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

#else // __cplusplus

extern void _ZN3ccc3AA0C1Ev();
extern void _ZN3ccc3AA0D1Ev();
Name_Map name_map__ZN3ccc3AA0E[] = {
  NSPAIR(_ZN3ccc3AA0C1Ev),
  NSPAIR(_ZN3ccc3AA0D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern void _ZN3ccc3AA03abcEv();
extern void _ZN3ccc3AA03efgEv();
extern void _ZN3ccc3AA03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3AA0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3AA0E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3AA0E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA0E[];
Class_Descriptor cd__ZN3ccc3AA0E = {  "_ZN3ccc3AA0E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3AA0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3AA0E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3AA0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  BB0  {
  virtual void  abc(); // _ZN3ccc3BB03abcEv
  virtual void  efg(); // _ZN3ccc3BB03efgEv
  virtual void  pqr(); // _ZN3ccc3BB03pqrEv
  ~BB0(); // tgen
  BB0(); // tgen
};
//SIG(-1 _ZN3ccc3BB0E) C1{ v1 v2 v3}
}
namespace ccc { 
void  ccc::BB0 ::abc(){vfunc_called(this, "_ZN3ccc3BB03abcEv");}
void  ccc::BB0 ::efg(){vfunc_called(this, "_ZN3ccc3BB03efgEv");}
void  ccc::BB0 ::pqr(){vfunc_called(this, "_ZN3ccc3BB03pqrEv");}
ccc::BB0 ::~BB0(){ note_dtor("_ZN3ccc3BB0E", this);} // tgen
ccc::BB0 ::BB0(){ note_ctor("_ZN3ccc3BB0E", this);} // tgen
}
static void Test__ZN3ccc3BB0E()
{
  extern Class_Descriptor cd__ZN3ccc3BB0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc3BB0E, buf);
    ::ccc::BB0 *dp, &lv = *(dp=new (buf) ::ccc::BB0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc3BB0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc3BB0E)");
    test_class_info(&lv, &cd__ZN3ccc3BB0E);
    dp->::ccc::BB0::~BB0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc3BB0E(Test__ZN3ccc3BB0E, "_ZN3ccc3BB0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc3BB0C1Ev();
extern void _ZN3ccc3BB0D1Ev();
Name_Map name_map__ZN3ccc3BB0E[] = {
  NSPAIR(_ZN3ccc3BB0C1Ev),
  NSPAIR(_ZN3ccc3BB0D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc3BB0E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc3BB0E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
Class_Descriptor cd__ZN3ccc3BB0E = {  "_ZN3ccc3BB0E", // class name
  0,0,//no base classes
  &(vtc__ZN3ccc3BB0E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc3BB0E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3ccc3BB0E),5, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  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  CC5x3y2  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y23pqrEv
  ~CC5x3y2(); // tgen
  CC5x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y2E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y23efgEv");}
void  ccc::CC5x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y23abcEv");}
void  ccc::CC5x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y23pqrEv");}
ccc::CC5x3y2 ::~CC5x3y2(){ note_dtor("_ZN3ccc7CC5x3y2E", this);} // tgen
ccc::CC5x3y2 ::CC5x3y2(){ note_ctor("_ZN3ccc7CC5x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y2E, buf);
    ::ccc::CC5x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y2E);
    dp->::ccc::CC5x3y2::~CC5x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y2E(Test__ZN3ccc7CC5x3y2E, "_ZN3ccc7CC5x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y2C1Ev();
extern void _ZN3ccc7CC5x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y2E[] = {
  NSPAIR(_ZN3ccc7CC5x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y2D1Ev),
  {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__ZN3ccc7CC5x3y2E[] = {
  // 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 _ZTIN3ccc7CC5x3y2E[];
extern void _ZN3ccc7CC5x3y23efgEv();
extern void _ZN3ccc7CC5x3y23pqrEv();
extern void _ZN3ccc7CC5x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y23pqrEv,_ZTv0_n12_N3ccc7CC5x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y23pqrEv,_ZThn4_N3ccc7CC5x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y23efgEv,_ZTv0_n16_N3ccc7CC5x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y23efgEv,_ZThn4_N3ccc7CC5x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y23abcEv,_ZTv0_n20_N3ccc7CC5x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y23abcEv,_ZThn4_N3ccc7CC5x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y23pqrEv,_ZTv0_n12_N3ccc7CC5x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y23efgEv,_ZTv0_n16_N3ccc7CC5x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y23abcEv,_ZTv0_n20_N3ccc7CC5x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y2E[] = {
  {&(_ZTVN3ccc7CC5x3y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y2E[];
static VTBL_ENTRY alt_thunk_names1[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y23abcEv,_ZTv0_n20_N3ccc7CC5x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y23abcEv,_ZThn4_N3ccc7CC5x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y23efgEv,_ZTv0_n16_N3ccc7CC5x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y23efgEv,_ZThn4_N3ccc7CC5x3y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y23pqrEv,_ZTv0_n12_N3ccc7CC5x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y23pqrEv,_ZThn4_N3ccc7CC5x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y2E = {  "_ZN3ccc7CC5x3y2E", // class name
  bases__ZN3ccc7CC5x3y2E, 2,
  &(vtc__ZN3ccc7CC5x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y2E),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  DD5x3y2  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD5x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x3y23pqrEv
  ~DD5x3y2(); // tgen
  DD5x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y23efgEv");}
void  ccc::DD5x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y23abcEv");}
void  ccc::DD5x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y23pqrEv");}
ccc::DD5x3y2 ::~DD5x3y2(){ note_dtor("_ZN3ccc7DD5x3y2E", this);} // tgen
ccc::DD5x3y2 ::DD5x3y2(){ note_ctor("_ZN3ccc7DD5x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y2E, buf);
    ::ccc::DD5x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y2E);
    dp->::ccc::DD5x3y2::~DD5x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y2E(Test__ZN3ccc7DD5x3y2E, "_ZN3ccc7DD5x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y2C1Ev();
extern void _ZN3ccc7DD5x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y2E[] = {
  NSPAIR(_ZN3ccc7DD5x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y2D1Ev),
  {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__ZN3ccc7DD5x3y2E[] = {
  // 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 _ZTIN3ccc7DD5x3y2E[];
extern void _ZN3ccc7DD5x3y23pqrEv();
extern void _ZN3ccc7DD5x3y23efgEv();
extern void _ZN3ccc7DD5x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y23efgEv,_ZTv0_n12_N3ccc7DD5x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y23efgEv,_ZThn4_N3ccc7DD5x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y23pqrEv,_ZTv0_n16_N3ccc7DD5x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y23pqrEv,_ZThn4_N3ccc7DD5x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y23abcEv,_ZTv0_n20_N3ccc7DD5x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y23abcEv,_ZThn4_N3ccc7DD5x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y23efgEv,_ZTv0_n12_N3ccc7DD5x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y23pqrEv,_ZTv0_n16_N3ccc7DD5x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y23abcEv,_ZTv0_n20_N3ccc7DD5x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y2E[] = {
  {&(_ZTVN3ccc7DD5x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y2E[];
static VTBL_ENTRY alt_thunk_names2[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y23abcEv,_ZTv0_n20_N3ccc7DD5x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y23abcEv,_ZThn4_N3ccc7DD5x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y23pqrEv,_ZTv0_n16_N3ccc7DD5x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y23pqrEv,_ZThn4_N3ccc7DD5x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y23efgEv,_ZTv0_n12_N3ccc7DD5x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y23efgEv,_ZThn4_N3ccc7DD5x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y2E = {  "_ZN3ccc7DD5x3y2E", // class name
  bases__ZN3ccc7DD5x3y2E, 2,
  &(vtc__ZN3ccc7DD5x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y2E),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  CC5x3y3  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x3y33abcEv
  ~CC5x3y3(); // tgen
  CC5x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y3E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y33efgEv");}
void  ccc::CC5x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y33pqrEv");}
void  ccc::CC5x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y33abcEv");}
ccc::CC5x3y3 ::~CC5x3y3(){ note_dtor("_ZN3ccc7CC5x3y3E", this);} // tgen
ccc::CC5x3y3 ::CC5x3y3(){ note_ctor("_ZN3ccc7CC5x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y3E, buf);
    ::ccc::CC5x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y3E);
    dp->::ccc::CC5x3y3::~CC5x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y3E(Test__ZN3ccc7CC5x3y3E, "_ZN3ccc7CC5x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y3C1Ev();
extern void _ZN3ccc7CC5x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y3E[] = {
  NSPAIR(_ZN3ccc7CC5x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y3D1Ev),
  {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__ZN3ccc7CC5x3y3E[] = {
  // 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 _ZTIN3ccc7CC5x3y3E[];
extern void _ZN3ccc7CC5x3y33efgEv();
extern void _ZN3ccc7CC5x3y33pqrEv();
extern void _ZN3ccc7CC5x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y33pqrEv,_ZTv0_n12_N3ccc7CC5x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y33pqrEv,_ZThn4_N3ccc7CC5x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y33efgEv,_ZTv0_n16_N3ccc7CC5x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y33efgEv,_ZThn4_N3ccc7CC5x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y33abcEv,_ZTv0_n20_N3ccc7CC5x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y33abcEv,_ZThn4_N3ccc7CC5x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y33pqrEv,_ZTv0_n12_N3ccc7CC5x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y33efgEv,_ZTv0_n16_N3ccc7CC5x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y33abcEv,_ZTv0_n20_N3ccc7CC5x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y3E[] = {
  {&(_ZTVN3ccc7CC5x3y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y3E[];
static VTBL_ENTRY alt_thunk_names3[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y33abcEv,_ZTv0_n20_N3ccc7CC5x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y33abcEv,_ZThn4_N3ccc7CC5x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y33efgEv,_ZTv0_n16_N3ccc7CC5x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y33efgEv,_ZThn4_N3ccc7CC5x3y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y33pqrEv,_ZTv0_n12_N3ccc7CC5x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y33pqrEv,_ZThn4_N3ccc7CC5x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y3E = {  "_ZN3ccc7CC5x3y3E", // class name
  bases__ZN3ccc7CC5x3y3E, 2,
  &(vtc__ZN3ccc7CC5x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y3E),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  DD5x3y3  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD5x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x3y33abcEv
  ~DD5x3y3(); // tgen
  DD5x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y33efgEv");}
void  ccc::DD5x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y33pqrEv");}
void  ccc::DD5x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y33abcEv");}
ccc::DD5x3y3 ::~DD5x3y3(){ note_dtor("_ZN3ccc7DD5x3y3E", this);} // tgen
ccc::DD5x3y3 ::DD5x3y3(){ note_ctor("_ZN3ccc7DD5x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y3E, buf);
    ::ccc::DD5x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y3E);
    dp->::ccc::DD5x3y3::~DD5x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y3E(Test__ZN3ccc7DD5x3y3E, "_ZN3ccc7DD5x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y3C1Ev();
extern void _ZN3ccc7DD5x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y3E[] = {
  NSPAIR(_ZN3ccc7DD5x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y3D1Ev),
  {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__ZN3ccc7DD5x3y3E[] = {
  // 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 _ZTIN3ccc7DD5x3y3E[];
extern void _ZN3ccc7DD5x3y33pqrEv();
extern void _ZN3ccc7DD5x3y33efgEv();
extern void _ZN3ccc7DD5x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y33efgEv,_ZTv0_n12_N3ccc7DD5x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y33efgEv,_ZThn4_N3ccc7DD5x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y33pqrEv,_ZTv0_n16_N3ccc7DD5x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y33pqrEv,_ZThn4_N3ccc7DD5x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y33abcEv,_ZTv0_n20_N3ccc7DD5x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y33abcEv,_ZThn4_N3ccc7DD5x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y33efgEv,_ZTv0_n12_N3ccc7DD5x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y33pqrEv,_ZTv0_n16_N3ccc7DD5x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y33abcEv,_ZTv0_n20_N3ccc7DD5x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y3E[] = {
  {&(_ZTVN3ccc7DD5x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y3E[];
static VTBL_ENTRY alt_thunk_names4[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y33abcEv,_ZTv0_n20_N3ccc7DD5x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y33abcEv,_ZThn4_N3ccc7DD5x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y33pqrEv,_ZTv0_n16_N3ccc7DD5x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y33pqrEv,_ZThn4_N3ccc7DD5x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y33efgEv,_ZTv0_n12_N3ccc7DD5x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y33efgEv,_ZThn4_N3ccc7DD5x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y3E = {  "_ZN3ccc7DD5x3y3E", // class name
  bases__ZN3ccc7DD5x3y3E, 2,
  &(vtc__ZN3ccc7DD5x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y3E),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  CC5x3y4  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC5x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x3y43efgEv
  ~CC5x3y4(); // tgen
  CC5x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y4E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y43pqrEv");}
void  ccc::CC5x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y43abcEv");}
void  ccc::CC5x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y43efgEv");}
ccc::CC5x3y4 ::~CC5x3y4(){ note_dtor("_ZN3ccc7CC5x3y4E", this);} // tgen
ccc::CC5x3y4 ::CC5x3y4(){ note_ctor("_ZN3ccc7CC5x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y4E, buf);
    ::ccc::CC5x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y4E);
    dp->::ccc::CC5x3y4::~CC5x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y4E(Test__ZN3ccc7CC5x3y4E, "_ZN3ccc7CC5x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y4C1Ev();
extern void _ZN3ccc7CC5x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y4E[] = {
  NSPAIR(_ZN3ccc7CC5x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y4D1Ev),
  {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__ZN3ccc7CC5x3y4E[] = {
  // 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 _ZTIN3ccc7CC5x3y4E[];
extern void _ZN3ccc7CC5x3y43efgEv();
extern void _ZN3ccc7CC5x3y43pqrEv();
extern void _ZN3ccc7CC5x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y43pqrEv,_ZTv0_n12_N3ccc7CC5x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y43pqrEv,_ZThn4_N3ccc7CC5x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y43efgEv,_ZTv0_n16_N3ccc7CC5x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y43efgEv,_ZThn4_N3ccc7CC5x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y43abcEv,_ZTv0_n20_N3ccc7CC5x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y43abcEv,_ZThn4_N3ccc7CC5x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y43pqrEv,_ZTv0_n12_N3ccc7CC5x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y43efgEv,_ZTv0_n16_N3ccc7CC5x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y43abcEv,_ZTv0_n20_N3ccc7CC5x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y4E[] = {
  {&(_ZTVN3ccc7CC5x3y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y4E[];
static VTBL_ENTRY alt_thunk_names5[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y43abcEv,_ZTv0_n20_N3ccc7CC5x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y43abcEv,_ZThn4_N3ccc7CC5x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y43efgEv,_ZTv0_n16_N3ccc7CC5x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y43efgEv,_ZThn4_N3ccc7CC5x3y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y43pqrEv,_ZTv0_n12_N3ccc7CC5x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y43pqrEv,_ZThn4_N3ccc7CC5x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y4E = {  "_ZN3ccc7CC5x3y4E", // class name
  bases__ZN3ccc7CC5x3y4E, 2,
  &(vtc__ZN3ccc7CC5x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y4E),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  DD5x3y4  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD5x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x3y43efgEv
  ~DD5x3y4(); // tgen
  DD5x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y43pqrEv");}
void  ccc::DD5x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y43abcEv");}
void  ccc::DD5x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y43efgEv");}
ccc::DD5x3y4 ::~DD5x3y4(){ note_dtor("_ZN3ccc7DD5x3y4E", this);} // tgen
ccc::DD5x3y4 ::DD5x3y4(){ note_ctor("_ZN3ccc7DD5x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y4E, buf);
    ::ccc::DD5x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y4E);
    dp->::ccc::DD5x3y4::~DD5x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y4E(Test__ZN3ccc7DD5x3y4E, "_ZN3ccc7DD5x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y4C1Ev();
extern void _ZN3ccc7DD5x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y4E[] = {
  NSPAIR(_ZN3ccc7DD5x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y4D1Ev),
  {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__ZN3ccc7DD5x3y4E[] = {
  // 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 _ZTIN3ccc7DD5x3y4E[];
extern void _ZN3ccc7DD5x3y43pqrEv();
extern void _ZN3ccc7DD5x3y43efgEv();
extern void _ZN3ccc7DD5x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y43efgEv,_ZTv0_n12_N3ccc7DD5x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y43efgEv,_ZThn4_N3ccc7DD5x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y43pqrEv,_ZTv0_n16_N3ccc7DD5x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y43pqrEv,_ZThn4_N3ccc7DD5x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y43abcEv,_ZTv0_n20_N3ccc7DD5x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y43abcEv,_ZThn4_N3ccc7DD5x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y43efgEv,_ZTv0_n12_N3ccc7DD5x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y43pqrEv,_ZTv0_n16_N3ccc7DD5x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y43abcEv,_ZTv0_n20_N3ccc7DD5x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y4E[] = {
  {&(_ZTVN3ccc7DD5x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y4E[];
static VTBL_ENTRY alt_thunk_names6[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y43abcEv,_ZTv0_n20_N3ccc7DD5x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y43abcEv,_ZThn4_N3ccc7DD5x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y43pqrEv,_ZTv0_n16_N3ccc7DD5x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y43pqrEv,_ZThn4_N3ccc7DD5x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y43efgEv,_ZTv0_n12_N3ccc7DD5x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y43efgEv,_ZThn4_N3ccc7DD5x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y4E = {  "_ZN3ccc7DD5x3y4E", // class name
  bases__ZN3ccc7DD5x3y4E, 2,
  &(vtc__ZN3ccc7DD5x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y4E),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  CC5x3y5  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC5x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x3y53abcEv
  ~CC5x3y5(); // tgen
  CC5x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y5E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y53pqrEv");}
void  ccc::CC5x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y53efgEv");}
void  ccc::CC5x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y53abcEv");}
ccc::CC5x3y5 ::~CC5x3y5(){ note_dtor("_ZN3ccc7CC5x3y5E", this);} // tgen
ccc::CC5x3y5 ::CC5x3y5(){ note_ctor("_ZN3ccc7CC5x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y5E, buf);
    ::ccc::CC5x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y5E);
    dp->::ccc::CC5x3y5::~CC5x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y5E(Test__ZN3ccc7CC5x3y5E, "_ZN3ccc7CC5x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y5C1Ev();
extern void _ZN3ccc7CC5x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y5E[] = {
  NSPAIR(_ZN3ccc7CC5x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y5D1Ev),
  {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__ZN3ccc7CC5x3y5E[] = {
  // 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 _ZTIN3ccc7CC5x3y5E[];
extern void _ZN3ccc7CC5x3y53efgEv();
extern void _ZN3ccc7CC5x3y53pqrEv();
extern void _ZN3ccc7CC5x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y53pqrEv,_ZTv0_n12_N3ccc7CC5x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y53pqrEv,_ZThn4_N3ccc7CC5x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y53efgEv,_ZTv0_n16_N3ccc7CC5x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y53efgEv,_ZThn4_N3ccc7CC5x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y53abcEv,_ZTv0_n20_N3ccc7CC5x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y53abcEv,_ZThn4_N3ccc7CC5x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y53pqrEv,_ZTv0_n12_N3ccc7CC5x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y53efgEv,_ZTv0_n16_N3ccc7CC5x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y53abcEv,_ZTv0_n20_N3ccc7CC5x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y5E[] = {
  {&(_ZTVN3ccc7CC5x3y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y5E[];
static VTBL_ENTRY alt_thunk_names7[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y53abcEv,_ZTv0_n20_N3ccc7CC5x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y53abcEv,_ZThn4_N3ccc7CC5x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y53efgEv,_ZTv0_n16_N3ccc7CC5x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y53efgEv,_ZThn4_N3ccc7CC5x3y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y53pqrEv,_ZTv0_n12_N3ccc7CC5x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y53pqrEv,_ZThn4_N3ccc7CC5x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y5E = {  "_ZN3ccc7CC5x3y5E", // class name
  bases__ZN3ccc7CC5x3y5E, 2,
  &(vtc__ZN3ccc7CC5x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y5E),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  DD5x3y5  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD5x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x3y53abcEv
  ~DD5x3y5(); // tgen
  DD5x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y53pqrEv");}
void  ccc::DD5x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y53efgEv");}
void  ccc::DD5x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y53abcEv");}
ccc::DD5x3y5 ::~DD5x3y5(){ note_dtor("_ZN3ccc7DD5x3y5E", this);} // tgen
ccc::DD5x3y5 ::DD5x3y5(){ note_ctor("_ZN3ccc7DD5x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y5E, buf);
    ::ccc::DD5x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y5E);
    dp->::ccc::DD5x3y5::~DD5x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y5E(Test__ZN3ccc7DD5x3y5E, "_ZN3ccc7DD5x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y5C1Ev();
extern void _ZN3ccc7DD5x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y5E[] = {
  NSPAIR(_ZN3ccc7DD5x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y5D1Ev),
  {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__ZN3ccc7DD5x3y5E[] = {
  // 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 _ZTIN3ccc7DD5x3y5E[];
extern void _ZN3ccc7DD5x3y53pqrEv();
extern void _ZN3ccc7DD5x3y53efgEv();
extern void _ZN3ccc7DD5x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y53efgEv,_ZTv0_n12_N3ccc7DD5x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y53efgEv,_ZThn4_N3ccc7DD5x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y53pqrEv,_ZTv0_n16_N3ccc7DD5x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y53pqrEv,_ZThn4_N3ccc7DD5x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y53abcEv,_ZTv0_n20_N3ccc7DD5x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y53abcEv,_ZThn4_N3ccc7DD5x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y53efgEv,_ZTv0_n12_N3ccc7DD5x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y53pqrEv,_ZTv0_n16_N3ccc7DD5x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y53abcEv,_ZTv0_n20_N3ccc7DD5x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y5E[] = {
  {&(_ZTVN3ccc7DD5x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y5E[];
static VTBL_ENTRY alt_thunk_names8[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y53abcEv,_ZTv0_n20_N3ccc7DD5x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y53abcEv,_ZThn4_N3ccc7DD5x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y53pqrEv,_ZTv0_n16_N3ccc7DD5x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y53pqrEv,_ZThn4_N3ccc7DD5x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y53efgEv,_ZTv0_n12_N3ccc7DD5x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y53efgEv,_ZThn4_N3ccc7DD5x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y5E = {  "_ZN3ccc7DD5x3y5E", // class name
  bases__ZN3ccc7DD5x3y5E, 2,
  &(vtc__ZN3ccc7DD5x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y5E),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  CC5x3y6  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x3y63efgEv
  ~CC5x3y6(); // tgen
  CC5x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y6E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y63abcEv");}
void  ccc::CC5x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y63efgEv");}
ccc::CC5x3y6 ::~CC5x3y6(){ note_dtor("_ZN3ccc7CC5x3y6E", this);} // tgen
ccc::CC5x3y6 ::CC5x3y6(){ note_ctor("_ZN3ccc7CC5x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y6E, buf);
    ::ccc::CC5x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y6E);
    dp->::ccc::CC5x3y6::~CC5x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y6E(Test__ZN3ccc7CC5x3y6E, "_ZN3ccc7CC5x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y6C1Ev();
extern void _ZN3ccc7CC5x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y6E[] = {
  NSPAIR(_ZN3ccc7CC5x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y6D1Ev),
  {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__ZN3ccc7CC5x3y6E[] = {
  // 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 _ZTIN3ccc7CC5x3y6E[];
extern void _ZN3ccc7CC5x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC5x3y63abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y63efgEv,_ZTv0_n16_N3ccc7CC5x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y63efgEv,_ZThn4_N3ccc7CC5x3y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y63abcEv,_ZTv0_n20_N3ccc7CC5x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y63abcEv,_ZThn4_N3ccc7CC5x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y63efgEv,_ZTv0_n16_N3ccc7CC5x3y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y63abcEv,_ZTv0_n20_N3ccc7CC5x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y6E[] = {
  {&(_ZTVN3ccc7CC5x3y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y6E[];
static VTBL_ENTRY alt_thunk_names9[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y63abcEv,_ZTv0_n20_N3ccc7CC5x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y63abcEv,_ZThn4_N3ccc7CC5x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y63efgEv,_ZTv0_n16_N3ccc7CC5x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y63efgEv,_ZThn4_N3ccc7CC5x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y6E = {  "_ZN3ccc7CC5x3y6E", // class name
  bases__ZN3ccc7CC5x3y6E, 2,
  &(vtc__ZN3ccc7CC5x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y6E),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  DD5x3y6  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD5x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x3y63efgEv
  ~DD5x3y6(); // tgen
  DD5x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y63abcEv");}
void  ccc::DD5x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y63efgEv");}
ccc::DD5x3y6 ::~DD5x3y6(){ note_dtor("_ZN3ccc7DD5x3y6E", this);} // tgen
ccc::DD5x3y6 ::DD5x3y6(){ note_ctor("_ZN3ccc7DD5x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y6E, buf);
    ::ccc::DD5x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y6E);
    dp->::ccc::DD5x3y6::~DD5x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y6E(Test__ZN3ccc7DD5x3y6E, "_ZN3ccc7DD5x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y6C1Ev();
extern void _ZN3ccc7DD5x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y6E[] = {
  NSPAIR(_ZN3ccc7DD5x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y6D1Ev),
  {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__ZN3ccc7DD5x3y6E[] = {
  // 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 _ZTIN3ccc7DD5x3y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x3y63efgEv();
extern void _ZN3ccc7DD5x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y63efgEv,_ZTv0_n12_N3ccc7DD5x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y63efgEv,_ZThn4_N3ccc7DD5x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y63abcEv,_ZTv0_n20_N3ccc7DD5x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y63abcEv,_ZThn4_N3ccc7DD5x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y63efgEv,_ZTv0_n12_N3ccc7DD5x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y63abcEv,_ZTv0_n20_N3ccc7DD5x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y6E[] = {
  {&(_ZTVN3ccc7DD5x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y6E[];
static VTBL_ENTRY alt_thunk_names10[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y63abcEv,_ZTv0_n20_N3ccc7DD5x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y63abcEv,_ZThn4_N3ccc7DD5x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y63efgEv,_ZTv0_n12_N3ccc7DD5x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y63efgEv,_ZThn4_N3ccc7DD5x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y6E = {  "_ZN3ccc7DD5x3y6E", // class name
  bases__ZN3ccc7DD5x3y6E, 2,
  &(vtc__ZN3ccc7DD5x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y6E),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  CC5x3y7  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC5x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y73pqrEv
  ~CC5x3y7(); // tgen
  CC5x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y7E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y73abcEv");}
void  ccc::CC5x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y73pqrEv");}
ccc::CC5x3y7 ::~CC5x3y7(){ note_dtor("_ZN3ccc7CC5x3y7E", this);} // tgen
ccc::CC5x3y7 ::CC5x3y7(){ note_ctor("_ZN3ccc7CC5x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y7E, buf);
    ::ccc::CC5x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y7E);
    dp->::ccc::CC5x3y7::~CC5x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y7E(Test__ZN3ccc7CC5x3y7E, "_ZN3ccc7CC5x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y7C1Ev();
extern void _ZN3ccc7CC5x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y7E[] = {
  NSPAIR(_ZN3ccc7CC5x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y7D1Ev),
  {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__ZN3ccc7CC5x3y7E[] = {
  // 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 _ZTIN3ccc7CC5x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC5x3y73pqrEv();
extern void _ZN3ccc7CC5x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y73pqrEv,_ZTv0_n12_N3ccc7CC5x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y73pqrEv,_ZThn4_N3ccc7CC5x3y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y73abcEv,_ZTv0_n20_N3ccc7CC5x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y73abcEv,_ZThn4_N3ccc7CC5x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y73pqrEv,_ZTv0_n12_N3ccc7CC5x3y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y73abcEv,_ZTv0_n20_N3ccc7CC5x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y7E[] = {
  {&(_ZTVN3ccc7CC5x3y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y7E[];
static VTBL_ENTRY alt_thunk_names11[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y73abcEv,_ZTv0_n20_N3ccc7CC5x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y73abcEv,_ZThn4_N3ccc7CC5x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y73pqrEv,_ZTv0_n12_N3ccc7CC5x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y73pqrEv,_ZThn4_N3ccc7CC5x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y7E = {  "_ZN3ccc7CC5x3y7E", // class name
  bases__ZN3ccc7CC5x3y7E, 2,
  &(vtc__ZN3ccc7CC5x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y7E),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  DD5x3y7  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD5x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x3y73pqrEv
  ~DD5x3y7(); // tgen
  DD5x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y73abcEv");}
void  ccc::DD5x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y73pqrEv");}
ccc::DD5x3y7 ::~DD5x3y7(){ note_dtor("_ZN3ccc7DD5x3y7E", this);} // tgen
ccc::DD5x3y7 ::DD5x3y7(){ note_ctor("_ZN3ccc7DD5x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y7E, buf);
    ::ccc::DD5x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y7E);
    dp->::ccc::DD5x3y7::~DD5x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y7E(Test__ZN3ccc7DD5x3y7E, "_ZN3ccc7DD5x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y7C1Ev();
extern void _ZN3ccc7DD5x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y7E[] = {
  NSPAIR(_ZN3ccc7DD5x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y7D1Ev),
  {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__ZN3ccc7DD5x3y7E[] = {
  // 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 _ZTIN3ccc7DD5x3y7E[];
extern void _ZN3ccc7DD5x3y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y73pqrEv,_ZTv0_n16_N3ccc7DD5x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y73pqrEv,_ZThn4_N3ccc7DD5x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y73abcEv,_ZTv0_n20_N3ccc7DD5x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y73abcEv,_ZThn4_N3ccc7DD5x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y73pqrEv,_ZTv0_n16_N3ccc7DD5x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y73abcEv,_ZTv0_n20_N3ccc7DD5x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y7E[] = {
  {&(_ZTVN3ccc7DD5x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y7E[];
static VTBL_ENTRY alt_thunk_names12[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y73abcEv,_ZTv0_n20_N3ccc7DD5x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y73abcEv,_ZThn4_N3ccc7DD5x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y73pqrEv,_ZTv0_n16_N3ccc7DD5x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y73pqrEv,_ZThn4_N3ccc7DD5x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y7E = {  "_ZN3ccc7DD5x3y7E", // class name
  bases__ZN3ccc7DD5x3y7E, 2,
  &(vtc__ZN3ccc7DD5x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y7E),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  CC5x3y8  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x3y83abcEv
  ~CC5x3y8(); // tgen
  CC5x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y8E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y83efgEv");}
void  ccc::CC5x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x3y83abcEv");}
ccc::CC5x3y8 ::~CC5x3y8(){ note_dtor("_ZN3ccc7CC5x3y8E", this);} // tgen
ccc::CC5x3y8 ::CC5x3y8(){ note_ctor("_ZN3ccc7CC5x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y8E, buf);
    ::ccc::CC5x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y8E);
    dp->::ccc::CC5x3y8::~CC5x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y8E(Test__ZN3ccc7CC5x3y8E, "_ZN3ccc7CC5x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y8C1Ev();
extern void _ZN3ccc7CC5x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y8E[] = {
  NSPAIR(_ZN3ccc7CC5x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y8D1Ev),
  {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__ZN3ccc7CC5x3y8E[] = {
  // 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 _ZTIN3ccc7CC5x3y8E[];
extern void _ZN3ccc7CC5x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC5x3y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y83efgEv,_ZTv0_n16_N3ccc7CC5x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y83efgEv,_ZThn4_N3ccc7CC5x3y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x3y83abcEv,_ZTv0_n20_N3ccc7CC5x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y83abcEv,_ZThn4_N3ccc7CC5x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y83efgEv,_ZTv0_n16_N3ccc7CC5x3y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x3y83abcEv,_ZTv0_n20_N3ccc7CC5x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y8E[] = {
  {&(_ZTVN3ccc7CC5x3y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y8E[];
static VTBL_ENTRY alt_thunk_names13[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x3y83abcEv,_ZTv0_n20_N3ccc7CC5x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y83abcEv,_ZThn4_N3ccc7CC5x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y83efgEv,_ZTv0_n16_N3ccc7CC5x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y83efgEv,_ZThn4_N3ccc7CC5x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y8E = {  "_ZN3ccc7CC5x3y8E", // class name
  bases__ZN3ccc7CC5x3y8E, 2,
  &(vtc__ZN3ccc7CC5x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y8E),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  DD5x3y8  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD5x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x3y83abcEv
  ~DD5x3y8(); // tgen
  DD5x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y83efgEv");}
void  ccc::DD5x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x3y83abcEv");}
ccc::DD5x3y8 ::~DD5x3y8(){ note_dtor("_ZN3ccc7DD5x3y8E", this);} // tgen
ccc::DD5x3y8 ::DD5x3y8(){ note_ctor("_ZN3ccc7DD5x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y8E, buf);
    ::ccc::DD5x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y8E);
    dp->::ccc::DD5x3y8::~DD5x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y8E(Test__ZN3ccc7DD5x3y8E, "_ZN3ccc7DD5x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y8C1Ev();
extern void _ZN3ccc7DD5x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y8E[] = {
  NSPAIR(_ZN3ccc7DD5x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y8D1Ev),
  {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__ZN3ccc7DD5x3y8E[] = {
  // 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 _ZTIN3ccc7DD5x3y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x3y83efgEv();
extern void _ZN3ccc7DD5x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y83efgEv,_ZTv0_n12_N3ccc7DD5x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y83efgEv,_ZThn4_N3ccc7DD5x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x3y83abcEv,_ZTv0_n20_N3ccc7DD5x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y83abcEv,_ZThn4_N3ccc7DD5x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y83efgEv,_ZTv0_n12_N3ccc7DD5x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x3y83abcEv,_ZTv0_n20_N3ccc7DD5x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y8E[] = {
  {&(_ZTVN3ccc7DD5x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y8E[];
static VTBL_ENTRY alt_thunk_names14[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x3y83abcEv,_ZTv0_n20_N3ccc7DD5x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y83abcEv,_ZThn4_N3ccc7DD5x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y83efgEv,_ZTv0_n12_N3ccc7DD5x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y83efgEv,_ZThn4_N3ccc7DD5x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y8E = {  "_ZN3ccc7DD5x3y8E", // class name
  bases__ZN3ccc7DD5x3y8E, 2,
  &(vtc__ZN3ccc7DD5x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y8E),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  CC5x3y9  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC5x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x3y93pqrEv
  ~CC5x3y9(); // tgen
  CC5x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x3y9E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x3y93efgEv");}
void  ccc::CC5x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x3y93pqrEv");}
ccc::CC5x3y9 ::~CC5x3y9(){ note_dtor("_ZN3ccc7CC5x3y9E", this);} // tgen
ccc::CC5x3y9 ::CC5x3y9(){ note_ctor("_ZN3ccc7CC5x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x3y9E, buf);
    ::ccc::CC5x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x3y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC5x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x3y9E);
    dp->::ccc::CC5x3y9::~CC5x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x3y9E(Test__ZN3ccc7CC5x3y9E, "_ZN3ccc7CC5x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x3y9C1Ev();
extern void _ZN3ccc7CC5x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x3y9E[] = {
  NSPAIR(_ZN3ccc7CC5x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x3y9D1Ev),
  {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__ZN3ccc7CC5x3y9E[] = {
  // 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 _ZTIN3ccc7CC5x3y9E[];
extern void _ZN3ccc7CC5x3y93efgEv();
extern void _ZN3ccc7CC5x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x3y93pqrEv,_ZTv0_n12_N3ccc7CC5x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y93pqrEv,_ZThn4_N3ccc7CC5x3y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x3y93efgEv,_ZTv0_n16_N3ccc7CC5x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x3y93efgEv,_ZThn4_N3ccc7CC5x3y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x3y93pqrEv,_ZTv0_n12_N3ccc7CC5x3y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x3y93efgEv,_ZTv0_n16_N3ccc7CC5x3y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x3y9E[] = {
  {&(_ZTVN3ccc7CC5x3y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x3y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x3y9E[];
static VTBL_ENTRY alt_thunk_names15[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x3y93efgEv,_ZTv0_n16_N3ccc7CC5x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y93efgEv,_ZThn4_N3ccc7CC5x3y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x3y93pqrEv,_ZTv0_n12_N3ccc7CC5x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x3y93pqrEv,_ZThn4_N3ccc7CC5x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x3y9E = {  "_ZN3ccc7CC5x3y9E", // class name
  bases__ZN3ccc7CC5x3y9E, 2,
  &(vtc__ZN3ccc7CC5x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x3y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x3y9E),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  DD5x3y9  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD5x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x3y93pqrEv
  ~DD5x3y9(); // tgen
  DD5x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x3y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x3y93efgEv");}
void  ccc::DD5x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x3y93pqrEv");}
ccc::DD5x3y9 ::~DD5x3y9(){ note_dtor("_ZN3ccc7DD5x3y9E", this);} // tgen
ccc::DD5x3y9 ::DD5x3y9(){ note_ctor("_ZN3ccc7DD5x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x3y9E, buf);
    ::ccc::DD5x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x3y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD5x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x3y9E);
    dp->::ccc::DD5x3y9::~DD5x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x3y9E(Test__ZN3ccc7DD5x3y9E, "_ZN3ccc7DD5x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x3y9C1Ev();
extern void _ZN3ccc7DD5x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x3y9E[] = {
  NSPAIR(_ZN3ccc7DD5x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x3y9D1Ev),
  {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__ZN3ccc7DD5x3y9E[] = {
  // 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 _ZTIN3ccc7DD5x3y9E[];
extern void _ZN3ccc7DD5x3y93pqrEv();
extern void _ZN3ccc7DD5x3y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x3y93efgEv,_ZTv0_n12_N3ccc7DD5x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y93efgEv,_ZThn4_N3ccc7DD5x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x3y93pqrEv,_ZTv0_n16_N3ccc7DD5x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x3y93pqrEv,_ZThn4_N3ccc7DD5x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x3y93efgEv,_ZTv0_n12_N3ccc7DD5x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x3y93pqrEv,_ZTv0_n16_N3ccc7DD5x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x3y9E[] = {
  {&(_ZTVN3ccc7DD5x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x3y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x3y9E[];
static VTBL_ENTRY alt_thunk_names16[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x3y93pqrEv,_ZTv0_n16_N3ccc7DD5x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y93pqrEv,_ZThn4_N3ccc7DD5x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x3y93efgEv,_ZTv0_n12_N3ccc7DD5x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x3y93efgEv,_ZThn4_N3ccc7DD5x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x3y9E = {  "_ZN3ccc7DD5x3y9E", // class name
  bases__ZN3ccc7DD5x3y9E, 2,
  &(vtc__ZN3ccc7DD5x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x3y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x3y9E),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  CC5x3y10  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC5x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x3y103abcEv
  ~CC5x3y10(); // tgen
  CC5x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y10E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x3y103pqrEv");}
void  ccc::CC5x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x3y103abcEv");}
ccc::CC5x3y10 ::~CC5x3y10(){ note_dtor("_ZN3ccc8CC5x3y10E", this);} // tgen
ccc::CC5x3y10 ::CC5x3y10(){ note_ctor("_ZN3ccc8CC5x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x3y10E, buf);
    ::ccc::CC5x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x3y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC5x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x3y10E);
    dp->::ccc::CC5x3y10::~CC5x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x3y10E(Test__ZN3ccc8CC5x3y10E, "_ZN3ccc8CC5x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x3y10C1Ev();
extern void _ZN3ccc8CC5x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x3y10E[] = {
  NSPAIR(_ZN3ccc8CC5x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x3y10D1Ev),
  {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__ZN3ccc8CC5x3y10E[] = {
  // 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 _ZTIN3ccc8CC5x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC5x3y103pqrEv();
extern void _ZN3ccc8CC5x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x3y103pqrEv,_ZTv0_n12_N3ccc8CC5x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y103pqrEv,_ZThn4_N3ccc8CC5x3y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x3y103abcEv,_ZTv0_n20_N3ccc8CC5x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y103abcEv,_ZThn4_N3ccc8CC5x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x3y103pqrEv,_ZTv0_n12_N3ccc8CC5x3y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x3y103abcEv,_ZTv0_n20_N3ccc8CC5x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x3y10E[] = {
  {&(_ZTVN3ccc8CC5x3y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x3y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x3y10E[];
static VTBL_ENTRY alt_thunk_names17[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x3y103abcEv,_ZTv0_n20_N3ccc8CC5x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y103abcEv,_ZThn4_N3ccc8CC5x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x3y103pqrEv,_ZTv0_n12_N3ccc8CC5x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y103pqrEv,_ZThn4_N3ccc8CC5x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x3y10E = {  "_ZN3ccc8CC5x3y10E", // class name
  bases__ZN3ccc8CC5x3y10E, 2,
  &(vtc__ZN3ccc8CC5x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x3y10E),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  DD5x3y10  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD5x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x3y103abcEv
  ~DD5x3y10(); // tgen
  DD5x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x3y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x3y103pqrEv");}
void  ccc::DD5x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x3y103abcEv");}
ccc::DD5x3y10 ::~DD5x3y10(){ note_dtor("_ZN3ccc8DD5x3y10E", this);} // tgen
ccc::DD5x3y10 ::DD5x3y10(){ note_ctor("_ZN3ccc8DD5x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x3y10E, buf);
    ::ccc::DD5x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x3y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD5x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x3y10E);
    dp->::ccc::DD5x3y10::~DD5x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x3y10E(Test__ZN3ccc8DD5x3y10E, "_ZN3ccc8DD5x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x3y10C1Ev();
extern void _ZN3ccc8DD5x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x3y10E[] = {
  NSPAIR(_ZN3ccc8DD5x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x3y10D1Ev),
  {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__ZN3ccc8DD5x3y10E[] = {
  // 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 _ZTIN3ccc8DD5x3y10E[];
extern void _ZN3ccc8DD5x3y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x3y103pqrEv,_ZTv0_n16_N3ccc8DD5x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y103pqrEv,_ZThn4_N3ccc8DD5x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x3y103abcEv,_ZTv0_n20_N3ccc8DD5x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y103abcEv,_ZThn4_N3ccc8DD5x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x3y103pqrEv,_ZTv0_n16_N3ccc8DD5x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x3y103abcEv,_ZTv0_n20_N3ccc8DD5x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x3y10E[] = {
  {&(_ZTVN3ccc8DD5x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x3y10E[];
static VTBL_ENTRY alt_thunk_names18[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x3y103abcEv,_ZTv0_n20_N3ccc8DD5x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y103abcEv,_ZThn4_N3ccc8DD5x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x3y103pqrEv,_ZTv0_n16_N3ccc8DD5x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y103pqrEv,_ZThn4_N3ccc8DD5x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x3y10E = {  "_ZN3ccc8DD5x3y10E", // class name
  bases__ZN3ccc8DD5x3y10E, 2,
  &(vtc__ZN3ccc8DD5x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x3y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x3y10E),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  CC5x3y11  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC5x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x3y113efgEv
  ~CC5x3y11(); // tgen
  CC5x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y11E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x3y113pqrEv");}
void  ccc::CC5x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x3y113efgEv");}
ccc::CC5x3y11 ::~CC5x3y11(){ note_dtor("_ZN3ccc8CC5x3y11E", this);} // tgen
ccc::CC5x3y11 ::CC5x3y11(){ note_ctor("_ZN3ccc8CC5x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x3y11E, buf);
    ::ccc::CC5x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x3y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC5x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x3y11E);
    dp->::ccc::CC5x3y11::~CC5x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x3y11E(Test__ZN3ccc8CC5x3y11E, "_ZN3ccc8CC5x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x3y11C1Ev();
extern void _ZN3ccc8CC5x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x3y11E[] = {
  NSPAIR(_ZN3ccc8CC5x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x3y11D1Ev),
  {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__ZN3ccc8CC5x3y11E[] = {
  // 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 _ZTIN3ccc8CC5x3y11E[];
extern void _ZN3ccc8CC5x3y113efgEv();
extern void _ZN3ccc8CC5x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x3y113pqrEv,_ZTv0_n12_N3ccc8CC5x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y113pqrEv,_ZThn4_N3ccc8CC5x3y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x3y113efgEv,_ZTv0_n16_N3ccc8CC5x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y113efgEv,_ZThn4_N3ccc8CC5x3y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x3y113pqrEv,_ZTv0_n12_N3ccc8CC5x3y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x3y113efgEv,_ZTv0_n16_N3ccc8CC5x3y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x3y11E[] = {
  {&(_ZTVN3ccc8CC5x3y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x3y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x3y11E[];
static VTBL_ENTRY alt_thunk_names19[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x3y113efgEv,_ZTv0_n16_N3ccc8CC5x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y113efgEv,_ZThn4_N3ccc8CC5x3y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x3y113pqrEv,_ZTv0_n12_N3ccc8CC5x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y113pqrEv,_ZThn4_N3ccc8CC5x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x3y11E = {  "_ZN3ccc8CC5x3y11E", // class name
  bases__ZN3ccc8CC5x3y11E, 2,
  &(vtc__ZN3ccc8CC5x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x3y11E),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  DD5x3y11  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD5x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x3y113efgEv
  ~DD5x3y11(); // tgen
  DD5x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x3y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x3y113pqrEv");}
void  ccc::DD5x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x3y113efgEv");}
ccc::DD5x3y11 ::~DD5x3y11(){ note_dtor("_ZN3ccc8DD5x3y11E", this);} // tgen
ccc::DD5x3y11 ::DD5x3y11(){ note_ctor("_ZN3ccc8DD5x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x3y11E, buf);
    ::ccc::DD5x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x3y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD5x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x3y11E);
    dp->::ccc::DD5x3y11::~DD5x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x3y11E(Test__ZN3ccc8DD5x3y11E, "_ZN3ccc8DD5x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x3y11C1Ev();
extern void _ZN3ccc8DD5x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x3y11E[] = {
  NSPAIR(_ZN3ccc8DD5x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x3y11D1Ev),
  {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__ZN3ccc8DD5x3y11E[] = {
  // 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 _ZTIN3ccc8DD5x3y11E[];
extern void _ZN3ccc8DD5x3y113pqrEv();
extern void _ZN3ccc8DD5x3y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x3y113efgEv,_ZTv0_n12_N3ccc8DD5x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y113efgEv,_ZThn4_N3ccc8DD5x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x3y113pqrEv,_ZTv0_n16_N3ccc8DD5x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y113pqrEv,_ZThn4_N3ccc8DD5x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x3y113efgEv,_ZTv0_n12_N3ccc8DD5x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x3y113pqrEv,_ZTv0_n16_N3ccc8DD5x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x3y11E[] = {
  {&(_ZTVN3ccc8DD5x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x3y11E[];
static VTBL_ENTRY alt_thunk_names20[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x3y113pqrEv,_ZTv0_n16_N3ccc8DD5x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y113pqrEv,_ZThn4_N3ccc8DD5x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x3y113efgEv,_ZTv0_n12_N3ccc8DD5x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y113efgEv,_ZThn4_N3ccc8DD5x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x3y11E = {  "_ZN3ccc8DD5x3y11E", // class name
  bases__ZN3ccc8DD5x3y11E, 2,
  &(vtc__ZN3ccc8DD5x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x3y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x3y11E),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  CC5x3y12  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC5x3y123abcEv
  ~CC5x3y12(); // tgen
  CC5x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x3y123abcEv");}
ccc::CC5x3y12 ::~CC5x3y12(){ note_dtor("_ZN3ccc8CC5x3y12E", this);} // tgen
ccc::CC5x3y12 ::CC5x3y12(){ note_ctor("_ZN3ccc8CC5x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x3y12E, buf);
    ::ccc::CC5x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x3y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC5x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x3y12E);
    dp->::ccc::CC5x3y12::~CC5x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x3y12E(Test__ZN3ccc8CC5x3y12E, "_ZN3ccc8CC5x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x3y12C1Ev();
extern void _ZN3ccc8CC5x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x3y12E[] = {
  NSPAIR(_ZN3ccc8CC5x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x3y12D1Ev),
  {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__ZN3ccc8CC5x3y12E[] = {
  // 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 _ZTIN3ccc8CC5x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC5x3y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x3y123abcEv,_ZTv0_n20_N3ccc8CC5x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y123abcEv,_ZThn4_N3ccc8CC5x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x3y123abcEv,_ZTv0_n20_N3ccc8CC5x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x3y12E[] = {
  {&(_ZTVN3ccc8CC5x3y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x3y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x3y12E[];
static VTBL_ENTRY alt_thunk_names21[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x3y123abcEv,_ZTv0_n20_N3ccc8CC5x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y123abcEv,_ZThn4_N3ccc8CC5x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x3y12E = {  "_ZN3ccc8CC5x3y12E", // class name
  bases__ZN3ccc8CC5x3y12E, 2,
  &(vtc__ZN3ccc8CC5x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x3y12E),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  DD5x3y12  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD5x3y123abcEv
  ~DD5x3y12(); // tgen
  DD5x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x3y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD5x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x3y123abcEv");}
ccc::DD5x3y12 ::~DD5x3y12(){ note_dtor("_ZN3ccc8DD5x3y12E", this);} // tgen
ccc::DD5x3y12 ::DD5x3y12(){ note_ctor("_ZN3ccc8DD5x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x3y12E, buf);
    ::ccc::DD5x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x3y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD5x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x3y12E);
    dp->::ccc::DD5x3y12::~DD5x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x3y12E(Test__ZN3ccc8DD5x3y12E, "_ZN3ccc8DD5x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x3y12C1Ev();
extern void _ZN3ccc8DD5x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x3y12E[] = {
  NSPAIR(_ZN3ccc8DD5x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x3y12D1Ev),
  {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__ZN3ccc8DD5x3y12E[] = {
  // 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 _ZTIN3ccc8DD5x3y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x3y123abcEv,_ZTv0_n20_N3ccc8DD5x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y123abcEv,_ZThn4_N3ccc8DD5x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x3y123abcEv,_ZTv0_n20_N3ccc8DD5x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x3y12E[] = {
  {&(_ZTVN3ccc8DD5x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x3y12E[];
static VTBL_ENTRY alt_thunk_names22[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x3y123abcEv,_ZTv0_n20_N3ccc8DD5x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y123abcEv,_ZThn4_N3ccc8DD5x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x3y12E = {  "_ZN3ccc8DD5x3y12E", // class name
  bases__ZN3ccc8DD5x3y12E, 2,
  &(vtc__ZN3ccc8DD5x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x3y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x3y12E),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  CC5x3y13  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC5x3y133efgEv
  ~CC5x3y13(); // tgen
  CC5x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x3y133efgEv");}
ccc::CC5x3y13 ::~CC5x3y13(){ note_dtor("_ZN3ccc8CC5x3y13E", this);} // tgen
ccc::CC5x3y13 ::CC5x3y13(){ note_ctor("_ZN3ccc8CC5x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x3y13E, buf);
    ::ccc::CC5x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x3y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC5x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x3y13E);
    dp->::ccc::CC5x3y13::~CC5x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x3y13E(Test__ZN3ccc8CC5x3y13E, "_ZN3ccc8CC5x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x3y13C1Ev();
extern void _ZN3ccc8CC5x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x3y13E[] = {
  NSPAIR(_ZN3ccc8CC5x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x3y13D1Ev),
  {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__ZN3ccc8CC5x3y13E[] = {
  // 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 _ZTIN3ccc8CC5x3y13E[];
extern void _ZN3ccc8CC5x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x3y133efgEv,_ZTv0_n16_N3ccc8CC5x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y133efgEv,_ZThn4_N3ccc8CC5x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x3y133efgEv,_ZTv0_n16_N3ccc8CC5x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x3y13E[] = {
  {&(_ZTVN3ccc8CC5x3y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x3y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x3y13E[];
static VTBL_ENTRY alt_thunk_names23[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x3y133efgEv,_ZTv0_n16_N3ccc8CC5x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y133efgEv,_ZThn4_N3ccc8CC5x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x3y13E = {  "_ZN3ccc8CC5x3y13E", // class name
  bases__ZN3ccc8CC5x3y13E, 2,
  &(vtc__ZN3ccc8CC5x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x3y13E),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  DD5x3y13  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD5x3y133efgEv
  ~DD5x3y13(); // tgen
  DD5x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x3y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x3y133efgEv");}
ccc::DD5x3y13 ::~DD5x3y13(){ note_dtor("_ZN3ccc8DD5x3y13E", this);} // tgen
ccc::DD5x3y13 ::DD5x3y13(){ note_ctor("_ZN3ccc8DD5x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x3y13E, buf);
    ::ccc::DD5x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x3y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD5x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x3y13E);
    dp->::ccc::DD5x3y13::~DD5x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x3y13E(Test__ZN3ccc8DD5x3y13E, "_ZN3ccc8DD5x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x3y13C1Ev();
extern void _ZN3ccc8DD5x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x3y13E[] = {
  NSPAIR(_ZN3ccc8DD5x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x3y13D1Ev),
  {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__ZN3ccc8DD5x3y13E[] = {
  // 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 _ZTIN3ccc8DD5x3y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x3y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x3y133efgEv,_ZTv0_n12_N3ccc8DD5x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y133efgEv,_ZThn4_N3ccc8DD5x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x3y133efgEv,_ZTv0_n12_N3ccc8DD5x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x3y13E[] = {
  {&(_ZTVN3ccc8DD5x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x3y13E[];
static VTBL_ENTRY alt_thunk_names24[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x3y133efgEv,_ZTv0_n12_N3ccc8DD5x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y133efgEv,_ZThn4_N3ccc8DD5x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x3y13E = {  "_ZN3ccc8DD5x3y13E", // class name
  bases__ZN3ccc8DD5x3y13E, 2,
  &(vtc__ZN3ccc8DD5x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x3y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x3y13E),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  CC5x3y14  : virtual ::ccc::AA5 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC5x3y143pqrEv
  ~CC5x3y14(); // tgen
  CC5x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x3y143pqrEv");}
ccc::CC5x3y14 ::~CC5x3y14(){ note_dtor("_ZN3ccc8CC5x3y14E", this);} // tgen
ccc::CC5x3y14 ::CC5x3y14(){ note_ctor("_ZN3ccc8CC5x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x3y14E, buf);
    ::ccc::CC5x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x3y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC5x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x3y14E);
    dp->::ccc::CC5x3y14::~CC5x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x3y14E(Test__ZN3ccc8CC5x3y14E, "_ZN3ccc8CC5x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x3y14C1Ev();
extern void _ZN3ccc8CC5x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x3y14E[] = {
  NSPAIR(_ZN3ccc8CC5x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x3y14D1Ev),
  {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__ZN3ccc8CC5x3y14E[] = {
  // 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 _ZTIN3ccc8CC5x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC5x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x3y143pqrEv,_ZTv0_n12_N3ccc8CC5x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x3y143pqrEv,_ZThn4_N3ccc8CC5x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x3y143pqrEv,_ZTv0_n12_N3ccc8CC5x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x3y14E[] = {
  {&(_ZTVN3ccc8CC5x3y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x3y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x3y14E[];
static VTBL_ENTRY alt_thunk_names25[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x3y143pqrEv,_ZTv0_n12_N3ccc8CC5x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x3y143pqrEv,_ZThn4_N3ccc8CC5x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x3y14E = {  "_ZN3ccc8CC5x3y14E", // class name
  bases__ZN3ccc8CC5x3y14E, 2,
  &(vtc__ZN3ccc8CC5x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x3y14E),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  DD5x3y14  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD5x3y143pqrEv
  ~DD5x3y14(); // tgen
  DD5x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x3y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD5x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x3y143pqrEv");}
ccc::DD5x3y14 ::~DD5x3y14(){ note_dtor("_ZN3ccc8DD5x3y14E", this);} // tgen
ccc::DD5x3y14 ::DD5x3y14(){ note_ctor("_ZN3ccc8DD5x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x3y14E, buf);
    ::ccc::DD5x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x3y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD5x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x3y14E);
    dp->::ccc::DD5x3y14::~DD5x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x3y14E(Test__ZN3ccc8DD5x3y14E, "_ZN3ccc8DD5x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x3y14C1Ev();
extern void _ZN3ccc8DD5x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x3y14E[] = {
  NSPAIR(_ZN3ccc8DD5x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x3y14D1Ev),
  {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__ZN3ccc8DD5x3y14E[] = {
  // 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 _ZTIN3ccc8DD5x3y14E[];
extern void _ZN3ccc8DD5x3y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x3y143pqrEv,_ZTv0_n16_N3ccc8DD5x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x3y143pqrEv,_ZThn4_N3ccc8DD5x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x3y143pqrEv,_ZTv0_n16_N3ccc8DD5x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x3y14E[] = {
  {&(_ZTVN3ccc8DD5x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x3y14E[];
static VTBL_ENTRY alt_thunk_names26[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x3y143pqrEv,_ZTv0_n16_N3ccc8DD5x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x3y143pqrEv,_ZThn4_N3ccc8DD5x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x3y14E = {  "_ZN3ccc8DD5x3y14E", // class name
  bases__ZN3ccc8DD5x3y14E, 2,
  &(vtc__ZN3ccc8DD5x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x3y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x3y14E),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  CC5x3y15  : virtual ::ccc::AA5 , ::ccc::BB3 {
  ~CC5x3y15(); // tgen
  CC5x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x3y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x3y15 ::~CC5x3y15(){ note_dtor("_ZN3ccc8CC5x3y15E", this);} // tgen
ccc::CC5x3y15 ::CC5x3y15(){ note_ctor("_ZN3ccc8CC5x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x3y15E, buf);
    ::ccc::CC5x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x3y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC5x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x3y15E);
    dp->::ccc::CC5x3y15::~CC5x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x3y15E(Test__ZN3ccc8CC5x3y15E, "_ZN3ccc8CC5x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x3y15C1Ev();
extern void _ZN3ccc8CC5x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x3y15E[] = {
  NSPAIR(_ZN3ccc8CC5x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x3y15D1Ev),
  {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__ZN3ccc8CC5x3y15E[] = {
  // 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 _ZTIN3ccc8CC5x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x3y15E[] = {
  {&(_ZTVN3ccc8CC5x3y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x3y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x3y15E[];
Class_Descriptor cd__ZN3ccc8CC5x3y15E = {  "_ZN3ccc8CC5x3y15E", // class name
  bases__ZN3ccc8CC5x3y15E, 2,
  &(vtc__ZN3ccc8CC5x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x3y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x3y15E),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  DD5x3y15  : virtual ::ccc::AA5 , virtual ::ccc::BB3 {
  ~DD5x3y15(); // tgen
  DD5x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x3y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD5x3y15 ::~DD5x3y15(){ note_dtor("_ZN3ccc8DD5x3y15E", this);} // tgen
ccc::DD5x3y15 ::DD5x3y15(){ note_ctor("_ZN3ccc8DD5x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x3y15E, buf);
    ::ccc::DD5x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x3y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD5x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x3y15E);
    dp->::ccc::DD5x3y15::~DD5x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x3y15E(Test__ZN3ccc8DD5x3y15E, "_ZN3ccc8DD5x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x3y15C1Ev();
extern void _ZN3ccc8DD5x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x3y15E[] = {
  NSPAIR(_ZN3ccc8DD5x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x3y15D1Ev),
  {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__ZN3ccc8DD5x3y15E[] = {
  // 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 _ZTIN3ccc8DD5x3y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x3y15E[] = {
  {&(_ZTVN3ccc8DD5x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x3y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x3y15E[];
Class_Descriptor cd__ZN3ccc8DD5x3y15E = {  "_ZN3ccc8DD5x3y15E", // class name
  bases__ZN3ccc8DD5x3y15E, 2,
  &(vtc__ZN3ccc8DD5x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x3y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x3y15E),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  CC5x4y0  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y03pqrEv
  ~CC5x4y0(); // tgen
  CC5x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y0E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y03abcEv");}
void  ccc::CC5x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y03efgEv");}
void  ccc::CC5x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y03pqrEv");}
ccc::CC5x4y0 ::~CC5x4y0(){ note_dtor("_ZN3ccc7CC5x4y0E", this);} // tgen
ccc::CC5x4y0 ::CC5x4y0(){ note_ctor("_ZN3ccc7CC5x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y0E, buf);
    ::ccc::CC5x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y0E);
    dp->::ccc::CC5x4y0::~CC5x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y0E(Test__ZN3ccc7CC5x4y0E, "_ZN3ccc7CC5x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y0C1Ev();
extern void _ZN3ccc7CC5x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y0E[] = {
  NSPAIR(_ZN3ccc7CC5x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y0E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y0E[];
extern void _ZN3ccc7CC5x4y03pqrEv();
extern void _ZN3ccc7CC5x4y03abcEv();
extern void _ZN3ccc7CC5x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y03pqrEv,_ZTv0_n12_N3ccc7CC5x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y03pqrEv,_ZThn4_N3ccc7CC5x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y03efgEv,_ZTv0_n16_N3ccc7CC5x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y03efgEv,_ZThn4_N3ccc7CC5x4y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y03abcEv,_ZTv0_n20_N3ccc7CC5x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y03abcEv,_ZThn4_N3ccc7CC5x4y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y03pqrEv,_ZTv0_n12_N3ccc7CC5x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y03efgEv,_ZTv0_n16_N3ccc7CC5x4y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y03abcEv,_ZTv0_n20_N3ccc7CC5x4y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y0E[] = {
  {&(_ZTVN3ccc7CC5x4y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y0E[];
static VTBL_ENTRY alt_thunk_names27[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y03abcEv,_ZTv0_n20_N3ccc7CC5x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y03abcEv,_ZThn4_N3ccc7CC5x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y03efgEv,_ZTv0_n16_N3ccc7CC5x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y03efgEv,_ZThn4_N3ccc7CC5x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y03pqrEv,_ZTv0_n12_N3ccc7CC5x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y03pqrEv,_ZThn4_N3ccc7CC5x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y0E = {  "_ZN3ccc7CC5x4y0E", // class name
  bases__ZN3ccc7CC5x4y0E, 2,
  &(vtc__ZN3ccc7CC5x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y0E),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  DD5x4y0  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD5x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x4y03pqrEv
  ~DD5x4y0(); // tgen
  DD5x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y03abcEv");}
void  ccc::DD5x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y03efgEv");}
void  ccc::DD5x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y03pqrEv");}
ccc::DD5x4y0 ::~DD5x4y0(){ note_dtor("_ZN3ccc7DD5x4y0E", this);} // tgen
ccc::DD5x4y0 ::DD5x4y0(){ note_ctor("_ZN3ccc7DD5x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y0E, buf);
    ::ccc::DD5x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y0E);
    dp->::ccc::DD5x4y0::~DD5x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y0E(Test__ZN3ccc7DD5x4y0E, "_ZN3ccc7DD5x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y0C1Ev();
extern void _ZN3ccc7DD5x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y0E[] = {
  NSPAIR(_ZN3ccc7DD5x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y0E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y0E[];
extern void _ZN3ccc7DD5x4y03pqrEv();
extern void _ZN3ccc7DD5x4y03efgEv();
extern void _ZN3ccc7DD5x4y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y03pqrEv,_ZTv0_n12_N3ccc7DD5x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y03pqrEv,_ZThn4_N3ccc7DD5x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y03abcEv,_ZTv0_n16_N3ccc7DD5x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y03abcEv,_ZThn4_N3ccc7DD5x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y03efgEv,_ZTv0_n20_N3ccc7DD5x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y03efgEv,_ZThn4_N3ccc7DD5x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y03pqrEv,_ZTv0_n12_N3ccc7DD5x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y03abcEv,_ZTv0_n16_N3ccc7DD5x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y03efgEv,_ZTv0_n20_N3ccc7DD5x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y0E[] = {
  {&(_ZTVN3ccc7DD5x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y0E[];
static VTBL_ENTRY alt_thunk_names28[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y03efgEv,_ZTv0_n20_N3ccc7DD5x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y03efgEv,_ZThn4_N3ccc7DD5x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y03abcEv,_ZTv0_n16_N3ccc7DD5x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y03abcEv,_ZThn4_N3ccc7DD5x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y03pqrEv,_ZTv0_n12_N3ccc7DD5x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y03pqrEv,_ZThn4_N3ccc7DD5x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y0E = {  "_ZN3ccc7DD5x4y0E", // class name
  bases__ZN3ccc7DD5x4y0E, 2,
  &(vtc__ZN3ccc7DD5x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y0E),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  CC5x4y1  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x4y13efgEv
  ~CC5x4y1(); // tgen
  CC5x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y1E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y13abcEv");}
void  ccc::CC5x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y13pqrEv");}
void  ccc::CC5x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y13efgEv");}
ccc::CC5x4y1 ::~CC5x4y1(){ note_dtor("_ZN3ccc7CC5x4y1E", this);} // tgen
ccc::CC5x4y1 ::CC5x4y1(){ note_ctor("_ZN3ccc7CC5x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y1E, buf);
    ::ccc::CC5x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y1E);
    dp->::ccc::CC5x4y1::~CC5x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y1E(Test__ZN3ccc7CC5x4y1E, "_ZN3ccc7CC5x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y1C1Ev();
extern void _ZN3ccc7CC5x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y1E[] = {
  NSPAIR(_ZN3ccc7CC5x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y1E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y1E[];
extern void _ZN3ccc7CC5x4y13pqrEv();
extern void _ZN3ccc7CC5x4y13abcEv();
extern void _ZN3ccc7CC5x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y13pqrEv,_ZTv0_n12_N3ccc7CC5x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y13pqrEv,_ZThn4_N3ccc7CC5x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y13efgEv,_ZTv0_n16_N3ccc7CC5x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y13efgEv,_ZThn4_N3ccc7CC5x4y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y13abcEv,_ZTv0_n20_N3ccc7CC5x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y13abcEv,_ZThn4_N3ccc7CC5x4y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y13pqrEv,_ZTv0_n12_N3ccc7CC5x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y13efgEv,_ZTv0_n16_N3ccc7CC5x4y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y13abcEv,_ZTv0_n20_N3ccc7CC5x4y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y1E[] = {
  {&(_ZTVN3ccc7CC5x4y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y1E[];
static VTBL_ENTRY alt_thunk_names29[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y13abcEv,_ZTv0_n20_N3ccc7CC5x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y13abcEv,_ZThn4_N3ccc7CC5x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y13efgEv,_ZTv0_n16_N3ccc7CC5x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y13efgEv,_ZThn4_N3ccc7CC5x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y13pqrEv,_ZTv0_n12_N3ccc7CC5x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y13pqrEv,_ZThn4_N3ccc7CC5x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y1E = {  "_ZN3ccc7CC5x4y1E", // class name
  bases__ZN3ccc7CC5x4y1E, 2,
  &(vtc__ZN3ccc7CC5x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y1E),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  DD5x4y1  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD5x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x4y13efgEv
  ~DD5x4y1(); // tgen
  DD5x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y13abcEv");}
void  ccc::DD5x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y13pqrEv");}
void  ccc::DD5x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y13efgEv");}
ccc::DD5x4y1 ::~DD5x4y1(){ note_dtor("_ZN3ccc7DD5x4y1E", this);} // tgen
ccc::DD5x4y1 ::DD5x4y1(){ note_ctor("_ZN3ccc7DD5x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y1E, buf);
    ::ccc::DD5x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y1E);
    dp->::ccc::DD5x4y1::~DD5x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y1E(Test__ZN3ccc7DD5x4y1E, "_ZN3ccc7DD5x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y1C1Ev();
extern void _ZN3ccc7DD5x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y1E[] = {
  NSPAIR(_ZN3ccc7DD5x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y1E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y1E[];
extern void _ZN3ccc7DD5x4y13pqrEv();
extern void _ZN3ccc7DD5x4y13efgEv();
extern void _ZN3ccc7DD5x4y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y13pqrEv,_ZTv0_n12_N3ccc7DD5x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y13pqrEv,_ZThn4_N3ccc7DD5x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y13abcEv,_ZTv0_n16_N3ccc7DD5x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y13abcEv,_ZThn4_N3ccc7DD5x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y13efgEv,_ZTv0_n20_N3ccc7DD5x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y13efgEv,_ZThn4_N3ccc7DD5x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y13pqrEv,_ZTv0_n12_N3ccc7DD5x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y13abcEv,_ZTv0_n16_N3ccc7DD5x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y13efgEv,_ZTv0_n20_N3ccc7DD5x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y1E[] = {
  {&(_ZTVN3ccc7DD5x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y1E[];
static VTBL_ENTRY alt_thunk_names30[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y13efgEv,_ZTv0_n20_N3ccc7DD5x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y13efgEv,_ZThn4_N3ccc7DD5x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y13abcEv,_ZTv0_n16_N3ccc7DD5x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y13abcEv,_ZThn4_N3ccc7DD5x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y13pqrEv,_ZTv0_n12_N3ccc7DD5x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y13pqrEv,_ZThn4_N3ccc7DD5x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y1E = {  "_ZN3ccc7DD5x4y1E", // class name
  bases__ZN3ccc7DD5x4y1E, 2,
  &(vtc__ZN3ccc7DD5x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y1E),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  CC5x4y2  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y23pqrEv
  ~CC5x4y2(); // tgen
  CC5x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y2E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y23efgEv");}
void  ccc::CC5x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y23abcEv");}
void  ccc::CC5x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y23pqrEv");}
ccc::CC5x4y2 ::~CC5x4y2(){ note_dtor("_ZN3ccc7CC5x4y2E", this);} // tgen
ccc::CC5x4y2 ::CC5x4y2(){ note_ctor("_ZN3ccc7CC5x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y2E, buf);
    ::ccc::CC5x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y2E);
    dp->::ccc::CC5x4y2::~CC5x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y2E(Test__ZN3ccc7CC5x4y2E, "_ZN3ccc7CC5x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y2C1Ev();
extern void _ZN3ccc7CC5x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y2E[] = {
  NSPAIR(_ZN3ccc7CC5x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y2E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y2E[];
extern void _ZN3ccc7CC5x4y23pqrEv();
extern void _ZN3ccc7CC5x4y23abcEv();
extern void _ZN3ccc7CC5x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y23pqrEv,_ZTv0_n12_N3ccc7CC5x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y23pqrEv,_ZThn4_N3ccc7CC5x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y23efgEv,_ZTv0_n16_N3ccc7CC5x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y23efgEv,_ZThn4_N3ccc7CC5x4y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y23abcEv,_ZTv0_n20_N3ccc7CC5x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y23abcEv,_ZThn4_N3ccc7CC5x4y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y23pqrEv,_ZTv0_n12_N3ccc7CC5x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y23efgEv,_ZTv0_n16_N3ccc7CC5x4y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y23abcEv,_ZTv0_n20_N3ccc7CC5x4y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y2E[] = {
  {&(_ZTVN3ccc7CC5x4y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y2E[];
static VTBL_ENTRY alt_thunk_names31[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y23abcEv,_ZTv0_n20_N3ccc7CC5x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y23abcEv,_ZThn4_N3ccc7CC5x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y23efgEv,_ZTv0_n16_N3ccc7CC5x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y23efgEv,_ZThn4_N3ccc7CC5x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y23pqrEv,_ZTv0_n12_N3ccc7CC5x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y23pqrEv,_ZThn4_N3ccc7CC5x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y2E = {  "_ZN3ccc7CC5x4y2E", // class name
  bases__ZN3ccc7CC5x4y2E, 2,
  &(vtc__ZN3ccc7CC5x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y2E),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  DD5x4y2  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD5x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x4y23pqrEv
  ~DD5x4y2(); // tgen
  DD5x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y23efgEv");}
void  ccc::DD5x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y23abcEv");}
void  ccc::DD5x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y23pqrEv");}
ccc::DD5x4y2 ::~DD5x4y2(){ note_dtor("_ZN3ccc7DD5x4y2E", this);} // tgen
ccc::DD5x4y2 ::DD5x4y2(){ note_ctor("_ZN3ccc7DD5x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y2E, buf);
    ::ccc::DD5x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y2E);
    dp->::ccc::DD5x4y2::~DD5x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y2E(Test__ZN3ccc7DD5x4y2E, "_ZN3ccc7DD5x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y2C1Ev();
extern void _ZN3ccc7DD5x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y2E[] = {
  NSPAIR(_ZN3ccc7DD5x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y2E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y2E[];
extern void _ZN3ccc7DD5x4y23pqrEv();
extern void _ZN3ccc7DD5x4y23efgEv();
extern void _ZN3ccc7DD5x4y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y23pqrEv,_ZTv0_n12_N3ccc7DD5x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y23pqrEv,_ZThn4_N3ccc7DD5x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y23abcEv,_ZTv0_n16_N3ccc7DD5x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y23abcEv,_ZThn4_N3ccc7DD5x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y23efgEv,_ZTv0_n20_N3ccc7DD5x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y23efgEv,_ZThn4_N3ccc7DD5x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y23pqrEv,_ZTv0_n12_N3ccc7DD5x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y23abcEv,_ZTv0_n16_N3ccc7DD5x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y23efgEv,_ZTv0_n20_N3ccc7DD5x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y2E[] = {
  {&(_ZTVN3ccc7DD5x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y2E[];
static VTBL_ENTRY alt_thunk_names32[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y23efgEv,_ZTv0_n20_N3ccc7DD5x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y23efgEv,_ZThn4_N3ccc7DD5x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y23abcEv,_ZTv0_n16_N3ccc7DD5x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y23abcEv,_ZThn4_N3ccc7DD5x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y23pqrEv,_ZTv0_n12_N3ccc7DD5x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y23pqrEv,_ZThn4_N3ccc7DD5x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y2E = {  "_ZN3ccc7DD5x4y2E", // class name
  bases__ZN3ccc7DD5x4y2E, 2,
  &(vtc__ZN3ccc7DD5x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y2E),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  CC5x4y3  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x4y33abcEv
  ~CC5x4y3(); // tgen
  CC5x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y3E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y33efgEv");}
void  ccc::CC5x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y33pqrEv");}
void  ccc::CC5x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y33abcEv");}
ccc::CC5x4y3 ::~CC5x4y3(){ note_dtor("_ZN3ccc7CC5x4y3E", this);} // tgen
ccc::CC5x4y3 ::CC5x4y3(){ note_ctor("_ZN3ccc7CC5x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y3E, buf);
    ::ccc::CC5x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y3E);
    dp->::ccc::CC5x4y3::~CC5x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y3E(Test__ZN3ccc7CC5x4y3E, "_ZN3ccc7CC5x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y3C1Ev();
extern void _ZN3ccc7CC5x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y3E[] = {
  NSPAIR(_ZN3ccc7CC5x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y3E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y3E[];
extern void _ZN3ccc7CC5x4y33pqrEv();
extern void _ZN3ccc7CC5x4y33abcEv();
extern void _ZN3ccc7CC5x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y33pqrEv,_ZTv0_n12_N3ccc7CC5x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y33pqrEv,_ZThn4_N3ccc7CC5x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y33efgEv,_ZTv0_n16_N3ccc7CC5x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y33efgEv,_ZThn4_N3ccc7CC5x4y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y33abcEv,_ZTv0_n20_N3ccc7CC5x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y33abcEv,_ZThn4_N3ccc7CC5x4y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y33pqrEv,_ZTv0_n12_N3ccc7CC5x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y33efgEv,_ZTv0_n16_N3ccc7CC5x4y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y33abcEv,_ZTv0_n20_N3ccc7CC5x4y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y3E[] = {
  {&(_ZTVN3ccc7CC5x4y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y3E[];
static VTBL_ENTRY alt_thunk_names33[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y33abcEv,_ZTv0_n20_N3ccc7CC5x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y33abcEv,_ZThn4_N3ccc7CC5x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y33efgEv,_ZTv0_n16_N3ccc7CC5x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y33efgEv,_ZThn4_N3ccc7CC5x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y33pqrEv,_ZTv0_n12_N3ccc7CC5x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y33pqrEv,_ZThn4_N3ccc7CC5x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y3E = {  "_ZN3ccc7CC5x4y3E", // class name
  bases__ZN3ccc7CC5x4y3E, 2,
  &(vtc__ZN3ccc7CC5x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y3E),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  DD5x4y3  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD5x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x4y33abcEv
  ~DD5x4y3(); // tgen
  DD5x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y33efgEv");}
void  ccc::DD5x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y33pqrEv");}
void  ccc::DD5x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y33abcEv");}
ccc::DD5x4y3 ::~DD5x4y3(){ note_dtor("_ZN3ccc7DD5x4y3E", this);} // tgen
ccc::DD5x4y3 ::DD5x4y3(){ note_ctor("_ZN3ccc7DD5x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y3E, buf);
    ::ccc::DD5x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y3E);
    dp->::ccc::DD5x4y3::~DD5x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y3E(Test__ZN3ccc7DD5x4y3E, "_ZN3ccc7DD5x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y3C1Ev();
extern void _ZN3ccc7DD5x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y3E[] = {
  NSPAIR(_ZN3ccc7DD5x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y3E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y3E[];
extern void _ZN3ccc7DD5x4y33pqrEv();
extern void _ZN3ccc7DD5x4y33efgEv();
extern void _ZN3ccc7DD5x4y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y33pqrEv,_ZTv0_n12_N3ccc7DD5x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y33pqrEv,_ZThn4_N3ccc7DD5x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y33abcEv,_ZTv0_n16_N3ccc7DD5x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y33abcEv,_ZThn4_N3ccc7DD5x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y33efgEv,_ZTv0_n20_N3ccc7DD5x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y33efgEv,_ZThn4_N3ccc7DD5x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y33pqrEv,_ZTv0_n12_N3ccc7DD5x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y33abcEv,_ZTv0_n16_N3ccc7DD5x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y33efgEv,_ZTv0_n20_N3ccc7DD5x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y3E[] = {
  {&(_ZTVN3ccc7DD5x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y3E[];
static VTBL_ENTRY alt_thunk_names34[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y33efgEv,_ZTv0_n20_N3ccc7DD5x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y33efgEv,_ZThn4_N3ccc7DD5x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y33abcEv,_ZTv0_n16_N3ccc7DD5x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y33abcEv,_ZThn4_N3ccc7DD5x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y33pqrEv,_ZTv0_n12_N3ccc7DD5x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y33pqrEv,_ZThn4_N3ccc7DD5x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y3E = {  "_ZN3ccc7DD5x4y3E", // class name
  bases__ZN3ccc7DD5x4y3E, 2,
  &(vtc__ZN3ccc7DD5x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y3E),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  CC5x4y4  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC5x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x4y43efgEv
  ~CC5x4y4(); // tgen
  CC5x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y4E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y43pqrEv");}
void  ccc::CC5x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y43abcEv");}
void  ccc::CC5x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y43efgEv");}
ccc::CC5x4y4 ::~CC5x4y4(){ note_dtor("_ZN3ccc7CC5x4y4E", this);} // tgen
ccc::CC5x4y4 ::CC5x4y4(){ note_ctor("_ZN3ccc7CC5x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y4E, buf);
    ::ccc::CC5x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y4E);
    dp->::ccc::CC5x4y4::~CC5x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y4E(Test__ZN3ccc7CC5x4y4E, "_ZN3ccc7CC5x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y4C1Ev();
extern void _ZN3ccc7CC5x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y4E[] = {
  NSPAIR(_ZN3ccc7CC5x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y4E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y4E[];
extern void _ZN3ccc7CC5x4y43pqrEv();
extern void _ZN3ccc7CC5x4y43abcEv();
extern void _ZN3ccc7CC5x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y43pqrEv,_ZTv0_n12_N3ccc7CC5x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y43pqrEv,_ZThn4_N3ccc7CC5x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y43efgEv,_ZTv0_n16_N3ccc7CC5x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y43efgEv,_ZThn4_N3ccc7CC5x4y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y43abcEv,_ZTv0_n20_N3ccc7CC5x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y43abcEv,_ZThn4_N3ccc7CC5x4y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y43pqrEv,_ZTv0_n12_N3ccc7CC5x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y43efgEv,_ZTv0_n16_N3ccc7CC5x4y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y43abcEv,_ZTv0_n20_N3ccc7CC5x4y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y4E[] = {
  {&(_ZTVN3ccc7CC5x4y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y4E[];
static VTBL_ENTRY alt_thunk_names35[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y43abcEv,_ZTv0_n20_N3ccc7CC5x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y43abcEv,_ZThn4_N3ccc7CC5x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y43efgEv,_ZTv0_n16_N3ccc7CC5x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y43efgEv,_ZThn4_N3ccc7CC5x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y43pqrEv,_ZTv0_n12_N3ccc7CC5x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y43pqrEv,_ZThn4_N3ccc7CC5x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y4E = {  "_ZN3ccc7CC5x4y4E", // class name
  bases__ZN3ccc7CC5x4y4E, 2,
  &(vtc__ZN3ccc7CC5x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y4E),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  DD5x4y4  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD5x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x4y43efgEv
  ~DD5x4y4(); // tgen
  DD5x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y43pqrEv");}
void  ccc::DD5x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y43abcEv");}
void  ccc::DD5x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y43efgEv");}
ccc::DD5x4y4 ::~DD5x4y4(){ note_dtor("_ZN3ccc7DD5x4y4E", this);} // tgen
ccc::DD5x4y4 ::DD5x4y4(){ note_ctor("_ZN3ccc7DD5x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y4E, buf);
    ::ccc::DD5x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y4E);
    dp->::ccc::DD5x4y4::~DD5x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y4E(Test__ZN3ccc7DD5x4y4E, "_ZN3ccc7DD5x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y4C1Ev();
extern void _ZN3ccc7DD5x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y4E[] = {
  NSPAIR(_ZN3ccc7DD5x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y4E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y4E[];
extern void _ZN3ccc7DD5x4y43pqrEv();
extern void _ZN3ccc7DD5x4y43efgEv();
extern void _ZN3ccc7DD5x4y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y43pqrEv,_ZTv0_n12_N3ccc7DD5x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y43pqrEv,_ZThn4_N3ccc7DD5x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y43abcEv,_ZTv0_n16_N3ccc7DD5x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y43abcEv,_ZThn4_N3ccc7DD5x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y43efgEv,_ZTv0_n20_N3ccc7DD5x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y43efgEv,_ZThn4_N3ccc7DD5x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y43pqrEv,_ZTv0_n12_N3ccc7DD5x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y43abcEv,_ZTv0_n16_N3ccc7DD5x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y43efgEv,_ZTv0_n20_N3ccc7DD5x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y4E[] = {
  {&(_ZTVN3ccc7DD5x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y4E[];
static VTBL_ENTRY alt_thunk_names36[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y43efgEv,_ZTv0_n20_N3ccc7DD5x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y43efgEv,_ZThn4_N3ccc7DD5x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y43abcEv,_ZTv0_n16_N3ccc7DD5x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y43abcEv,_ZThn4_N3ccc7DD5x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y43pqrEv,_ZTv0_n12_N3ccc7DD5x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y43pqrEv,_ZThn4_N3ccc7DD5x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y4E = {  "_ZN3ccc7DD5x4y4E", // class name
  bases__ZN3ccc7DD5x4y4E, 2,
  &(vtc__ZN3ccc7DD5x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y4E),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  CC5x4y5  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC5x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x4y53abcEv
  ~CC5x4y5(); // tgen
  CC5x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y5E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y53pqrEv");}
void  ccc::CC5x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y53efgEv");}
void  ccc::CC5x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y53abcEv");}
ccc::CC5x4y5 ::~CC5x4y5(){ note_dtor("_ZN3ccc7CC5x4y5E", this);} // tgen
ccc::CC5x4y5 ::CC5x4y5(){ note_ctor("_ZN3ccc7CC5x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y5E, buf);
    ::ccc::CC5x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y5E);
    dp->::ccc::CC5x4y5::~CC5x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y5E(Test__ZN3ccc7CC5x4y5E, "_ZN3ccc7CC5x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y5C1Ev();
extern void _ZN3ccc7CC5x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y5E[] = {
  NSPAIR(_ZN3ccc7CC5x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y5E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y5E[];
extern void _ZN3ccc7CC5x4y53pqrEv();
extern void _ZN3ccc7CC5x4y53abcEv();
extern void _ZN3ccc7CC5x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y53pqrEv,_ZTv0_n12_N3ccc7CC5x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y53pqrEv,_ZThn4_N3ccc7CC5x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y53efgEv,_ZTv0_n16_N3ccc7CC5x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y53efgEv,_ZThn4_N3ccc7CC5x4y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y53abcEv,_ZTv0_n20_N3ccc7CC5x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y53abcEv,_ZThn4_N3ccc7CC5x4y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y53pqrEv,_ZTv0_n12_N3ccc7CC5x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y53efgEv,_ZTv0_n16_N3ccc7CC5x4y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y53abcEv,_ZTv0_n20_N3ccc7CC5x4y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y5E[] = {
  {&(_ZTVN3ccc7CC5x4y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y5E[];
static VTBL_ENTRY alt_thunk_names37[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y53abcEv,_ZTv0_n20_N3ccc7CC5x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y53abcEv,_ZThn4_N3ccc7CC5x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y53efgEv,_ZTv0_n16_N3ccc7CC5x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y53efgEv,_ZThn4_N3ccc7CC5x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y53pqrEv,_ZTv0_n12_N3ccc7CC5x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y53pqrEv,_ZThn4_N3ccc7CC5x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y5E = {  "_ZN3ccc7CC5x4y5E", // class name
  bases__ZN3ccc7CC5x4y5E, 2,
  &(vtc__ZN3ccc7CC5x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y5E),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  DD5x4y5  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD5x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x4y53abcEv
  ~DD5x4y5(); // tgen
  DD5x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y53pqrEv");}
void  ccc::DD5x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y53efgEv");}
void  ccc::DD5x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y53abcEv");}
ccc::DD5x4y5 ::~DD5x4y5(){ note_dtor("_ZN3ccc7DD5x4y5E", this);} // tgen
ccc::DD5x4y5 ::DD5x4y5(){ note_ctor("_ZN3ccc7DD5x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y5E, buf);
    ::ccc::DD5x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y5E);
    dp->::ccc::DD5x4y5::~DD5x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y5E(Test__ZN3ccc7DD5x4y5E, "_ZN3ccc7DD5x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y5C1Ev();
extern void _ZN3ccc7DD5x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y5E[] = {
  NSPAIR(_ZN3ccc7DD5x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y5E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y5E[];
extern void _ZN3ccc7DD5x4y53pqrEv();
extern void _ZN3ccc7DD5x4y53efgEv();
extern void _ZN3ccc7DD5x4y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y53pqrEv,_ZTv0_n12_N3ccc7DD5x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y53pqrEv,_ZThn4_N3ccc7DD5x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y53abcEv,_ZTv0_n16_N3ccc7DD5x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y53abcEv,_ZThn4_N3ccc7DD5x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y53efgEv,_ZTv0_n20_N3ccc7DD5x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y53efgEv,_ZThn4_N3ccc7DD5x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y53pqrEv,_ZTv0_n12_N3ccc7DD5x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y53abcEv,_ZTv0_n16_N3ccc7DD5x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y53efgEv,_ZTv0_n20_N3ccc7DD5x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y5E[] = {
  {&(_ZTVN3ccc7DD5x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y5E[];
static VTBL_ENTRY alt_thunk_names38[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y53efgEv,_ZTv0_n20_N3ccc7DD5x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y53efgEv,_ZThn4_N3ccc7DD5x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y53abcEv,_ZTv0_n16_N3ccc7DD5x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y53abcEv,_ZThn4_N3ccc7DD5x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y53pqrEv,_ZTv0_n12_N3ccc7DD5x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y53pqrEv,_ZThn4_N3ccc7DD5x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y5E = {  "_ZN3ccc7DD5x4y5E", // class name
  bases__ZN3ccc7DD5x4y5E, 2,
  &(vtc__ZN3ccc7DD5x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y5E),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  CC5x4y6  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x4y63efgEv
  ~CC5x4y6(); // tgen
  CC5x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y6E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y63abcEv");}
void  ccc::CC5x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y63efgEv");}
ccc::CC5x4y6 ::~CC5x4y6(){ note_dtor("_ZN3ccc7CC5x4y6E", this);} // tgen
ccc::CC5x4y6 ::CC5x4y6(){ note_ctor("_ZN3ccc7CC5x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y6E, buf);
    ::ccc::CC5x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y6E);
    dp->::ccc::CC5x4y6::~CC5x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y6E(Test__ZN3ccc7CC5x4y6E, "_ZN3ccc7CC5x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y6C1Ev();
extern void _ZN3ccc7CC5x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y6E[] = {
  NSPAIR(_ZN3ccc7CC5x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y6E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC5x4y63abcEv();
extern void _ZN3ccc7CC5x4y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y63efgEv,_ZTv0_n16_N3ccc7CC5x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y63efgEv,_ZThn4_N3ccc7CC5x4y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y63abcEv,_ZTv0_n20_N3ccc7CC5x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y63abcEv,_ZThn4_N3ccc7CC5x4y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y63efgEv,_ZTv0_n16_N3ccc7CC5x4y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y63abcEv,_ZTv0_n20_N3ccc7CC5x4y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y6E[] = {
  {&(_ZTVN3ccc7CC5x4y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y6E[];
static VTBL_ENTRY alt_thunk_names39[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y63abcEv,_ZTv0_n20_N3ccc7CC5x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y63abcEv,_ZThn4_N3ccc7CC5x4y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y63efgEv,_ZTv0_n16_N3ccc7CC5x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y63efgEv,_ZThn4_N3ccc7CC5x4y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y6E = {  "_ZN3ccc7CC5x4y6E", // class name
  bases__ZN3ccc7CC5x4y6E, 2,
  &(vtc__ZN3ccc7CC5x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y6E),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  DD5x4y6  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD5x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x4y63efgEv
  ~DD5x4y6(); // tgen
  DD5x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y63abcEv");}
void  ccc::DD5x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y63efgEv");}
ccc::DD5x4y6 ::~DD5x4y6(){ note_dtor("_ZN3ccc7DD5x4y6E", this);} // tgen
ccc::DD5x4y6 ::DD5x4y6(){ note_ctor("_ZN3ccc7DD5x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y6E, buf);
    ::ccc::DD5x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y6E);
    dp->::ccc::DD5x4y6::~DD5x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y6E(Test__ZN3ccc7DD5x4y6E, "_ZN3ccc7DD5x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y6C1Ev();
extern void _ZN3ccc7DD5x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y6E[] = {
  NSPAIR(_ZN3ccc7DD5x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y6E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x4y63efgEv();
extern void _ZN3ccc7DD5x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y63abcEv,_ZTv0_n16_N3ccc7DD5x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y63abcEv,_ZThn4_N3ccc7DD5x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y63efgEv,_ZTv0_n20_N3ccc7DD5x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y63efgEv,_ZThn4_N3ccc7DD5x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y63abcEv,_ZTv0_n16_N3ccc7DD5x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y63efgEv,_ZTv0_n20_N3ccc7DD5x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y6E[] = {
  {&(_ZTVN3ccc7DD5x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y6E[];
static VTBL_ENTRY alt_thunk_names40[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y63efgEv,_ZTv0_n20_N3ccc7DD5x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y63efgEv,_ZThn4_N3ccc7DD5x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y63abcEv,_ZTv0_n16_N3ccc7DD5x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y63abcEv,_ZThn4_N3ccc7DD5x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y6E = {  "_ZN3ccc7DD5x4y6E", // class name
  bases__ZN3ccc7DD5x4y6E, 2,
  &(vtc__ZN3ccc7DD5x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y6E),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  CC5x4y7  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC5x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y73pqrEv
  ~CC5x4y7(); // tgen
  CC5x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y7E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y73abcEv");}
void  ccc::CC5x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y73pqrEv");}
ccc::CC5x4y7 ::~CC5x4y7(){ note_dtor("_ZN3ccc7CC5x4y7E", this);} // tgen
ccc::CC5x4y7 ::CC5x4y7(){ note_ctor("_ZN3ccc7CC5x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y7E, buf);
    ::ccc::CC5x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y7E);
    dp->::ccc::CC5x4y7::~CC5x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y7E(Test__ZN3ccc7CC5x4y7E, "_ZN3ccc7CC5x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y7C1Ev();
extern void _ZN3ccc7CC5x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y7E[] = {
  NSPAIR(_ZN3ccc7CC5x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y7E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y7E[];
extern void _ZN3ccc7CC5x4y73pqrEv();
extern void _ZN3ccc7CC5x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y73pqrEv,_ZTv0_n12_N3ccc7CC5x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y73pqrEv,_ZThn4_N3ccc7CC5x4y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y73abcEv,_ZTv0_n20_N3ccc7CC5x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y73abcEv,_ZThn4_N3ccc7CC5x4y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y73pqrEv,_ZTv0_n12_N3ccc7CC5x4y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y73abcEv,_ZTv0_n20_N3ccc7CC5x4y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y7E[] = {
  {&(_ZTVN3ccc7CC5x4y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y7E[];
static VTBL_ENTRY alt_thunk_names41[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y73abcEv,_ZTv0_n20_N3ccc7CC5x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y73abcEv,_ZThn4_N3ccc7CC5x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y73pqrEv,_ZTv0_n12_N3ccc7CC5x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y73pqrEv,_ZThn4_N3ccc7CC5x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y7E = {  "_ZN3ccc7CC5x4y7E", // class name
  bases__ZN3ccc7CC5x4y7E, 2,
  &(vtc__ZN3ccc7CC5x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y7E),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  DD5x4y7  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD5x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x4y73pqrEv
  ~DD5x4y7(); // tgen
  DD5x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y73abcEv");}
void  ccc::DD5x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y73pqrEv");}
ccc::DD5x4y7 ::~DD5x4y7(){ note_dtor("_ZN3ccc7DD5x4y7E", this);} // tgen
ccc::DD5x4y7 ::DD5x4y7(){ note_ctor("_ZN3ccc7DD5x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y7E, buf);
    ::ccc::DD5x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y7E);
    dp->::ccc::DD5x4y7::~DD5x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y7E(Test__ZN3ccc7DD5x4y7E, "_ZN3ccc7DD5x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y7C1Ev();
extern void _ZN3ccc7DD5x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y7E[] = {
  NSPAIR(_ZN3ccc7DD5x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y7E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y7E[];
extern void _ZN3ccc7DD5x4y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x4y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y73pqrEv,_ZTv0_n12_N3ccc7DD5x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y73pqrEv,_ZThn4_N3ccc7DD5x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y73abcEv,_ZTv0_n16_N3ccc7DD5x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y73abcEv,_ZThn4_N3ccc7DD5x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y73pqrEv,_ZTv0_n12_N3ccc7DD5x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y73abcEv,_ZTv0_n16_N3ccc7DD5x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y7E[] = {
  {&(_ZTVN3ccc7DD5x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y7E[];
static VTBL_ENTRY alt_thunk_names42[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y73abcEv,_ZTv0_n16_N3ccc7DD5x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y73abcEv,_ZThn4_N3ccc7DD5x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y73pqrEv,_ZTv0_n12_N3ccc7DD5x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y73pqrEv,_ZThn4_N3ccc7DD5x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y7E = {  "_ZN3ccc7DD5x4y7E", // class name
  bases__ZN3ccc7DD5x4y7E, 2,
  &(vtc__ZN3ccc7DD5x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y7E),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  CC5x4y8  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x4y83abcEv
  ~CC5x4y8(); // tgen
  CC5x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y8E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y83efgEv");}
void  ccc::CC5x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x4y83abcEv");}
ccc::CC5x4y8 ::~CC5x4y8(){ note_dtor("_ZN3ccc7CC5x4y8E", this);} // tgen
ccc::CC5x4y8 ::CC5x4y8(){ note_ctor("_ZN3ccc7CC5x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y8E, buf);
    ::ccc::CC5x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y8E);
    dp->::ccc::CC5x4y8::~CC5x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y8E(Test__ZN3ccc7CC5x4y8E, "_ZN3ccc7CC5x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y8C1Ev();
extern void _ZN3ccc7CC5x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y8E[] = {
  NSPAIR(_ZN3ccc7CC5x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y8E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC5x4y83abcEv();
extern void _ZN3ccc7CC5x4y83efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y83efgEv,_ZTv0_n16_N3ccc7CC5x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y83efgEv,_ZThn4_N3ccc7CC5x4y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x4y83abcEv,_ZTv0_n20_N3ccc7CC5x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y83abcEv,_ZThn4_N3ccc7CC5x4y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y83efgEv,_ZTv0_n16_N3ccc7CC5x4y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x4y83abcEv,_ZTv0_n20_N3ccc7CC5x4y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y8E[] = {
  {&(_ZTVN3ccc7CC5x4y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y8E[];
static VTBL_ENTRY alt_thunk_names43[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x4y83abcEv,_ZTv0_n20_N3ccc7CC5x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y83abcEv,_ZThn4_N3ccc7CC5x4y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y83efgEv,_ZTv0_n16_N3ccc7CC5x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y83efgEv,_ZThn4_N3ccc7CC5x4y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y8E = {  "_ZN3ccc7CC5x4y8E", // class name
  bases__ZN3ccc7CC5x4y8E, 2,
  &(vtc__ZN3ccc7CC5x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y8E),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  DD5x4y8  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD5x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x4y83abcEv
  ~DD5x4y8(); // tgen
  DD5x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y83efgEv");}
void  ccc::DD5x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x4y83abcEv");}
ccc::DD5x4y8 ::~DD5x4y8(){ note_dtor("_ZN3ccc7DD5x4y8E", this);} // tgen
ccc::DD5x4y8 ::DD5x4y8(){ note_ctor("_ZN3ccc7DD5x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y8E, buf);
    ::ccc::DD5x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y8E);
    dp->::ccc::DD5x4y8::~DD5x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y8E(Test__ZN3ccc7DD5x4y8E, "_ZN3ccc7DD5x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y8C1Ev();
extern void _ZN3ccc7DD5x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y8E[] = {
  NSPAIR(_ZN3ccc7DD5x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y8E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x4y83efgEv();
extern void _ZN3ccc7DD5x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x4y83abcEv,_ZTv0_n16_N3ccc7DD5x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y83abcEv,_ZThn4_N3ccc7DD5x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y83efgEv,_ZTv0_n20_N3ccc7DD5x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y83efgEv,_ZThn4_N3ccc7DD5x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x4y83abcEv,_ZTv0_n16_N3ccc7DD5x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y83efgEv,_ZTv0_n20_N3ccc7DD5x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y8E[] = {
  {&(_ZTVN3ccc7DD5x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y8E[];
static VTBL_ENTRY alt_thunk_names44[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y83efgEv,_ZTv0_n20_N3ccc7DD5x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y83efgEv,_ZThn4_N3ccc7DD5x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x4y83abcEv,_ZTv0_n16_N3ccc7DD5x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y83abcEv,_ZThn4_N3ccc7DD5x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y8E = {  "_ZN3ccc7DD5x4y8E", // class name
  bases__ZN3ccc7DD5x4y8E, 2,
  &(vtc__ZN3ccc7DD5x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y8E),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  CC5x4y9  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC5x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x4y93pqrEv
  ~CC5x4y9(); // tgen
  CC5x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x4y9E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x4y93efgEv");}
void  ccc::CC5x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x4y93pqrEv");}
ccc::CC5x4y9 ::~CC5x4y9(){ note_dtor("_ZN3ccc7CC5x4y9E", this);} // tgen
ccc::CC5x4y9 ::CC5x4y9(){ note_ctor("_ZN3ccc7CC5x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x4y9E, buf);
    ::ccc::CC5x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x4y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC5x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x4y9E);
    dp->::ccc::CC5x4y9::~CC5x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x4y9E(Test__ZN3ccc7CC5x4y9E, "_ZN3ccc7CC5x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x4y9C1Ev();
extern void _ZN3ccc7CC5x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x4y9E[] = {
  NSPAIR(_ZN3ccc7CC5x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC5x4y9E[] = {
  // 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__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 _ZTIN3ccc7CC5x4y9E[];
extern void _ZN3ccc7CC5x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC5x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x4y93pqrEv,_ZTv0_n12_N3ccc7CC5x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y93pqrEv,_ZThn4_N3ccc7CC5x4y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x4y93efgEv,_ZTv0_n16_N3ccc7CC5x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x4y93efgEv,_ZThn4_N3ccc7CC5x4y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x4y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x4y93pqrEv,_ZTv0_n12_N3ccc7CC5x4y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x4y93efgEv,_ZTv0_n16_N3ccc7CC5x4y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x4y9E[] = {
  {&(_ZTVN3ccc7CC5x4y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x4y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x4y9E[];
static VTBL_ENTRY alt_thunk_names45[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x4y93efgEv,_ZTv0_n16_N3ccc7CC5x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y93efgEv,_ZThn4_N3ccc7CC5x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x4y93pqrEv,_ZTv0_n12_N3ccc7CC5x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x4y93pqrEv,_ZThn4_N3ccc7CC5x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x4y9E = {  "_ZN3ccc7CC5x4y9E", // class name
  bases__ZN3ccc7CC5x4y9E, 2,
  &(vtc__ZN3ccc7CC5x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x4y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x4y9E),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  DD5x4y9  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD5x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x4y93pqrEv
  ~DD5x4y9(); // tgen
  DD5x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x4y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x4y93efgEv");}
void  ccc::DD5x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x4y93pqrEv");}
ccc::DD5x4y9 ::~DD5x4y9(){ note_dtor("_ZN3ccc7DD5x4y9E", this);} // tgen
ccc::DD5x4y9 ::DD5x4y9(){ note_ctor("_ZN3ccc7DD5x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x4y9E, buf);
    ::ccc::DD5x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x4y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD5x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x4y9E);
    dp->::ccc::DD5x4y9::~DD5x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x4y9E(Test__ZN3ccc7DD5x4y9E, "_ZN3ccc7DD5x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x4y9C1Ev();
extern void _ZN3ccc7DD5x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x4y9E[] = {
  NSPAIR(_ZN3ccc7DD5x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD5x4y9E[] = {
  // 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__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 _ZTIN3ccc7DD5x4y9E[];
extern void _ZN3ccc7DD5x4y93pqrEv();
extern void _ZN3ccc7DD5x4y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x4y93pqrEv,_ZTv0_n12_N3ccc7DD5x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y93pqrEv,_ZThn4_N3ccc7DD5x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x4y93efgEv,_ZTv0_n20_N3ccc7DD5x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x4y93efgEv,_ZThn4_N3ccc7DD5x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x4y93pqrEv,_ZTv0_n12_N3ccc7DD5x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x4y93efgEv,_ZTv0_n20_N3ccc7DD5x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x4y9E[] = {
  {&(_ZTVN3ccc7DD5x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x4y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x4y9E[];
static VTBL_ENTRY alt_thunk_names46[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x4y93efgEv,_ZTv0_n20_N3ccc7DD5x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y93efgEv,_ZThn4_N3ccc7DD5x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x4y93pqrEv,_ZTv0_n12_N3ccc7DD5x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x4y93pqrEv,_ZThn4_N3ccc7DD5x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x4y9E = {  "_ZN3ccc7DD5x4y9E", // class name
  bases__ZN3ccc7DD5x4y9E, 2,
  &(vtc__ZN3ccc7DD5x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x4y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x4y9E),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  CC5x4y10  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC5x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x4y103abcEv
  ~CC5x4y10(); // tgen
  CC5x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y10E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x4y103pqrEv");}
void  ccc::CC5x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x4y103abcEv");}
ccc::CC5x4y10 ::~CC5x4y10(){ note_dtor("_ZN3ccc8CC5x4y10E", this);} // tgen
ccc::CC5x4y10 ::CC5x4y10(){ note_ctor("_ZN3ccc8CC5x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x4y10E, buf);
    ::ccc::CC5x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x4y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC5x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x4y10E);
    dp->::ccc::CC5x4y10::~CC5x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x4y10E(Test__ZN3ccc8CC5x4y10E, "_ZN3ccc8CC5x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x4y10C1Ev();
extern void _ZN3ccc8CC5x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x4y10E[] = {
  NSPAIR(_ZN3ccc8CC5x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC5x4y10E[] = {
  // 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__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 _ZTIN3ccc8CC5x4y10E[];
extern void _ZN3ccc8CC5x4y103pqrEv();
extern void _ZN3ccc8CC5x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x4y103pqrEv,_ZTv0_n12_N3ccc8CC5x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y103pqrEv,_ZThn4_N3ccc8CC5x4y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x4y103abcEv,_ZTv0_n20_N3ccc8CC5x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y103abcEv,_ZThn4_N3ccc8CC5x4y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x4y103pqrEv,_ZTv0_n12_N3ccc8CC5x4y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x4y103abcEv,_ZTv0_n20_N3ccc8CC5x4y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x4y10E[] = {
  {&(_ZTVN3ccc8CC5x4y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x4y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x4y10E[];
static VTBL_ENTRY alt_thunk_names47[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x4y103abcEv,_ZTv0_n20_N3ccc8CC5x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y103abcEv,_ZThn4_N3ccc8CC5x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x4y103pqrEv,_ZTv0_n12_N3ccc8CC5x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y103pqrEv,_ZThn4_N3ccc8CC5x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x4y10E = {  "_ZN3ccc8CC5x4y10E", // class name
  bases__ZN3ccc8CC5x4y10E, 2,
  &(vtc__ZN3ccc8CC5x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x4y10E),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  DD5x4y10  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD5x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x4y103abcEv
  ~DD5x4y10(); // tgen
  DD5x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x4y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x4y103pqrEv");}
void  ccc::DD5x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x4y103abcEv");}
ccc::DD5x4y10 ::~DD5x4y10(){ note_dtor("_ZN3ccc8DD5x4y10E", this);} // tgen
ccc::DD5x4y10 ::DD5x4y10(){ note_ctor("_ZN3ccc8DD5x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x4y10E, buf);
    ::ccc::DD5x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x4y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD5x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x4y10E);
    dp->::ccc::DD5x4y10::~DD5x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x4y10E(Test__ZN3ccc8DD5x4y10E, "_ZN3ccc8DD5x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x4y10C1Ev();
extern void _ZN3ccc8DD5x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x4y10E[] = {
  NSPAIR(_ZN3ccc8DD5x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD5x4y10E[] = {
  // 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__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 _ZTIN3ccc8DD5x4y10E[];
extern void _ZN3ccc8DD5x4y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x4y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x4y103pqrEv,_ZTv0_n12_N3ccc8DD5x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y103pqrEv,_ZThn4_N3ccc8DD5x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x4y103abcEv,_ZTv0_n16_N3ccc8DD5x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y103abcEv,_ZThn4_N3ccc8DD5x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x4y103pqrEv,_ZTv0_n12_N3ccc8DD5x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x4y103abcEv,_ZTv0_n16_N3ccc8DD5x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x4y10E[] = {
  {&(_ZTVN3ccc8DD5x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x4y10E[];
static VTBL_ENTRY alt_thunk_names48[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x4y103abcEv,_ZTv0_n16_N3ccc8DD5x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y103abcEv,_ZThn4_N3ccc8DD5x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x4y103pqrEv,_ZTv0_n12_N3ccc8DD5x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y103pqrEv,_ZThn4_N3ccc8DD5x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x4y10E = {  "_ZN3ccc8DD5x4y10E", // class name
  bases__ZN3ccc8DD5x4y10E, 2,
  &(vtc__ZN3ccc8DD5x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x4y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x4y10E),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  CC5x4y11  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC5x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x4y113efgEv
  ~CC5x4y11(); // tgen
  CC5x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y11E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x4y113pqrEv");}
void  ccc::CC5x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x4y113efgEv");}
ccc::CC5x4y11 ::~CC5x4y11(){ note_dtor("_ZN3ccc8CC5x4y11E", this);} // tgen
ccc::CC5x4y11 ::CC5x4y11(){ note_ctor("_ZN3ccc8CC5x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x4y11E, buf);
    ::ccc::CC5x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x4y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC5x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x4y11E);
    dp->::ccc::CC5x4y11::~CC5x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x4y11E(Test__ZN3ccc8CC5x4y11E, "_ZN3ccc8CC5x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x4y11C1Ev();
extern void _ZN3ccc8CC5x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x4y11E[] = {
  NSPAIR(_ZN3ccc8CC5x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC5x4y11E[] = {
  // 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__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 _ZTIN3ccc8CC5x4y11E[];
extern void _ZN3ccc8CC5x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC5x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x4y113pqrEv,_ZTv0_n12_N3ccc8CC5x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y113pqrEv,_ZThn4_N3ccc8CC5x4y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x4y113efgEv,_ZTv0_n16_N3ccc8CC5x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y113efgEv,_ZThn4_N3ccc8CC5x4y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x4y113pqrEv,_ZTv0_n12_N3ccc8CC5x4y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x4y113efgEv,_ZTv0_n16_N3ccc8CC5x4y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x4y11E[] = {
  {&(_ZTVN3ccc8CC5x4y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x4y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x4y11E[];
static VTBL_ENTRY alt_thunk_names49[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x4y113efgEv,_ZTv0_n16_N3ccc8CC5x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y113efgEv,_ZThn4_N3ccc8CC5x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x4y113pqrEv,_ZTv0_n12_N3ccc8CC5x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y113pqrEv,_ZThn4_N3ccc8CC5x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x4y11E = {  "_ZN3ccc8CC5x4y11E", // class name
  bases__ZN3ccc8CC5x4y11E, 2,
  &(vtc__ZN3ccc8CC5x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x4y11E),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  DD5x4y11  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD5x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x4y113efgEv
  ~DD5x4y11(); // tgen
  DD5x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x4y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x4y113pqrEv");}
void  ccc::DD5x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x4y113efgEv");}
ccc::DD5x4y11 ::~DD5x4y11(){ note_dtor("_ZN3ccc8DD5x4y11E", this);} // tgen
ccc::DD5x4y11 ::DD5x4y11(){ note_ctor("_ZN3ccc8DD5x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x4y11E, buf);
    ::ccc::DD5x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x4y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD5x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x4y11E);
    dp->::ccc::DD5x4y11::~DD5x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x4y11E(Test__ZN3ccc8DD5x4y11E, "_ZN3ccc8DD5x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x4y11C1Ev();
extern void _ZN3ccc8DD5x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x4y11E[] = {
  NSPAIR(_ZN3ccc8DD5x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD5x4y11E[] = {
  // 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__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 _ZTIN3ccc8DD5x4y11E[];
extern void _ZN3ccc8DD5x4y113pqrEv();
extern void _ZN3ccc8DD5x4y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x4y113pqrEv,_ZTv0_n12_N3ccc8DD5x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y113pqrEv,_ZThn4_N3ccc8DD5x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x4y113efgEv,_ZTv0_n20_N3ccc8DD5x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y113efgEv,_ZThn4_N3ccc8DD5x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x4y113pqrEv,_ZTv0_n12_N3ccc8DD5x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x4y113efgEv,_ZTv0_n20_N3ccc8DD5x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x4y11E[] = {
  {&(_ZTVN3ccc8DD5x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x4y11E[];
static VTBL_ENTRY alt_thunk_names50[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x4y113efgEv,_ZTv0_n20_N3ccc8DD5x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y113efgEv,_ZThn4_N3ccc8DD5x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x4y113pqrEv,_ZTv0_n12_N3ccc8DD5x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y113pqrEv,_ZThn4_N3ccc8DD5x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x4y11E = {  "_ZN3ccc8DD5x4y11E", // class name
  bases__ZN3ccc8DD5x4y11E, 2,
  &(vtc__ZN3ccc8DD5x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x4y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x4y11E),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  CC5x4y12  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC5x4y123abcEv
  ~CC5x4y12(); // tgen
  CC5x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x4y123abcEv");}
ccc::CC5x4y12 ::~CC5x4y12(){ note_dtor("_ZN3ccc8CC5x4y12E", this);} // tgen
ccc::CC5x4y12 ::CC5x4y12(){ note_ctor("_ZN3ccc8CC5x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x4y12E, buf);
    ::ccc::CC5x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x4y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC5x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x4y12E);
    dp->::ccc::CC5x4y12::~CC5x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x4y12E(Test__ZN3ccc8CC5x4y12E, "_ZN3ccc8CC5x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x4y12C1Ev();
extern void _ZN3ccc8CC5x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x4y12E[] = {
  NSPAIR(_ZN3ccc8CC5x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC5x4y12E[] = {
  // 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__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 _ZTIN3ccc8CC5x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC5x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x4y123abcEv,_ZTv0_n20_N3ccc8CC5x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y123abcEv,_ZThn4_N3ccc8CC5x4y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x4y123abcEv,_ZTv0_n20_N3ccc8CC5x4y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x4y12E[] = {
  {&(_ZTVN3ccc8CC5x4y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x4y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x4y12E[];
static VTBL_ENTRY alt_thunk_names51[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x4y123abcEv,_ZTv0_n20_N3ccc8CC5x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y123abcEv,_ZThn4_N3ccc8CC5x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x4y12E = {  "_ZN3ccc8CC5x4y12E", // class name
  bases__ZN3ccc8CC5x4y12E, 2,
  &(vtc__ZN3ccc8CC5x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x4y12E),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  DD5x4y12  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD5x4y123abcEv
  ~DD5x4y12(); // tgen
  DD5x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x4y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD5x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x4y123abcEv");}
ccc::DD5x4y12 ::~DD5x4y12(){ note_dtor("_ZN3ccc8DD5x4y12E", this);} // tgen
ccc::DD5x4y12 ::DD5x4y12(){ note_ctor("_ZN3ccc8DD5x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x4y12E, buf);
    ::ccc::DD5x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x4y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD5x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x4y12E);
    dp->::ccc::DD5x4y12::~DD5x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x4y12E(Test__ZN3ccc8DD5x4y12E, "_ZN3ccc8DD5x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x4y12C1Ev();
extern void _ZN3ccc8DD5x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x4y12E[] = {
  NSPAIR(_ZN3ccc8DD5x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD5x4y12E[] = {
  // 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__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 _ZTIN3ccc8DD5x4y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x4y123abcEv,_ZTv0_n16_N3ccc8DD5x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y123abcEv,_ZThn4_N3ccc8DD5x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x4y123abcEv,_ZTv0_n16_N3ccc8DD5x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x4y12E[] = {
  {&(_ZTVN3ccc8DD5x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x4y12E[];
static VTBL_ENTRY alt_thunk_names52[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x4y123abcEv,_ZTv0_n16_N3ccc8DD5x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y123abcEv,_ZThn4_N3ccc8DD5x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x4y12E = {  "_ZN3ccc8DD5x4y12E", // class name
  bases__ZN3ccc8DD5x4y12E, 2,
  &(vtc__ZN3ccc8DD5x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x4y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x4y12E),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  CC5x4y13  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC5x4y133efgEv
  ~CC5x4y13(); // tgen
  CC5x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x4y133efgEv");}
ccc::CC5x4y13 ::~CC5x4y13(){ note_dtor("_ZN3ccc8CC5x4y13E", this);} // tgen
ccc::CC5x4y13 ::CC5x4y13(){ note_ctor("_ZN3ccc8CC5x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x4y13E, buf);
    ::ccc::CC5x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x4y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC5x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x4y13E);
    dp->::ccc::CC5x4y13::~CC5x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x4y13E(Test__ZN3ccc8CC5x4y13E, "_ZN3ccc8CC5x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x4y13C1Ev();
extern void _ZN3ccc8CC5x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x4y13E[] = {
  NSPAIR(_ZN3ccc8CC5x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC5x4y13E[] = {
  // 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__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 _ZTIN3ccc8CC5x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC5x4y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x4y133efgEv,_ZTv0_n16_N3ccc8CC5x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y133efgEv,_ZThn4_N3ccc8CC5x4y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x4y133efgEv,_ZTv0_n16_N3ccc8CC5x4y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x4y13E[] = {
  {&(_ZTVN3ccc8CC5x4y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x4y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x4y13E[];
static VTBL_ENTRY alt_thunk_names53[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x4y133efgEv,_ZTv0_n16_N3ccc8CC5x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y133efgEv,_ZThn4_N3ccc8CC5x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x4y13E = {  "_ZN3ccc8CC5x4y13E", // class name
  bases__ZN3ccc8CC5x4y13E, 2,
  &(vtc__ZN3ccc8CC5x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x4y13E),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  DD5x4y13  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD5x4y133efgEv
  ~DD5x4y13(); // tgen
  DD5x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x4y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD5x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x4y133efgEv");}
ccc::DD5x4y13 ::~DD5x4y13(){ note_dtor("_ZN3ccc8DD5x4y13E", this);} // tgen
ccc::DD5x4y13 ::DD5x4y13(){ note_ctor("_ZN3ccc8DD5x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x4y13E, buf);
    ::ccc::DD5x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x4y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD5x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x4y13E);
    dp->::ccc::DD5x4y13::~DD5x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x4y13E(Test__ZN3ccc8DD5x4y13E, "_ZN3ccc8DD5x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x4y13C1Ev();
extern void _ZN3ccc8DD5x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x4y13E[] = {
  NSPAIR(_ZN3ccc8DD5x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD5x4y13E[] = {
  // 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__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 _ZTIN3ccc8DD5x4y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x4y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x4y133efgEv,_ZTv0_n20_N3ccc8DD5x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y133efgEv,_ZThn4_N3ccc8DD5x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x4y133efgEv,_ZTv0_n20_N3ccc8DD5x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x4y13E[] = {
  {&(_ZTVN3ccc8DD5x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x4y13E[];
static VTBL_ENTRY alt_thunk_names54[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x4y133efgEv,_ZTv0_n20_N3ccc8DD5x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y133efgEv,_ZThn4_N3ccc8DD5x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x4y13E = {  "_ZN3ccc8DD5x4y13E", // class name
  bases__ZN3ccc8DD5x4y13E, 2,
  &(vtc__ZN3ccc8DD5x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x4y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x4y13E),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  CC5x4y14  : virtual ::ccc::AA5 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC5x4y143pqrEv
  ~CC5x4y14(); // tgen
  CC5x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x4y143pqrEv");}
ccc::CC5x4y14 ::~CC5x4y14(){ note_dtor("_ZN3ccc8CC5x4y14E", this);} // tgen
ccc::CC5x4y14 ::CC5x4y14(){ note_ctor("_ZN3ccc8CC5x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x4y14E, buf);
    ::ccc::CC5x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x4y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC5x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x4y14E);
    dp->::ccc::CC5x4y14::~CC5x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x4y14E(Test__ZN3ccc8CC5x4y14E, "_ZN3ccc8CC5x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x4y14C1Ev();
extern void _ZN3ccc8CC5x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x4y14E[] = {
  NSPAIR(_ZN3ccc8CC5x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC5x4y14E[] = {
  // 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__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 _ZTIN3ccc8CC5x4y14E[];
extern void _ZN3ccc8CC5x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x4y143pqrEv,_ZTv0_n12_N3ccc8CC5x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x4y143pqrEv,_ZThn4_N3ccc8CC5x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x4y143pqrEv,_ZTv0_n12_N3ccc8CC5x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x4y14E[] = {
  {&(_ZTVN3ccc8CC5x4y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x4y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x4y14E[];
static VTBL_ENTRY alt_thunk_names55[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x4y143pqrEv,_ZTv0_n12_N3ccc8CC5x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x4y143pqrEv,_ZThn4_N3ccc8CC5x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x4y14E = {  "_ZN3ccc8CC5x4y14E", // class name
  bases__ZN3ccc8CC5x4y14E, 2,
  &(vtc__ZN3ccc8CC5x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x4y14E),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  DD5x4y14  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD5x4y143pqrEv
  ~DD5x4y14(); // tgen
  DD5x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x4y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x4y143pqrEv");}
ccc::DD5x4y14 ::~DD5x4y14(){ note_dtor("_ZN3ccc8DD5x4y14E", this);} // tgen
ccc::DD5x4y14 ::DD5x4y14(){ note_ctor("_ZN3ccc8DD5x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x4y14E, buf);
    ::ccc::DD5x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x4y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD5x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x4y14E);
    dp->::ccc::DD5x4y14::~DD5x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x4y14E(Test__ZN3ccc8DD5x4y14E, "_ZN3ccc8DD5x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x4y14C1Ev();
extern void _ZN3ccc8DD5x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x4y14E[] = {
  NSPAIR(_ZN3ccc8DD5x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD5x4y14E[] = {
  // 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__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 _ZTIN3ccc8DD5x4y14E[];
extern void _ZN3ccc8DD5x4y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x4y143pqrEv,_ZTv0_n12_N3ccc8DD5x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x4y143pqrEv,_ZThn4_N3ccc8DD5x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x4y143pqrEv,_ZTv0_n12_N3ccc8DD5x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x4y14E[] = {
  {&(_ZTVN3ccc8DD5x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x4y14E[];
static VTBL_ENTRY alt_thunk_names56[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x4y143pqrEv,_ZTv0_n12_N3ccc8DD5x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x4y143pqrEv,_ZThn4_N3ccc8DD5x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x4y14E = {  "_ZN3ccc8DD5x4y14E", // class name
  bases__ZN3ccc8DD5x4y14E, 2,
  &(vtc__ZN3ccc8DD5x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x4y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x4y14E),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  CC5x4y15  : virtual ::ccc::AA5 , ::ccc::BB4 {
  ~CC5x4y15(); // tgen
  CC5x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x4y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x4y15 ::~CC5x4y15(){ note_dtor("_ZN3ccc8CC5x4y15E", this);} // tgen
ccc::CC5x4y15 ::CC5x4y15(){ note_ctor("_ZN3ccc8CC5x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x4y15E, buf);
    ::ccc::CC5x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x4y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC5x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x4y15E);
    dp->::ccc::CC5x4y15::~CC5x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x4y15E(Test__ZN3ccc8CC5x4y15E, "_ZN3ccc8CC5x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x4y15C1Ev();
extern void _ZN3ccc8CC5x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x4y15E[] = {
  NSPAIR(_ZN3ccc8CC5x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC5x4y15E[] = {
  // 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__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 _ZTIN3ccc8CC5x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x4y15E[] = {
  {&(_ZTVN3ccc8CC5x4y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x4y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x4y15E[];
Class_Descriptor cd__ZN3ccc8CC5x4y15E = {  "_ZN3ccc8CC5x4y15E", // class name
  bases__ZN3ccc8CC5x4y15E, 2,
  &(vtc__ZN3ccc8CC5x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x4y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x4y15E),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  DD5x4y15  : virtual ::ccc::AA5 , virtual ::ccc::BB4 {
  ~DD5x4y15(); // tgen
  DD5x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x4y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD5x4y15 ::~DD5x4y15(){ note_dtor("_ZN3ccc8DD5x4y15E", this);} // tgen
ccc::DD5x4y15 ::DD5x4y15(){ note_ctor("_ZN3ccc8DD5x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x4y15E, buf);
    ::ccc::DD5x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x4y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD5x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x4y15E);
    dp->::ccc::DD5x4y15::~DD5x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x4y15E(Test__ZN3ccc8DD5x4y15E, "_ZN3ccc8DD5x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x4y15C1Ev();
extern void _ZN3ccc8DD5x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x4y15E[] = {
  NSPAIR(_ZN3ccc8DD5x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD5x4y15E[] = {
  // 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__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 _ZTIN3ccc8DD5x4y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x4y15E[] = {
  {&(_ZTVN3ccc8DD5x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x4y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x4y15E[];
Class_Descriptor cd__ZN3ccc8DD5x4y15E = {  "_ZN3ccc8DD5x4y15E", // class name
  bases__ZN3ccc8DD5x4y15E, 2,
  &(vtc__ZN3ccc8DD5x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x4y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x4y15E),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  CC5x5y0  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y03pqrEv
  ~CC5x5y0(); // tgen
  CC5x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y0E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y03abcEv");}
void  ccc::CC5x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y03efgEv");}
void  ccc::CC5x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y03pqrEv");}
ccc::CC5x5y0 ::~CC5x5y0(){ note_dtor("_ZN3ccc7CC5x5y0E", this);} // tgen
ccc::CC5x5y0 ::CC5x5y0(){ note_ctor("_ZN3ccc7CC5x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y0E, buf);
    ::ccc::CC5x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y0E);
    dp->::ccc::CC5x5y0::~CC5x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y0E(Test__ZN3ccc7CC5x5y0E, "_ZN3ccc7CC5x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y0C1Ev();
extern void _ZN3ccc7CC5x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y0E[] = {
  NSPAIR(_ZN3ccc7CC5x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y0E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y0E[];
extern void _ZN3ccc7CC5x5y03pqrEv();
extern void _ZN3ccc7CC5x5y03efgEv();
extern void _ZN3ccc7CC5x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y03pqrEv,_ZTv0_n12_N3ccc7CC5x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y03pqrEv,_ZThn4_N3ccc7CC5x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y03efgEv,_ZTv0_n16_N3ccc7CC5x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y03efgEv,_ZThn4_N3ccc7CC5x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y03abcEv,_ZTv0_n20_N3ccc7CC5x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y03abcEv,_ZThn4_N3ccc7CC5x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y03pqrEv,_ZTv0_n12_N3ccc7CC5x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y03efgEv,_ZTv0_n16_N3ccc7CC5x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y03abcEv,_ZTv0_n20_N3ccc7CC5x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y0E[] = {
  {&(_ZTVN3ccc7CC5x5y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y0E[];
static VTBL_ENTRY alt_thunk_names57[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y03abcEv,_ZTv0_n20_N3ccc7CC5x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y03abcEv,_ZThn4_N3ccc7CC5x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y03efgEv,_ZTv0_n16_N3ccc7CC5x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y03efgEv,_ZThn4_N3ccc7CC5x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y03pqrEv,_ZTv0_n12_N3ccc7CC5x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y03pqrEv,_ZThn4_N3ccc7CC5x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y0E = {  "_ZN3ccc7CC5x5y0E", // class name
  bases__ZN3ccc7CC5x5y0E, 2,
  &(vtc__ZN3ccc7CC5x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y0E),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  DD5x5y0  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD5x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x5y03pqrEv
  ~DD5x5y0(); // tgen
  DD5x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y03abcEv");}
void  ccc::DD5x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y03efgEv");}
void  ccc::DD5x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y03pqrEv");}
ccc::DD5x5y0 ::~DD5x5y0(){ note_dtor("_ZN3ccc7DD5x5y0E", this);} // tgen
ccc::DD5x5y0 ::DD5x5y0(){ note_ctor("_ZN3ccc7DD5x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y0E, buf);
    ::ccc::DD5x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y0E);
    dp->::ccc::DD5x5y0::~DD5x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y0E(Test__ZN3ccc7DD5x5y0E, "_ZN3ccc7DD5x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y0C1Ev();
extern void _ZN3ccc7DD5x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y0E[] = {
  NSPAIR(_ZN3ccc7DD5x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y0E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y0E[];
extern void _ZN3ccc7DD5x5y03pqrEv();
extern void _ZN3ccc7DD5x5y03efgEv();
extern void _ZN3ccc7DD5x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y03pqrEv,_ZTv0_n12_N3ccc7DD5x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y03pqrEv,_ZThn4_N3ccc7DD5x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y03efgEv,_ZTv0_n16_N3ccc7DD5x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y03efgEv,_ZThn4_N3ccc7DD5x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y03abcEv,_ZTv0_n20_N3ccc7DD5x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y03abcEv,_ZThn4_N3ccc7DD5x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y03pqrEv,_ZTv0_n12_N3ccc7DD5x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y03efgEv,_ZTv0_n16_N3ccc7DD5x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y03abcEv,_ZTv0_n20_N3ccc7DD5x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y0E[] = {
  {&(_ZTVN3ccc7DD5x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y0E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y0E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y0E[];
static VTBL_ENTRY alt_thunk_names58[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y03abcEv,_ZTv0_n20_N3ccc7DD5x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y03abcEv,_ZThn4_N3ccc7DD5x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y03efgEv,_ZTv0_n16_N3ccc7DD5x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y03efgEv,_ZThn4_N3ccc7DD5x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y03pqrEv,_ZTv0_n12_N3ccc7DD5x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y03pqrEv,_ZThn4_N3ccc7DD5x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y0E = {  "_ZN3ccc7DD5x5y0E", // class name
  bases__ZN3ccc7DD5x5y0E, 2,
  &(vtc__ZN3ccc7DD5x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y0E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y0E),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  CC5x5y1  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x5y13efgEv
  ~CC5x5y1(); // tgen
  CC5x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y1E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y13abcEv");}
void  ccc::CC5x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y13pqrEv");}
void  ccc::CC5x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y13efgEv");}
ccc::CC5x5y1 ::~CC5x5y1(){ note_dtor("_ZN3ccc7CC5x5y1E", this);} // tgen
ccc::CC5x5y1 ::CC5x5y1(){ note_ctor("_ZN3ccc7CC5x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y1E, buf);
    ::ccc::CC5x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y1E);
    dp->::ccc::CC5x5y1::~CC5x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y1E(Test__ZN3ccc7CC5x5y1E, "_ZN3ccc7CC5x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y1C1Ev();
extern void _ZN3ccc7CC5x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y1E[] = {
  NSPAIR(_ZN3ccc7CC5x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y1E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y1E[];
extern void _ZN3ccc7CC5x5y13pqrEv();
extern void _ZN3ccc7CC5x5y13efgEv();
extern void _ZN3ccc7CC5x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y13pqrEv,_ZTv0_n12_N3ccc7CC5x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y13pqrEv,_ZThn4_N3ccc7CC5x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y13efgEv,_ZTv0_n16_N3ccc7CC5x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y13efgEv,_ZThn4_N3ccc7CC5x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y13abcEv,_ZTv0_n20_N3ccc7CC5x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y13abcEv,_ZThn4_N3ccc7CC5x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y13pqrEv,_ZTv0_n12_N3ccc7CC5x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y13efgEv,_ZTv0_n16_N3ccc7CC5x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y13abcEv,_ZTv0_n20_N3ccc7CC5x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y1E[] = {
  {&(_ZTVN3ccc7CC5x5y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y1E[];
static VTBL_ENTRY alt_thunk_names59[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y13abcEv,_ZTv0_n20_N3ccc7CC5x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y13abcEv,_ZThn4_N3ccc7CC5x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y13efgEv,_ZTv0_n16_N3ccc7CC5x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y13efgEv,_ZThn4_N3ccc7CC5x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y13pqrEv,_ZTv0_n12_N3ccc7CC5x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y13pqrEv,_ZThn4_N3ccc7CC5x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y1E = {  "_ZN3ccc7CC5x5y1E", // class name
  bases__ZN3ccc7CC5x5y1E, 2,
  &(vtc__ZN3ccc7CC5x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y1E),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  DD5x5y1  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD5x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x5y13efgEv
  ~DD5x5y1(); // tgen
  DD5x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y13abcEv");}
void  ccc::DD5x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y13pqrEv");}
void  ccc::DD5x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y13efgEv");}
ccc::DD5x5y1 ::~DD5x5y1(){ note_dtor("_ZN3ccc7DD5x5y1E", this);} // tgen
ccc::DD5x5y1 ::DD5x5y1(){ note_ctor("_ZN3ccc7DD5x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y1E, buf);
    ::ccc::DD5x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y1E);
    dp->::ccc::DD5x5y1::~DD5x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y1E(Test__ZN3ccc7DD5x5y1E, "_ZN3ccc7DD5x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y1C1Ev();
extern void _ZN3ccc7DD5x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y1E[] = {
  NSPAIR(_ZN3ccc7DD5x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y1E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y1E[];
extern void _ZN3ccc7DD5x5y13pqrEv();
extern void _ZN3ccc7DD5x5y13efgEv();
extern void _ZN3ccc7DD5x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y13pqrEv,_ZTv0_n12_N3ccc7DD5x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y13pqrEv,_ZThn4_N3ccc7DD5x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y13efgEv,_ZTv0_n16_N3ccc7DD5x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y13efgEv,_ZThn4_N3ccc7DD5x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y13abcEv,_ZTv0_n20_N3ccc7DD5x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y13abcEv,_ZThn4_N3ccc7DD5x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y13pqrEv,_ZTv0_n12_N3ccc7DD5x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y13efgEv,_ZTv0_n16_N3ccc7DD5x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y13abcEv,_ZTv0_n20_N3ccc7DD5x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y1E[] = {
  {&(_ZTVN3ccc7DD5x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y1E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y1E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y1E[];
static VTBL_ENTRY alt_thunk_names60[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y13abcEv,_ZTv0_n20_N3ccc7DD5x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y13abcEv,_ZThn4_N3ccc7DD5x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y13efgEv,_ZTv0_n16_N3ccc7DD5x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y13efgEv,_ZThn4_N3ccc7DD5x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y13pqrEv,_ZTv0_n12_N3ccc7DD5x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y13pqrEv,_ZThn4_N3ccc7DD5x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y1E = {  "_ZN3ccc7DD5x5y1E", // class name
  bases__ZN3ccc7DD5x5y1E, 2,
  &(vtc__ZN3ccc7DD5x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y1E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y1E),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  CC5x5y2  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y23pqrEv
  ~CC5x5y2(); // tgen
  CC5x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y2E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y23efgEv");}
void  ccc::CC5x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y23abcEv");}
void  ccc::CC5x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y23pqrEv");}
ccc::CC5x5y2 ::~CC5x5y2(){ note_dtor("_ZN3ccc7CC5x5y2E", this);} // tgen
ccc::CC5x5y2 ::CC5x5y2(){ note_ctor("_ZN3ccc7CC5x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y2E, buf);
    ::ccc::CC5x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y2E);
    dp->::ccc::CC5x5y2::~CC5x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y2E(Test__ZN3ccc7CC5x5y2E, "_ZN3ccc7CC5x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y2C1Ev();
extern void _ZN3ccc7CC5x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y2E[] = {
  NSPAIR(_ZN3ccc7CC5x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y2E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y2E[];
extern void _ZN3ccc7CC5x5y23pqrEv();
extern void _ZN3ccc7CC5x5y23efgEv();
extern void _ZN3ccc7CC5x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y23pqrEv,_ZTv0_n12_N3ccc7CC5x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y23pqrEv,_ZThn4_N3ccc7CC5x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y23efgEv,_ZTv0_n16_N3ccc7CC5x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y23efgEv,_ZThn4_N3ccc7CC5x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y23abcEv,_ZTv0_n20_N3ccc7CC5x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y23abcEv,_ZThn4_N3ccc7CC5x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y23pqrEv,_ZTv0_n12_N3ccc7CC5x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y23efgEv,_ZTv0_n16_N3ccc7CC5x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y23abcEv,_ZTv0_n20_N3ccc7CC5x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y2E[] = {
  {&(_ZTVN3ccc7CC5x5y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y2E[];
static VTBL_ENTRY alt_thunk_names61[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y23abcEv,_ZTv0_n20_N3ccc7CC5x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y23abcEv,_ZThn4_N3ccc7CC5x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y23efgEv,_ZTv0_n16_N3ccc7CC5x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y23efgEv,_ZThn4_N3ccc7CC5x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y23pqrEv,_ZTv0_n12_N3ccc7CC5x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y23pqrEv,_ZThn4_N3ccc7CC5x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y2E = {  "_ZN3ccc7CC5x5y2E", // class name
  bases__ZN3ccc7CC5x5y2E, 2,
  &(vtc__ZN3ccc7CC5x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y2E),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  DD5x5y2  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD5x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x5y23pqrEv
  ~DD5x5y2(); // tgen
  DD5x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y23efgEv");}
void  ccc::DD5x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y23abcEv");}
void  ccc::DD5x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y23pqrEv");}
ccc::DD5x5y2 ::~DD5x5y2(){ note_dtor("_ZN3ccc7DD5x5y2E", this);} // tgen
ccc::DD5x5y2 ::DD5x5y2(){ note_ctor("_ZN3ccc7DD5x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y2E, buf);
    ::ccc::DD5x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y2E);
    dp->::ccc::DD5x5y2::~DD5x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y2E(Test__ZN3ccc7DD5x5y2E, "_ZN3ccc7DD5x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y2C1Ev();
extern void _ZN3ccc7DD5x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y2E[] = {
  NSPAIR(_ZN3ccc7DD5x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y2E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y2E[];
extern void _ZN3ccc7DD5x5y23pqrEv();
extern void _ZN3ccc7DD5x5y23efgEv();
extern void _ZN3ccc7DD5x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y23pqrEv,_ZTv0_n12_N3ccc7DD5x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y23pqrEv,_ZThn4_N3ccc7DD5x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y23efgEv,_ZTv0_n16_N3ccc7DD5x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y23efgEv,_ZThn4_N3ccc7DD5x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y23abcEv,_ZTv0_n20_N3ccc7DD5x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y23abcEv,_ZThn4_N3ccc7DD5x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y23pqrEv,_ZTv0_n12_N3ccc7DD5x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y23efgEv,_ZTv0_n16_N3ccc7DD5x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y23abcEv,_ZTv0_n20_N3ccc7DD5x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y2E[] = {
  {&(_ZTVN3ccc7DD5x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y2E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y2E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y2E[];
static VTBL_ENTRY alt_thunk_names62[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y23abcEv,_ZTv0_n20_N3ccc7DD5x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y23abcEv,_ZThn4_N3ccc7DD5x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y23efgEv,_ZTv0_n16_N3ccc7DD5x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y23efgEv,_ZThn4_N3ccc7DD5x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y23pqrEv,_ZTv0_n12_N3ccc7DD5x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y23pqrEv,_ZThn4_N3ccc7DD5x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y2E = {  "_ZN3ccc7DD5x5y2E", // class name
  bases__ZN3ccc7DD5x5y2E, 2,
  &(vtc__ZN3ccc7DD5x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y2E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y2E),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  CC5x5y3  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x5y33abcEv
  ~CC5x5y3(); // tgen
  CC5x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y3E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y33efgEv");}
void  ccc::CC5x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y33pqrEv");}
void  ccc::CC5x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y33abcEv");}
ccc::CC5x5y3 ::~CC5x5y3(){ note_dtor("_ZN3ccc7CC5x5y3E", this);} // tgen
ccc::CC5x5y3 ::CC5x5y3(){ note_ctor("_ZN3ccc7CC5x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y3E, buf);
    ::ccc::CC5x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y3E);
    dp->::ccc::CC5x5y3::~CC5x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y3E(Test__ZN3ccc7CC5x5y3E, "_ZN3ccc7CC5x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y3C1Ev();
extern void _ZN3ccc7CC5x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y3E[] = {
  NSPAIR(_ZN3ccc7CC5x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y3E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y3E[];
extern void _ZN3ccc7CC5x5y33pqrEv();
extern void _ZN3ccc7CC5x5y33efgEv();
extern void _ZN3ccc7CC5x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y33pqrEv,_ZTv0_n12_N3ccc7CC5x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y33pqrEv,_ZThn4_N3ccc7CC5x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y33efgEv,_ZTv0_n16_N3ccc7CC5x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y33efgEv,_ZThn4_N3ccc7CC5x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y33abcEv,_ZTv0_n20_N3ccc7CC5x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y33abcEv,_ZThn4_N3ccc7CC5x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y33pqrEv,_ZTv0_n12_N3ccc7CC5x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y33efgEv,_ZTv0_n16_N3ccc7CC5x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y33abcEv,_ZTv0_n20_N3ccc7CC5x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y3E[] = {
  {&(_ZTVN3ccc7CC5x5y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y3E[];
static VTBL_ENTRY alt_thunk_names63[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y33abcEv,_ZTv0_n20_N3ccc7CC5x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y33abcEv,_ZThn4_N3ccc7CC5x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y33efgEv,_ZTv0_n16_N3ccc7CC5x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y33efgEv,_ZThn4_N3ccc7CC5x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y33pqrEv,_ZTv0_n12_N3ccc7CC5x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y33pqrEv,_ZThn4_N3ccc7CC5x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y3E = {  "_ZN3ccc7CC5x5y3E", // class name
  bases__ZN3ccc7CC5x5y3E, 2,
  &(vtc__ZN3ccc7CC5x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y3E),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  DD5x5y3  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD5x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x5y33abcEv
  ~DD5x5y3(); // tgen
  DD5x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y33efgEv");}
void  ccc::DD5x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y33pqrEv");}
void  ccc::DD5x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y33abcEv");}
ccc::DD5x5y3 ::~DD5x5y3(){ note_dtor("_ZN3ccc7DD5x5y3E", this);} // tgen
ccc::DD5x5y3 ::DD5x5y3(){ note_ctor("_ZN3ccc7DD5x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y3E, buf);
    ::ccc::DD5x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y3E);
    dp->::ccc::DD5x5y3::~DD5x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y3E(Test__ZN3ccc7DD5x5y3E, "_ZN3ccc7DD5x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y3C1Ev();
extern void _ZN3ccc7DD5x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y3E[] = {
  NSPAIR(_ZN3ccc7DD5x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y3E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y3E[];
extern void _ZN3ccc7DD5x5y33pqrEv();
extern void _ZN3ccc7DD5x5y33efgEv();
extern void _ZN3ccc7DD5x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y33pqrEv,_ZTv0_n12_N3ccc7DD5x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y33pqrEv,_ZThn4_N3ccc7DD5x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y33efgEv,_ZTv0_n16_N3ccc7DD5x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y33efgEv,_ZThn4_N3ccc7DD5x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y33abcEv,_ZTv0_n20_N3ccc7DD5x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y33abcEv,_ZThn4_N3ccc7DD5x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y33pqrEv,_ZTv0_n12_N3ccc7DD5x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y33efgEv,_ZTv0_n16_N3ccc7DD5x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y33abcEv,_ZTv0_n20_N3ccc7DD5x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y3E[] = {
  {&(_ZTVN3ccc7DD5x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y3E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y3E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y3E[];
static VTBL_ENTRY alt_thunk_names64[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y33abcEv,_ZTv0_n20_N3ccc7DD5x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y33abcEv,_ZThn4_N3ccc7DD5x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y33efgEv,_ZTv0_n16_N3ccc7DD5x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y33efgEv,_ZThn4_N3ccc7DD5x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y33pqrEv,_ZTv0_n12_N3ccc7DD5x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y33pqrEv,_ZThn4_N3ccc7DD5x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y3E = {  "_ZN3ccc7DD5x5y3E", // class name
  bases__ZN3ccc7DD5x5y3E, 2,
  &(vtc__ZN3ccc7DD5x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y3E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y3E),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  CC5x5y4  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC5x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x5y43efgEv
  ~CC5x5y4(); // tgen
  CC5x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y4E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y43pqrEv");}
void  ccc::CC5x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y43abcEv");}
void  ccc::CC5x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y43efgEv");}
ccc::CC5x5y4 ::~CC5x5y4(){ note_dtor("_ZN3ccc7CC5x5y4E", this);} // tgen
ccc::CC5x5y4 ::CC5x5y4(){ note_ctor("_ZN3ccc7CC5x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y4E, buf);
    ::ccc::CC5x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y4E);
    dp->::ccc::CC5x5y4::~CC5x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y4E(Test__ZN3ccc7CC5x5y4E, "_ZN3ccc7CC5x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y4C1Ev();
extern void _ZN3ccc7CC5x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y4E[] = {
  NSPAIR(_ZN3ccc7CC5x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y4E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y4E[];
extern void _ZN3ccc7CC5x5y43pqrEv();
extern void _ZN3ccc7CC5x5y43efgEv();
extern void _ZN3ccc7CC5x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y43pqrEv,_ZTv0_n12_N3ccc7CC5x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y43pqrEv,_ZThn4_N3ccc7CC5x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y43efgEv,_ZTv0_n16_N3ccc7CC5x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y43efgEv,_ZThn4_N3ccc7CC5x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y43abcEv,_ZTv0_n20_N3ccc7CC5x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y43abcEv,_ZThn4_N3ccc7CC5x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y43pqrEv,_ZTv0_n12_N3ccc7CC5x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y43efgEv,_ZTv0_n16_N3ccc7CC5x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y43abcEv,_ZTv0_n20_N3ccc7CC5x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y4E[] = {
  {&(_ZTVN3ccc7CC5x5y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y4E[];
static VTBL_ENTRY alt_thunk_names65[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y43abcEv,_ZTv0_n20_N3ccc7CC5x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y43abcEv,_ZThn4_N3ccc7CC5x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y43efgEv,_ZTv0_n16_N3ccc7CC5x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y43efgEv,_ZThn4_N3ccc7CC5x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y43pqrEv,_ZTv0_n12_N3ccc7CC5x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y43pqrEv,_ZThn4_N3ccc7CC5x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y4E = {  "_ZN3ccc7CC5x5y4E", // class name
  bases__ZN3ccc7CC5x5y4E, 2,
  &(vtc__ZN3ccc7CC5x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y4E),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  DD5x5y4  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD5x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x5y43efgEv
  ~DD5x5y4(); // tgen
  DD5x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y43pqrEv");}
void  ccc::DD5x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y43abcEv");}
void  ccc::DD5x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y43efgEv");}
ccc::DD5x5y4 ::~DD5x5y4(){ note_dtor("_ZN3ccc7DD5x5y4E", this);} // tgen
ccc::DD5x5y4 ::DD5x5y4(){ note_ctor("_ZN3ccc7DD5x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y4E, buf);
    ::ccc::DD5x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y4E);
    dp->::ccc::DD5x5y4::~DD5x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y4E(Test__ZN3ccc7DD5x5y4E, "_ZN3ccc7DD5x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y4C1Ev();
extern void _ZN3ccc7DD5x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y4E[] = {
  NSPAIR(_ZN3ccc7DD5x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y4E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y4E[];
extern void _ZN3ccc7DD5x5y43pqrEv();
extern void _ZN3ccc7DD5x5y43efgEv();
extern void _ZN3ccc7DD5x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y43pqrEv,_ZTv0_n12_N3ccc7DD5x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y43pqrEv,_ZThn4_N3ccc7DD5x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y43efgEv,_ZTv0_n16_N3ccc7DD5x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y43efgEv,_ZThn4_N3ccc7DD5x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y43abcEv,_ZTv0_n20_N3ccc7DD5x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y43abcEv,_ZThn4_N3ccc7DD5x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y43pqrEv,_ZTv0_n12_N3ccc7DD5x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y43efgEv,_ZTv0_n16_N3ccc7DD5x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y43abcEv,_ZTv0_n20_N3ccc7DD5x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y4E[] = {
  {&(_ZTVN3ccc7DD5x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y4E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y4E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y4E[];
static VTBL_ENTRY alt_thunk_names66[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y43abcEv,_ZTv0_n20_N3ccc7DD5x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y43abcEv,_ZThn4_N3ccc7DD5x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y43efgEv,_ZTv0_n16_N3ccc7DD5x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y43efgEv,_ZThn4_N3ccc7DD5x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y43pqrEv,_ZTv0_n12_N3ccc7DD5x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y43pqrEv,_ZThn4_N3ccc7DD5x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y4E = {  "_ZN3ccc7DD5x5y4E", // class name
  bases__ZN3ccc7DD5x5y4E, 2,
  &(vtc__ZN3ccc7DD5x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y4E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y4E),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  CC5x5y5  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC5x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x5y53abcEv
  ~CC5x5y5(); // tgen
  CC5x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y5E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y53pqrEv");}
void  ccc::CC5x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y53efgEv");}
void  ccc::CC5x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y53abcEv");}
ccc::CC5x5y5 ::~CC5x5y5(){ note_dtor("_ZN3ccc7CC5x5y5E", this);} // tgen
ccc::CC5x5y5 ::CC5x5y5(){ note_ctor("_ZN3ccc7CC5x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y5E, buf);
    ::ccc::CC5x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y5E);
    dp->::ccc::CC5x5y5::~CC5x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y5E(Test__ZN3ccc7CC5x5y5E, "_ZN3ccc7CC5x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y5C1Ev();
extern void _ZN3ccc7CC5x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y5E[] = {
  NSPAIR(_ZN3ccc7CC5x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y5E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y5E[];
extern void _ZN3ccc7CC5x5y53pqrEv();
extern void _ZN3ccc7CC5x5y53efgEv();
extern void _ZN3ccc7CC5x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y53pqrEv,_ZTv0_n12_N3ccc7CC5x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y53pqrEv,_ZThn4_N3ccc7CC5x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y53efgEv,_ZTv0_n16_N3ccc7CC5x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y53efgEv,_ZThn4_N3ccc7CC5x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y53abcEv,_ZTv0_n20_N3ccc7CC5x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y53abcEv,_ZThn4_N3ccc7CC5x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y53pqrEv,_ZTv0_n12_N3ccc7CC5x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y53efgEv,_ZTv0_n16_N3ccc7CC5x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y53abcEv,_ZTv0_n20_N3ccc7CC5x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y5E[] = {
  {&(_ZTVN3ccc7CC5x5y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y5E[];
static VTBL_ENTRY alt_thunk_names67[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y53abcEv,_ZTv0_n20_N3ccc7CC5x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y53abcEv,_ZThn4_N3ccc7CC5x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y53efgEv,_ZTv0_n16_N3ccc7CC5x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y53efgEv,_ZThn4_N3ccc7CC5x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y53pqrEv,_ZTv0_n12_N3ccc7CC5x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y53pqrEv,_ZThn4_N3ccc7CC5x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y5E = {  "_ZN3ccc7CC5x5y5E", // class name
  bases__ZN3ccc7CC5x5y5E, 2,
  &(vtc__ZN3ccc7CC5x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y5E),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  DD5x5y5  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD5x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x5y53abcEv
  ~DD5x5y5(); // tgen
  DD5x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y53pqrEv");}
void  ccc::DD5x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y53efgEv");}
void  ccc::DD5x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y53abcEv");}
ccc::DD5x5y5 ::~DD5x5y5(){ note_dtor("_ZN3ccc7DD5x5y5E", this);} // tgen
ccc::DD5x5y5 ::DD5x5y5(){ note_ctor("_ZN3ccc7DD5x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y5E, buf);
    ::ccc::DD5x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y5E);
    dp->::ccc::DD5x5y5::~DD5x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y5E(Test__ZN3ccc7DD5x5y5E, "_ZN3ccc7DD5x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y5C1Ev();
extern void _ZN3ccc7DD5x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y5E[] = {
  NSPAIR(_ZN3ccc7DD5x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y5E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y5E[];
extern void _ZN3ccc7DD5x5y53pqrEv();
extern void _ZN3ccc7DD5x5y53efgEv();
extern void _ZN3ccc7DD5x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y53pqrEv,_ZTv0_n12_N3ccc7DD5x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y53pqrEv,_ZThn4_N3ccc7DD5x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y53efgEv,_ZTv0_n16_N3ccc7DD5x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y53efgEv,_ZThn4_N3ccc7DD5x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y53abcEv,_ZTv0_n20_N3ccc7DD5x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y53abcEv,_ZThn4_N3ccc7DD5x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y53pqrEv,_ZTv0_n12_N3ccc7DD5x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y53efgEv,_ZTv0_n16_N3ccc7DD5x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y53abcEv,_ZTv0_n20_N3ccc7DD5x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y5E[] = {
  {&(_ZTVN3ccc7DD5x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y5E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y5E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y5E[];
static VTBL_ENTRY alt_thunk_names68[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y53abcEv,_ZTv0_n20_N3ccc7DD5x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y53abcEv,_ZThn4_N3ccc7DD5x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y53efgEv,_ZTv0_n16_N3ccc7DD5x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y53efgEv,_ZThn4_N3ccc7DD5x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y53pqrEv,_ZTv0_n12_N3ccc7DD5x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y53pqrEv,_ZThn4_N3ccc7DD5x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y5E = {  "_ZN3ccc7DD5x5y5E", // class name
  bases__ZN3ccc7DD5x5y5E, 2,
  &(vtc__ZN3ccc7DD5x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y5E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y5E),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  CC5x5y6  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x5y63efgEv
  ~CC5x5y6(); // tgen
  CC5x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y6E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y63abcEv");}
void  ccc::CC5x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y63efgEv");}
ccc::CC5x5y6 ::~CC5x5y6(){ note_dtor("_ZN3ccc7CC5x5y6E", this);} // tgen
ccc::CC5x5y6 ::CC5x5y6(){ note_ctor("_ZN3ccc7CC5x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y6E, buf);
    ::ccc::CC5x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y6E);
    dp->::ccc::CC5x5y6::~CC5x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y6E(Test__ZN3ccc7CC5x5y6E, "_ZN3ccc7CC5x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y6C1Ev();
extern void _ZN3ccc7CC5x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y6E[] = {
  NSPAIR(_ZN3ccc7CC5x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y6E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC5x5y63efgEv();
extern void _ZN3ccc7CC5x5y63abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y63efgEv,_ZTv0_n16_N3ccc7CC5x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y63efgEv,_ZThn4_N3ccc7CC5x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y63abcEv,_ZTv0_n20_N3ccc7CC5x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y63abcEv,_ZThn4_N3ccc7CC5x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y63efgEv,_ZTv0_n16_N3ccc7CC5x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y63abcEv,_ZTv0_n20_N3ccc7CC5x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y6E[] = {
  {&(_ZTVN3ccc7CC5x5y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y6E[];
static VTBL_ENTRY alt_thunk_names69[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y63abcEv,_ZTv0_n20_N3ccc7CC5x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y63abcEv,_ZThn4_N3ccc7CC5x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y63efgEv,_ZTv0_n16_N3ccc7CC5x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y63efgEv,_ZThn4_N3ccc7CC5x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y6E = {  "_ZN3ccc7CC5x5y6E", // class name
  bases__ZN3ccc7CC5x5y6E, 2,
  &(vtc__ZN3ccc7CC5x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y6E),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  DD5x5y6  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD5x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x5y63efgEv
  ~DD5x5y6(); // tgen
  DD5x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y63abcEv");}
void  ccc::DD5x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y63efgEv");}
ccc::DD5x5y6 ::~DD5x5y6(){ note_dtor("_ZN3ccc7DD5x5y6E", this);} // tgen
ccc::DD5x5y6 ::DD5x5y6(){ note_ctor("_ZN3ccc7DD5x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y6E, buf);
    ::ccc::DD5x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y6E);
    dp->::ccc::DD5x5y6::~DD5x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y6E(Test__ZN3ccc7DD5x5y6E, "_ZN3ccc7DD5x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y6C1Ev();
extern void _ZN3ccc7DD5x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y6E[] = {
  NSPAIR(_ZN3ccc7DD5x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y6E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x5y63efgEv();
extern void _ZN3ccc7DD5x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y63efgEv,_ZTv0_n16_N3ccc7DD5x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y63efgEv,_ZThn4_N3ccc7DD5x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y63abcEv,_ZTv0_n20_N3ccc7DD5x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y63abcEv,_ZThn4_N3ccc7DD5x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y63efgEv,_ZTv0_n16_N3ccc7DD5x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y63abcEv,_ZTv0_n20_N3ccc7DD5x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y6E[] = {
  {&(_ZTVN3ccc7DD5x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y6E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y6E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y6E[];
static VTBL_ENTRY alt_thunk_names70[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y63abcEv,_ZTv0_n20_N3ccc7DD5x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y63abcEv,_ZThn4_N3ccc7DD5x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y63efgEv,_ZTv0_n16_N3ccc7DD5x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y63efgEv,_ZThn4_N3ccc7DD5x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y6E = {  "_ZN3ccc7DD5x5y6E", // class name
  bases__ZN3ccc7DD5x5y6E, 2,
  &(vtc__ZN3ccc7DD5x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y6E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y6E),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  CC5x5y7  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC5x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y73pqrEv
  ~CC5x5y7(); // tgen
  CC5x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y7E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y73abcEv");}
void  ccc::CC5x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y73pqrEv");}
ccc::CC5x5y7 ::~CC5x5y7(){ note_dtor("_ZN3ccc7CC5x5y7E", this);} // tgen
ccc::CC5x5y7 ::CC5x5y7(){ note_ctor("_ZN3ccc7CC5x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y7E, buf);
    ::ccc::CC5x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y7E);
    dp->::ccc::CC5x5y7::~CC5x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y7E(Test__ZN3ccc7CC5x5y7E, "_ZN3ccc7CC5x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y7C1Ev();
extern void _ZN3ccc7CC5x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y7E[] = {
  NSPAIR(_ZN3ccc7CC5x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y7E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y7E[];
extern void _ZN3ccc7CC5x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC5x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y73pqrEv,_ZTv0_n12_N3ccc7CC5x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y73pqrEv,_ZThn4_N3ccc7CC5x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y73abcEv,_ZTv0_n20_N3ccc7CC5x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y73abcEv,_ZThn4_N3ccc7CC5x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y73pqrEv,_ZTv0_n12_N3ccc7CC5x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y73abcEv,_ZTv0_n20_N3ccc7CC5x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y7E[] = {
  {&(_ZTVN3ccc7CC5x5y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y7E[];
static VTBL_ENTRY alt_thunk_names71[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y73abcEv,_ZTv0_n20_N3ccc7CC5x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y73abcEv,_ZThn4_N3ccc7CC5x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y73pqrEv,_ZTv0_n12_N3ccc7CC5x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y73pqrEv,_ZThn4_N3ccc7CC5x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y7E = {  "_ZN3ccc7CC5x5y7E", // class name
  bases__ZN3ccc7CC5x5y7E, 2,
  &(vtc__ZN3ccc7CC5x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y7E),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  DD5x5y7  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD5x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x5y73pqrEv
  ~DD5x5y7(); // tgen
  DD5x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y73abcEv");}
void  ccc::DD5x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y73pqrEv");}
ccc::DD5x5y7 ::~DD5x5y7(){ note_dtor("_ZN3ccc7DD5x5y7E", this);} // tgen
ccc::DD5x5y7 ::DD5x5y7(){ note_ctor("_ZN3ccc7DD5x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y7E, buf);
    ::ccc::DD5x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y7E);
    dp->::ccc::DD5x5y7::~DD5x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y7E(Test__ZN3ccc7DD5x5y7E, "_ZN3ccc7DD5x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y7C1Ev();
extern void _ZN3ccc7DD5x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y7E[] = {
  NSPAIR(_ZN3ccc7DD5x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y7E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y7E[];
extern void _ZN3ccc7DD5x5y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y73pqrEv,_ZTv0_n12_N3ccc7DD5x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y73pqrEv,_ZThn4_N3ccc7DD5x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y73abcEv,_ZTv0_n20_N3ccc7DD5x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y73abcEv,_ZThn4_N3ccc7DD5x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y73pqrEv,_ZTv0_n12_N3ccc7DD5x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y73abcEv,_ZTv0_n20_N3ccc7DD5x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y7E[] = {
  {&(_ZTVN3ccc7DD5x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y7E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y7E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y7E[];
static VTBL_ENTRY alt_thunk_names72[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y73abcEv,_ZTv0_n20_N3ccc7DD5x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y73abcEv,_ZThn4_N3ccc7DD5x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y73pqrEv,_ZTv0_n12_N3ccc7DD5x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y73pqrEv,_ZThn4_N3ccc7DD5x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y7E = {  "_ZN3ccc7DD5x5y7E", // class name
  bases__ZN3ccc7DD5x5y7E, 2,
  &(vtc__ZN3ccc7DD5x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y7E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y7E),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  CC5x5y8  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x5y83abcEv
  ~CC5x5y8(); // tgen
  CC5x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y8E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y83efgEv");}
void  ccc::CC5x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x5y83abcEv");}
ccc::CC5x5y8 ::~CC5x5y8(){ note_dtor("_ZN3ccc7CC5x5y8E", this);} // tgen
ccc::CC5x5y8 ::CC5x5y8(){ note_ctor("_ZN3ccc7CC5x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y8E, buf);
    ::ccc::CC5x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y8E);
    dp->::ccc::CC5x5y8::~CC5x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y8E(Test__ZN3ccc7CC5x5y8E, "_ZN3ccc7CC5x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y8C1Ev();
extern void _ZN3ccc7CC5x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y8E[] = {
  NSPAIR(_ZN3ccc7CC5x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y8E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC5x5y83efgEv();
extern void _ZN3ccc7CC5x5y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y83efgEv,_ZTv0_n16_N3ccc7CC5x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y83efgEv,_ZThn4_N3ccc7CC5x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x5y83abcEv,_ZTv0_n20_N3ccc7CC5x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y83abcEv,_ZThn4_N3ccc7CC5x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y83efgEv,_ZTv0_n16_N3ccc7CC5x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x5y83abcEv,_ZTv0_n20_N3ccc7CC5x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y8E[] = {
  {&(_ZTVN3ccc7CC5x5y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y8E[];
static VTBL_ENTRY alt_thunk_names73[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x5y83abcEv,_ZTv0_n20_N3ccc7CC5x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y83abcEv,_ZThn4_N3ccc7CC5x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y83efgEv,_ZTv0_n16_N3ccc7CC5x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y83efgEv,_ZThn4_N3ccc7CC5x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y8E = {  "_ZN3ccc7CC5x5y8E", // class name
  bases__ZN3ccc7CC5x5y8E, 2,
  &(vtc__ZN3ccc7CC5x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y8E),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  DD5x5y8  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD5x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x5y83abcEv
  ~DD5x5y8(); // tgen
  DD5x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y83efgEv");}
void  ccc::DD5x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x5y83abcEv");}
ccc::DD5x5y8 ::~DD5x5y8(){ note_dtor("_ZN3ccc7DD5x5y8E", this);} // tgen
ccc::DD5x5y8 ::DD5x5y8(){ note_ctor("_ZN3ccc7DD5x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y8E, buf);
    ::ccc::DD5x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y8E);
    dp->::ccc::DD5x5y8::~DD5x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y8E(Test__ZN3ccc7DD5x5y8E, "_ZN3ccc7DD5x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y8C1Ev();
extern void _ZN3ccc7DD5x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y8E[] = {
  NSPAIR(_ZN3ccc7DD5x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y8E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x5y83efgEv();
extern void _ZN3ccc7DD5x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y83efgEv,_ZTv0_n16_N3ccc7DD5x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y83efgEv,_ZThn4_N3ccc7DD5x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD5x5y83abcEv,_ZTv0_n20_N3ccc7DD5x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y83abcEv,_ZThn4_N3ccc7DD5x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y83efgEv,_ZTv0_n16_N3ccc7DD5x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD5x5y83abcEv,_ZTv0_n20_N3ccc7DD5x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y8E[] = {
  {&(_ZTVN3ccc7DD5x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y8E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y8E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y8E[];
static VTBL_ENTRY alt_thunk_names74[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD5x5y83abcEv,_ZTv0_n20_N3ccc7DD5x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y83abcEv,_ZThn4_N3ccc7DD5x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y83efgEv,_ZTv0_n16_N3ccc7DD5x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y83efgEv,_ZThn4_N3ccc7DD5x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y8E = {  "_ZN3ccc7DD5x5y8E", // class name
  bases__ZN3ccc7DD5x5y8E, 2,
  &(vtc__ZN3ccc7DD5x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y8E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y8E),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  CC5x5y9  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC5x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x5y93pqrEv
  ~CC5x5y9(); // tgen
  CC5x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x5y9E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x5y93efgEv");}
void  ccc::CC5x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x5y93pqrEv");}
ccc::CC5x5y9 ::~CC5x5y9(){ note_dtor("_ZN3ccc7CC5x5y9E", this);} // tgen
ccc::CC5x5y9 ::CC5x5y9(){ note_ctor("_ZN3ccc7CC5x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x5y9E, buf);
    ::ccc::CC5x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x5y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC5x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x5y9E);
    dp->::ccc::CC5x5y9::~CC5x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x5y9E(Test__ZN3ccc7CC5x5y9E, "_ZN3ccc7CC5x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x5y9C1Ev();
extern void _ZN3ccc7CC5x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x5y9E[] = {
  NSPAIR(_ZN3ccc7CC5x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC5x5y9E[] = {
  // 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__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 _ZTIN3ccc7CC5x5y9E[];
extern void _ZN3ccc7CC5x5y93pqrEv();
extern void _ZN3ccc7CC5x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x5y93pqrEv,_ZTv0_n12_N3ccc7CC5x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y93pqrEv,_ZThn4_N3ccc7CC5x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x5y93efgEv,_ZTv0_n16_N3ccc7CC5x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x5y93efgEv,_ZThn4_N3ccc7CC5x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x5y93pqrEv,_ZTv0_n12_N3ccc7CC5x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x5y93efgEv,_ZTv0_n16_N3ccc7CC5x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x5y9E[] = {
  {&(_ZTVN3ccc7CC5x5y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x5y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x5y9E[];
static VTBL_ENTRY alt_thunk_names75[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x5y93efgEv,_ZTv0_n16_N3ccc7CC5x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y93efgEv,_ZThn4_N3ccc7CC5x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x5y93pqrEv,_ZTv0_n12_N3ccc7CC5x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x5y93pqrEv,_ZThn4_N3ccc7CC5x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x5y9E = {  "_ZN3ccc7CC5x5y9E", // class name
  bases__ZN3ccc7CC5x5y9E, 2,
  &(vtc__ZN3ccc7CC5x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x5y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x5y9E),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  DD5x5y9  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD5x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x5y93pqrEv
  ~DD5x5y9(); // tgen
  DD5x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x5y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x5y93efgEv");}
void  ccc::DD5x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x5y93pqrEv");}
ccc::DD5x5y9 ::~DD5x5y9(){ note_dtor("_ZN3ccc7DD5x5y9E", this);} // tgen
ccc::DD5x5y9 ::DD5x5y9(){ note_ctor("_ZN3ccc7DD5x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x5y9E, buf);
    ::ccc::DD5x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x5y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD5x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x5y9E);
    dp->::ccc::DD5x5y9::~DD5x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x5y9E(Test__ZN3ccc7DD5x5y9E, "_ZN3ccc7DD5x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x5y9C1Ev();
extern void _ZN3ccc7DD5x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x5y9E[] = {
  NSPAIR(_ZN3ccc7DD5x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD5x5y9E[] = {
  // 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__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 _ZTIN3ccc7DD5x5y9E[];
extern void _ZN3ccc7DD5x5y93pqrEv();
extern void _ZN3ccc7DD5x5y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x5y93pqrEv,_ZTv0_n12_N3ccc7DD5x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y93pqrEv,_ZThn4_N3ccc7DD5x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x5y93efgEv,_ZTv0_n16_N3ccc7DD5x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x5y93efgEv,_ZThn4_N3ccc7DD5x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x5y93pqrEv,_ZTv0_n12_N3ccc7DD5x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x5y93efgEv,_ZTv0_n16_N3ccc7DD5x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x5y9E[] = {
  {&(_ZTVN3ccc7DD5x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y9E[7]),  7,18},
  {&(_ZTVN3ccc7DD5x5y9E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x5y9E[];
static VTBL_ENTRY alt_thunk_names76[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x5y93efgEv,_ZTv0_n16_N3ccc7DD5x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y93efgEv,_ZThn4_N3ccc7DD5x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x5y93pqrEv,_ZTv0_n12_N3ccc7DD5x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x5y93pqrEv,_ZThn4_N3ccc7DD5x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x5y9E = {  "_ZN3ccc7DD5x5y9E", // class name
  bases__ZN3ccc7DD5x5y9E, 2,
  &(vtc__ZN3ccc7DD5x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x5y9E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x5y9E),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  CC5x5y10  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC5x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x5y103abcEv
  ~CC5x5y10(); // tgen
  CC5x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y10E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x5y103pqrEv");}
void  ccc::CC5x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x5y103abcEv");}
ccc::CC5x5y10 ::~CC5x5y10(){ note_dtor("_ZN3ccc8CC5x5y10E", this);} // tgen
ccc::CC5x5y10 ::CC5x5y10(){ note_ctor("_ZN3ccc8CC5x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x5y10E, buf);
    ::ccc::CC5x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x5y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC5x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x5y10E);
    dp->::ccc::CC5x5y10::~CC5x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x5y10E(Test__ZN3ccc8CC5x5y10E, "_ZN3ccc8CC5x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x5y10C1Ev();
extern void _ZN3ccc8CC5x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x5y10E[] = {
  NSPAIR(_ZN3ccc8CC5x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC5x5y10E[] = {
  // 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__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 _ZTIN3ccc8CC5x5y10E[];
extern void _ZN3ccc8CC5x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC5x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x5y103pqrEv,_ZTv0_n12_N3ccc8CC5x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y103pqrEv,_ZThn4_N3ccc8CC5x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x5y103abcEv,_ZTv0_n20_N3ccc8CC5x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y103abcEv,_ZThn4_N3ccc8CC5x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x5y103pqrEv,_ZTv0_n12_N3ccc8CC5x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x5y103abcEv,_ZTv0_n20_N3ccc8CC5x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x5y10E[] = {
  {&(_ZTVN3ccc8CC5x5y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x5y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x5y10E[];
static VTBL_ENTRY alt_thunk_names77[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x5y103abcEv,_ZTv0_n20_N3ccc8CC5x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y103abcEv,_ZThn4_N3ccc8CC5x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x5y103pqrEv,_ZTv0_n12_N3ccc8CC5x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y103pqrEv,_ZThn4_N3ccc8CC5x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x5y10E = {  "_ZN3ccc8CC5x5y10E", // class name
  bases__ZN3ccc8CC5x5y10E, 2,
  &(vtc__ZN3ccc8CC5x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x5y10E),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  DD5x5y10  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD5x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x5y103abcEv
  ~DD5x5y10(); // tgen
  DD5x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x5y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x5y103pqrEv");}
void  ccc::DD5x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x5y103abcEv");}
ccc::DD5x5y10 ::~DD5x5y10(){ note_dtor("_ZN3ccc8DD5x5y10E", this);} // tgen
ccc::DD5x5y10 ::DD5x5y10(){ note_ctor("_ZN3ccc8DD5x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x5y10E, buf);
    ::ccc::DD5x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x5y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD5x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x5y10E);
    dp->::ccc::DD5x5y10::~DD5x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x5y10E(Test__ZN3ccc8DD5x5y10E, "_ZN3ccc8DD5x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x5y10C1Ev();
extern void _ZN3ccc8DD5x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x5y10E[] = {
  NSPAIR(_ZN3ccc8DD5x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD5x5y10E[] = {
  // 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__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 _ZTIN3ccc8DD5x5y10E[];
extern void _ZN3ccc8DD5x5y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x5y103pqrEv,_ZTv0_n12_N3ccc8DD5x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y103pqrEv,_ZThn4_N3ccc8DD5x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x5y103abcEv,_ZTv0_n20_N3ccc8DD5x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y103abcEv,_ZThn4_N3ccc8DD5x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x5y103pqrEv,_ZTv0_n12_N3ccc8DD5x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x5y103abcEv,_ZTv0_n20_N3ccc8DD5x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x5y10E[] = {
  {&(_ZTVN3ccc8DD5x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y10E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y10E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x5y10E[];
static VTBL_ENTRY alt_thunk_names78[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x5y103abcEv,_ZTv0_n20_N3ccc8DD5x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y103abcEv,_ZThn4_N3ccc8DD5x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x5y103pqrEv,_ZTv0_n12_N3ccc8DD5x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y103pqrEv,_ZThn4_N3ccc8DD5x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x5y10E = {  "_ZN3ccc8DD5x5y10E", // class name
  bases__ZN3ccc8DD5x5y10E, 2,
  &(vtc__ZN3ccc8DD5x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x5y10E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x5y10E),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  CC5x5y11  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC5x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x5y113efgEv
  ~CC5x5y11(); // tgen
  CC5x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y11E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x5y113pqrEv");}
void  ccc::CC5x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x5y113efgEv");}
ccc::CC5x5y11 ::~CC5x5y11(){ note_dtor("_ZN3ccc8CC5x5y11E", this);} // tgen
ccc::CC5x5y11 ::CC5x5y11(){ note_ctor("_ZN3ccc8CC5x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x5y11E, buf);
    ::ccc::CC5x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x5y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC5x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x5y11E);
    dp->::ccc::CC5x5y11::~CC5x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x5y11E(Test__ZN3ccc8CC5x5y11E, "_ZN3ccc8CC5x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x5y11C1Ev();
extern void _ZN3ccc8CC5x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x5y11E[] = {
  NSPAIR(_ZN3ccc8CC5x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC5x5y11E[] = {
  // 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__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 _ZTIN3ccc8CC5x5y11E[];
extern void _ZN3ccc8CC5x5y113pqrEv();
extern void _ZN3ccc8CC5x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x5y113pqrEv,_ZTv0_n12_N3ccc8CC5x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y113pqrEv,_ZThn4_N3ccc8CC5x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x5y113efgEv,_ZTv0_n16_N3ccc8CC5x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y113efgEv,_ZThn4_N3ccc8CC5x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x5y113pqrEv,_ZTv0_n12_N3ccc8CC5x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x5y113efgEv,_ZTv0_n16_N3ccc8CC5x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x5y11E[] = {
  {&(_ZTVN3ccc8CC5x5y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x5y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x5y11E[];
static VTBL_ENTRY alt_thunk_names79[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x5y113efgEv,_ZTv0_n16_N3ccc8CC5x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y113efgEv,_ZThn4_N3ccc8CC5x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x5y113pqrEv,_ZTv0_n12_N3ccc8CC5x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y113pqrEv,_ZThn4_N3ccc8CC5x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x5y11E = {  "_ZN3ccc8CC5x5y11E", // class name
  bases__ZN3ccc8CC5x5y11E, 2,
  &(vtc__ZN3ccc8CC5x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x5y11E),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  DD5x5y11  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD5x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x5y113efgEv
  ~DD5x5y11(); // tgen
  DD5x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x5y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x5y113pqrEv");}
void  ccc::DD5x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x5y113efgEv");}
ccc::DD5x5y11 ::~DD5x5y11(){ note_dtor("_ZN3ccc8DD5x5y11E", this);} // tgen
ccc::DD5x5y11 ::DD5x5y11(){ note_ctor("_ZN3ccc8DD5x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x5y11E, buf);
    ::ccc::DD5x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x5y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD5x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x5y11E);
    dp->::ccc::DD5x5y11::~DD5x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x5y11E(Test__ZN3ccc8DD5x5y11E, "_ZN3ccc8DD5x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x5y11C1Ev();
extern void _ZN3ccc8DD5x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x5y11E[] = {
  NSPAIR(_ZN3ccc8DD5x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD5x5y11E[] = {
  // 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__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 _ZTIN3ccc8DD5x5y11E[];
extern void _ZN3ccc8DD5x5y113pqrEv();
extern void _ZN3ccc8DD5x5y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x5y113pqrEv,_ZTv0_n12_N3ccc8DD5x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y113pqrEv,_ZThn4_N3ccc8DD5x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x5y113efgEv,_ZTv0_n16_N3ccc8DD5x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y113efgEv,_ZThn4_N3ccc8DD5x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x5y113pqrEv,_ZTv0_n12_N3ccc8DD5x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x5y113efgEv,_ZTv0_n16_N3ccc8DD5x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x5y11E[] = {
  {&(_ZTVN3ccc8DD5x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y11E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y11E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x5y11E[];
static VTBL_ENTRY alt_thunk_names80[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x5y113efgEv,_ZTv0_n16_N3ccc8DD5x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y113efgEv,_ZThn4_N3ccc8DD5x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x5y113pqrEv,_ZTv0_n12_N3ccc8DD5x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y113pqrEv,_ZThn4_N3ccc8DD5x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x5y11E = {  "_ZN3ccc8DD5x5y11E", // class name
  bases__ZN3ccc8DD5x5y11E, 2,
  &(vtc__ZN3ccc8DD5x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x5y11E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x5y11E),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  CC5x5y12  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC5x5y123abcEv
  ~CC5x5y12(); // tgen
  CC5x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC5x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x5y123abcEv");}
ccc::CC5x5y12 ::~CC5x5y12(){ note_dtor("_ZN3ccc8CC5x5y12E", this);} // tgen
ccc::CC5x5y12 ::CC5x5y12(){ note_ctor("_ZN3ccc8CC5x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x5y12E, buf);
    ::ccc::CC5x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x5y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC5x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x5y12E);
    dp->::ccc::CC5x5y12::~CC5x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x5y12E(Test__ZN3ccc8CC5x5y12E, "_ZN3ccc8CC5x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x5y12C1Ev();
extern void _ZN3ccc8CC5x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x5y12E[] = {
  NSPAIR(_ZN3ccc8CC5x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC5x5y12E[] = {
  // 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__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 _ZTIN3ccc8CC5x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC5x5y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x5y123abcEv,_ZTv0_n20_N3ccc8CC5x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y123abcEv,_ZThn4_N3ccc8CC5x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x5y123abcEv,_ZTv0_n20_N3ccc8CC5x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x5y12E[] = {
  {&(_ZTVN3ccc8CC5x5y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x5y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x5y12E[];
static VTBL_ENTRY alt_thunk_names81[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x5y123abcEv,_ZTv0_n20_N3ccc8CC5x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y123abcEv,_ZThn4_N3ccc8CC5x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x5y12E = {  "_ZN3ccc8CC5x5y12E", // class name
  bases__ZN3ccc8CC5x5y12E, 2,
  &(vtc__ZN3ccc8CC5x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x5y12E),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  DD5x5y12  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD5x5y123abcEv
  ~DD5x5y12(); // tgen
  DD5x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x5y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD5x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x5y123abcEv");}
ccc::DD5x5y12 ::~DD5x5y12(){ note_dtor("_ZN3ccc8DD5x5y12E", this);} // tgen
ccc::DD5x5y12 ::DD5x5y12(){ note_ctor("_ZN3ccc8DD5x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x5y12E, buf);
    ::ccc::DD5x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x5y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD5x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x5y12E);
    dp->::ccc::DD5x5y12::~DD5x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x5y12E(Test__ZN3ccc8DD5x5y12E, "_ZN3ccc8DD5x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x5y12C1Ev();
extern void _ZN3ccc8DD5x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x5y12E[] = {
  NSPAIR(_ZN3ccc8DD5x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD5x5y12E[] = {
  // 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__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 _ZTIN3ccc8DD5x5y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD5x5y123abcEv,_ZTv0_n20_N3ccc8DD5x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y123abcEv,_ZThn4_N3ccc8DD5x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD5x5y123abcEv,_ZTv0_n20_N3ccc8DD5x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x5y12E[] = {
  {&(_ZTVN3ccc8DD5x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y12E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y12E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x5y12E[];
static VTBL_ENTRY alt_thunk_names82[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD5x5y123abcEv,_ZTv0_n20_N3ccc8DD5x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y123abcEv,_ZThn4_N3ccc8DD5x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x5y12E = {  "_ZN3ccc8DD5x5y12E", // class name
  bases__ZN3ccc8DD5x5y12E, 2,
  &(vtc__ZN3ccc8DD5x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x5y12E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x5y12E),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  CC5x5y13  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC5x5y133efgEv
  ~CC5x5y13(); // tgen
  CC5x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC5x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x5y133efgEv");}
ccc::CC5x5y13 ::~CC5x5y13(){ note_dtor("_ZN3ccc8CC5x5y13E", this);} // tgen
ccc::CC5x5y13 ::CC5x5y13(){ note_ctor("_ZN3ccc8CC5x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x5y13E, buf);
    ::ccc::CC5x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x5y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC5x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x5y13E);
    dp->::ccc::CC5x5y13::~CC5x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x5y13E(Test__ZN3ccc8CC5x5y13E, "_ZN3ccc8CC5x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x5y13C1Ev();
extern void _ZN3ccc8CC5x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x5y13E[] = {
  NSPAIR(_ZN3ccc8CC5x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC5x5y13E[] = {
  // 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__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 _ZTIN3ccc8CC5x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC5x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x5y133efgEv,_ZTv0_n16_N3ccc8CC5x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y133efgEv,_ZThn4_N3ccc8CC5x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x5y133efgEv,_ZTv0_n16_N3ccc8CC5x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x5y13E[] = {
  {&(_ZTVN3ccc8CC5x5y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x5y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x5y13E[];
static VTBL_ENTRY alt_thunk_names83[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x5y133efgEv,_ZTv0_n16_N3ccc8CC5x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y133efgEv,_ZThn4_N3ccc8CC5x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x5y13E = {  "_ZN3ccc8CC5x5y13E", // class name
  bases__ZN3ccc8CC5x5y13E, 2,
  &(vtc__ZN3ccc8CC5x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x5y13E),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  DD5x5y13  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD5x5y133efgEv
  ~DD5x5y13(); // tgen
  DD5x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x5y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD5x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x5y133efgEv");}
ccc::DD5x5y13 ::~DD5x5y13(){ note_dtor("_ZN3ccc8DD5x5y13E", this);} // tgen
ccc::DD5x5y13 ::DD5x5y13(){ note_ctor("_ZN3ccc8DD5x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x5y13E, buf);
    ::ccc::DD5x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x5y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD5x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x5y13E);
    dp->::ccc::DD5x5y13::~DD5x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x5y13E(Test__ZN3ccc8DD5x5y13E, "_ZN3ccc8DD5x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x5y13C1Ev();
extern void _ZN3ccc8DD5x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x5y13E[] = {
  NSPAIR(_ZN3ccc8DD5x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD5x5y13E[] = {
  // 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__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 _ZTIN3ccc8DD5x5y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x5y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x5y133efgEv,_ZTv0_n16_N3ccc8DD5x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y133efgEv,_ZThn4_N3ccc8DD5x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x5y133efgEv,_ZTv0_n16_N3ccc8DD5x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x5y13E[] = {
  {&(_ZTVN3ccc8DD5x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y13E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y13E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x5y13E[];
static VTBL_ENTRY alt_thunk_names84[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x5y133efgEv,_ZTv0_n16_N3ccc8DD5x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y133efgEv,_ZThn4_N3ccc8DD5x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x5y13E = {  "_ZN3ccc8DD5x5y13E", // class name
  bases__ZN3ccc8DD5x5y13E, 2,
  &(vtc__ZN3ccc8DD5x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x5y13E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x5y13E),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  CC5x5y14  : virtual ::ccc::AA5 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC5x5y143pqrEv
  ~CC5x5y14(); // tgen
  CC5x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x5y143pqrEv");}
ccc::CC5x5y14 ::~CC5x5y14(){ note_dtor("_ZN3ccc8CC5x5y14E", this);} // tgen
ccc::CC5x5y14 ::CC5x5y14(){ note_ctor("_ZN3ccc8CC5x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x5y14E, buf);
    ::ccc::CC5x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x5y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC5x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x5y14E);
    dp->::ccc::CC5x5y14::~CC5x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x5y14E(Test__ZN3ccc8CC5x5y14E, "_ZN3ccc8CC5x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x5y14C1Ev();
extern void _ZN3ccc8CC5x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x5y14E[] = {
  NSPAIR(_ZN3ccc8CC5x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC5x5y14E[] = {
  // 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__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 _ZTIN3ccc8CC5x5y14E[];
extern void _ZN3ccc8CC5x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x5y143pqrEv,_ZTv0_n12_N3ccc8CC5x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x5y143pqrEv,_ZThn4_N3ccc8CC5x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x5y143pqrEv,_ZTv0_n12_N3ccc8CC5x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x5y14E[] = {
  {&(_ZTVN3ccc8CC5x5y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x5y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x5y14E[];
static VTBL_ENTRY alt_thunk_names85[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x5y143pqrEv,_ZTv0_n12_N3ccc8CC5x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x5y143pqrEv,_ZThn4_N3ccc8CC5x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x5y14E = {  "_ZN3ccc8CC5x5y14E", // class name
  bases__ZN3ccc8CC5x5y14E, 2,
  &(vtc__ZN3ccc8CC5x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x5y14E),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  DD5x5y14  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD5x5y143pqrEv
  ~DD5x5y14(); // tgen
  DD5x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x5y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x5y143pqrEv");}
ccc::DD5x5y14 ::~DD5x5y14(){ note_dtor("_ZN3ccc8DD5x5y14E", this);} // tgen
ccc::DD5x5y14 ::DD5x5y14(){ note_ctor("_ZN3ccc8DD5x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x5y14E, buf);
    ::ccc::DD5x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x5y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD5x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x5y14E);
    dp->::ccc::DD5x5y14::~DD5x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x5y14E(Test__ZN3ccc8DD5x5y14E, "_ZN3ccc8DD5x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x5y14C1Ev();
extern void _ZN3ccc8DD5x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x5y14E[] = {
  NSPAIR(_ZN3ccc8DD5x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD5x5y14E[] = {
  // 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__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 _ZTIN3ccc8DD5x5y14E[];
extern void _ZN3ccc8DD5x5y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x5y143pqrEv,_ZTv0_n12_N3ccc8DD5x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x5y143pqrEv,_ZThn4_N3ccc8DD5x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x5y143pqrEv,_ZTv0_n12_N3ccc8DD5x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x5y14E[] = {
  {&(_ZTVN3ccc8DD5x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y14E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y14E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x5y14E[];
static VTBL_ENTRY alt_thunk_names86[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x5y143pqrEv,_ZTv0_n12_N3ccc8DD5x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x5y143pqrEv,_ZThn4_N3ccc8DD5x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x5y14E = {  "_ZN3ccc8DD5x5y14E", // class name
  bases__ZN3ccc8DD5x5y14E, 2,
  &(vtc__ZN3ccc8DD5x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x5y14E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x5y14E),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  CC5x5y15  : virtual ::ccc::AA5 , ::ccc::BB5 {
  ~CC5x5y15(); // tgen
  CC5x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x5y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::CC5x5y15 ::~CC5x5y15(){ note_dtor("_ZN3ccc8CC5x5y15E", this);} // tgen
ccc::CC5x5y15 ::CC5x5y15(){ note_ctor("_ZN3ccc8CC5x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x5y15E, buf);
    ::ccc::CC5x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x5y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC5x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x5y15E);
    dp->::ccc::CC5x5y15::~CC5x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x5y15E(Test__ZN3ccc8CC5x5y15E, "_ZN3ccc8CC5x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x5y15C1Ev();
extern void _ZN3ccc8CC5x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x5y15E[] = {
  NSPAIR(_ZN3ccc8CC5x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC5x5y15E[] = {
  // 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__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 _ZTIN3ccc8CC5x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x5y15E[] = {
  {&(_ZTVN3ccc8CC5x5y15E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x5y15E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x5y15E[];
Class_Descriptor cd__ZN3ccc8CC5x5y15E = {  "_ZN3ccc8CC5x5y15E", // class name
  bases__ZN3ccc8CC5x5y15E, 2,
  &(vtc__ZN3ccc8CC5x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x5y15E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x5y15E),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  DD5x5y15  : virtual ::ccc::AA5 , virtual ::ccc::BB5 {
  ~DD5x5y15(); // tgen
  DD5x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x5y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5 v6}}
}
namespace ccc { 
ccc::DD5x5y15 ::~DD5x5y15(){ note_dtor("_ZN3ccc8DD5x5y15E", this);} // tgen
ccc::DD5x5y15 ::DD5x5y15(){ note_ctor("_ZN3ccc8DD5x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x5y15E, buf);
    ::ccc::DD5x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x5y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD5x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x5y15E);
    dp->::ccc::DD5x5y15::~DD5x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x5y15E(Test__ZN3ccc8DD5x5y15E, "_ZN3ccc8DD5x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x5y15C1Ev();
extern void _ZN3ccc8DD5x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x5y15E[] = {
  NSPAIR(_ZN3ccc8DD5x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD5x5y15E[] = {
  // 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__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 _ZTIN3ccc8DD5x5y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x5y15E[] = {
  {&(_ZTVN3ccc8DD5x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y15E[7]),  7,18},
  {&(_ZTVN3ccc8DD5x5y15E[15]),  15,18},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x5y15E[];
Class_Descriptor cd__ZN3ccc8DD5x5y15E = {  "_ZN3ccc8DD5x5y15E", // class name
  bases__ZN3ccc8DD5x5y15E, 2,
  &(vtc__ZN3ccc8DD5x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x5y15E),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x5y15E),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  CC5x6y0  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y03pqrEv
  ~CC5x6y0(); // tgen
  CC5x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y0E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y03abcEv");}
void  ccc::CC5x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y03efgEv");}
void  ccc::CC5x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y03pqrEv");}
ccc::CC5x6y0 ::~CC5x6y0(){ note_dtor("_ZN3ccc7CC5x6y0E", this);} // tgen
ccc::CC5x6y0 ::CC5x6y0(){ note_ctor("_ZN3ccc7CC5x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y0E, buf);
    ::ccc::CC5x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y0E);
    dp->::ccc::CC5x6y0::~CC5x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y0E(Test__ZN3ccc7CC5x6y0E, "_ZN3ccc7CC5x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y0C1Ev();
extern void _ZN3ccc7CC5x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y0E[] = {
  NSPAIR(_ZN3ccc7CC5x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y0E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y0E[];
extern void _ZN3ccc7CC5x6y03abcEv();
extern void _ZN3ccc7CC5x6y03efgEv();
extern void _ZN3ccc7CC5x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y03pqrEv,_ZTv0_n12_N3ccc7CC5x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y03pqrEv,_ZThn4_N3ccc7CC5x6y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y03efgEv,_ZTv0_n16_N3ccc7CC5x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y03efgEv,_ZThn4_N3ccc7CC5x6y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y03abcEv,_ZTv0_n20_N3ccc7CC5x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y03abcEv,_ZThn4_N3ccc7CC5x6y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y03pqrEv,_ZTv0_n12_N3ccc7CC5x6y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y03efgEv,_ZTv0_n16_N3ccc7CC5x6y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y03abcEv,_ZTv0_n20_N3ccc7CC5x6y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y0E[] = {
  {&(_ZTVN3ccc7CC5x6y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y0E[];
static VTBL_ENTRY alt_thunk_names87[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y03abcEv,_ZTv0_n20_N3ccc7CC5x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y03abcEv,_ZThn4_N3ccc7CC5x6y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y03efgEv,_ZTv0_n16_N3ccc7CC5x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y03efgEv,_ZThn4_N3ccc7CC5x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y03pqrEv,_ZTv0_n12_N3ccc7CC5x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y03pqrEv,_ZThn4_N3ccc7CC5x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y0E = {  "_ZN3ccc7CC5x6y0E", // class name
  bases__ZN3ccc7CC5x6y0E, 2,
  &(vtc__ZN3ccc7CC5x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y0E),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  DD5x6y0  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD5x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x6y03pqrEv
  ~DD5x6y0(); // tgen
  DD5x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y03abcEv");}
void  ccc::DD5x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y03efgEv");}
void  ccc::DD5x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y03pqrEv");}
ccc::DD5x6y0 ::~DD5x6y0(){ note_dtor("_ZN3ccc7DD5x6y0E", this);} // tgen
ccc::DD5x6y0 ::DD5x6y0(){ note_ctor("_ZN3ccc7DD5x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y0E, buf);
    ::ccc::DD5x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y0E);
    dp->::ccc::DD5x6y0::~DD5x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y0E(Test__ZN3ccc7DD5x6y0E, "_ZN3ccc7DD5x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y0C1Ev();
extern void _ZN3ccc7DD5x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y0E[] = {
  NSPAIR(_ZN3ccc7DD5x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y0E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y0E[];
extern void _ZN3ccc7DD5x6y03pqrEv();
extern void _ZN3ccc7DD5x6y03efgEv();
extern void _ZN3ccc7DD5x6y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y03abcEv,_ZTv0_n12_N3ccc7DD5x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y03abcEv,_ZThn4_N3ccc7DD5x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y03efgEv,_ZTv0_n16_N3ccc7DD5x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y03efgEv,_ZThn4_N3ccc7DD5x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y03abcEv,_ZTv0_n12_N3ccc7DD5x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y03efgEv,_ZTv0_n16_N3ccc7DD5x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y0E[] = {
  {&(_ZTVN3ccc7DD5x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y0E[];
static VTBL_ENTRY alt_thunk_names88[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y03efgEv,_ZTv0_n16_N3ccc7DD5x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y03efgEv,_ZThn4_N3ccc7DD5x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y03abcEv,_ZTv0_n12_N3ccc7DD5x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y03abcEv,_ZThn4_N3ccc7DD5x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y0E = {  "_ZN3ccc7DD5x6y0E", // class name
  bases__ZN3ccc7DD5x6y0E, 2,
  &(vtc__ZN3ccc7DD5x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y0E),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  CC5x6y1  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x6y13efgEv
  ~CC5x6y1(); // tgen
  CC5x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y1E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y13abcEv");}
void  ccc::CC5x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y13pqrEv");}
void  ccc::CC5x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y13efgEv");}
ccc::CC5x6y1 ::~CC5x6y1(){ note_dtor("_ZN3ccc7CC5x6y1E", this);} // tgen
ccc::CC5x6y1 ::CC5x6y1(){ note_ctor("_ZN3ccc7CC5x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y1E, buf);
    ::ccc::CC5x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y1E);
    dp->::ccc::CC5x6y1::~CC5x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y1E(Test__ZN3ccc7CC5x6y1E, "_ZN3ccc7CC5x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y1C1Ev();
extern void _ZN3ccc7CC5x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y1E[] = {
  NSPAIR(_ZN3ccc7CC5x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y1E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y1E[];
extern void _ZN3ccc7CC5x6y13abcEv();
extern void _ZN3ccc7CC5x6y13efgEv();
extern void _ZN3ccc7CC5x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y13pqrEv,_ZTv0_n12_N3ccc7CC5x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y13pqrEv,_ZThn4_N3ccc7CC5x6y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y13efgEv,_ZTv0_n16_N3ccc7CC5x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y13efgEv,_ZThn4_N3ccc7CC5x6y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y13abcEv,_ZTv0_n20_N3ccc7CC5x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y13abcEv,_ZThn4_N3ccc7CC5x6y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y13pqrEv,_ZTv0_n12_N3ccc7CC5x6y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y13efgEv,_ZTv0_n16_N3ccc7CC5x6y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y13abcEv,_ZTv0_n20_N3ccc7CC5x6y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y1E[] = {
  {&(_ZTVN3ccc7CC5x6y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y1E[];
static VTBL_ENTRY alt_thunk_names89[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y13abcEv,_ZTv0_n20_N3ccc7CC5x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y13abcEv,_ZThn4_N3ccc7CC5x6y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y13efgEv,_ZTv0_n16_N3ccc7CC5x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y13efgEv,_ZThn4_N3ccc7CC5x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y13pqrEv,_ZTv0_n12_N3ccc7CC5x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y13pqrEv,_ZThn4_N3ccc7CC5x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y1E = {  "_ZN3ccc7CC5x6y1E", // class name
  bases__ZN3ccc7CC5x6y1E, 2,
  &(vtc__ZN3ccc7CC5x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y1E),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  DD5x6y1  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD5x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x6y13efgEv
  ~DD5x6y1(); // tgen
  DD5x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y13abcEv");}
void  ccc::DD5x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y13pqrEv");}
void  ccc::DD5x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y13efgEv");}
ccc::DD5x6y1 ::~DD5x6y1(){ note_dtor("_ZN3ccc7DD5x6y1E", this);} // tgen
ccc::DD5x6y1 ::DD5x6y1(){ note_ctor("_ZN3ccc7DD5x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y1E, buf);
    ::ccc::DD5x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y1E);
    dp->::ccc::DD5x6y1::~DD5x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y1E(Test__ZN3ccc7DD5x6y1E, "_ZN3ccc7DD5x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y1C1Ev();
extern void _ZN3ccc7DD5x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y1E[] = {
  NSPAIR(_ZN3ccc7DD5x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y1E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y1E[];
extern void _ZN3ccc7DD5x6y13pqrEv();
extern void _ZN3ccc7DD5x6y13efgEv();
extern void _ZN3ccc7DD5x6y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y13abcEv,_ZTv0_n12_N3ccc7DD5x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y13abcEv,_ZThn4_N3ccc7DD5x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y13efgEv,_ZTv0_n16_N3ccc7DD5x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y13efgEv,_ZThn4_N3ccc7DD5x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y13abcEv,_ZTv0_n12_N3ccc7DD5x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y13efgEv,_ZTv0_n16_N3ccc7DD5x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y1E[] = {
  {&(_ZTVN3ccc7DD5x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y1E[];
static VTBL_ENTRY alt_thunk_names90[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y13efgEv,_ZTv0_n16_N3ccc7DD5x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y13efgEv,_ZThn4_N3ccc7DD5x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y13abcEv,_ZTv0_n12_N3ccc7DD5x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y13abcEv,_ZThn4_N3ccc7DD5x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y1E = {  "_ZN3ccc7DD5x6y1E", // class name
  bases__ZN3ccc7DD5x6y1E, 2,
  &(vtc__ZN3ccc7DD5x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y1E),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  CC5x6y2  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y23pqrEv
  ~CC5x6y2(); // tgen
  CC5x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y2E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y23efgEv");}
void  ccc::CC5x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y23abcEv");}
void  ccc::CC5x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y23pqrEv");}
ccc::CC5x6y2 ::~CC5x6y2(){ note_dtor("_ZN3ccc7CC5x6y2E", this);} // tgen
ccc::CC5x6y2 ::CC5x6y2(){ note_ctor("_ZN3ccc7CC5x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y2E, buf);
    ::ccc::CC5x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y2E);
    dp->::ccc::CC5x6y2::~CC5x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y2E(Test__ZN3ccc7CC5x6y2E, "_ZN3ccc7CC5x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y2C1Ev();
extern void _ZN3ccc7CC5x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y2E[] = {
  NSPAIR(_ZN3ccc7CC5x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y2E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y2E[];
extern void _ZN3ccc7CC5x6y23abcEv();
extern void _ZN3ccc7CC5x6y23efgEv();
extern void _ZN3ccc7CC5x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y23pqrEv,_ZTv0_n12_N3ccc7CC5x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y23pqrEv,_ZThn4_N3ccc7CC5x6y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y23efgEv,_ZTv0_n16_N3ccc7CC5x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y23efgEv,_ZThn4_N3ccc7CC5x6y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y23abcEv,_ZTv0_n20_N3ccc7CC5x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y23abcEv,_ZThn4_N3ccc7CC5x6y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y23pqrEv,_ZTv0_n12_N3ccc7CC5x6y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y23efgEv,_ZTv0_n16_N3ccc7CC5x6y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y23abcEv,_ZTv0_n20_N3ccc7CC5x6y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y2E[] = {
  {&(_ZTVN3ccc7CC5x6y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y2E[];
static VTBL_ENTRY alt_thunk_names91[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y23abcEv,_ZTv0_n20_N3ccc7CC5x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y23abcEv,_ZThn4_N3ccc7CC5x6y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y23efgEv,_ZTv0_n16_N3ccc7CC5x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y23efgEv,_ZThn4_N3ccc7CC5x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y23pqrEv,_ZTv0_n12_N3ccc7CC5x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y23pqrEv,_ZThn4_N3ccc7CC5x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y2E = {  "_ZN3ccc7CC5x6y2E", // class name
  bases__ZN3ccc7CC5x6y2E, 2,
  &(vtc__ZN3ccc7CC5x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y2E),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  DD5x6y2  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD5x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x6y23pqrEv
  ~DD5x6y2(); // tgen
  DD5x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y23efgEv");}
void  ccc::DD5x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y23abcEv");}
void  ccc::DD5x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y23pqrEv");}
ccc::DD5x6y2 ::~DD5x6y2(){ note_dtor("_ZN3ccc7DD5x6y2E", this);} // tgen
ccc::DD5x6y2 ::DD5x6y2(){ note_ctor("_ZN3ccc7DD5x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y2E, buf);
    ::ccc::DD5x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y2E);
    dp->::ccc::DD5x6y2::~DD5x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y2E(Test__ZN3ccc7DD5x6y2E, "_ZN3ccc7DD5x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y2C1Ev();
extern void _ZN3ccc7DD5x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y2E[] = {
  NSPAIR(_ZN3ccc7DD5x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y2E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y2E[];
extern void _ZN3ccc7DD5x6y23pqrEv();
extern void _ZN3ccc7DD5x6y23efgEv();
extern void _ZN3ccc7DD5x6y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y23abcEv,_ZTv0_n12_N3ccc7DD5x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y23abcEv,_ZThn4_N3ccc7DD5x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y23efgEv,_ZTv0_n16_N3ccc7DD5x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y23efgEv,_ZThn4_N3ccc7DD5x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y23abcEv,_ZTv0_n12_N3ccc7DD5x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y23efgEv,_ZTv0_n16_N3ccc7DD5x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y2E[] = {
  {&(_ZTVN3ccc7DD5x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y2E[];
static VTBL_ENTRY alt_thunk_names92[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y23efgEv,_ZTv0_n16_N3ccc7DD5x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y23efgEv,_ZThn4_N3ccc7DD5x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y23abcEv,_ZTv0_n12_N3ccc7DD5x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y23abcEv,_ZThn4_N3ccc7DD5x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y2E = {  "_ZN3ccc7DD5x6y2E", // class name
  bases__ZN3ccc7DD5x6y2E, 2,
  &(vtc__ZN3ccc7DD5x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y2E),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  CC5x6y3  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x6y33abcEv
  ~CC5x6y3(); // tgen
  CC5x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y3E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y33efgEv");}
void  ccc::CC5x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y33pqrEv");}
void  ccc::CC5x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y33abcEv");}
ccc::CC5x6y3 ::~CC5x6y3(){ note_dtor("_ZN3ccc7CC5x6y3E", this);} // tgen
ccc::CC5x6y3 ::CC5x6y3(){ note_ctor("_ZN3ccc7CC5x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y3E, buf);
    ::ccc::CC5x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y3E);
    dp->::ccc::CC5x6y3::~CC5x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y3E(Test__ZN3ccc7CC5x6y3E, "_ZN3ccc7CC5x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y3C1Ev();
extern void _ZN3ccc7CC5x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y3E[] = {
  NSPAIR(_ZN3ccc7CC5x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y3E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y3E[];
extern void _ZN3ccc7CC5x6y33abcEv();
extern void _ZN3ccc7CC5x6y33efgEv();
extern void _ZN3ccc7CC5x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y33pqrEv,_ZTv0_n12_N3ccc7CC5x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y33pqrEv,_ZThn4_N3ccc7CC5x6y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y33efgEv,_ZTv0_n16_N3ccc7CC5x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y33efgEv,_ZThn4_N3ccc7CC5x6y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y33abcEv,_ZTv0_n20_N3ccc7CC5x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y33abcEv,_ZThn4_N3ccc7CC5x6y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y33pqrEv,_ZTv0_n12_N3ccc7CC5x6y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y33efgEv,_ZTv0_n16_N3ccc7CC5x6y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y33abcEv,_ZTv0_n20_N3ccc7CC5x6y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y3E[] = {
  {&(_ZTVN3ccc7CC5x6y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y3E[];
static VTBL_ENTRY alt_thunk_names93[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y33abcEv,_ZTv0_n20_N3ccc7CC5x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y33abcEv,_ZThn4_N3ccc7CC5x6y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y33efgEv,_ZTv0_n16_N3ccc7CC5x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y33efgEv,_ZThn4_N3ccc7CC5x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y33pqrEv,_ZTv0_n12_N3ccc7CC5x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y33pqrEv,_ZThn4_N3ccc7CC5x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y3E = {  "_ZN3ccc7CC5x6y3E", // class name
  bases__ZN3ccc7CC5x6y3E, 2,
  &(vtc__ZN3ccc7CC5x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y3E),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  DD5x6y3  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD5x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x6y33abcEv
  ~DD5x6y3(); // tgen
  DD5x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y33efgEv");}
void  ccc::DD5x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y33pqrEv");}
void  ccc::DD5x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y33abcEv");}
ccc::DD5x6y3 ::~DD5x6y3(){ note_dtor("_ZN3ccc7DD5x6y3E", this);} // tgen
ccc::DD5x6y3 ::DD5x6y3(){ note_ctor("_ZN3ccc7DD5x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y3E, buf);
    ::ccc::DD5x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y3E);
    dp->::ccc::DD5x6y3::~DD5x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y3E(Test__ZN3ccc7DD5x6y3E, "_ZN3ccc7DD5x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y3C1Ev();
extern void _ZN3ccc7DD5x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y3E[] = {
  NSPAIR(_ZN3ccc7DD5x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y3E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y3E[];
extern void _ZN3ccc7DD5x6y33pqrEv();
extern void _ZN3ccc7DD5x6y33efgEv();
extern void _ZN3ccc7DD5x6y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y33abcEv,_ZTv0_n12_N3ccc7DD5x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y33abcEv,_ZThn4_N3ccc7DD5x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y33efgEv,_ZTv0_n16_N3ccc7DD5x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y33efgEv,_ZThn4_N3ccc7DD5x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y33abcEv,_ZTv0_n12_N3ccc7DD5x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y33efgEv,_ZTv0_n16_N3ccc7DD5x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y3E[] = {
  {&(_ZTVN3ccc7DD5x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y3E[];
static VTBL_ENTRY alt_thunk_names94[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y33efgEv,_ZTv0_n16_N3ccc7DD5x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y33efgEv,_ZThn4_N3ccc7DD5x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y33abcEv,_ZTv0_n12_N3ccc7DD5x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y33abcEv,_ZThn4_N3ccc7DD5x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y3E = {  "_ZN3ccc7DD5x6y3E", // class name
  bases__ZN3ccc7DD5x6y3E, 2,
  &(vtc__ZN3ccc7DD5x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y3E),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  CC5x6y4  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC5x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x6y43efgEv
  ~CC5x6y4(); // tgen
  CC5x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y4E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y43pqrEv");}
void  ccc::CC5x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y43abcEv");}
void  ccc::CC5x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y43efgEv");}
ccc::CC5x6y4 ::~CC5x6y4(){ note_dtor("_ZN3ccc7CC5x6y4E", this);} // tgen
ccc::CC5x6y4 ::CC5x6y4(){ note_ctor("_ZN3ccc7CC5x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y4E, buf);
    ::ccc::CC5x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y4E);
    dp->::ccc::CC5x6y4::~CC5x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y4E(Test__ZN3ccc7CC5x6y4E, "_ZN3ccc7CC5x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y4C1Ev();
extern void _ZN3ccc7CC5x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y4E[] = {
  NSPAIR(_ZN3ccc7CC5x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y4E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y4E[];
extern void _ZN3ccc7CC5x6y43abcEv();
extern void _ZN3ccc7CC5x6y43efgEv();
extern void _ZN3ccc7CC5x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y43pqrEv,_ZTv0_n12_N3ccc7CC5x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y43pqrEv,_ZThn4_N3ccc7CC5x6y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y43efgEv,_ZTv0_n16_N3ccc7CC5x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y43efgEv,_ZThn4_N3ccc7CC5x6y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y43abcEv,_ZTv0_n20_N3ccc7CC5x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y43abcEv,_ZThn4_N3ccc7CC5x6y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y43pqrEv,_ZTv0_n12_N3ccc7CC5x6y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y43efgEv,_ZTv0_n16_N3ccc7CC5x6y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y43abcEv,_ZTv0_n20_N3ccc7CC5x6y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y4E[] = {
  {&(_ZTVN3ccc7CC5x6y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y4E[];
static VTBL_ENTRY alt_thunk_names95[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y43abcEv,_ZTv0_n20_N3ccc7CC5x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y43abcEv,_ZThn4_N3ccc7CC5x6y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y43efgEv,_ZTv0_n16_N3ccc7CC5x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y43efgEv,_ZThn4_N3ccc7CC5x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y43pqrEv,_ZTv0_n12_N3ccc7CC5x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y43pqrEv,_ZThn4_N3ccc7CC5x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y4E = {  "_ZN3ccc7CC5x6y4E", // class name
  bases__ZN3ccc7CC5x6y4E, 2,
  &(vtc__ZN3ccc7CC5x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y4E),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  DD5x6y4  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD5x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x6y43efgEv
  ~DD5x6y4(); // tgen
  DD5x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y43pqrEv");}
void  ccc::DD5x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y43abcEv");}
void  ccc::DD5x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y43efgEv");}
ccc::DD5x6y4 ::~DD5x6y4(){ note_dtor("_ZN3ccc7DD5x6y4E", this);} // tgen
ccc::DD5x6y4 ::DD5x6y4(){ note_ctor("_ZN3ccc7DD5x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y4E, buf);
    ::ccc::DD5x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y4E);
    dp->::ccc::DD5x6y4::~DD5x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y4E(Test__ZN3ccc7DD5x6y4E, "_ZN3ccc7DD5x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y4C1Ev();
extern void _ZN3ccc7DD5x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y4E[] = {
  NSPAIR(_ZN3ccc7DD5x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y4E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y4E[];
extern void _ZN3ccc7DD5x6y43pqrEv();
extern void _ZN3ccc7DD5x6y43efgEv();
extern void _ZN3ccc7DD5x6y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y43abcEv,_ZTv0_n12_N3ccc7DD5x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y43abcEv,_ZThn4_N3ccc7DD5x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y43efgEv,_ZTv0_n16_N3ccc7DD5x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y43efgEv,_ZThn4_N3ccc7DD5x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y43abcEv,_ZTv0_n12_N3ccc7DD5x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y43efgEv,_ZTv0_n16_N3ccc7DD5x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y4E[] = {
  {&(_ZTVN3ccc7DD5x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y4E[];
static VTBL_ENTRY alt_thunk_names96[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y43efgEv,_ZTv0_n16_N3ccc7DD5x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y43efgEv,_ZThn4_N3ccc7DD5x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y43abcEv,_ZTv0_n12_N3ccc7DD5x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y43abcEv,_ZThn4_N3ccc7DD5x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y4E = {  "_ZN3ccc7DD5x6y4E", // class name
  bases__ZN3ccc7DD5x6y4E, 2,
  &(vtc__ZN3ccc7DD5x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y4E),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  CC5x6y5  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC5x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x6y53abcEv
  ~CC5x6y5(); // tgen
  CC5x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y5E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y53pqrEv");}
void  ccc::CC5x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y53efgEv");}
void  ccc::CC5x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y53abcEv");}
ccc::CC5x6y5 ::~CC5x6y5(){ note_dtor("_ZN3ccc7CC5x6y5E", this);} // tgen
ccc::CC5x6y5 ::CC5x6y5(){ note_ctor("_ZN3ccc7CC5x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y5E, buf);
    ::ccc::CC5x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y5E);
    dp->::ccc::CC5x6y5::~CC5x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y5E(Test__ZN3ccc7CC5x6y5E, "_ZN3ccc7CC5x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y5C1Ev();
extern void _ZN3ccc7CC5x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y5E[] = {
  NSPAIR(_ZN3ccc7CC5x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y5E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y5E[];
extern void _ZN3ccc7CC5x6y53abcEv();
extern void _ZN3ccc7CC5x6y53efgEv();
extern void _ZN3ccc7CC5x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y53pqrEv,_ZTv0_n12_N3ccc7CC5x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y53pqrEv,_ZThn4_N3ccc7CC5x6y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y53efgEv,_ZTv0_n16_N3ccc7CC5x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y53efgEv,_ZThn4_N3ccc7CC5x6y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y53abcEv,_ZTv0_n20_N3ccc7CC5x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y53abcEv,_ZThn4_N3ccc7CC5x6y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y53pqrEv,_ZTv0_n12_N3ccc7CC5x6y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y53efgEv,_ZTv0_n16_N3ccc7CC5x6y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y53abcEv,_ZTv0_n20_N3ccc7CC5x6y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y5E[] = {
  {&(_ZTVN3ccc7CC5x6y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y5E[];
static VTBL_ENTRY alt_thunk_names97[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y53abcEv,_ZTv0_n20_N3ccc7CC5x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y53abcEv,_ZThn4_N3ccc7CC5x6y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y53efgEv,_ZTv0_n16_N3ccc7CC5x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y53efgEv,_ZThn4_N3ccc7CC5x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y53pqrEv,_ZTv0_n12_N3ccc7CC5x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y53pqrEv,_ZThn4_N3ccc7CC5x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y5E = {  "_ZN3ccc7CC5x6y5E", // class name
  bases__ZN3ccc7CC5x6y5E, 2,
  &(vtc__ZN3ccc7CC5x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y5E),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  DD5x6y5  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD5x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x6y53abcEv
  ~DD5x6y5(); // tgen
  DD5x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y53pqrEv");}
void  ccc::DD5x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y53efgEv");}
void  ccc::DD5x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y53abcEv");}
ccc::DD5x6y5 ::~DD5x6y5(){ note_dtor("_ZN3ccc7DD5x6y5E", this);} // tgen
ccc::DD5x6y5 ::DD5x6y5(){ note_ctor("_ZN3ccc7DD5x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y5E, buf);
    ::ccc::DD5x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y5E);
    dp->::ccc::DD5x6y5::~DD5x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y5E(Test__ZN3ccc7DD5x6y5E, "_ZN3ccc7DD5x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y5C1Ev();
extern void _ZN3ccc7DD5x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y5E[] = {
  NSPAIR(_ZN3ccc7DD5x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y5E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y5E[];
extern void _ZN3ccc7DD5x6y53pqrEv();
extern void _ZN3ccc7DD5x6y53efgEv();
extern void _ZN3ccc7DD5x6y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y53abcEv,_ZTv0_n12_N3ccc7DD5x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y53abcEv,_ZThn4_N3ccc7DD5x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y53efgEv,_ZTv0_n16_N3ccc7DD5x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y53efgEv,_ZThn4_N3ccc7DD5x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y53abcEv,_ZTv0_n12_N3ccc7DD5x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y53efgEv,_ZTv0_n16_N3ccc7DD5x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y5E[] = {
  {&(_ZTVN3ccc7DD5x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y5E[];
static VTBL_ENTRY alt_thunk_names98[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y53efgEv,_ZTv0_n16_N3ccc7DD5x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y53efgEv,_ZThn4_N3ccc7DD5x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y53abcEv,_ZTv0_n12_N3ccc7DD5x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y53abcEv,_ZThn4_N3ccc7DD5x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y5E = {  "_ZN3ccc7DD5x6y5E", // class name
  bases__ZN3ccc7DD5x6y5E, 2,
  &(vtc__ZN3ccc7DD5x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y5E),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  CC5x6y6  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x6y63efgEv
  ~CC5x6y6(); // tgen
  CC5x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y6E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y63abcEv");}
void  ccc::CC5x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y63efgEv");}
ccc::CC5x6y6 ::~CC5x6y6(){ note_dtor("_ZN3ccc7CC5x6y6E", this);} // tgen
ccc::CC5x6y6 ::CC5x6y6(){ note_ctor("_ZN3ccc7CC5x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y6E, buf);
    ::ccc::CC5x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y6E);
    dp->::ccc::CC5x6y6::~CC5x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y6E(Test__ZN3ccc7CC5x6y6E, "_ZN3ccc7CC5x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y6C1Ev();
extern void _ZN3ccc7CC5x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y6E[] = {
  NSPAIR(_ZN3ccc7CC5x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc7CC5x6y6E[];
extern void _ZN3ccc7CC5x6y63abcEv();
extern void _ZN3ccc7CC5x6y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y63efgEv,_ZTv0_n16_N3ccc7CC5x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y63efgEv,_ZThn4_N3ccc7CC5x6y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y63abcEv,_ZTv0_n20_N3ccc7CC5x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y63abcEv,_ZThn4_N3ccc7CC5x6y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y63efgEv,_ZTv0_n16_N3ccc7CC5x6y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y63abcEv,_ZTv0_n20_N3ccc7CC5x6y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y6E[] = {
  {&(_ZTVN3ccc7CC5x6y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC5x6y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y6E[];
static VTBL_ENTRY alt_thunk_names99[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y63abcEv,_ZTv0_n20_N3ccc7CC5x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y63abcEv,_ZThn4_N3ccc7CC5x6y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y63efgEv,_ZTv0_n16_N3ccc7CC5x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y63efgEv,_ZThn4_N3ccc7CC5x6y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y6E = {  "_ZN3ccc7CC5x6y6E", // class name
  bases__ZN3ccc7CC5x6y6E, 2,
  &(vtc__ZN3ccc7CC5x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y6E),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  DD5x6y6  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD5x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x6y63efgEv
  ~DD5x6y6(); // tgen
  DD5x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y63abcEv");}
void  ccc::DD5x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y63efgEv");}
ccc::DD5x6y6 ::~DD5x6y6(){ note_dtor("_ZN3ccc7DD5x6y6E", this);} // tgen
ccc::DD5x6y6 ::DD5x6y6(){ note_ctor("_ZN3ccc7DD5x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y6E, buf);
    ::ccc::DD5x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y6E);
    dp->::ccc::DD5x6y6::~DD5x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y6E(Test__ZN3ccc7DD5x6y6E, "_ZN3ccc7DD5x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y6C1Ev();
extern void _ZN3ccc7DD5x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y6E[] = {
  NSPAIR(_ZN3ccc7DD5x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y6E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x6y63efgEv();
extern void _ZN3ccc7DD5x6y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y63abcEv,_ZTv0_n12_N3ccc7DD5x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y63abcEv,_ZThn4_N3ccc7DD5x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y63efgEv,_ZTv0_n16_N3ccc7DD5x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y63efgEv,_ZThn4_N3ccc7DD5x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y63abcEv,_ZTv0_n12_N3ccc7DD5x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y63efgEv,_ZTv0_n16_N3ccc7DD5x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y6E[] = {
  {&(_ZTVN3ccc7DD5x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y6E[];
static VTBL_ENTRY alt_thunk_names100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y63efgEv,_ZTv0_n16_N3ccc7DD5x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y63efgEv,_ZThn4_N3ccc7DD5x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y63abcEv,_ZTv0_n12_N3ccc7DD5x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y63abcEv,_ZThn4_N3ccc7DD5x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y6E = {  "_ZN3ccc7DD5x6y6E", // class name
  bases__ZN3ccc7DD5x6y6E, 2,
  &(vtc__ZN3ccc7DD5x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y6E),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  CC5x6y7  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC5x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y73pqrEv
  ~CC5x6y7(); // tgen
  CC5x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y7E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y73abcEv");}
void  ccc::CC5x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y73pqrEv");}
ccc::CC5x6y7 ::~CC5x6y7(){ note_dtor("_ZN3ccc7CC5x6y7E", this);} // tgen
ccc::CC5x6y7 ::CC5x6y7(){ note_ctor("_ZN3ccc7CC5x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y7E, buf);
    ::ccc::CC5x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y7E);
    dp->::ccc::CC5x6y7::~CC5x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y7E(Test__ZN3ccc7CC5x6y7E, "_ZN3ccc7CC5x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y7C1Ev();
extern void _ZN3ccc7CC5x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y7E[] = {
  NSPAIR(_ZN3ccc7CC5x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y7E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y7E[];
extern void _ZN3ccc7CC5x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC5x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y73pqrEv,_ZTv0_n12_N3ccc7CC5x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y73pqrEv,_ZThn4_N3ccc7CC5x6y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y73abcEv,_ZTv0_n20_N3ccc7CC5x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y73abcEv,_ZThn4_N3ccc7CC5x6y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y73pqrEv,_ZTv0_n12_N3ccc7CC5x6y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y73abcEv,_ZTv0_n20_N3ccc7CC5x6y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y7E[] = {
  {&(_ZTVN3ccc7CC5x6y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y7E[];
static VTBL_ENTRY alt_thunk_names101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y73abcEv,_ZTv0_n20_N3ccc7CC5x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y73abcEv,_ZThn4_N3ccc7CC5x6y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y73pqrEv,_ZTv0_n12_N3ccc7CC5x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y73pqrEv,_ZThn4_N3ccc7CC5x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y7E = {  "_ZN3ccc7CC5x6y7E", // class name
  bases__ZN3ccc7CC5x6y7E, 2,
  &(vtc__ZN3ccc7CC5x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y7E),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  DD5x6y7  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD5x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x6y73pqrEv
  ~DD5x6y7(); // tgen
  DD5x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y73abcEv");}
void  ccc::DD5x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y73pqrEv");}
ccc::DD5x6y7 ::~DD5x6y7(){ note_dtor("_ZN3ccc7DD5x6y7E", this);} // tgen
ccc::DD5x6y7 ::DD5x6y7(){ note_ctor("_ZN3ccc7DD5x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y7E, buf);
    ::ccc::DD5x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y7E);
    dp->::ccc::DD5x6y7::~DD5x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y7E(Test__ZN3ccc7DD5x6y7E, "_ZN3ccc7DD5x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y7C1Ev();
extern void _ZN3ccc7DD5x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y7E[] = {
  NSPAIR(_ZN3ccc7DD5x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y7E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y7E[];
extern void _ZN3ccc7DD5x6y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x6y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y73abcEv,_ZTv0_n12_N3ccc7DD5x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y73abcEv,_ZThn4_N3ccc7DD5x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y73abcEv,_ZTv0_n12_N3ccc7DD5x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y7E[] = {
  {&(_ZTVN3ccc7DD5x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y7E[];
static VTBL_ENTRY alt_thunk_names102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y73abcEv,_ZTv0_n12_N3ccc7DD5x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y73abcEv,_ZThn4_N3ccc7DD5x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y7E = {  "_ZN3ccc7DD5x6y7E", // class name
  bases__ZN3ccc7DD5x6y7E, 2,
  &(vtc__ZN3ccc7DD5x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y7E),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  CC5x6y8  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x6y83abcEv
  ~CC5x6y8(); // tgen
  CC5x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y8E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y83efgEv");}
void  ccc::CC5x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x6y83abcEv");}
ccc::CC5x6y8 ::~CC5x6y8(){ note_dtor("_ZN3ccc7CC5x6y8E", this);} // tgen
ccc::CC5x6y8 ::CC5x6y8(){ note_ctor("_ZN3ccc7CC5x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y8E, buf);
    ::ccc::CC5x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y8E);
    dp->::ccc::CC5x6y8::~CC5x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y8E(Test__ZN3ccc7CC5x6y8E, "_ZN3ccc7CC5x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y8C1Ev();
extern void _ZN3ccc7CC5x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y8E[] = {
  NSPAIR(_ZN3ccc7CC5x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc7CC5x6y8E[];
extern void _ZN3ccc7CC5x6y83abcEv();
extern void _ZN3ccc7CC5x6y83efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y83efgEv,_ZTv0_n16_N3ccc7CC5x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y83efgEv,_ZThn4_N3ccc7CC5x6y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x6y83abcEv,_ZTv0_n20_N3ccc7CC5x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y83abcEv,_ZThn4_N3ccc7CC5x6y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y83efgEv,_ZTv0_n16_N3ccc7CC5x6y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x6y83abcEv,_ZTv0_n20_N3ccc7CC5x6y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y8E[] = {
  {&(_ZTVN3ccc7CC5x6y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC5x6y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y8E[];
static VTBL_ENTRY alt_thunk_names103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x6y83abcEv,_ZTv0_n20_N3ccc7CC5x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y83abcEv,_ZThn4_N3ccc7CC5x6y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y83efgEv,_ZTv0_n16_N3ccc7CC5x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y83efgEv,_ZThn4_N3ccc7CC5x6y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y8E = {  "_ZN3ccc7CC5x6y8E", // class name
  bases__ZN3ccc7CC5x6y8E, 2,
  &(vtc__ZN3ccc7CC5x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y8E),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  DD5x6y8  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD5x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x6y83abcEv
  ~DD5x6y8(); // tgen
  DD5x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y83efgEv");}
void  ccc::DD5x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x6y83abcEv");}
ccc::DD5x6y8 ::~DD5x6y8(){ note_dtor("_ZN3ccc7DD5x6y8E", this);} // tgen
ccc::DD5x6y8 ::DD5x6y8(){ note_ctor("_ZN3ccc7DD5x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y8E, buf);
    ::ccc::DD5x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y8E);
    dp->::ccc::DD5x6y8::~DD5x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y8E(Test__ZN3ccc7DD5x6y8E, "_ZN3ccc7DD5x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y8C1Ev();
extern void _ZN3ccc7DD5x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y8E[] = {
  NSPAIR(_ZN3ccc7DD5x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y8E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x6y83efgEv();
extern void _ZN3ccc7DD5x6y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x6y83abcEv,_ZTv0_n12_N3ccc7DD5x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y83abcEv,_ZThn4_N3ccc7DD5x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y83efgEv,_ZTv0_n16_N3ccc7DD5x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y83efgEv,_ZThn4_N3ccc7DD5x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x6y83abcEv,_ZTv0_n12_N3ccc7DD5x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y83efgEv,_ZTv0_n16_N3ccc7DD5x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y8E[] = {
  {&(_ZTVN3ccc7DD5x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y8E[];
static VTBL_ENTRY alt_thunk_names104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y83efgEv,_ZTv0_n16_N3ccc7DD5x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y83efgEv,_ZThn4_N3ccc7DD5x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x6y83abcEv,_ZTv0_n12_N3ccc7DD5x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y83abcEv,_ZThn4_N3ccc7DD5x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y8E = {  "_ZN3ccc7DD5x6y8E", // class name
  bases__ZN3ccc7DD5x6y8E, 2,
  &(vtc__ZN3ccc7DD5x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y8E),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  CC5x6y9  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC5x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x6y93pqrEv
  ~CC5x6y9(); // tgen
  CC5x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x6y9E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x6y93efgEv");}
void  ccc::CC5x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x6y93pqrEv");}
ccc::CC5x6y9 ::~CC5x6y9(){ note_dtor("_ZN3ccc7CC5x6y9E", this);} // tgen
ccc::CC5x6y9 ::CC5x6y9(){ note_ctor("_ZN3ccc7CC5x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x6y9E, buf);
    ::ccc::CC5x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x6y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC5x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x6y9E);
    dp->::ccc::CC5x6y9::~CC5x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x6y9E(Test__ZN3ccc7CC5x6y9E, "_ZN3ccc7CC5x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x6y9C1Ev();
extern void _ZN3ccc7CC5x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x6y9E[] = {
  NSPAIR(_ZN3ccc7CC5x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC5x6y9E[] = {
  // 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__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 _ZTIN3ccc7CC5x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC5x6y93efgEv();
extern void _ZN3ccc7CC5x6y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x6y93pqrEv,_ZTv0_n12_N3ccc7CC5x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y93pqrEv,_ZThn4_N3ccc7CC5x6y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x6y93efgEv,_ZTv0_n16_N3ccc7CC5x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x6y93efgEv,_ZThn4_N3ccc7CC5x6y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x6y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x6y93pqrEv,_ZTv0_n12_N3ccc7CC5x6y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x6y93efgEv,_ZTv0_n16_N3ccc7CC5x6y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x6y9E[] = {
  {&(_ZTVN3ccc7CC5x6y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x6y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x6y9E[];
static VTBL_ENTRY alt_thunk_names105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x6y93efgEv,_ZTv0_n16_N3ccc7CC5x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y93efgEv,_ZThn4_N3ccc7CC5x6y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x6y93pqrEv,_ZTv0_n12_N3ccc7CC5x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x6y93pqrEv,_ZThn4_N3ccc7CC5x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x6y9E = {  "_ZN3ccc7CC5x6y9E", // class name
  bases__ZN3ccc7CC5x6y9E, 2,
  &(vtc__ZN3ccc7CC5x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x6y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x6y9E),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  DD5x6y9  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD5x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x6y93pqrEv
  ~DD5x6y9(); // tgen
  DD5x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x6y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x6y93efgEv");}
void  ccc::DD5x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x6y93pqrEv");}
ccc::DD5x6y9 ::~DD5x6y9(){ note_dtor("_ZN3ccc7DD5x6y9E", this);} // tgen
ccc::DD5x6y9 ::DD5x6y9(){ note_ctor("_ZN3ccc7DD5x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x6y9E, buf);
    ::ccc::DD5x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x6y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD5x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x6y9E);
    dp->::ccc::DD5x6y9::~DD5x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x6y9E(Test__ZN3ccc7DD5x6y9E, "_ZN3ccc7DD5x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x6y9C1Ev();
extern void _ZN3ccc7DD5x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x6y9E[] = {
  NSPAIR(_ZN3ccc7DD5x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD5x6y9E[] = {
  // 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__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 _ZTIN3ccc7DD5x6y9E[];
extern void _ZN3ccc7DD5x6y93pqrEv();
extern void _ZN3ccc7DD5x6y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x6y93efgEv,_ZTv0_n16_N3ccc7DD5x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x6y93efgEv,_ZThn4_N3ccc7DD5x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x6y93efgEv,_ZTv0_n16_N3ccc7DD5x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x6y9E[] = {
  {&(_ZTVN3ccc7DD5x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x6y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x6y9E[];
static VTBL_ENTRY alt_thunk_names106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x6y93efgEv,_ZTv0_n16_N3ccc7DD5x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x6y93efgEv,_ZThn4_N3ccc7DD5x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x6y9E = {  "_ZN3ccc7DD5x6y9E", // class name
  bases__ZN3ccc7DD5x6y9E, 2,
  &(vtc__ZN3ccc7DD5x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x6y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x6y9E),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  CC5x6y10  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC5x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x6y103abcEv
  ~CC5x6y10(); // tgen
  CC5x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y10E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x6y103pqrEv");}
void  ccc::CC5x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x6y103abcEv");}
ccc::CC5x6y10 ::~CC5x6y10(){ note_dtor("_ZN3ccc8CC5x6y10E", this);} // tgen
ccc::CC5x6y10 ::CC5x6y10(){ note_ctor("_ZN3ccc8CC5x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x6y10E, buf);
    ::ccc::CC5x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x6y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC5x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x6y10E);
    dp->::ccc::CC5x6y10::~CC5x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x6y10E(Test__ZN3ccc8CC5x6y10E, "_ZN3ccc8CC5x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x6y10C1Ev();
extern void _ZN3ccc8CC5x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x6y10E[] = {
  NSPAIR(_ZN3ccc8CC5x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC5x6y10E[] = {
  // 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__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 _ZTIN3ccc8CC5x6y10E[];
extern void _ZN3ccc8CC5x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC5x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x6y103pqrEv,_ZTv0_n12_N3ccc8CC5x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y103pqrEv,_ZThn4_N3ccc8CC5x6y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x6y103abcEv,_ZTv0_n20_N3ccc8CC5x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y103abcEv,_ZThn4_N3ccc8CC5x6y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x6y103pqrEv,_ZTv0_n12_N3ccc8CC5x6y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x6y103abcEv,_ZTv0_n20_N3ccc8CC5x6y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x6y10E[] = {
  {&(_ZTVN3ccc8CC5x6y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x6y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x6y10E[];
static VTBL_ENTRY alt_thunk_names107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x6y103abcEv,_ZTv0_n20_N3ccc8CC5x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y103abcEv,_ZThn4_N3ccc8CC5x6y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x6y103pqrEv,_ZTv0_n12_N3ccc8CC5x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y103pqrEv,_ZThn4_N3ccc8CC5x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x6y10E = {  "_ZN3ccc8CC5x6y10E", // class name
  bases__ZN3ccc8CC5x6y10E, 2,
  &(vtc__ZN3ccc8CC5x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x6y10E),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  DD5x6y10  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD5x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x6y103abcEv
  ~DD5x6y10(); // tgen
  DD5x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x6y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x6y103pqrEv");}
void  ccc::DD5x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x6y103abcEv");}
ccc::DD5x6y10 ::~DD5x6y10(){ note_dtor("_ZN3ccc8DD5x6y10E", this);} // tgen
ccc::DD5x6y10 ::DD5x6y10(){ note_ctor("_ZN3ccc8DD5x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x6y10E, buf);
    ::ccc::DD5x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x6y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD5x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x6y10E);
    dp->::ccc::DD5x6y10::~DD5x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x6y10E(Test__ZN3ccc8DD5x6y10E, "_ZN3ccc8DD5x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x6y10C1Ev();
extern void _ZN3ccc8DD5x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x6y10E[] = {
  NSPAIR(_ZN3ccc8DD5x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD5x6y10E[] = {
  // 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__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 _ZTIN3ccc8DD5x6y10E[];
extern void _ZN3ccc8DD5x6y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x6y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x6y103abcEv,_ZTv0_n12_N3ccc8DD5x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x6y103abcEv,_ZThn4_N3ccc8DD5x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x6y103abcEv,_ZTv0_n12_N3ccc8DD5x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x6y10E[] = {
  {&(_ZTVN3ccc8DD5x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x6y10E[];
static VTBL_ENTRY alt_thunk_names108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x6y103abcEv,_ZTv0_n12_N3ccc8DD5x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x6y103abcEv,_ZThn4_N3ccc8DD5x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x6y10E = {  "_ZN3ccc8DD5x6y10E", // class name
  bases__ZN3ccc8DD5x6y10E, 2,
  &(vtc__ZN3ccc8DD5x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x6y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x6y10E),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  CC5x6y11  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC5x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x6y113efgEv
  ~CC5x6y11(); // tgen
  CC5x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y11E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x6y113pqrEv");}
void  ccc::CC5x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x6y113efgEv");}
ccc::CC5x6y11 ::~CC5x6y11(){ note_dtor("_ZN3ccc8CC5x6y11E", this);} // tgen
ccc::CC5x6y11 ::CC5x6y11(){ note_ctor("_ZN3ccc8CC5x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x6y11E, buf);
    ::ccc::CC5x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x6y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC5x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x6y11E);
    dp->::ccc::CC5x6y11::~CC5x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x6y11E(Test__ZN3ccc8CC5x6y11E, "_ZN3ccc8CC5x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x6y11C1Ev();
extern void _ZN3ccc8CC5x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x6y11E[] = {
  NSPAIR(_ZN3ccc8CC5x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC5x6y11E[] = {
  // 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__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 _ZTIN3ccc8CC5x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC5x6y113efgEv();
extern void _ZN3ccc8CC5x6y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x6y113pqrEv,_ZTv0_n12_N3ccc8CC5x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y113pqrEv,_ZThn4_N3ccc8CC5x6y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x6y113efgEv,_ZTv0_n16_N3ccc8CC5x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y113efgEv,_ZThn4_N3ccc8CC5x6y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x6y113pqrEv,_ZTv0_n12_N3ccc8CC5x6y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x6y113efgEv,_ZTv0_n16_N3ccc8CC5x6y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x6y11E[] = {
  {&(_ZTVN3ccc8CC5x6y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x6y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x6y11E[];
static VTBL_ENTRY alt_thunk_names109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x6y113efgEv,_ZTv0_n16_N3ccc8CC5x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y113efgEv,_ZThn4_N3ccc8CC5x6y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x6y113pqrEv,_ZTv0_n12_N3ccc8CC5x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y113pqrEv,_ZThn4_N3ccc8CC5x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x6y11E = {  "_ZN3ccc8CC5x6y11E", // class name
  bases__ZN3ccc8CC5x6y11E, 2,
  &(vtc__ZN3ccc8CC5x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x6y11E),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  DD5x6y11  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD5x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x6y113efgEv
  ~DD5x6y11(); // tgen
  DD5x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x6y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x6y113pqrEv");}
void  ccc::DD5x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x6y113efgEv");}
ccc::DD5x6y11 ::~DD5x6y11(){ note_dtor("_ZN3ccc8DD5x6y11E", this);} // tgen
ccc::DD5x6y11 ::DD5x6y11(){ note_ctor("_ZN3ccc8DD5x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x6y11E, buf);
    ::ccc::DD5x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x6y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD5x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x6y11E);
    dp->::ccc::DD5x6y11::~DD5x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x6y11E(Test__ZN3ccc8DD5x6y11E, "_ZN3ccc8DD5x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x6y11C1Ev();
extern void _ZN3ccc8DD5x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x6y11E[] = {
  NSPAIR(_ZN3ccc8DD5x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD5x6y11E[] = {
  // 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__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 _ZTIN3ccc8DD5x6y11E[];
extern void _ZN3ccc8DD5x6y113pqrEv();
extern void _ZN3ccc8DD5x6y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x6y113efgEv,_ZTv0_n16_N3ccc8DD5x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x6y113efgEv,_ZThn4_N3ccc8DD5x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x6y113efgEv,_ZTv0_n16_N3ccc8DD5x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x6y11E[] = {
  {&(_ZTVN3ccc8DD5x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x6y11E[];
static VTBL_ENTRY alt_thunk_names110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x6y113efgEv,_ZTv0_n16_N3ccc8DD5x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x6y113efgEv,_ZThn4_N3ccc8DD5x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x6y11E = {  "_ZN3ccc8DD5x6y11E", // class name
  bases__ZN3ccc8DD5x6y11E, 2,
  &(vtc__ZN3ccc8DD5x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x6y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x6y11E),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  CC5x6y12  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC5x6y123abcEv
  ~CC5x6y12(); // tgen
  CC5x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC5x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x6y123abcEv");}
ccc::CC5x6y12 ::~CC5x6y12(){ note_dtor("_ZN3ccc8CC5x6y12E", this);} // tgen
ccc::CC5x6y12 ::CC5x6y12(){ note_ctor("_ZN3ccc8CC5x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x6y12E, buf);
    ::ccc::CC5x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x6y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC5x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x6y12E);
    dp->::ccc::CC5x6y12::~CC5x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x6y12E(Test__ZN3ccc8CC5x6y12E, "_ZN3ccc8CC5x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x6y12C1Ev();
extern void _ZN3ccc8CC5x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x6y12E[] = {
  NSPAIR(_ZN3ccc8CC5x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC5x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x6y12E[];
extern void _ZN3ccc8CC5x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x6y123abcEv,_ZTv0_n20_N3ccc8CC5x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y123abcEv,_ZThn4_N3ccc8CC5x6y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x6y123abcEv,_ZTv0_n20_N3ccc8CC5x6y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x6y12E[] = {
  {&(_ZTVN3ccc8CC5x6y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x6y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x6y12E[];
static VTBL_ENTRY alt_thunk_names111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x6y123abcEv,_ZTv0_n20_N3ccc8CC5x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y123abcEv,_ZThn4_N3ccc8CC5x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x6y12E = {  "_ZN3ccc8CC5x6y12E", // class name
  bases__ZN3ccc8CC5x6y12E, 2,
  &(vtc__ZN3ccc8CC5x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x6y12E),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  DD5x6y12  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD5x6y123abcEv
  ~DD5x6y12(); // tgen
  DD5x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x6y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD5x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x6y123abcEv");}
ccc::DD5x6y12 ::~DD5x6y12(){ note_dtor("_ZN3ccc8DD5x6y12E", this);} // tgen
ccc::DD5x6y12 ::DD5x6y12(){ note_ctor("_ZN3ccc8DD5x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x6y12E, buf);
    ::ccc::DD5x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x6y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD5x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x6y12E);
    dp->::ccc::DD5x6y12::~DD5x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x6y12E(Test__ZN3ccc8DD5x6y12E, "_ZN3ccc8DD5x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x6y12C1Ev();
extern void _ZN3ccc8DD5x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x6y12E[] = {
  NSPAIR(_ZN3ccc8DD5x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD5x6y12E[] = {
  // 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__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 _ZTIN3ccc8DD5x6y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x6y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x6y123abcEv,_ZTv0_n12_N3ccc8DD5x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x6y123abcEv,_ZThn4_N3ccc8DD5x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x6y123abcEv,_ZTv0_n12_N3ccc8DD5x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x6y12E[] = {
  {&(_ZTVN3ccc8DD5x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x6y12E[];
static VTBL_ENTRY alt_thunk_names112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x6y123abcEv,_ZTv0_n12_N3ccc8DD5x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x6y123abcEv,_ZThn4_N3ccc8DD5x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x6y12E = {  "_ZN3ccc8DD5x6y12E", // class name
  bases__ZN3ccc8DD5x6y12E, 2,
  &(vtc__ZN3ccc8DD5x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x6y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x6y12E),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  CC5x6y13  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC5x6y133efgEv
  ~CC5x6y13(); // tgen
  CC5x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC5x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x6y133efgEv");}
ccc::CC5x6y13 ::~CC5x6y13(){ note_dtor("_ZN3ccc8CC5x6y13E", this);} // tgen
ccc::CC5x6y13 ::CC5x6y13(){ note_ctor("_ZN3ccc8CC5x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x6y13E, buf);
    ::ccc::CC5x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x6y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC5x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x6y13E);
    dp->::ccc::CC5x6y13::~CC5x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x6y13E(Test__ZN3ccc8CC5x6y13E, "_ZN3ccc8CC5x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x6y13C1Ev();
extern void _ZN3ccc8CC5x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x6y13E[] = {
  NSPAIR(_ZN3ccc8CC5x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC5x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC5x6y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x6y133efgEv,_ZTv0_n16_N3ccc8CC5x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y133efgEv,_ZThn4_N3ccc8CC5x6y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x6y133efgEv,_ZTv0_n16_N3ccc8CC5x6y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x6y13E[] = {
  {&(_ZTVN3ccc8CC5x6y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x6y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x6y13E[];
static VTBL_ENTRY alt_thunk_names113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x6y133efgEv,_ZTv0_n16_N3ccc8CC5x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y133efgEv,_ZThn4_N3ccc8CC5x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x6y13E = {  "_ZN3ccc8CC5x6y13E", // class name
  bases__ZN3ccc8CC5x6y13E, 2,
  &(vtc__ZN3ccc8CC5x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x6y13E),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  DD5x6y13  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD5x6y133efgEv
  ~DD5x6y13(); // tgen
  DD5x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x6y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD5x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x6y133efgEv");}
ccc::DD5x6y13 ::~DD5x6y13(){ note_dtor("_ZN3ccc8DD5x6y13E", this);} // tgen
ccc::DD5x6y13 ::DD5x6y13(){ note_ctor("_ZN3ccc8DD5x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x6y13E, buf);
    ::ccc::DD5x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x6y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD5x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x6y13E);
    dp->::ccc::DD5x6y13::~DD5x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x6y13E(Test__ZN3ccc8DD5x6y13E, "_ZN3ccc8DD5x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x6y13C1Ev();
extern void _ZN3ccc8DD5x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x6y13E[] = {
  NSPAIR(_ZN3ccc8DD5x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD5x6y13E[] = {
  // 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__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 _ZTIN3ccc8DD5x6y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x6y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x6y133efgEv,_ZTv0_n16_N3ccc8DD5x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x6y133efgEv,_ZThn4_N3ccc8DD5x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x6y133efgEv,_ZTv0_n16_N3ccc8DD5x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x6y13E[] = {
  {&(_ZTVN3ccc8DD5x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x6y13E[];
static VTBL_ENTRY alt_thunk_names114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x6y133efgEv,_ZTv0_n16_N3ccc8DD5x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x6y133efgEv,_ZThn4_N3ccc8DD5x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x6y13E = {  "_ZN3ccc8DD5x6y13E", // class name
  bases__ZN3ccc8DD5x6y13E, 2,
  &(vtc__ZN3ccc8DD5x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x6y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x6y13E),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  CC5x6y14  : virtual ::ccc::AA5 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC5x6y143pqrEv
  ~CC5x6y14(); // tgen
  CC5x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x6y143pqrEv");}
ccc::CC5x6y14 ::~CC5x6y14(){ note_dtor("_ZN3ccc8CC5x6y14E", this);} // tgen
ccc::CC5x6y14 ::CC5x6y14(){ note_ctor("_ZN3ccc8CC5x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x6y14E, buf);
    ::ccc::CC5x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x6y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC5x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x6y14E);
    dp->::ccc::CC5x6y14::~CC5x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x6y14E(Test__ZN3ccc8CC5x6y14E, "_ZN3ccc8CC5x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x6y14C1Ev();
extern void _ZN3ccc8CC5x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x6y14E[] = {
  NSPAIR(_ZN3ccc8CC5x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC5x6y14E[] = {
  // 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__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 _ZTIN3ccc8CC5x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC5x6y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x6y143pqrEv,_ZTv0_n12_N3ccc8CC5x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x6y143pqrEv,_ZThn4_N3ccc8CC5x6y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x6y143pqrEv,_ZTv0_n12_N3ccc8CC5x6y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x6y14E[] = {
  {&(_ZTVN3ccc8CC5x6y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x6y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x6y14E[];
static VTBL_ENTRY alt_thunk_names115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x6y143pqrEv,_ZTv0_n12_N3ccc8CC5x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x6y143pqrEv,_ZThn4_N3ccc8CC5x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x6y14E = {  "_ZN3ccc8CC5x6y14E", // class name
  bases__ZN3ccc8CC5x6y14E, 2,
  &(vtc__ZN3ccc8CC5x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x6y14E),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  DD5x6y14  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD5x6y143pqrEv
  ~DD5x6y14(); // tgen
  DD5x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x6y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x6y143pqrEv");}
ccc::DD5x6y14 ::~DD5x6y14(){ note_dtor("_ZN3ccc8DD5x6y14E", this);} // tgen
ccc::DD5x6y14 ::DD5x6y14(){ note_ctor("_ZN3ccc8DD5x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x6y14E, buf);
    ::ccc::DD5x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x6y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD5x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x6y14E);
    dp->::ccc::DD5x6y14::~DD5x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x6y14E(Test__ZN3ccc8DD5x6y14E, "_ZN3ccc8DD5x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x6y14C1Ev();
extern void _ZN3ccc8DD5x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x6y14E[] = {
  NSPAIR(_ZN3ccc8DD5x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD5x6y14E[] = {
  // 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__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 _ZTIN3ccc8DD5x6y14E[];
extern void _ZN3ccc8DD5x6y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x6y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x6y14E[] = {
  {&(_ZTVN3ccc8DD5x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x6y14E[];
Class_Descriptor cd__ZN3ccc8DD5x6y14E = {  "_ZN3ccc8DD5x6y14E", // class name
  bases__ZN3ccc8DD5x6y14E, 2,
  &(vtc__ZN3ccc8DD5x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x6y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x6y14E),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  CC5x6y15  : virtual ::ccc::AA5 , ::ccc::BB6 {
  ~CC5x6y15(); // tgen
  CC5x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x6y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC5x6y15 ::~CC5x6y15(){ note_dtor("_ZN3ccc8CC5x6y15E", this);} // tgen
ccc::CC5x6y15 ::CC5x6y15(){ note_ctor("_ZN3ccc8CC5x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x6y15E, buf);
    ::ccc::CC5x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x6y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC5x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x6y15E);
    dp->::ccc::CC5x6y15::~CC5x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x6y15E(Test__ZN3ccc8CC5x6y15E, "_ZN3ccc8CC5x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x6y15C1Ev();
extern void _ZN3ccc8CC5x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x6y15E[] = {
  NSPAIR(_ZN3ccc8CC5x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC5x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x6y15E[] = {
  {&(_ZTVN3ccc8CC5x6y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x6y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x6y15E[];
Class_Descriptor cd__ZN3ccc8CC5x6y15E = {  "_ZN3ccc8CC5x6y15E", // class name
  bases__ZN3ccc8CC5x6y15E, 2,
  &(vtc__ZN3ccc8CC5x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x6y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x6y15E),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  DD5x6y15  : virtual ::ccc::AA5 , virtual ::ccc::BB6 {
  ~DD5x6y15(); // tgen
  DD5x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x6y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD5x6y15 ::~DD5x6y15(){ note_dtor("_ZN3ccc8DD5x6y15E", this);} // tgen
ccc::DD5x6y15 ::DD5x6y15(){ note_ctor("_ZN3ccc8DD5x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x6y15E, buf);
    ::ccc::DD5x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x6y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD5x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x6y15E);
    dp->::ccc::DD5x6y15::~DD5x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x6y15E(Test__ZN3ccc8DD5x6y15E, "_ZN3ccc8DD5x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x6y15C1Ev();
extern void _ZN3ccc8DD5x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x6y15E[] = {
  NSPAIR(_ZN3ccc8DD5x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD5x6y15E[] = {
  // 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__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 _ZTIN3ccc8DD5x6y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x6y15E[] = {
  {&(_ZTVN3ccc8DD5x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x6y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x6y15E[];
Class_Descriptor cd__ZN3ccc8DD5x6y15E = {  "_ZN3ccc8DD5x6y15E", // class name
  bases__ZN3ccc8DD5x6y15E, 2,
  &(vtc__ZN3ccc8DD5x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x6y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x6y15E),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  CC5x7y0  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y03pqrEv
  ~CC5x7y0(); // tgen
  CC5x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y0E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y03abcEv");}
void  ccc::CC5x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y03efgEv");}
void  ccc::CC5x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y03pqrEv");}
ccc::CC5x7y0 ::~CC5x7y0(){ note_dtor("_ZN3ccc7CC5x7y0E", this);} // tgen
ccc::CC5x7y0 ::CC5x7y0(){ note_ctor("_ZN3ccc7CC5x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y0E, buf);
    ::ccc::CC5x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y0E);
    dp->::ccc::CC5x7y0::~CC5x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y0E(Test__ZN3ccc7CC5x7y0E, "_ZN3ccc7CC5x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y0C1Ev();
extern void _ZN3ccc7CC5x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y0E[] = {
  NSPAIR(_ZN3ccc7CC5x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y0E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y0E[];
extern void _ZN3ccc7CC5x7y03abcEv();
extern void _ZN3ccc7CC5x7y03pqrEv();
extern void _ZN3ccc7CC5x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y03pqrEv,_ZTv0_n12_N3ccc7CC5x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y03pqrEv,_ZThn4_N3ccc7CC5x7y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y03efgEv,_ZTv0_n16_N3ccc7CC5x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y03efgEv,_ZThn4_N3ccc7CC5x7y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y03abcEv,_ZTv0_n20_N3ccc7CC5x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y03abcEv,_ZThn4_N3ccc7CC5x7y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y03pqrEv,_ZTv0_n12_N3ccc7CC5x7y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y03efgEv,_ZTv0_n16_N3ccc7CC5x7y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y03abcEv,_ZTv0_n20_N3ccc7CC5x7y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y0E[] = {
  {&(_ZTVN3ccc7CC5x7y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y0E[];
static VTBL_ENTRY alt_thunk_names116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y03abcEv,_ZTv0_n20_N3ccc7CC5x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y03abcEv,_ZThn4_N3ccc7CC5x7y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y03efgEv,_ZTv0_n16_N3ccc7CC5x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y03efgEv,_ZThn4_N3ccc7CC5x7y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y03pqrEv,_ZTv0_n12_N3ccc7CC5x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y03pqrEv,_ZThn4_N3ccc7CC5x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y0E = {  "_ZN3ccc7CC5x7y0E", // class name
  bases__ZN3ccc7CC5x7y0E, 2,
  &(vtc__ZN3ccc7CC5x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y0E),2, //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  DD5x7y0  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD5x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x7y03pqrEv
  ~DD5x7y0(); // tgen
  DD5x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y03abcEv");}
void  ccc::DD5x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y03efgEv");}
void  ccc::DD5x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y03pqrEv");}
ccc::DD5x7y0 ::~DD5x7y0(){ note_dtor("_ZN3ccc7DD5x7y0E", this);} // tgen
ccc::DD5x7y0 ::DD5x7y0(){ note_ctor("_ZN3ccc7DD5x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y0E, buf);
    ::ccc::DD5x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y0E);
    dp->::ccc::DD5x7y0::~DD5x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y0E(Test__ZN3ccc7DD5x7y0E, "_ZN3ccc7DD5x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y0C1Ev();
extern void _ZN3ccc7DD5x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y0E[] = {
  NSPAIR(_ZN3ccc7DD5x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y0E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y0E[];
extern void _ZN3ccc7DD5x7y03pqrEv();
extern void _ZN3ccc7DD5x7y03efgEv();
extern void _ZN3ccc7DD5x7y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y03abcEv,_ZTv0_n12_N3ccc7DD5x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y03abcEv,_ZThn4_N3ccc7DD5x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y03pqrEv,_ZTv0_n16_N3ccc7DD5x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y03pqrEv,_ZThn4_N3ccc7DD5x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y03abcEv,_ZTv0_n12_N3ccc7DD5x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y03pqrEv,_ZTv0_n16_N3ccc7DD5x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y0E[] = {
  {&(_ZTVN3ccc7DD5x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y0E[];
static VTBL_ENTRY alt_thunk_names117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y03pqrEv,_ZTv0_n16_N3ccc7DD5x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y03pqrEv,_ZThn4_N3ccc7DD5x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y03abcEv,_ZTv0_n12_N3ccc7DD5x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y03abcEv,_ZThn4_N3ccc7DD5x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y0E = {  "_ZN3ccc7DD5x7y0E", // class name
  bases__ZN3ccc7DD5x7y0E, 2,
  &(vtc__ZN3ccc7DD5x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y0E),3, //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  CC5x7y1  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x7y13efgEv
  ~CC5x7y1(); // tgen
  CC5x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y1E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y13abcEv");}
void  ccc::CC5x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y13pqrEv");}
void  ccc::CC5x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y13efgEv");}
ccc::CC5x7y1 ::~CC5x7y1(){ note_dtor("_ZN3ccc7CC5x7y1E", this);} // tgen
ccc::CC5x7y1 ::CC5x7y1(){ note_ctor("_ZN3ccc7CC5x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y1E, buf);
    ::ccc::CC5x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y1E);
    dp->::ccc::CC5x7y1::~CC5x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y1E(Test__ZN3ccc7CC5x7y1E, "_ZN3ccc7CC5x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y1C1Ev();
extern void _ZN3ccc7CC5x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y1E[] = {
  NSPAIR(_ZN3ccc7CC5x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y1E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y1E[];
extern void _ZN3ccc7CC5x7y13abcEv();
extern void _ZN3ccc7CC5x7y13pqrEv();
extern void _ZN3ccc7CC5x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y13pqrEv,_ZTv0_n12_N3ccc7CC5x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y13pqrEv,_ZThn4_N3ccc7CC5x7y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y13efgEv,_ZTv0_n16_N3ccc7CC5x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y13efgEv,_ZThn4_N3ccc7CC5x7y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y13abcEv,_ZTv0_n20_N3ccc7CC5x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y13abcEv,_ZThn4_N3ccc7CC5x7y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y13pqrEv,_ZTv0_n12_N3ccc7CC5x7y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y13efgEv,_ZTv0_n16_N3ccc7CC5x7y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y13abcEv,_ZTv0_n20_N3ccc7CC5x7y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y1E[] = {
  {&(_ZTVN3ccc7CC5x7y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y1E[];
static VTBL_ENTRY alt_thunk_names118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y13abcEv,_ZTv0_n20_N3ccc7CC5x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y13abcEv,_ZThn4_N3ccc7CC5x7y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y13efgEv,_ZTv0_n16_N3ccc7CC5x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y13efgEv,_ZThn4_N3ccc7CC5x7y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y13pqrEv,_ZTv0_n12_N3ccc7CC5x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y13pqrEv,_ZThn4_N3ccc7CC5x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y1E = {  "_ZN3ccc7CC5x7y1E", // class name
  bases__ZN3ccc7CC5x7y1E, 2,
  &(vtc__ZN3ccc7CC5x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y1E),2, //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  DD5x7y1  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD5x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x7y13efgEv
  ~DD5x7y1(); // tgen
  DD5x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y13abcEv");}
void  ccc::DD5x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y13pqrEv");}
void  ccc::DD5x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y13efgEv");}
ccc::DD5x7y1 ::~DD5x7y1(){ note_dtor("_ZN3ccc7DD5x7y1E", this);} // tgen
ccc::DD5x7y1 ::DD5x7y1(){ note_ctor("_ZN3ccc7DD5x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y1E, buf);
    ::ccc::DD5x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y1E);
    dp->::ccc::DD5x7y1::~DD5x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y1E(Test__ZN3ccc7DD5x7y1E, "_ZN3ccc7DD5x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y1C1Ev();
extern void _ZN3ccc7DD5x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y1E[] = {
  NSPAIR(_ZN3ccc7DD5x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y1E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y1E[];
extern void _ZN3ccc7DD5x7y13pqrEv();
extern void _ZN3ccc7DD5x7y13efgEv();
extern void _ZN3ccc7DD5x7y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y13abcEv,_ZTv0_n12_N3ccc7DD5x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y13abcEv,_ZThn4_N3ccc7DD5x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y13pqrEv,_ZTv0_n16_N3ccc7DD5x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y13pqrEv,_ZThn4_N3ccc7DD5x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y13abcEv,_ZTv0_n12_N3ccc7DD5x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y13pqrEv,_ZTv0_n16_N3ccc7DD5x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y1E[] = {
  {&(_ZTVN3ccc7DD5x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y1E[];
static VTBL_ENTRY alt_thunk_names119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y13pqrEv,_ZTv0_n16_N3ccc7DD5x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y13pqrEv,_ZThn4_N3ccc7DD5x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y13abcEv,_ZTv0_n12_N3ccc7DD5x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y13abcEv,_ZThn4_N3ccc7DD5x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y1E = {  "_ZN3ccc7DD5x7y1E", // class name
  bases__ZN3ccc7DD5x7y1E, 2,
  &(vtc__ZN3ccc7DD5x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y1E),3, //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  CC5x7y2  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y23pqrEv
  ~CC5x7y2(); // tgen
  CC5x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y2E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y23efgEv");}
void  ccc::CC5x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y23abcEv");}
void  ccc::CC5x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y23pqrEv");}
ccc::CC5x7y2 ::~CC5x7y2(){ note_dtor("_ZN3ccc7CC5x7y2E", this);} // tgen
ccc::CC5x7y2 ::CC5x7y2(){ note_ctor("_ZN3ccc7CC5x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y2E, buf);
    ::ccc::CC5x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y2E);
    dp->::ccc::CC5x7y2::~CC5x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y2E(Test__ZN3ccc7CC5x7y2E, "_ZN3ccc7CC5x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y2C1Ev();
extern void _ZN3ccc7CC5x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y2E[] = {
  NSPAIR(_ZN3ccc7CC5x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y2E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y2E[];
extern void _ZN3ccc7CC5x7y23abcEv();
extern void _ZN3ccc7CC5x7y23pqrEv();
extern void _ZN3ccc7CC5x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y23pqrEv,_ZTv0_n12_N3ccc7CC5x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y23pqrEv,_ZThn4_N3ccc7CC5x7y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y23efgEv,_ZTv0_n16_N3ccc7CC5x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y23efgEv,_ZThn4_N3ccc7CC5x7y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y23abcEv,_ZTv0_n20_N3ccc7CC5x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y23abcEv,_ZThn4_N3ccc7CC5x7y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y23pqrEv,_ZTv0_n12_N3ccc7CC5x7y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y23efgEv,_ZTv0_n16_N3ccc7CC5x7y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y23abcEv,_ZTv0_n20_N3ccc7CC5x7y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y2E[] = {
  {&(_ZTVN3ccc7CC5x7y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y2E[];
static VTBL_ENTRY alt_thunk_names120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y23abcEv,_ZTv0_n20_N3ccc7CC5x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y23abcEv,_ZThn4_N3ccc7CC5x7y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y23efgEv,_ZTv0_n16_N3ccc7CC5x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y23efgEv,_ZThn4_N3ccc7CC5x7y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y23pqrEv,_ZTv0_n12_N3ccc7CC5x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y23pqrEv,_ZThn4_N3ccc7CC5x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y2E = {  "_ZN3ccc7CC5x7y2E", // class name
  bases__ZN3ccc7CC5x7y2E, 2,
  &(vtc__ZN3ccc7CC5x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y2E),2, //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  DD5x7y2  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD5x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x7y23pqrEv
  ~DD5x7y2(); // tgen
  DD5x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y23efgEv");}
void  ccc::DD5x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y23abcEv");}
void  ccc::DD5x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y23pqrEv");}
ccc::DD5x7y2 ::~DD5x7y2(){ note_dtor("_ZN3ccc7DD5x7y2E", this);} // tgen
ccc::DD5x7y2 ::DD5x7y2(){ note_ctor("_ZN3ccc7DD5x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y2E, buf);
    ::ccc::DD5x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y2E);
    dp->::ccc::DD5x7y2::~DD5x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y2E(Test__ZN3ccc7DD5x7y2E, "_ZN3ccc7DD5x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y2C1Ev();
extern void _ZN3ccc7DD5x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y2E[] = {
  NSPAIR(_ZN3ccc7DD5x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y2E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y2E[];
extern void _ZN3ccc7DD5x7y23pqrEv();
extern void _ZN3ccc7DD5x7y23efgEv();
extern void _ZN3ccc7DD5x7y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y23abcEv,_ZTv0_n12_N3ccc7DD5x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y23abcEv,_ZThn4_N3ccc7DD5x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y23pqrEv,_ZTv0_n16_N3ccc7DD5x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y23pqrEv,_ZThn4_N3ccc7DD5x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y23abcEv,_ZTv0_n12_N3ccc7DD5x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y23pqrEv,_ZTv0_n16_N3ccc7DD5x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y2E[] = {
  {&(_ZTVN3ccc7DD5x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y2E[];
static VTBL_ENTRY alt_thunk_names121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y23pqrEv,_ZTv0_n16_N3ccc7DD5x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y23pqrEv,_ZThn4_N3ccc7DD5x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y23abcEv,_ZTv0_n12_N3ccc7DD5x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y23abcEv,_ZThn4_N3ccc7DD5x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y2E = {  "_ZN3ccc7DD5x7y2E", // class name
  bases__ZN3ccc7DD5x7y2E, 2,
  &(vtc__ZN3ccc7DD5x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y2E),3, //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  CC5x7y3  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x7y33abcEv
  ~CC5x7y3(); // tgen
  CC5x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y3E) C1{ VBC2{ v2 v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y33efgEv");}
void  ccc::CC5x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y33pqrEv");}
void  ccc::CC5x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y33abcEv");}
ccc::CC5x7y3 ::~CC5x7y3(){ note_dtor("_ZN3ccc7CC5x7y3E", this);} // tgen
ccc::CC5x7y3 ::CC5x7y3(){ note_ctor("_ZN3ccc7CC5x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y3E, buf);
    ::ccc::CC5x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y3E);
    dp->::ccc::CC5x7y3::~CC5x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y3E(Test__ZN3ccc7CC5x7y3E, "_ZN3ccc7CC5x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y3C1Ev();
extern void _ZN3ccc7CC5x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y3E[] = {
  NSPAIR(_ZN3ccc7CC5x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y3E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y3E[];
extern void _ZN3ccc7CC5x7y33abcEv();
extern void _ZN3ccc7CC5x7y33pqrEv();
extern void _ZN3ccc7CC5x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y33pqrEv,_ZTv0_n12_N3ccc7CC5x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y33pqrEv,_ZThn4_N3ccc7CC5x7y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y33efgEv,_ZTv0_n16_N3ccc7CC5x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y33efgEv,_ZThn4_N3ccc7CC5x7y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y33abcEv,_ZTv0_n20_N3ccc7CC5x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y33abcEv,_ZThn4_N3ccc7CC5x7y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y33pqrEv,_ZTv0_n12_N3ccc7CC5x7y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y33efgEv,_ZTv0_n16_N3ccc7CC5x7y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y33abcEv,_ZTv0_n20_N3ccc7CC5x7y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y3E[] = {
  {&(_ZTVN3ccc7CC5x7y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y3E[];
static VTBL_ENTRY alt_thunk_names122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y33abcEv,_ZTv0_n20_N3ccc7CC5x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y33abcEv,_ZThn4_N3ccc7CC5x7y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y33efgEv,_ZTv0_n16_N3ccc7CC5x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y33efgEv,_ZThn4_N3ccc7CC5x7y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y33pqrEv,_ZTv0_n12_N3ccc7CC5x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y33pqrEv,_ZThn4_N3ccc7CC5x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y3E = {  "_ZN3ccc7CC5x7y3E", // class name
  bases__ZN3ccc7CC5x7y3E, 2,
  &(vtc__ZN3ccc7CC5x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y3E),2, //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  DD5x7y3  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD5x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x7y33abcEv
  ~DD5x7y3(); // tgen
  DD5x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y33efgEv");}
void  ccc::DD5x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y33pqrEv");}
void  ccc::DD5x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y33abcEv");}
ccc::DD5x7y3 ::~DD5x7y3(){ note_dtor("_ZN3ccc7DD5x7y3E", this);} // tgen
ccc::DD5x7y3 ::DD5x7y3(){ note_ctor("_ZN3ccc7DD5x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y3E, buf);
    ::ccc::DD5x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y3E);
    dp->::ccc::DD5x7y3::~DD5x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y3E(Test__ZN3ccc7DD5x7y3E, "_ZN3ccc7DD5x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y3C1Ev();
extern void _ZN3ccc7DD5x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y3E[] = {
  NSPAIR(_ZN3ccc7DD5x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y3E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y3E[];
extern void _ZN3ccc7DD5x7y33pqrEv();
extern void _ZN3ccc7DD5x7y33efgEv();
extern void _ZN3ccc7DD5x7y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y33abcEv,_ZTv0_n12_N3ccc7DD5x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y33abcEv,_ZThn4_N3ccc7DD5x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y33pqrEv,_ZTv0_n16_N3ccc7DD5x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y33pqrEv,_ZThn4_N3ccc7DD5x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y33abcEv,_ZTv0_n12_N3ccc7DD5x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y33pqrEv,_ZTv0_n16_N3ccc7DD5x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y3E[] = {
  {&(_ZTVN3ccc7DD5x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y3E[];
static VTBL_ENTRY alt_thunk_names123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y33pqrEv,_ZTv0_n16_N3ccc7DD5x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y33pqrEv,_ZThn4_N3ccc7DD5x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y33abcEv,_ZTv0_n12_N3ccc7DD5x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y33abcEv,_ZThn4_N3ccc7DD5x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y3E = {  "_ZN3ccc7DD5x7y3E", // class name
  bases__ZN3ccc7DD5x7y3E, 2,
  &(vtc__ZN3ccc7DD5x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y3E),3, //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  CC5x7y4  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC5x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x7y43efgEv
  ~CC5x7y4(); // tgen
  CC5x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y4E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y43pqrEv");}
void  ccc::CC5x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y43abcEv");}
void  ccc::CC5x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y43efgEv");}
ccc::CC5x7y4 ::~CC5x7y4(){ note_dtor("_ZN3ccc7CC5x7y4E", this);} // tgen
ccc::CC5x7y4 ::CC5x7y4(){ note_ctor("_ZN3ccc7CC5x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y4E, buf);
    ::ccc::CC5x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y4E);
    dp->::ccc::CC5x7y4::~CC5x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y4E(Test__ZN3ccc7CC5x7y4E, "_ZN3ccc7CC5x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y4C1Ev();
extern void _ZN3ccc7CC5x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y4E[] = {
  NSPAIR(_ZN3ccc7CC5x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y4E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y4E[];
extern void _ZN3ccc7CC5x7y43abcEv();
extern void _ZN3ccc7CC5x7y43pqrEv();
extern void _ZN3ccc7CC5x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y43pqrEv,_ZTv0_n12_N3ccc7CC5x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y43pqrEv,_ZThn4_N3ccc7CC5x7y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y43efgEv,_ZTv0_n16_N3ccc7CC5x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y43efgEv,_ZThn4_N3ccc7CC5x7y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y43abcEv,_ZTv0_n20_N3ccc7CC5x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y43abcEv,_ZThn4_N3ccc7CC5x7y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y43pqrEv,_ZTv0_n12_N3ccc7CC5x7y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y43efgEv,_ZTv0_n16_N3ccc7CC5x7y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y43abcEv,_ZTv0_n20_N3ccc7CC5x7y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y4E[] = {
  {&(_ZTVN3ccc7CC5x7y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y4E[];
static VTBL_ENTRY alt_thunk_names124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y43abcEv,_ZTv0_n20_N3ccc7CC5x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y43abcEv,_ZThn4_N3ccc7CC5x7y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y43efgEv,_ZTv0_n16_N3ccc7CC5x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y43efgEv,_ZThn4_N3ccc7CC5x7y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y43pqrEv,_ZTv0_n12_N3ccc7CC5x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y43pqrEv,_ZThn4_N3ccc7CC5x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y4E = {  "_ZN3ccc7CC5x7y4E", // class name
  bases__ZN3ccc7CC5x7y4E, 2,
  &(vtc__ZN3ccc7CC5x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y4E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names124,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x7y4  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD5x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x7y43efgEv
  ~DD5x7y4(); // tgen
  DD5x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y43pqrEv");}
void  ccc::DD5x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y43abcEv");}
void  ccc::DD5x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y43efgEv");}
ccc::DD5x7y4 ::~DD5x7y4(){ note_dtor("_ZN3ccc7DD5x7y4E", this);} // tgen
ccc::DD5x7y4 ::DD5x7y4(){ note_ctor("_ZN3ccc7DD5x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y4E, buf);
    ::ccc::DD5x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y4E);
    dp->::ccc::DD5x7y4::~DD5x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y4E(Test__ZN3ccc7DD5x7y4E, "_ZN3ccc7DD5x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y4C1Ev();
extern void _ZN3ccc7DD5x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y4E[] = {
  NSPAIR(_ZN3ccc7DD5x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y4E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y4E[];
extern void _ZN3ccc7DD5x7y43pqrEv();
extern void _ZN3ccc7DD5x7y43efgEv();
extern void _ZN3ccc7DD5x7y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y43abcEv,_ZTv0_n12_N3ccc7DD5x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y43abcEv,_ZThn4_N3ccc7DD5x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y43pqrEv,_ZTv0_n16_N3ccc7DD5x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y43pqrEv,_ZThn4_N3ccc7DD5x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y43abcEv,_ZTv0_n12_N3ccc7DD5x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y43pqrEv,_ZTv0_n16_N3ccc7DD5x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y4E[] = {
  {&(_ZTVN3ccc7DD5x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y4E[];
static VTBL_ENTRY alt_thunk_names125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y43pqrEv,_ZTv0_n16_N3ccc7DD5x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y43pqrEv,_ZThn4_N3ccc7DD5x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y43abcEv,_ZTv0_n12_N3ccc7DD5x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y43abcEv,_ZThn4_N3ccc7DD5x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y4E = {  "_ZN3ccc7DD5x7y4E", // class name
  bases__ZN3ccc7DD5x7y4E, 2,
  &(vtc__ZN3ccc7DD5x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y4E),3, //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  CC5x7y5  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC5x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x7y53abcEv
  ~CC5x7y5(); // tgen
  CC5x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y5E) C1{ VBC2{ v1 v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y53pqrEv");}
void  ccc::CC5x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y53efgEv");}
void  ccc::CC5x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y53abcEv");}
ccc::CC5x7y5 ::~CC5x7y5(){ note_dtor("_ZN3ccc7CC5x7y5E", this);} // tgen
ccc::CC5x7y5 ::CC5x7y5(){ note_ctor("_ZN3ccc7CC5x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y5E, buf);
    ::ccc::CC5x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y5E);
    dp->::ccc::CC5x7y5::~CC5x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y5E(Test__ZN3ccc7CC5x7y5E, "_ZN3ccc7CC5x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y5C1Ev();
extern void _ZN3ccc7CC5x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y5E[] = {
  NSPAIR(_ZN3ccc7CC5x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y5E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y5E[];
extern void _ZN3ccc7CC5x7y53abcEv();
extern void _ZN3ccc7CC5x7y53pqrEv();
extern void _ZN3ccc7CC5x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y53pqrEv,_ZTv0_n12_N3ccc7CC5x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y53pqrEv,_ZThn4_N3ccc7CC5x7y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y53efgEv,_ZTv0_n16_N3ccc7CC5x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y53efgEv,_ZThn4_N3ccc7CC5x7y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y53abcEv,_ZTv0_n20_N3ccc7CC5x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y53abcEv,_ZThn4_N3ccc7CC5x7y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y53pqrEv,_ZTv0_n12_N3ccc7CC5x7y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y53efgEv,_ZTv0_n16_N3ccc7CC5x7y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y53abcEv,_ZTv0_n20_N3ccc7CC5x7y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y5E[] = {
  {&(_ZTVN3ccc7CC5x7y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y5E[];
static VTBL_ENTRY alt_thunk_names126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y53abcEv,_ZTv0_n20_N3ccc7CC5x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y53abcEv,_ZThn4_N3ccc7CC5x7y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y53efgEv,_ZTv0_n16_N3ccc7CC5x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y53efgEv,_ZThn4_N3ccc7CC5x7y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y53pqrEv,_ZTv0_n12_N3ccc7CC5x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y53pqrEv,_ZThn4_N3ccc7CC5x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y5E = {  "_ZN3ccc7CC5x7y5E", // class name
  bases__ZN3ccc7CC5x7y5E, 2,
  &(vtc__ZN3ccc7CC5x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y5E),2, //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  DD5x7y5  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD5x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x7y53abcEv
  ~DD5x7y5(); // tgen
  DD5x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y53pqrEv");}
void  ccc::DD5x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y53efgEv");}
void  ccc::DD5x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y53abcEv");}
ccc::DD5x7y5 ::~DD5x7y5(){ note_dtor("_ZN3ccc7DD5x7y5E", this);} // tgen
ccc::DD5x7y5 ::DD5x7y5(){ note_ctor("_ZN3ccc7DD5x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y5E, buf);
    ::ccc::DD5x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y5E);
    dp->::ccc::DD5x7y5::~DD5x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y5E(Test__ZN3ccc7DD5x7y5E, "_ZN3ccc7DD5x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y5C1Ev();
extern void _ZN3ccc7DD5x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y5E[] = {
  NSPAIR(_ZN3ccc7DD5x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y5E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y5E[];
extern void _ZN3ccc7DD5x7y53pqrEv();
extern void _ZN3ccc7DD5x7y53efgEv();
extern void _ZN3ccc7DD5x7y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y53abcEv,_ZTv0_n12_N3ccc7DD5x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y53abcEv,_ZThn4_N3ccc7DD5x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y53pqrEv,_ZTv0_n16_N3ccc7DD5x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y53pqrEv,_ZThn4_N3ccc7DD5x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y53abcEv,_ZTv0_n12_N3ccc7DD5x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y53pqrEv,_ZTv0_n16_N3ccc7DD5x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y5E[] = {
  {&(_ZTVN3ccc7DD5x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y5E[];
static VTBL_ENTRY alt_thunk_names127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y53pqrEv,_ZTv0_n16_N3ccc7DD5x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y53pqrEv,_ZThn4_N3ccc7DD5x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y53abcEv,_ZTv0_n12_N3ccc7DD5x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y53abcEv,_ZThn4_N3ccc7DD5x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y5E = {  "_ZN3ccc7DD5x7y5E", // class name
  bases__ZN3ccc7DD5x7y5E, 2,
  &(vtc__ZN3ccc7DD5x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y5E),3, //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  CC5x7y6  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x7y63efgEv
  ~CC5x7y6(); // tgen
  CC5x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y6E) C1{ VBC2{ v3 v2 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y63abcEv");}
void  ccc::CC5x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y63efgEv");}
ccc::CC5x7y6 ::~CC5x7y6(){ note_dtor("_ZN3ccc7CC5x7y6E", this);} // tgen
ccc::CC5x7y6 ::CC5x7y6(){ note_ctor("_ZN3ccc7CC5x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y6E, buf);
    ::ccc::CC5x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y6E);
    dp->::ccc::CC5x7y6::~CC5x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y6E(Test__ZN3ccc7CC5x7y6E, "_ZN3ccc7CC5x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y6C1Ev();
extern void _ZN3ccc7CC5x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y6E[] = {
  NSPAIR(_ZN3ccc7CC5x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y6E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y6E[];
extern void _ZN3ccc7CC5x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC5x7y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y63efgEv,_ZTv0_n16_N3ccc7CC5x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y63efgEv,_ZThn4_N3ccc7CC5x7y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y63abcEv,_ZTv0_n20_N3ccc7CC5x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y63abcEv,_ZThn4_N3ccc7CC5x7y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y63efgEv,_ZTv0_n16_N3ccc7CC5x7y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y63abcEv,_ZTv0_n20_N3ccc7CC5x7y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y6E[] = {
  {&(_ZTVN3ccc7CC5x7y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y6E[];
static VTBL_ENTRY alt_thunk_names128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y63abcEv,_ZTv0_n20_N3ccc7CC5x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y63abcEv,_ZThn4_N3ccc7CC5x7y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y63efgEv,_ZTv0_n16_N3ccc7CC5x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y63efgEv,_ZThn4_N3ccc7CC5x7y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y6E = {  "_ZN3ccc7CC5x7y6E", // class name
  bases__ZN3ccc7CC5x7y6E, 2,
  &(vtc__ZN3ccc7CC5x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y6E),2, //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  DD5x7y6  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD5x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x7y63efgEv
  ~DD5x7y6(); // tgen
  DD5x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y63abcEv");}
void  ccc::DD5x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y63efgEv");}
ccc::DD5x7y6 ::~DD5x7y6(){ note_dtor("_ZN3ccc7DD5x7y6E", this);} // tgen
ccc::DD5x7y6 ::DD5x7y6(){ note_ctor("_ZN3ccc7DD5x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y6E, buf);
    ::ccc::DD5x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y6E);
    dp->::ccc::DD5x7y6::~DD5x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y6E(Test__ZN3ccc7DD5x7y6E, "_ZN3ccc7DD5x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y6C1Ev();
extern void _ZN3ccc7DD5x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y6E[] = {
  NSPAIR(_ZN3ccc7DD5x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y6E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x7y63efgEv();
extern void _ZN3ccc7DD5x7y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y63abcEv,_ZTv0_n12_N3ccc7DD5x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y63abcEv,_ZThn4_N3ccc7DD5x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y63abcEv,_ZTv0_n12_N3ccc7DD5x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y6E[] = {
  {&(_ZTVN3ccc7DD5x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y6E[];
static VTBL_ENTRY alt_thunk_names129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y63abcEv,_ZTv0_n12_N3ccc7DD5x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y63abcEv,_ZThn4_N3ccc7DD5x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y6E = {  "_ZN3ccc7DD5x7y6E", // class name
  bases__ZN3ccc7DD5x7y6E, 2,
  &(vtc__ZN3ccc7DD5x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y6E),3, //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  CC5x7y7  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC5x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y73pqrEv
  ~CC5x7y7(); // tgen
  CC5x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y7E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y73abcEv");}
void  ccc::CC5x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y73pqrEv");}
ccc::CC5x7y7 ::~CC5x7y7(){ note_dtor("_ZN3ccc7CC5x7y7E", this);} // tgen
ccc::CC5x7y7 ::CC5x7y7(){ note_ctor("_ZN3ccc7CC5x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y7E, buf);
    ::ccc::CC5x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y7E);
    dp->::ccc::CC5x7y7::~CC5x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y7E(Test__ZN3ccc7CC5x7y7E, "_ZN3ccc7CC5x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y7C1Ev();
extern void _ZN3ccc7CC5x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y7E[] = {
  NSPAIR(_ZN3ccc7CC5x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc7CC5x7y7E[];
extern void _ZN3ccc7CC5x7y73abcEv();
extern void _ZN3ccc7CC5x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y73pqrEv,_ZTv0_n12_N3ccc7CC5x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y73pqrEv,_ZThn4_N3ccc7CC5x7y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y73abcEv,_ZTv0_n20_N3ccc7CC5x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y73abcEv,_ZThn4_N3ccc7CC5x7y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y73pqrEv,_ZTv0_n12_N3ccc7CC5x7y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y73abcEv,_ZTv0_n20_N3ccc7CC5x7y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y7E[] = {
  {&(_ZTVN3ccc7CC5x7y7E[3]),  3,13},
  {&(_ZTVN3ccc7CC5x7y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y7E[];
static VTBL_ENTRY alt_thunk_names130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y73abcEv,_ZTv0_n20_N3ccc7CC5x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y73abcEv,_ZThn4_N3ccc7CC5x7y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y73pqrEv,_ZTv0_n12_N3ccc7CC5x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y73pqrEv,_ZThn4_N3ccc7CC5x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y7E = {  "_ZN3ccc7CC5x7y7E", // class name
  bases__ZN3ccc7CC5x7y7E, 2,
  &(vtc__ZN3ccc7CC5x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y7E),2, //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  DD5x7y7  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD5x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x7y73pqrEv
  ~DD5x7y7(); // tgen
  DD5x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y73abcEv");}
void  ccc::DD5x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y73pqrEv");}
ccc::DD5x7y7 ::~DD5x7y7(){ note_dtor("_ZN3ccc7DD5x7y7E", this);} // tgen
ccc::DD5x7y7 ::DD5x7y7(){ note_ctor("_ZN3ccc7DD5x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y7E, buf);
    ::ccc::DD5x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y7E);
    dp->::ccc::DD5x7y7::~DD5x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y7E(Test__ZN3ccc7DD5x7y7E, "_ZN3ccc7DD5x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y7C1Ev();
extern void _ZN3ccc7DD5x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y7E[] = {
  NSPAIR(_ZN3ccc7DD5x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y7E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y7E[];
extern void _ZN3ccc7DD5x7y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x7y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y73abcEv,_ZTv0_n12_N3ccc7DD5x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y73abcEv,_ZThn4_N3ccc7DD5x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y73pqrEv,_ZTv0_n16_N3ccc7DD5x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y73pqrEv,_ZThn4_N3ccc7DD5x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y73abcEv,_ZTv0_n12_N3ccc7DD5x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y73pqrEv,_ZTv0_n16_N3ccc7DD5x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y7E[] = {
  {&(_ZTVN3ccc7DD5x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y7E[];
static VTBL_ENTRY alt_thunk_names131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y73pqrEv,_ZTv0_n16_N3ccc7DD5x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y73pqrEv,_ZThn4_N3ccc7DD5x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y73abcEv,_ZTv0_n12_N3ccc7DD5x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y73abcEv,_ZThn4_N3ccc7DD5x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y7E = {  "_ZN3ccc7DD5x7y7E", // class name
  bases__ZN3ccc7DD5x7y7E, 2,
  &(vtc__ZN3ccc7DD5x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y7E),3, //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  CC5x7y8  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x7y83abcEv
  ~CC5x7y8(); // tgen
  CC5x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y8E) C1{ VBC2{ v3 v1 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y83efgEv");}
void  ccc::CC5x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x7y83abcEv");}
ccc::CC5x7y8 ::~CC5x7y8(){ note_dtor("_ZN3ccc7CC5x7y8E", this);} // tgen
ccc::CC5x7y8 ::CC5x7y8(){ note_ctor("_ZN3ccc7CC5x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y8E, buf);
    ::ccc::CC5x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y8E);
    dp->::ccc::CC5x7y8::~CC5x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y8E(Test__ZN3ccc7CC5x7y8E, "_ZN3ccc7CC5x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y8C1Ev();
extern void _ZN3ccc7CC5x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y8E[] = {
  NSPAIR(_ZN3ccc7CC5x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y8E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y8E[];
extern void _ZN3ccc7CC5x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC5x7y83efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y83efgEv,_ZTv0_n16_N3ccc7CC5x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y83efgEv,_ZThn4_N3ccc7CC5x7y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x7y83abcEv,_ZTv0_n20_N3ccc7CC5x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y83abcEv,_ZThn4_N3ccc7CC5x7y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y83efgEv,_ZTv0_n16_N3ccc7CC5x7y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x7y83abcEv,_ZTv0_n20_N3ccc7CC5x7y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y8E[] = {
  {&(_ZTVN3ccc7CC5x7y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y8E[];
static VTBL_ENTRY alt_thunk_names132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x7y83abcEv,_ZTv0_n20_N3ccc7CC5x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y83abcEv,_ZThn4_N3ccc7CC5x7y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y83efgEv,_ZTv0_n16_N3ccc7CC5x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y83efgEv,_ZThn4_N3ccc7CC5x7y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y8E = {  "_ZN3ccc7CC5x7y8E", // class name
  bases__ZN3ccc7CC5x7y8E, 2,
  &(vtc__ZN3ccc7CC5x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y8E),2, //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  DD5x7y8  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD5x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x7y83abcEv
  ~DD5x7y8(); // tgen
  DD5x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y83efgEv");}
void  ccc::DD5x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x7y83abcEv");}
ccc::DD5x7y8 ::~DD5x7y8(){ note_dtor("_ZN3ccc7DD5x7y8E", this);} // tgen
ccc::DD5x7y8 ::DD5x7y8(){ note_ctor("_ZN3ccc7DD5x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y8E, buf);
    ::ccc::DD5x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y8E);
    dp->::ccc::DD5x7y8::~DD5x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y8E(Test__ZN3ccc7DD5x7y8E, "_ZN3ccc7DD5x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y8C1Ev();
extern void _ZN3ccc7DD5x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y8E[] = {
  NSPAIR(_ZN3ccc7DD5x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y8E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x7y83efgEv();
extern void _ZN3ccc7DD5x7y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x7y83abcEv,_ZTv0_n12_N3ccc7DD5x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y83abcEv,_ZThn4_N3ccc7DD5x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x7y83abcEv,_ZTv0_n12_N3ccc7DD5x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y8E[] = {
  {&(_ZTVN3ccc7DD5x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y8E[];
static VTBL_ENTRY alt_thunk_names133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x7y83abcEv,_ZTv0_n12_N3ccc7DD5x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y83abcEv,_ZThn4_N3ccc7DD5x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y8E = {  "_ZN3ccc7DD5x7y8E", // class name
  bases__ZN3ccc7DD5x7y8E, 2,
  &(vtc__ZN3ccc7DD5x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y8E),3, //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  CC5x7y9  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC5x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x7y93pqrEv
  ~CC5x7y9(); // tgen
  CC5x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x7y9E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x7y93efgEv");}
void  ccc::CC5x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x7y93pqrEv");}
ccc::CC5x7y9 ::~CC5x7y9(){ note_dtor("_ZN3ccc7CC5x7y9E", this);} // tgen
ccc::CC5x7y9 ::CC5x7y9(){ note_ctor("_ZN3ccc7CC5x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x7y9E, buf);
    ::ccc::CC5x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x7y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC5x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x7y9E);
    dp->::ccc::CC5x7y9::~CC5x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x7y9E(Test__ZN3ccc7CC5x7y9E, "_ZN3ccc7CC5x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x7y9C1Ev();
extern void _ZN3ccc7CC5x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x7y9E[] = {
  NSPAIR(_ZN3ccc7CC5x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC5x7y9E[] = {
  // 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__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 _ZTIN3ccc7CC5x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC5x7y93pqrEv();
extern void _ZN3ccc7CC5x7y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x7y93pqrEv,_ZTv0_n12_N3ccc7CC5x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y93pqrEv,_ZThn4_N3ccc7CC5x7y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x7y93efgEv,_ZTv0_n16_N3ccc7CC5x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x7y93efgEv,_ZThn4_N3ccc7CC5x7y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x7y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x7y93pqrEv,_ZTv0_n12_N3ccc7CC5x7y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x7y93efgEv,_ZTv0_n16_N3ccc7CC5x7y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x7y9E[] = {
  {&(_ZTVN3ccc7CC5x7y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x7y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x7y9E[];
static VTBL_ENTRY alt_thunk_names134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x7y93efgEv,_ZTv0_n16_N3ccc7CC5x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y93efgEv,_ZThn4_N3ccc7CC5x7y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x7y93pqrEv,_ZTv0_n12_N3ccc7CC5x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x7y93pqrEv,_ZThn4_N3ccc7CC5x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x7y9E = {  "_ZN3ccc7CC5x7y9E", // class name
  bases__ZN3ccc7CC5x7y9E, 2,
  &(vtc__ZN3ccc7CC5x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x7y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x7y9E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names134,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x7y9  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD5x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x7y93pqrEv
  ~DD5x7y9(); // tgen
  DD5x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x7y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x7y93efgEv");}
void  ccc::DD5x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x7y93pqrEv");}
ccc::DD5x7y9 ::~DD5x7y9(){ note_dtor("_ZN3ccc7DD5x7y9E", this);} // tgen
ccc::DD5x7y9 ::DD5x7y9(){ note_ctor("_ZN3ccc7DD5x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x7y9E, buf);
    ::ccc::DD5x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x7y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD5x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x7y9E);
    dp->::ccc::DD5x7y9::~DD5x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x7y9E(Test__ZN3ccc7DD5x7y9E, "_ZN3ccc7DD5x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x7y9C1Ev();
extern void _ZN3ccc7DD5x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x7y9E[] = {
  NSPAIR(_ZN3ccc7DD5x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD5x7y9E[] = {
  // 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__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 _ZTIN3ccc7DD5x7y9E[];
extern void _ZN3ccc7DD5x7y93pqrEv();
extern void _ZN3ccc7DD5x7y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x7y93pqrEv,_ZTv0_n16_N3ccc7DD5x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x7y93pqrEv,_ZThn4_N3ccc7DD5x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x7y93pqrEv,_ZTv0_n16_N3ccc7DD5x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x7y9E[] = {
  {&(_ZTVN3ccc7DD5x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x7y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x7y9E[];
static VTBL_ENTRY alt_thunk_names135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x7y93pqrEv,_ZTv0_n16_N3ccc7DD5x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x7y93pqrEv,_ZThn4_N3ccc7DD5x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x7y9E = {  "_ZN3ccc7DD5x7y9E", // class name
  bases__ZN3ccc7DD5x7y9E, 2,
  &(vtc__ZN3ccc7DD5x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x7y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x7y9E),3, //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  CC5x7y10  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC5x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x7y103abcEv
  ~CC5x7y10(); // tgen
  CC5x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y10E) C1{ VBC2{ v1 v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x7y103pqrEv");}
void  ccc::CC5x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x7y103abcEv");}
ccc::CC5x7y10 ::~CC5x7y10(){ note_dtor("_ZN3ccc8CC5x7y10E", this);} // tgen
ccc::CC5x7y10 ::CC5x7y10(){ note_ctor("_ZN3ccc8CC5x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x7y10E, buf);
    ::ccc::CC5x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x7y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC5x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x7y10E);
    dp->::ccc::CC5x7y10::~CC5x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x7y10E(Test__ZN3ccc8CC5x7y10E, "_ZN3ccc8CC5x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x7y10C1Ev();
extern void _ZN3ccc8CC5x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x7y10E[] = {
  NSPAIR(_ZN3ccc8CC5x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC5x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x7y10E[];
extern void _ZN3ccc8CC5x7y103abcEv();
extern void _ZN3ccc8CC5x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x7y103pqrEv,_ZTv0_n12_N3ccc8CC5x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y103pqrEv,_ZThn4_N3ccc8CC5x7y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x7y103abcEv,_ZTv0_n20_N3ccc8CC5x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y103abcEv,_ZThn4_N3ccc8CC5x7y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x7y103pqrEv,_ZTv0_n12_N3ccc8CC5x7y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x7y103abcEv,_ZTv0_n20_N3ccc8CC5x7y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x7y10E[] = {
  {&(_ZTVN3ccc8CC5x7y10E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x7y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x7y10E[];
static VTBL_ENTRY alt_thunk_names136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x7y103abcEv,_ZTv0_n20_N3ccc8CC5x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y103abcEv,_ZThn4_N3ccc8CC5x7y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x7y103pqrEv,_ZTv0_n12_N3ccc8CC5x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y103pqrEv,_ZThn4_N3ccc8CC5x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x7y10E = {  "_ZN3ccc8CC5x7y10E", // class name
  bases__ZN3ccc8CC5x7y10E, 2,
  &(vtc__ZN3ccc8CC5x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x7y10E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names136,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x7y10  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD5x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x7y103abcEv
  ~DD5x7y10(); // tgen
  DD5x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x7y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x7y103pqrEv");}
void  ccc::DD5x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x7y103abcEv");}
ccc::DD5x7y10 ::~DD5x7y10(){ note_dtor("_ZN3ccc8DD5x7y10E", this);} // tgen
ccc::DD5x7y10 ::DD5x7y10(){ note_ctor("_ZN3ccc8DD5x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x7y10E, buf);
    ::ccc::DD5x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x7y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD5x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x7y10E);
    dp->::ccc::DD5x7y10::~DD5x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x7y10E(Test__ZN3ccc8DD5x7y10E, "_ZN3ccc8DD5x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x7y10C1Ev();
extern void _ZN3ccc8DD5x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x7y10E[] = {
  NSPAIR(_ZN3ccc8DD5x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD5x7y10E[] = {
  // 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__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 _ZTIN3ccc8DD5x7y10E[];
extern void _ZN3ccc8DD5x7y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x7y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x7y103abcEv,_ZTv0_n12_N3ccc8DD5x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x7y103abcEv,_ZThn4_N3ccc8DD5x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x7y103pqrEv,_ZTv0_n16_N3ccc8DD5x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x7y103pqrEv,_ZThn4_N3ccc8DD5x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x7y103abcEv,_ZTv0_n12_N3ccc8DD5x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x7y103pqrEv,_ZTv0_n16_N3ccc8DD5x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x7y10E[] = {
  {&(_ZTVN3ccc8DD5x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x7y10E[];
static VTBL_ENTRY alt_thunk_names137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x7y103pqrEv,_ZTv0_n16_N3ccc8DD5x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x7y103pqrEv,_ZThn4_N3ccc8DD5x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x7y103abcEv,_ZTv0_n12_N3ccc8DD5x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x7y103abcEv,_ZThn4_N3ccc8DD5x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x7y10E = {  "_ZN3ccc8DD5x7y10E", // class name
  bases__ZN3ccc8DD5x7y10E, 2,
  &(vtc__ZN3ccc8DD5x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x7y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x7y10E),3, //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  CC5x7y11  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC5x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x7y113efgEv
  ~CC5x7y11(); // tgen
  CC5x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y11E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x7y113pqrEv");}
void  ccc::CC5x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x7y113efgEv");}
ccc::CC5x7y11 ::~CC5x7y11(){ note_dtor("_ZN3ccc8CC5x7y11E", this);} // tgen
ccc::CC5x7y11 ::CC5x7y11(){ note_ctor("_ZN3ccc8CC5x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x7y11E, buf);
    ::ccc::CC5x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x7y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC5x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x7y11E);
    dp->::ccc::CC5x7y11::~CC5x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x7y11E(Test__ZN3ccc8CC5x7y11E, "_ZN3ccc8CC5x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x7y11C1Ev();
extern void _ZN3ccc8CC5x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x7y11E[] = {
  NSPAIR(_ZN3ccc8CC5x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC5x7y11E[] = {
  // 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__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 _ZTIN3ccc8CC5x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC5x7y113pqrEv();
extern void _ZN3ccc8CC5x7y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x7y113pqrEv,_ZTv0_n12_N3ccc8CC5x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y113pqrEv,_ZThn4_N3ccc8CC5x7y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x7y113efgEv,_ZTv0_n16_N3ccc8CC5x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y113efgEv,_ZThn4_N3ccc8CC5x7y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x7y113pqrEv,_ZTv0_n12_N3ccc8CC5x7y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x7y113efgEv,_ZTv0_n16_N3ccc8CC5x7y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x7y11E[] = {
  {&(_ZTVN3ccc8CC5x7y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x7y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x7y11E[];
static VTBL_ENTRY alt_thunk_names138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x7y113efgEv,_ZTv0_n16_N3ccc8CC5x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y113efgEv,_ZThn4_N3ccc8CC5x7y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x7y113pqrEv,_ZTv0_n12_N3ccc8CC5x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y113pqrEv,_ZThn4_N3ccc8CC5x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x7y11E = {  "_ZN3ccc8CC5x7y11E", // class name
  bases__ZN3ccc8CC5x7y11E, 2,
  &(vtc__ZN3ccc8CC5x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x7y11E),2, //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  DD5x7y11  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD5x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x7y113efgEv
  ~DD5x7y11(); // tgen
  DD5x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x7y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x7y113pqrEv");}
void  ccc::DD5x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x7y113efgEv");}
ccc::DD5x7y11 ::~DD5x7y11(){ note_dtor("_ZN3ccc8DD5x7y11E", this);} // tgen
ccc::DD5x7y11 ::DD5x7y11(){ note_ctor("_ZN3ccc8DD5x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x7y11E, buf);
    ::ccc::DD5x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x7y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD5x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x7y11E);
    dp->::ccc::DD5x7y11::~DD5x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x7y11E(Test__ZN3ccc8DD5x7y11E, "_ZN3ccc8DD5x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x7y11C1Ev();
extern void _ZN3ccc8DD5x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x7y11E[] = {
  NSPAIR(_ZN3ccc8DD5x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD5x7y11E[] = {
  // 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__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 _ZTIN3ccc8DD5x7y11E[];
extern void _ZN3ccc8DD5x7y113pqrEv();
extern void _ZN3ccc8DD5x7y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x7y113pqrEv,_ZTv0_n16_N3ccc8DD5x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x7y113pqrEv,_ZThn4_N3ccc8DD5x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x7y113pqrEv,_ZTv0_n16_N3ccc8DD5x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x7y11E[] = {
  {&(_ZTVN3ccc8DD5x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x7y11E[];
static VTBL_ENTRY alt_thunk_names139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x7y113pqrEv,_ZTv0_n16_N3ccc8DD5x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x7y113pqrEv,_ZThn4_N3ccc8DD5x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x7y11E = {  "_ZN3ccc8DD5x7y11E", // class name
  bases__ZN3ccc8DD5x7y11E, 2,
  &(vtc__ZN3ccc8DD5x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x7y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x7y11E),3, //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  CC5x7y12  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC5x7y123abcEv
  ~CC5x7y12(); // tgen
  CC5x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC5x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x7y123abcEv");}
ccc::CC5x7y12 ::~CC5x7y12(){ note_dtor("_ZN3ccc8CC5x7y12E", this);} // tgen
ccc::CC5x7y12 ::CC5x7y12(){ note_ctor("_ZN3ccc8CC5x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x7y12E, buf);
    ::ccc::CC5x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x7y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC5x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x7y12E);
    dp->::ccc::CC5x7y12::~CC5x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x7y12E(Test__ZN3ccc8CC5x7y12E, "_ZN3ccc8CC5x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x7y12C1Ev();
extern void _ZN3ccc8CC5x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x7y12E[] = {
  NSPAIR(_ZN3ccc8CC5x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC5x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x7y12E[];
extern void _ZN3ccc8CC5x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x7y123abcEv,_ZTv0_n20_N3ccc8CC5x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y123abcEv,_ZThn4_N3ccc8CC5x7y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x7y123abcEv,_ZTv0_n20_N3ccc8CC5x7y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x7y12E[] = {
  {&(_ZTVN3ccc8CC5x7y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x7y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x7y12E[];
static VTBL_ENTRY alt_thunk_names140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x7y123abcEv,_ZTv0_n20_N3ccc8CC5x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y123abcEv,_ZThn4_N3ccc8CC5x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x7y12E = {  "_ZN3ccc8CC5x7y12E", // class name
  bases__ZN3ccc8CC5x7y12E, 2,
  &(vtc__ZN3ccc8CC5x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x7y12E),2, //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  DD5x7y12  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD5x7y123abcEv
  ~DD5x7y12(); // tgen
  DD5x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x7y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD5x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x7y123abcEv");}
ccc::DD5x7y12 ::~DD5x7y12(){ note_dtor("_ZN3ccc8DD5x7y12E", this);} // tgen
ccc::DD5x7y12 ::DD5x7y12(){ note_ctor("_ZN3ccc8DD5x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x7y12E, buf);
    ::ccc::DD5x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x7y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD5x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x7y12E);
    dp->::ccc::DD5x7y12::~DD5x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x7y12E(Test__ZN3ccc8DD5x7y12E, "_ZN3ccc8DD5x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x7y12C1Ev();
extern void _ZN3ccc8DD5x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x7y12E[] = {
  NSPAIR(_ZN3ccc8DD5x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD5x7y12E[] = {
  // 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__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 _ZTIN3ccc8DD5x7y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x7y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x7y123abcEv,_ZTv0_n12_N3ccc8DD5x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x7y123abcEv,_ZThn4_N3ccc8DD5x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x7y123abcEv,_ZTv0_n12_N3ccc8DD5x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x7y12E[] = {
  {&(_ZTVN3ccc8DD5x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x7y12E[];
static VTBL_ENTRY alt_thunk_names141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x7y123abcEv,_ZTv0_n12_N3ccc8DD5x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x7y123abcEv,_ZThn4_N3ccc8DD5x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x7y12E = {  "_ZN3ccc8DD5x7y12E", // class name
  bases__ZN3ccc8DD5x7y12E, 2,
  &(vtc__ZN3ccc8DD5x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x7y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x7y12E),3, //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  CC5x7y13  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC5x7y133efgEv
  ~CC5x7y13(); // tgen
  CC5x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x7y133efgEv");}
ccc::CC5x7y13 ::~CC5x7y13(){ note_dtor("_ZN3ccc8CC5x7y13E", this);} // tgen
ccc::CC5x7y13 ::CC5x7y13(){ note_ctor("_ZN3ccc8CC5x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x7y13E, buf);
    ::ccc::CC5x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x7y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC5x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x7y13E);
    dp->::ccc::CC5x7y13::~CC5x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x7y13E(Test__ZN3ccc8CC5x7y13E, "_ZN3ccc8CC5x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x7y13C1Ev();
extern void _ZN3ccc8CC5x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x7y13E[] = {
  NSPAIR(_ZN3ccc8CC5x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC5x7y13E[] = {
  // 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__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 _ZTIN3ccc8CC5x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC5x7y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x7y133efgEv,_ZTv0_n16_N3ccc8CC5x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y133efgEv,_ZThn4_N3ccc8CC5x7y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x7y133efgEv,_ZTv0_n16_N3ccc8CC5x7y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x7y13E[] = {
  {&(_ZTVN3ccc8CC5x7y13E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x7y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x7y13E[];
static VTBL_ENTRY alt_thunk_names142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x7y133efgEv,_ZTv0_n16_N3ccc8CC5x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y133efgEv,_ZThn4_N3ccc8CC5x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x7y13E = {  "_ZN3ccc8CC5x7y13E", // class name
  bases__ZN3ccc8CC5x7y13E, 2,
  &(vtc__ZN3ccc8CC5x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x7y13E),2, //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  DD5x7y13  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD5x7y133efgEv
  ~DD5x7y13(); // tgen
  DD5x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x7y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x7y133efgEv");}
ccc::DD5x7y13 ::~DD5x7y13(){ note_dtor("_ZN3ccc8DD5x7y13E", this);} // tgen
ccc::DD5x7y13 ::DD5x7y13(){ note_ctor("_ZN3ccc8DD5x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x7y13E, buf);
    ::ccc::DD5x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x7y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD5x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x7y13E);
    dp->::ccc::DD5x7y13::~DD5x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x7y13E(Test__ZN3ccc8DD5x7y13E, "_ZN3ccc8DD5x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x7y13C1Ev();
extern void _ZN3ccc8DD5x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x7y13E[] = {
  NSPAIR(_ZN3ccc8DD5x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD5x7y13E[] = {
  // 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__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 _ZTIN3ccc8DD5x7y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x7y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x7y13E[] = {
  {&(_ZTVN3ccc8DD5x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x7y13E[];
Class_Descriptor cd__ZN3ccc8DD5x7y13E = {  "_ZN3ccc8DD5x7y13E", // class name
  bases__ZN3ccc8DD5x7y13E, 2,
  &(vtc__ZN3ccc8DD5x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x7y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x7y13E),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  CC5x7y14  : virtual ::ccc::AA5 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC5x7y143pqrEv
  ~CC5x7y14(); // tgen
  CC5x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC5x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x7y143pqrEv");}
ccc::CC5x7y14 ::~CC5x7y14(){ note_dtor("_ZN3ccc8CC5x7y14E", this);} // tgen
ccc::CC5x7y14 ::CC5x7y14(){ note_ctor("_ZN3ccc8CC5x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x7y14E, buf);
    ::ccc::CC5x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x7y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC5x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x7y14E);
    dp->::ccc::CC5x7y14::~CC5x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x7y14E(Test__ZN3ccc8CC5x7y14E, "_ZN3ccc8CC5x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x7y14C1Ev();
extern void _ZN3ccc8CC5x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x7y14E[] = {
  NSPAIR(_ZN3ccc8CC5x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC5x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC5x7y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x7y143pqrEv,_ZTv0_n12_N3ccc8CC5x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x7y143pqrEv,_ZThn4_N3ccc8CC5x7y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x7y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x7y143pqrEv,_ZTv0_n12_N3ccc8CC5x7y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x7y14E[] = {
  {&(_ZTVN3ccc8CC5x7y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x7y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x7y14E[];
static VTBL_ENTRY alt_thunk_names143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x7y143pqrEv,_ZTv0_n12_N3ccc8CC5x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x7y143pqrEv,_ZThn4_N3ccc8CC5x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x7y14E = {  "_ZN3ccc8CC5x7y14E", // class name
  bases__ZN3ccc8CC5x7y14E, 2,
  &(vtc__ZN3ccc8CC5x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x7y14E),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  DD5x7y14  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD5x7y143pqrEv
  ~DD5x7y14(); // tgen
  DD5x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x7y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD5x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x7y143pqrEv");}
ccc::DD5x7y14 ::~DD5x7y14(){ note_dtor("_ZN3ccc8DD5x7y14E", this);} // tgen
ccc::DD5x7y14 ::DD5x7y14(){ note_ctor("_ZN3ccc8DD5x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x7y14E, buf);
    ::ccc::DD5x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x7y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD5x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x7y14E);
    dp->::ccc::DD5x7y14::~DD5x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x7y14E(Test__ZN3ccc8DD5x7y14E, "_ZN3ccc8DD5x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x7y14C1Ev();
extern void _ZN3ccc8DD5x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x7y14E[] = {
  NSPAIR(_ZN3ccc8DD5x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD5x7y14E[] = {
  // 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__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 _ZTIN3ccc8DD5x7y14E[];
extern void _ZN3ccc8DD5x7y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x7y143pqrEv,_ZTv0_n16_N3ccc8DD5x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x7y143pqrEv,_ZThn4_N3ccc8DD5x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x7y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x7y143pqrEv,_ZTv0_n16_N3ccc8DD5x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x7y14E[] = {
  {&(_ZTVN3ccc8DD5x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x7y14E[];
static VTBL_ENTRY alt_thunk_names144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x7y143pqrEv,_ZTv0_n16_N3ccc8DD5x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x7y143pqrEv,_ZThn4_N3ccc8DD5x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x7y14E = {  "_ZN3ccc8DD5x7y14E", // class name
  bases__ZN3ccc8DD5x7y14E, 2,
  &(vtc__ZN3ccc8DD5x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x7y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x7y14E),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  CC5x7y15  : virtual ::ccc::AA5 , ::ccc::BB7 {
  ~CC5x7y15(); // tgen
  CC5x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x7y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC5x7y15 ::~CC5x7y15(){ note_dtor("_ZN3ccc8CC5x7y15E", this);} // tgen
ccc::CC5x7y15 ::CC5x7y15(){ note_ctor("_ZN3ccc8CC5x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x7y15E, buf);
    ::ccc::CC5x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x7y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC5x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x7y15E);
    dp->::ccc::CC5x7y15::~CC5x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x7y15E(Test__ZN3ccc8CC5x7y15E, "_ZN3ccc8CC5x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x7y15C1Ev();
extern void _ZN3ccc8CC5x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x7y15E[] = {
  NSPAIR(_ZN3ccc8CC5x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC5x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x7y15E[] = {
  {&(_ZTVN3ccc8CC5x7y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x7y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x7y15E[];
Class_Descriptor cd__ZN3ccc8CC5x7y15E = {  "_ZN3ccc8CC5x7y15E", // class name
  bases__ZN3ccc8CC5x7y15E, 2,
  &(vtc__ZN3ccc8CC5x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x7y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x7y15E),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  DD5x7y15  : virtual ::ccc::AA5 , virtual ::ccc::BB7 {
  ~DD5x7y15(); // tgen
  DD5x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x7y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD5x7y15 ::~DD5x7y15(){ note_dtor("_ZN3ccc8DD5x7y15E", this);} // tgen
ccc::DD5x7y15 ::DD5x7y15(){ note_ctor("_ZN3ccc8DD5x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x7y15E, buf);
    ::ccc::DD5x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x7y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD5x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x7y15E);
    dp->::ccc::DD5x7y15::~DD5x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x7y15E(Test__ZN3ccc8DD5x7y15E, "_ZN3ccc8DD5x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x7y15C1Ev();
extern void _ZN3ccc8DD5x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x7y15E[] = {
  NSPAIR(_ZN3ccc8DD5x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD5x7y15E[] = {
  // 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__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 _ZTIN3ccc8DD5x7y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x7y15E[] = {
  {&(_ZTVN3ccc8DD5x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x7y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x7y15E[];
Class_Descriptor cd__ZN3ccc8DD5x7y15E = {  "_ZN3ccc8DD5x7y15E", // class name
  bases__ZN3ccc8DD5x7y15E, 2,
  &(vtc__ZN3ccc8DD5x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x7y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x7y15E),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  CC5x8y0  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y03pqrEv
  ~CC5x8y0(); // tgen
  CC5x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y0E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y03abcEv");}
void  ccc::CC5x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y03efgEv");}
void  ccc::CC5x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y03pqrEv");}
ccc::CC5x8y0 ::~CC5x8y0(){ note_dtor("_ZN3ccc7CC5x8y0E", this);} // tgen
ccc::CC5x8y0 ::CC5x8y0(){ note_ctor("_ZN3ccc7CC5x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y0E, buf);
    ::ccc::CC5x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y0E);
    dp->::ccc::CC5x8y0::~CC5x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y0E(Test__ZN3ccc7CC5x8y0E, "_ZN3ccc7CC5x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y0C1Ev();
extern void _ZN3ccc7CC5x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y0E[] = {
  NSPAIR(_ZN3ccc7CC5x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y0E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y0E[];
extern void _ZN3ccc7CC5x8y03efgEv();
extern void _ZN3ccc7CC5x8y03abcEv();
extern void _ZN3ccc7CC5x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y03pqrEv,_ZTv0_n12_N3ccc7CC5x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y03pqrEv,_ZThn4_N3ccc7CC5x8y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y03efgEv,_ZTv0_n16_N3ccc7CC5x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y03efgEv,_ZThn4_N3ccc7CC5x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y03abcEv,_ZTv0_n20_N3ccc7CC5x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y03abcEv,_ZThn4_N3ccc7CC5x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y03pqrEv,_ZTv0_n12_N3ccc7CC5x8y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y03efgEv,_ZTv0_n16_N3ccc7CC5x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y03abcEv,_ZTv0_n20_N3ccc7CC5x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y0E[] = {
  {&(_ZTVN3ccc7CC5x8y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y0E[];
static VTBL_ENTRY alt_thunk_names145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y03abcEv,_ZTv0_n20_N3ccc7CC5x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y03abcEv,_ZThn4_N3ccc7CC5x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y03efgEv,_ZTv0_n16_N3ccc7CC5x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y03efgEv,_ZThn4_N3ccc7CC5x8y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y03pqrEv,_ZTv0_n12_N3ccc7CC5x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y03pqrEv,_ZThn4_N3ccc7CC5x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y0E = {  "_ZN3ccc7CC5x8y0E", // class name
  bases__ZN3ccc7CC5x8y0E, 2,
  &(vtc__ZN3ccc7CC5x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y0E),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  DD5x8y0  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD5x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x8y03pqrEv
  ~DD5x8y0(); // tgen
  DD5x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y03abcEv");}
void  ccc::DD5x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y03efgEv");}
void  ccc::DD5x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y03pqrEv");}
ccc::DD5x8y0 ::~DD5x8y0(){ note_dtor("_ZN3ccc7DD5x8y0E", this);} // tgen
ccc::DD5x8y0 ::DD5x8y0(){ note_ctor("_ZN3ccc7DD5x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y0E, buf);
    ::ccc::DD5x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y0E);
    dp->::ccc::DD5x8y0::~DD5x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y0E(Test__ZN3ccc7DD5x8y0E, "_ZN3ccc7DD5x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y0C1Ev();
extern void _ZN3ccc7DD5x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y0E[] = {
  NSPAIR(_ZN3ccc7DD5x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y0E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y0E[];
extern void _ZN3ccc7DD5x8y03pqrEv();
extern void _ZN3ccc7DD5x8y03efgEv();
extern void _ZN3ccc7DD5x8y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y03efgEv,_ZTv0_n12_N3ccc7DD5x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y03efgEv,_ZThn4_N3ccc7DD5x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y03abcEv,_ZTv0_n16_N3ccc7DD5x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y03abcEv,_ZThn4_N3ccc7DD5x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y03efgEv,_ZTv0_n12_N3ccc7DD5x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y03abcEv,_ZTv0_n16_N3ccc7DD5x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y0E[] = {
  {&(_ZTVN3ccc7DD5x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y0E[];
static VTBL_ENTRY alt_thunk_names146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y03abcEv,_ZTv0_n16_N3ccc7DD5x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y03abcEv,_ZThn4_N3ccc7DD5x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y03efgEv,_ZTv0_n12_N3ccc7DD5x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y03efgEv,_ZThn4_N3ccc7DD5x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y0E = {  "_ZN3ccc7DD5x8y0E", // class name
  bases__ZN3ccc7DD5x8y0E, 2,
  &(vtc__ZN3ccc7DD5x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y0E),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  CC5x8y1  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x8y13efgEv
  ~CC5x8y1(); // tgen
  CC5x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y1E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y13abcEv");}
void  ccc::CC5x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y13pqrEv");}
void  ccc::CC5x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y13efgEv");}
ccc::CC5x8y1 ::~CC5x8y1(){ note_dtor("_ZN3ccc7CC5x8y1E", this);} // tgen
ccc::CC5x8y1 ::CC5x8y1(){ note_ctor("_ZN3ccc7CC5x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y1E, buf);
    ::ccc::CC5x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y1E);
    dp->::ccc::CC5x8y1::~CC5x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y1E(Test__ZN3ccc7CC5x8y1E, "_ZN3ccc7CC5x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y1C1Ev();
extern void _ZN3ccc7CC5x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y1E[] = {
  NSPAIR(_ZN3ccc7CC5x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y1E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y1E[];
extern void _ZN3ccc7CC5x8y13efgEv();
extern void _ZN3ccc7CC5x8y13abcEv();
extern void _ZN3ccc7CC5x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y13pqrEv,_ZTv0_n12_N3ccc7CC5x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y13pqrEv,_ZThn4_N3ccc7CC5x8y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y13efgEv,_ZTv0_n16_N3ccc7CC5x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y13efgEv,_ZThn4_N3ccc7CC5x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y13abcEv,_ZTv0_n20_N3ccc7CC5x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y13abcEv,_ZThn4_N3ccc7CC5x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y13pqrEv,_ZTv0_n12_N3ccc7CC5x8y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y13efgEv,_ZTv0_n16_N3ccc7CC5x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y13abcEv,_ZTv0_n20_N3ccc7CC5x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y1E[] = {
  {&(_ZTVN3ccc7CC5x8y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y1E[];
static VTBL_ENTRY alt_thunk_names147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y13abcEv,_ZTv0_n20_N3ccc7CC5x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y13abcEv,_ZThn4_N3ccc7CC5x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y13efgEv,_ZTv0_n16_N3ccc7CC5x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y13efgEv,_ZThn4_N3ccc7CC5x8y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y13pqrEv,_ZTv0_n12_N3ccc7CC5x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y13pqrEv,_ZThn4_N3ccc7CC5x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y1E = {  "_ZN3ccc7CC5x8y1E", // class name
  bases__ZN3ccc7CC5x8y1E, 2,
  &(vtc__ZN3ccc7CC5x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y1E),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  DD5x8y1  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD5x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x8y13efgEv
  ~DD5x8y1(); // tgen
  DD5x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y13abcEv");}
void  ccc::DD5x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y13pqrEv");}
void  ccc::DD5x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y13efgEv");}
ccc::DD5x8y1 ::~DD5x8y1(){ note_dtor("_ZN3ccc7DD5x8y1E", this);} // tgen
ccc::DD5x8y1 ::DD5x8y1(){ note_ctor("_ZN3ccc7DD5x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y1E, buf);
    ::ccc::DD5x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y1E);
    dp->::ccc::DD5x8y1::~DD5x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y1E(Test__ZN3ccc7DD5x8y1E, "_ZN3ccc7DD5x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y1C1Ev();
extern void _ZN3ccc7DD5x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y1E[] = {
  NSPAIR(_ZN3ccc7DD5x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y1E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y1E[];
extern void _ZN3ccc7DD5x8y13pqrEv();
extern void _ZN3ccc7DD5x8y13efgEv();
extern void _ZN3ccc7DD5x8y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y13efgEv,_ZTv0_n12_N3ccc7DD5x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y13efgEv,_ZThn4_N3ccc7DD5x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y13abcEv,_ZTv0_n16_N3ccc7DD5x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y13abcEv,_ZThn4_N3ccc7DD5x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y13efgEv,_ZTv0_n12_N3ccc7DD5x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y13abcEv,_ZTv0_n16_N3ccc7DD5x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y1E[] = {
  {&(_ZTVN3ccc7DD5x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y1E[];
static VTBL_ENTRY alt_thunk_names148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y13abcEv,_ZTv0_n16_N3ccc7DD5x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y13abcEv,_ZThn4_N3ccc7DD5x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y13efgEv,_ZTv0_n12_N3ccc7DD5x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y13efgEv,_ZThn4_N3ccc7DD5x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y1E = {  "_ZN3ccc7DD5x8y1E", // class name
  bases__ZN3ccc7DD5x8y1E, 2,
  &(vtc__ZN3ccc7DD5x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y1E),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  CC5x8y2  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y23pqrEv
  ~CC5x8y2(); // tgen
  CC5x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y2E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y23efgEv");}
void  ccc::CC5x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y23abcEv");}
void  ccc::CC5x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y23pqrEv");}
ccc::CC5x8y2 ::~CC5x8y2(){ note_dtor("_ZN3ccc7CC5x8y2E", this);} // tgen
ccc::CC5x8y2 ::CC5x8y2(){ note_ctor("_ZN3ccc7CC5x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y2E, buf);
    ::ccc::CC5x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y2E);
    dp->::ccc::CC5x8y2::~CC5x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y2E(Test__ZN3ccc7CC5x8y2E, "_ZN3ccc7CC5x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y2C1Ev();
extern void _ZN3ccc7CC5x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y2E[] = {
  NSPAIR(_ZN3ccc7CC5x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y2E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y2E[];
extern void _ZN3ccc7CC5x8y23efgEv();
extern void _ZN3ccc7CC5x8y23abcEv();
extern void _ZN3ccc7CC5x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y23pqrEv,_ZTv0_n12_N3ccc7CC5x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y23pqrEv,_ZThn4_N3ccc7CC5x8y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y23efgEv,_ZTv0_n16_N3ccc7CC5x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y23efgEv,_ZThn4_N3ccc7CC5x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y23abcEv,_ZTv0_n20_N3ccc7CC5x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y23abcEv,_ZThn4_N3ccc7CC5x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y23pqrEv,_ZTv0_n12_N3ccc7CC5x8y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y23efgEv,_ZTv0_n16_N3ccc7CC5x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y23abcEv,_ZTv0_n20_N3ccc7CC5x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y2E[] = {
  {&(_ZTVN3ccc7CC5x8y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y2E[];
static VTBL_ENTRY alt_thunk_names149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y23abcEv,_ZTv0_n20_N3ccc7CC5x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y23abcEv,_ZThn4_N3ccc7CC5x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y23efgEv,_ZTv0_n16_N3ccc7CC5x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y23efgEv,_ZThn4_N3ccc7CC5x8y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y23pqrEv,_ZTv0_n12_N3ccc7CC5x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y23pqrEv,_ZThn4_N3ccc7CC5x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y2E = {  "_ZN3ccc7CC5x8y2E", // class name
  bases__ZN3ccc7CC5x8y2E, 2,
  &(vtc__ZN3ccc7CC5x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y2E),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  DD5x8y2  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD5x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x8y23pqrEv
  ~DD5x8y2(); // tgen
  DD5x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y23efgEv");}
void  ccc::DD5x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y23abcEv");}
void  ccc::DD5x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y23pqrEv");}
ccc::DD5x8y2 ::~DD5x8y2(){ note_dtor("_ZN3ccc7DD5x8y2E", this);} // tgen
ccc::DD5x8y2 ::DD5x8y2(){ note_ctor("_ZN3ccc7DD5x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y2E, buf);
    ::ccc::DD5x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y2E);
    dp->::ccc::DD5x8y2::~DD5x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y2E(Test__ZN3ccc7DD5x8y2E, "_ZN3ccc7DD5x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y2C1Ev();
extern void _ZN3ccc7DD5x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y2E[] = {
  NSPAIR(_ZN3ccc7DD5x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y2E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y2E[];
extern void _ZN3ccc7DD5x8y23pqrEv();
extern void _ZN3ccc7DD5x8y23efgEv();
extern void _ZN3ccc7DD5x8y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y23efgEv,_ZTv0_n12_N3ccc7DD5x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y23efgEv,_ZThn4_N3ccc7DD5x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y23abcEv,_ZTv0_n16_N3ccc7DD5x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y23abcEv,_ZThn4_N3ccc7DD5x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y23efgEv,_ZTv0_n12_N3ccc7DD5x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y23abcEv,_ZTv0_n16_N3ccc7DD5x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y2E[] = {
  {&(_ZTVN3ccc7DD5x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y2E[];
static VTBL_ENTRY alt_thunk_names150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y23abcEv,_ZTv0_n16_N3ccc7DD5x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y23abcEv,_ZThn4_N3ccc7DD5x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y23efgEv,_ZTv0_n12_N3ccc7DD5x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y23efgEv,_ZThn4_N3ccc7DD5x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y2E = {  "_ZN3ccc7DD5x8y2E", // class name
  bases__ZN3ccc7DD5x8y2E, 2,
  &(vtc__ZN3ccc7DD5x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y2E),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  CC5x8y3  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x8y33abcEv
  ~CC5x8y3(); // tgen
  CC5x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y3E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y33efgEv");}
void  ccc::CC5x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y33pqrEv");}
void  ccc::CC5x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y33abcEv");}
ccc::CC5x8y3 ::~CC5x8y3(){ note_dtor("_ZN3ccc7CC5x8y3E", this);} // tgen
ccc::CC5x8y3 ::CC5x8y3(){ note_ctor("_ZN3ccc7CC5x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y3E, buf);
    ::ccc::CC5x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y3E);
    dp->::ccc::CC5x8y3::~CC5x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y3E(Test__ZN3ccc7CC5x8y3E, "_ZN3ccc7CC5x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y3C1Ev();
extern void _ZN3ccc7CC5x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y3E[] = {
  NSPAIR(_ZN3ccc7CC5x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y3E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y3E[];
extern void _ZN3ccc7CC5x8y33efgEv();
extern void _ZN3ccc7CC5x8y33abcEv();
extern void _ZN3ccc7CC5x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y33pqrEv,_ZTv0_n12_N3ccc7CC5x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y33pqrEv,_ZThn4_N3ccc7CC5x8y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y33efgEv,_ZTv0_n16_N3ccc7CC5x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y33efgEv,_ZThn4_N3ccc7CC5x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y33abcEv,_ZTv0_n20_N3ccc7CC5x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y33abcEv,_ZThn4_N3ccc7CC5x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y33pqrEv,_ZTv0_n12_N3ccc7CC5x8y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y33efgEv,_ZTv0_n16_N3ccc7CC5x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y33abcEv,_ZTv0_n20_N3ccc7CC5x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y3E[] = {
  {&(_ZTVN3ccc7CC5x8y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y3E[];
static VTBL_ENTRY alt_thunk_names151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y33abcEv,_ZTv0_n20_N3ccc7CC5x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y33abcEv,_ZThn4_N3ccc7CC5x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y33efgEv,_ZTv0_n16_N3ccc7CC5x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y33efgEv,_ZThn4_N3ccc7CC5x8y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y33pqrEv,_ZTv0_n12_N3ccc7CC5x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y33pqrEv,_ZThn4_N3ccc7CC5x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y3E = {  "_ZN3ccc7CC5x8y3E", // class name
  bases__ZN3ccc7CC5x8y3E, 2,
  &(vtc__ZN3ccc7CC5x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y3E),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  DD5x8y3  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD5x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x8y33abcEv
  ~DD5x8y3(); // tgen
  DD5x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y33efgEv");}
void  ccc::DD5x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y33pqrEv");}
void  ccc::DD5x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y33abcEv");}
ccc::DD5x8y3 ::~DD5x8y3(){ note_dtor("_ZN3ccc7DD5x8y3E", this);} // tgen
ccc::DD5x8y3 ::DD5x8y3(){ note_ctor("_ZN3ccc7DD5x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y3E, buf);
    ::ccc::DD5x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y3E);
    dp->::ccc::DD5x8y3::~DD5x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y3E(Test__ZN3ccc7DD5x8y3E, "_ZN3ccc7DD5x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y3C1Ev();
extern void _ZN3ccc7DD5x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y3E[] = {
  NSPAIR(_ZN3ccc7DD5x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y3E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y3E[];
extern void _ZN3ccc7DD5x8y33pqrEv();
extern void _ZN3ccc7DD5x8y33efgEv();
extern void _ZN3ccc7DD5x8y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y33efgEv,_ZTv0_n12_N3ccc7DD5x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y33efgEv,_ZThn4_N3ccc7DD5x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y33abcEv,_ZTv0_n16_N3ccc7DD5x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y33abcEv,_ZThn4_N3ccc7DD5x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y33efgEv,_ZTv0_n12_N3ccc7DD5x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y33abcEv,_ZTv0_n16_N3ccc7DD5x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y3E[] = {
  {&(_ZTVN3ccc7DD5x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y3E[];
static VTBL_ENTRY alt_thunk_names152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y33abcEv,_ZTv0_n16_N3ccc7DD5x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y33abcEv,_ZThn4_N3ccc7DD5x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y33efgEv,_ZTv0_n12_N3ccc7DD5x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y33efgEv,_ZThn4_N3ccc7DD5x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y3E = {  "_ZN3ccc7DD5x8y3E", // class name
  bases__ZN3ccc7DD5x8y3E, 2,
  &(vtc__ZN3ccc7DD5x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y3E),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  CC5x8y4  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC5x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x8y43efgEv
  ~CC5x8y4(); // tgen
  CC5x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y4E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y43pqrEv");}
void  ccc::CC5x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y43abcEv");}
void  ccc::CC5x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y43efgEv");}
ccc::CC5x8y4 ::~CC5x8y4(){ note_dtor("_ZN3ccc7CC5x8y4E", this);} // tgen
ccc::CC5x8y4 ::CC5x8y4(){ note_ctor("_ZN3ccc7CC5x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y4E, buf);
    ::ccc::CC5x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y4E);
    dp->::ccc::CC5x8y4::~CC5x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y4E(Test__ZN3ccc7CC5x8y4E, "_ZN3ccc7CC5x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y4C1Ev();
extern void _ZN3ccc7CC5x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y4E[] = {
  NSPAIR(_ZN3ccc7CC5x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y4E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y4E[];
extern void _ZN3ccc7CC5x8y43efgEv();
extern void _ZN3ccc7CC5x8y43abcEv();
extern void _ZN3ccc7CC5x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y43pqrEv,_ZTv0_n12_N3ccc7CC5x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y43pqrEv,_ZThn4_N3ccc7CC5x8y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y43efgEv,_ZTv0_n16_N3ccc7CC5x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y43efgEv,_ZThn4_N3ccc7CC5x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y43abcEv,_ZTv0_n20_N3ccc7CC5x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y43abcEv,_ZThn4_N3ccc7CC5x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y43pqrEv,_ZTv0_n12_N3ccc7CC5x8y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y43efgEv,_ZTv0_n16_N3ccc7CC5x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y43abcEv,_ZTv0_n20_N3ccc7CC5x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y4E[] = {
  {&(_ZTVN3ccc7CC5x8y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y4E[];
static VTBL_ENTRY alt_thunk_names153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y43abcEv,_ZTv0_n20_N3ccc7CC5x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y43abcEv,_ZThn4_N3ccc7CC5x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y43efgEv,_ZTv0_n16_N3ccc7CC5x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y43efgEv,_ZThn4_N3ccc7CC5x8y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y43pqrEv,_ZTv0_n12_N3ccc7CC5x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y43pqrEv,_ZThn4_N3ccc7CC5x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y4E = {  "_ZN3ccc7CC5x8y4E", // class name
  bases__ZN3ccc7CC5x8y4E, 2,
  &(vtc__ZN3ccc7CC5x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y4E),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  DD5x8y4  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD5x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x8y43efgEv
  ~DD5x8y4(); // tgen
  DD5x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y43pqrEv");}
void  ccc::DD5x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y43abcEv");}
void  ccc::DD5x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y43efgEv");}
ccc::DD5x8y4 ::~DD5x8y4(){ note_dtor("_ZN3ccc7DD5x8y4E", this);} // tgen
ccc::DD5x8y4 ::DD5x8y4(){ note_ctor("_ZN3ccc7DD5x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y4E, buf);
    ::ccc::DD5x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y4E);
    dp->::ccc::DD5x8y4::~DD5x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y4E(Test__ZN3ccc7DD5x8y4E, "_ZN3ccc7DD5x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y4C1Ev();
extern void _ZN3ccc7DD5x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y4E[] = {
  NSPAIR(_ZN3ccc7DD5x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y4E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y4E[];
extern void _ZN3ccc7DD5x8y43pqrEv();
extern void _ZN3ccc7DD5x8y43efgEv();
extern void _ZN3ccc7DD5x8y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y43efgEv,_ZTv0_n12_N3ccc7DD5x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y43efgEv,_ZThn4_N3ccc7DD5x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y43abcEv,_ZTv0_n16_N3ccc7DD5x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y43abcEv,_ZThn4_N3ccc7DD5x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y43efgEv,_ZTv0_n12_N3ccc7DD5x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y43abcEv,_ZTv0_n16_N3ccc7DD5x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y4E[] = {
  {&(_ZTVN3ccc7DD5x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y4E[];
static VTBL_ENTRY alt_thunk_names154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y43abcEv,_ZTv0_n16_N3ccc7DD5x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y43abcEv,_ZThn4_N3ccc7DD5x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y43efgEv,_ZTv0_n12_N3ccc7DD5x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y43efgEv,_ZThn4_N3ccc7DD5x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y4E = {  "_ZN3ccc7DD5x8y4E", // class name
  bases__ZN3ccc7DD5x8y4E, 2,
  &(vtc__ZN3ccc7DD5x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y4E),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  CC5x8y5  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC5x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x8y53abcEv
  ~CC5x8y5(); // tgen
  CC5x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y5E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y53pqrEv");}
void  ccc::CC5x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y53efgEv");}
void  ccc::CC5x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y53abcEv");}
ccc::CC5x8y5 ::~CC5x8y5(){ note_dtor("_ZN3ccc7CC5x8y5E", this);} // tgen
ccc::CC5x8y5 ::CC5x8y5(){ note_ctor("_ZN3ccc7CC5x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y5E, buf);
    ::ccc::CC5x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y5E);
    dp->::ccc::CC5x8y5::~CC5x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y5E(Test__ZN3ccc7CC5x8y5E, "_ZN3ccc7CC5x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y5C1Ev();
extern void _ZN3ccc7CC5x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y5E[] = {
  NSPAIR(_ZN3ccc7CC5x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y5E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y5E[];
extern void _ZN3ccc7CC5x8y53efgEv();
extern void _ZN3ccc7CC5x8y53abcEv();
extern void _ZN3ccc7CC5x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y53pqrEv,_ZTv0_n12_N3ccc7CC5x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y53pqrEv,_ZThn4_N3ccc7CC5x8y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y53efgEv,_ZTv0_n16_N3ccc7CC5x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y53efgEv,_ZThn4_N3ccc7CC5x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y53abcEv,_ZTv0_n20_N3ccc7CC5x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y53abcEv,_ZThn4_N3ccc7CC5x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y53pqrEv,_ZTv0_n12_N3ccc7CC5x8y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y53efgEv,_ZTv0_n16_N3ccc7CC5x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y53abcEv,_ZTv0_n20_N3ccc7CC5x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y5E[] = {
  {&(_ZTVN3ccc7CC5x8y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y5E[];
static VTBL_ENTRY alt_thunk_names155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y53abcEv,_ZTv0_n20_N3ccc7CC5x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y53abcEv,_ZThn4_N3ccc7CC5x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y53efgEv,_ZTv0_n16_N3ccc7CC5x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y53efgEv,_ZThn4_N3ccc7CC5x8y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y53pqrEv,_ZTv0_n12_N3ccc7CC5x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y53pqrEv,_ZThn4_N3ccc7CC5x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y5E = {  "_ZN3ccc7CC5x8y5E", // class name
  bases__ZN3ccc7CC5x8y5E, 2,
  &(vtc__ZN3ccc7CC5x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y5E),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  DD5x8y5  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD5x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x8y53abcEv
  ~DD5x8y5(); // tgen
  DD5x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y53pqrEv");}
void  ccc::DD5x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y53efgEv");}
void  ccc::DD5x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y53abcEv");}
ccc::DD5x8y5 ::~DD5x8y5(){ note_dtor("_ZN3ccc7DD5x8y5E", this);} // tgen
ccc::DD5x8y5 ::DD5x8y5(){ note_ctor("_ZN3ccc7DD5x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y5E, buf);
    ::ccc::DD5x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y5E);
    dp->::ccc::DD5x8y5::~DD5x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y5E(Test__ZN3ccc7DD5x8y5E, "_ZN3ccc7DD5x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y5C1Ev();
extern void _ZN3ccc7DD5x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y5E[] = {
  NSPAIR(_ZN3ccc7DD5x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y5E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y5E[];
extern void _ZN3ccc7DD5x8y53pqrEv();
extern void _ZN3ccc7DD5x8y53efgEv();
extern void _ZN3ccc7DD5x8y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y53efgEv,_ZTv0_n12_N3ccc7DD5x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y53efgEv,_ZThn4_N3ccc7DD5x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y53abcEv,_ZTv0_n16_N3ccc7DD5x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y53abcEv,_ZThn4_N3ccc7DD5x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y53efgEv,_ZTv0_n12_N3ccc7DD5x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y53abcEv,_ZTv0_n16_N3ccc7DD5x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y5E[] = {
  {&(_ZTVN3ccc7DD5x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y5E[];
static VTBL_ENTRY alt_thunk_names156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y53abcEv,_ZTv0_n16_N3ccc7DD5x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y53abcEv,_ZThn4_N3ccc7DD5x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y53efgEv,_ZTv0_n12_N3ccc7DD5x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y53efgEv,_ZThn4_N3ccc7DD5x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y5E = {  "_ZN3ccc7DD5x8y5E", // class name
  bases__ZN3ccc7DD5x8y5E, 2,
  &(vtc__ZN3ccc7DD5x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y5E),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  CC5x8y6  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x8y63efgEv
  ~CC5x8y6(); // tgen
  CC5x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y6E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y63abcEv");}
void  ccc::CC5x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y63efgEv");}
ccc::CC5x8y6 ::~CC5x8y6(){ note_dtor("_ZN3ccc7CC5x8y6E", this);} // tgen
ccc::CC5x8y6 ::CC5x8y6(){ note_ctor("_ZN3ccc7CC5x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y6E, buf);
    ::ccc::CC5x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y6E);
    dp->::ccc::CC5x8y6::~CC5x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y6E(Test__ZN3ccc7CC5x8y6E, "_ZN3ccc7CC5x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y6C1Ev();
extern void _ZN3ccc7CC5x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y6E[] = {
  NSPAIR(_ZN3ccc7CC5x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc7CC5x8y6E[];
extern void _ZN3ccc7CC5x8y63efgEv();
extern void _ZN3ccc7CC5x8y63abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y63efgEv,_ZTv0_n16_N3ccc7CC5x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y63efgEv,_ZThn4_N3ccc7CC5x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y63abcEv,_ZTv0_n20_N3ccc7CC5x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y63abcEv,_ZThn4_N3ccc7CC5x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y63efgEv,_ZTv0_n16_N3ccc7CC5x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y63abcEv,_ZTv0_n20_N3ccc7CC5x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y6E[] = {
  {&(_ZTVN3ccc7CC5x8y6E[3]),  3,13},
  {&(_ZTVN3ccc7CC5x8y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y6E[];
static VTBL_ENTRY alt_thunk_names157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y63abcEv,_ZTv0_n20_N3ccc7CC5x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y63abcEv,_ZThn4_N3ccc7CC5x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y63efgEv,_ZTv0_n16_N3ccc7CC5x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y63efgEv,_ZThn4_N3ccc7CC5x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y6E = {  "_ZN3ccc7CC5x8y6E", // class name
  bases__ZN3ccc7CC5x8y6E, 2,
  &(vtc__ZN3ccc7CC5x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y6E),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  DD5x8y6  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD5x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x8y63efgEv
  ~DD5x8y6(); // tgen
  DD5x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y63abcEv");}
void  ccc::DD5x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y63efgEv");}
ccc::DD5x8y6 ::~DD5x8y6(){ note_dtor("_ZN3ccc7DD5x8y6E", this);} // tgen
ccc::DD5x8y6 ::DD5x8y6(){ note_ctor("_ZN3ccc7DD5x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y6E, buf);
    ::ccc::DD5x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y6E);
    dp->::ccc::DD5x8y6::~DD5x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y6E(Test__ZN3ccc7DD5x8y6E, "_ZN3ccc7DD5x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y6C1Ev();
extern void _ZN3ccc7DD5x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y6E[] = {
  NSPAIR(_ZN3ccc7DD5x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y6E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x8y63efgEv();
extern void _ZN3ccc7DD5x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y63efgEv,_ZTv0_n12_N3ccc7DD5x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y63efgEv,_ZThn4_N3ccc7DD5x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y63abcEv,_ZTv0_n16_N3ccc7DD5x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y63abcEv,_ZThn4_N3ccc7DD5x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y63efgEv,_ZTv0_n12_N3ccc7DD5x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y63abcEv,_ZTv0_n16_N3ccc7DD5x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y6E[] = {
  {&(_ZTVN3ccc7DD5x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y6E[];
static VTBL_ENTRY alt_thunk_names158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y63abcEv,_ZTv0_n16_N3ccc7DD5x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y63abcEv,_ZThn4_N3ccc7DD5x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y63efgEv,_ZTv0_n12_N3ccc7DD5x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y63efgEv,_ZThn4_N3ccc7DD5x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y6E = {  "_ZN3ccc7DD5x8y6E", // class name
  bases__ZN3ccc7DD5x8y6E, 2,
  &(vtc__ZN3ccc7DD5x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y6E),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  CC5x8y7  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC5x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y73pqrEv
  ~CC5x8y7(); // tgen
  CC5x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y7E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y73abcEv");}
void  ccc::CC5x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y73pqrEv");}
ccc::CC5x8y7 ::~CC5x8y7(){ note_dtor("_ZN3ccc7CC5x8y7E", this);} // tgen
ccc::CC5x8y7 ::CC5x8y7(){ note_ctor("_ZN3ccc7CC5x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y7E, buf);
    ::ccc::CC5x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y7E);
    dp->::ccc::CC5x8y7::~CC5x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y7E(Test__ZN3ccc7CC5x8y7E, "_ZN3ccc7CC5x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y7C1Ev();
extern void _ZN3ccc7CC5x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y7E[] = {
  NSPAIR(_ZN3ccc7CC5x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y7E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC5x8y73abcEv();
extern void _ZN3ccc7CC5x8y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y73pqrEv,_ZTv0_n12_N3ccc7CC5x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y73pqrEv,_ZThn4_N3ccc7CC5x8y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y73abcEv,_ZTv0_n20_N3ccc7CC5x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y73abcEv,_ZThn4_N3ccc7CC5x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y73pqrEv,_ZTv0_n12_N3ccc7CC5x8y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y73abcEv,_ZTv0_n20_N3ccc7CC5x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y7E[] = {
  {&(_ZTVN3ccc7CC5x8y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y7E[];
static VTBL_ENTRY alt_thunk_names159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y73abcEv,_ZTv0_n20_N3ccc7CC5x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y73abcEv,_ZThn4_N3ccc7CC5x8y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y73pqrEv,_ZTv0_n12_N3ccc7CC5x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y73pqrEv,_ZThn4_N3ccc7CC5x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y7E = {  "_ZN3ccc7CC5x8y7E", // class name
  bases__ZN3ccc7CC5x8y7E, 2,
  &(vtc__ZN3ccc7CC5x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y7E),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  DD5x8y7  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD5x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x8y73pqrEv
  ~DD5x8y7(); // tgen
  DD5x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y73abcEv");}
void  ccc::DD5x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y73pqrEv");}
ccc::DD5x8y7 ::~DD5x8y7(){ note_dtor("_ZN3ccc7DD5x8y7E", this);} // tgen
ccc::DD5x8y7 ::DD5x8y7(){ note_ctor("_ZN3ccc7DD5x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y7E, buf);
    ::ccc::DD5x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y7E);
    dp->::ccc::DD5x8y7::~DD5x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y7E(Test__ZN3ccc7DD5x8y7E, "_ZN3ccc7DD5x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y7C1Ev();
extern void _ZN3ccc7DD5x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y7E[] = {
  NSPAIR(_ZN3ccc7DD5x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y7E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y7E[];
extern void _ZN3ccc7DD5x8y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y73abcEv,_ZTv0_n16_N3ccc7DD5x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y73abcEv,_ZThn4_N3ccc7DD5x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y73abcEv,_ZTv0_n16_N3ccc7DD5x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y7E[] = {
  {&(_ZTVN3ccc7DD5x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y7E[];
static VTBL_ENTRY alt_thunk_names160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y73abcEv,_ZTv0_n16_N3ccc7DD5x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y73abcEv,_ZThn4_N3ccc7DD5x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y7E = {  "_ZN3ccc7DD5x8y7E", // class name
  bases__ZN3ccc7DD5x8y7E, 2,
  &(vtc__ZN3ccc7DD5x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y7E),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  CC5x8y8  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x8y83abcEv
  ~CC5x8y8(); // tgen
  CC5x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y8E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y83efgEv");}
void  ccc::CC5x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x8y83abcEv");}
ccc::CC5x8y8 ::~CC5x8y8(){ note_dtor("_ZN3ccc7CC5x8y8E", this);} // tgen
ccc::CC5x8y8 ::CC5x8y8(){ note_ctor("_ZN3ccc7CC5x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y8E, buf);
    ::ccc::CC5x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y8E);
    dp->::ccc::CC5x8y8::~CC5x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y8E(Test__ZN3ccc7CC5x8y8E, "_ZN3ccc7CC5x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y8C1Ev();
extern void _ZN3ccc7CC5x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y8E[] = {
  NSPAIR(_ZN3ccc7CC5x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc7CC5x8y8E[];
extern void _ZN3ccc7CC5x8y83efgEv();
extern void _ZN3ccc7CC5x8y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y83efgEv,_ZTv0_n16_N3ccc7CC5x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y83efgEv,_ZThn4_N3ccc7CC5x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x8y83abcEv,_ZTv0_n20_N3ccc7CC5x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y83abcEv,_ZThn4_N3ccc7CC5x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y83efgEv,_ZTv0_n16_N3ccc7CC5x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x8y83abcEv,_ZTv0_n20_N3ccc7CC5x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y8E[] = {
  {&(_ZTVN3ccc7CC5x8y8E[3]),  3,13},
  {&(_ZTVN3ccc7CC5x8y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y8E[];
static VTBL_ENTRY alt_thunk_names161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x8y83abcEv,_ZTv0_n20_N3ccc7CC5x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y83abcEv,_ZThn4_N3ccc7CC5x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y83efgEv,_ZTv0_n16_N3ccc7CC5x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y83efgEv,_ZThn4_N3ccc7CC5x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y8E = {  "_ZN3ccc7CC5x8y8E", // class name
  bases__ZN3ccc7CC5x8y8E, 2,
  &(vtc__ZN3ccc7CC5x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y8E),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  DD5x8y8  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD5x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x8y83abcEv
  ~DD5x8y8(); // tgen
  DD5x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y83efgEv");}
void  ccc::DD5x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x8y83abcEv");}
ccc::DD5x8y8 ::~DD5x8y8(){ note_dtor("_ZN3ccc7DD5x8y8E", this);} // tgen
ccc::DD5x8y8 ::DD5x8y8(){ note_ctor("_ZN3ccc7DD5x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y8E, buf);
    ::ccc::DD5x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y8E);
    dp->::ccc::DD5x8y8::~DD5x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y8E(Test__ZN3ccc7DD5x8y8E, "_ZN3ccc7DD5x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y8C1Ev();
extern void _ZN3ccc7DD5x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y8E[] = {
  NSPAIR(_ZN3ccc7DD5x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y8E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x8y83efgEv();
extern void _ZN3ccc7DD5x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y83efgEv,_ZTv0_n12_N3ccc7DD5x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y83efgEv,_ZThn4_N3ccc7DD5x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x8y83abcEv,_ZTv0_n16_N3ccc7DD5x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y83abcEv,_ZThn4_N3ccc7DD5x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y83efgEv,_ZTv0_n12_N3ccc7DD5x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x8y83abcEv,_ZTv0_n16_N3ccc7DD5x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y8E[] = {
  {&(_ZTVN3ccc7DD5x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y8E[];
static VTBL_ENTRY alt_thunk_names162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x8y83abcEv,_ZTv0_n16_N3ccc7DD5x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y83abcEv,_ZThn4_N3ccc7DD5x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y83efgEv,_ZTv0_n12_N3ccc7DD5x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y83efgEv,_ZThn4_N3ccc7DD5x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y8E = {  "_ZN3ccc7DD5x8y8E", // class name
  bases__ZN3ccc7DD5x8y8E, 2,
  &(vtc__ZN3ccc7DD5x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y8E),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  CC5x8y9  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC5x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x8y93pqrEv
  ~CC5x8y9(); // tgen
  CC5x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x8y9E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x8y93efgEv");}
void  ccc::CC5x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x8y93pqrEv");}
ccc::CC5x8y9 ::~CC5x8y9(){ note_dtor("_ZN3ccc7CC5x8y9E", this);} // tgen
ccc::CC5x8y9 ::CC5x8y9(){ note_ctor("_ZN3ccc7CC5x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x8y9E, buf);
    ::ccc::CC5x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x8y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC5x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x8y9E);
    dp->::ccc::CC5x8y9::~CC5x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x8y9E(Test__ZN3ccc7CC5x8y9E, "_ZN3ccc7CC5x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x8y9C1Ev();
extern void _ZN3ccc7CC5x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x8y9E[] = {
  NSPAIR(_ZN3ccc7CC5x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC5x8y9E[] = {
  // 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__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 _ZTIN3ccc7CC5x8y9E[];
extern void _ZN3ccc7CC5x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC5x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x8y93pqrEv,_ZTv0_n12_N3ccc7CC5x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y93pqrEv,_ZThn4_N3ccc7CC5x8y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x8y93efgEv,_ZTv0_n16_N3ccc7CC5x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x8y93efgEv,_ZThn4_N3ccc7CC5x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x8y93pqrEv,_ZTv0_n12_N3ccc7CC5x8y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x8y93efgEv,_ZTv0_n16_N3ccc7CC5x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x8y9E[] = {
  {&(_ZTVN3ccc7CC5x8y9E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x8y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x8y9E[];
static VTBL_ENTRY alt_thunk_names163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x8y93efgEv,_ZTv0_n16_N3ccc7CC5x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y93efgEv,_ZThn4_N3ccc7CC5x8y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x8y93pqrEv,_ZTv0_n12_N3ccc7CC5x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x8y93pqrEv,_ZThn4_N3ccc7CC5x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x8y9E = {  "_ZN3ccc7CC5x8y9E", // class name
  bases__ZN3ccc7CC5x8y9E, 2,
  &(vtc__ZN3ccc7CC5x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x8y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x8y9E),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  DD5x8y9  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD5x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x8y93pqrEv
  ~DD5x8y9(); // tgen
  DD5x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x8y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x8y93efgEv");}
void  ccc::DD5x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x8y93pqrEv");}
ccc::DD5x8y9 ::~DD5x8y9(){ note_dtor("_ZN3ccc7DD5x8y9E", this);} // tgen
ccc::DD5x8y9 ::DD5x8y9(){ note_ctor("_ZN3ccc7DD5x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x8y9E, buf);
    ::ccc::DD5x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x8y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD5x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x8y9E);
    dp->::ccc::DD5x8y9::~DD5x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x8y9E(Test__ZN3ccc7DD5x8y9E, "_ZN3ccc7DD5x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x8y9C1Ev();
extern void _ZN3ccc7DD5x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x8y9E[] = {
  NSPAIR(_ZN3ccc7DD5x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD5x8y9E[] = {
  // 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__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 _ZTIN3ccc7DD5x8y9E[];
extern void _ZN3ccc7DD5x8y93pqrEv();
extern void _ZN3ccc7DD5x8y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x8y93efgEv,_ZTv0_n12_N3ccc7DD5x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x8y93efgEv,_ZThn4_N3ccc7DD5x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x8y93efgEv,_ZTv0_n12_N3ccc7DD5x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x8y9E[] = {
  {&(_ZTVN3ccc7DD5x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x8y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x8y9E[];
static VTBL_ENTRY alt_thunk_names164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x8y93efgEv,_ZTv0_n12_N3ccc7DD5x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x8y93efgEv,_ZThn4_N3ccc7DD5x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x8y9E = {  "_ZN3ccc7DD5x8y9E", // class name
  bases__ZN3ccc7DD5x8y9E, 2,
  &(vtc__ZN3ccc7DD5x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x8y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x8y9E),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  CC5x8y10  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC5x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x8y103abcEv
  ~CC5x8y10(); // tgen
  CC5x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y10E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x8y103pqrEv");}
void  ccc::CC5x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x8y103abcEv");}
ccc::CC5x8y10 ::~CC5x8y10(){ note_dtor("_ZN3ccc8CC5x8y10E", this);} // tgen
ccc::CC5x8y10 ::CC5x8y10(){ note_ctor("_ZN3ccc8CC5x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x8y10E, buf);
    ::ccc::CC5x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x8y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC5x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x8y10E);
    dp->::ccc::CC5x8y10::~CC5x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x8y10E(Test__ZN3ccc8CC5x8y10E, "_ZN3ccc8CC5x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x8y10C1Ev();
extern void _ZN3ccc8CC5x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x8y10E[] = {
  NSPAIR(_ZN3ccc8CC5x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC5x8y10E[] = {
  // 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__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 _ZTIN3ccc8CC5x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC5x8y103abcEv();
extern void _ZN3ccc8CC5x8y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x8y103pqrEv,_ZTv0_n12_N3ccc8CC5x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y103pqrEv,_ZThn4_N3ccc8CC5x8y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x8y103abcEv,_ZTv0_n20_N3ccc8CC5x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y103abcEv,_ZThn4_N3ccc8CC5x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x8y103pqrEv,_ZTv0_n12_N3ccc8CC5x8y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x8y103abcEv,_ZTv0_n20_N3ccc8CC5x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x8y10E[] = {
  {&(_ZTVN3ccc8CC5x8y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x8y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x8y10E[];
static VTBL_ENTRY alt_thunk_names165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x8y103abcEv,_ZTv0_n20_N3ccc8CC5x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y103abcEv,_ZThn4_N3ccc8CC5x8y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x8y103pqrEv,_ZTv0_n12_N3ccc8CC5x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y103pqrEv,_ZThn4_N3ccc8CC5x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x8y10E = {  "_ZN3ccc8CC5x8y10E", // class name
  bases__ZN3ccc8CC5x8y10E, 2,
  &(vtc__ZN3ccc8CC5x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x8y10E),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  DD5x8y10  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD5x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x8y103abcEv
  ~DD5x8y10(); // tgen
  DD5x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x8y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x8y103pqrEv");}
void  ccc::DD5x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x8y103abcEv");}
ccc::DD5x8y10 ::~DD5x8y10(){ note_dtor("_ZN3ccc8DD5x8y10E", this);} // tgen
ccc::DD5x8y10 ::DD5x8y10(){ note_ctor("_ZN3ccc8DD5x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x8y10E, buf);
    ::ccc::DD5x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x8y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD5x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x8y10E);
    dp->::ccc::DD5x8y10::~DD5x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x8y10E(Test__ZN3ccc8DD5x8y10E, "_ZN3ccc8DD5x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x8y10C1Ev();
extern void _ZN3ccc8DD5x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x8y10E[] = {
  NSPAIR(_ZN3ccc8DD5x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD5x8y10E[] = {
  // 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__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 _ZTIN3ccc8DD5x8y10E[];
extern void _ZN3ccc8DD5x8y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x8y103abcEv,_ZTv0_n16_N3ccc8DD5x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x8y103abcEv,_ZThn4_N3ccc8DD5x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x8y103abcEv,_ZTv0_n16_N3ccc8DD5x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x8y10E[] = {
  {&(_ZTVN3ccc8DD5x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x8y10E[];
static VTBL_ENTRY alt_thunk_names166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x8y103abcEv,_ZTv0_n16_N3ccc8DD5x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x8y103abcEv,_ZThn4_N3ccc8DD5x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x8y10E = {  "_ZN3ccc8DD5x8y10E", // class name
  bases__ZN3ccc8DD5x8y10E, 2,
  &(vtc__ZN3ccc8DD5x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x8y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x8y10E),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  CC5x8y11  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC5x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x8y113efgEv
  ~CC5x8y11(); // tgen
  CC5x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y11E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x8y113pqrEv");}
void  ccc::CC5x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x8y113efgEv");}
ccc::CC5x8y11 ::~CC5x8y11(){ note_dtor("_ZN3ccc8CC5x8y11E", this);} // tgen
ccc::CC5x8y11 ::CC5x8y11(){ note_ctor("_ZN3ccc8CC5x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x8y11E, buf);
    ::ccc::CC5x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x8y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC5x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x8y11E);
    dp->::ccc::CC5x8y11::~CC5x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x8y11E(Test__ZN3ccc8CC5x8y11E, "_ZN3ccc8CC5x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x8y11C1Ev();
extern void _ZN3ccc8CC5x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x8y11E[] = {
  NSPAIR(_ZN3ccc8CC5x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC5x8y11E[] = {
  // 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__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 _ZTIN3ccc8CC5x8y11E[];
extern void _ZN3ccc8CC5x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC5x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x8y113pqrEv,_ZTv0_n12_N3ccc8CC5x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y113pqrEv,_ZThn4_N3ccc8CC5x8y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x8y113efgEv,_ZTv0_n16_N3ccc8CC5x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y113efgEv,_ZThn4_N3ccc8CC5x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x8y113pqrEv,_ZTv0_n12_N3ccc8CC5x8y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x8y113efgEv,_ZTv0_n16_N3ccc8CC5x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x8y11E[] = {
  {&(_ZTVN3ccc8CC5x8y11E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x8y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x8y11E[];
static VTBL_ENTRY alt_thunk_names167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x8y113efgEv,_ZTv0_n16_N3ccc8CC5x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y113efgEv,_ZThn4_N3ccc8CC5x8y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x8y113pqrEv,_ZTv0_n12_N3ccc8CC5x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y113pqrEv,_ZThn4_N3ccc8CC5x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x8y11E = {  "_ZN3ccc8CC5x8y11E", // class name
  bases__ZN3ccc8CC5x8y11E, 2,
  &(vtc__ZN3ccc8CC5x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x8y11E),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  DD5x8y11  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD5x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x8y113efgEv
  ~DD5x8y11(); // tgen
  DD5x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x8y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x8y113pqrEv");}
void  ccc::DD5x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x8y113efgEv");}
ccc::DD5x8y11 ::~DD5x8y11(){ note_dtor("_ZN3ccc8DD5x8y11E", this);} // tgen
ccc::DD5x8y11 ::DD5x8y11(){ note_ctor("_ZN3ccc8DD5x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x8y11E, buf);
    ::ccc::DD5x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x8y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD5x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x8y11E);
    dp->::ccc::DD5x8y11::~DD5x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x8y11E(Test__ZN3ccc8DD5x8y11E, "_ZN3ccc8DD5x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x8y11C1Ev();
extern void _ZN3ccc8DD5x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x8y11E[] = {
  NSPAIR(_ZN3ccc8DD5x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD5x8y11E[] = {
  // 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__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 _ZTIN3ccc8DD5x8y11E[];
extern void _ZN3ccc8DD5x8y113pqrEv();
extern void _ZN3ccc8DD5x8y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x8y113efgEv,_ZTv0_n12_N3ccc8DD5x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x8y113efgEv,_ZThn4_N3ccc8DD5x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x8y113efgEv,_ZTv0_n12_N3ccc8DD5x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x8y11E[] = {
  {&(_ZTVN3ccc8DD5x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x8y11E[];
static VTBL_ENTRY alt_thunk_names168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x8y113efgEv,_ZTv0_n12_N3ccc8DD5x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x8y113efgEv,_ZThn4_N3ccc8DD5x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x8y11E = {  "_ZN3ccc8DD5x8y11E", // class name
  bases__ZN3ccc8DD5x8y11E, 2,
  &(vtc__ZN3ccc8DD5x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x8y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x8y11E),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  CC5x8y12  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC5x8y123abcEv
  ~CC5x8y12(); // tgen
  CC5x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC5x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x8y123abcEv");}
ccc::CC5x8y12 ::~CC5x8y12(){ note_dtor("_ZN3ccc8CC5x8y12E", this);} // tgen
ccc::CC5x8y12 ::CC5x8y12(){ note_ctor("_ZN3ccc8CC5x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x8y12E, buf);
    ::ccc::CC5x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x8y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC5x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x8y12E);
    dp->::ccc::CC5x8y12::~CC5x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x8y12E(Test__ZN3ccc8CC5x8y12E, "_ZN3ccc8CC5x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x8y12C1Ev();
extern void _ZN3ccc8CC5x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x8y12E[] = {
  NSPAIR(_ZN3ccc8CC5x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC5x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC5x8y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x8y123abcEv,_ZTv0_n20_N3ccc8CC5x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y123abcEv,_ZThn4_N3ccc8CC5x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x8y123abcEv,_ZTv0_n20_N3ccc8CC5x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x8y12E[] = {
  {&(_ZTVN3ccc8CC5x8y12E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x8y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x8y12E[];
static VTBL_ENTRY alt_thunk_names169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x8y123abcEv,_ZTv0_n20_N3ccc8CC5x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y123abcEv,_ZThn4_N3ccc8CC5x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x8y12E = {  "_ZN3ccc8CC5x8y12E", // class name
  bases__ZN3ccc8CC5x8y12E, 2,
  &(vtc__ZN3ccc8CC5x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x8y12E),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  DD5x8y12  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD5x8y123abcEv
  ~DD5x8y12(); // tgen
  DD5x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x8y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD5x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x8y123abcEv");}
ccc::DD5x8y12 ::~DD5x8y12(){ note_dtor("_ZN3ccc8DD5x8y12E", this);} // tgen
ccc::DD5x8y12 ::DD5x8y12(){ note_ctor("_ZN3ccc8DD5x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x8y12E, buf);
    ::ccc::DD5x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x8y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD5x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x8y12E);
    dp->::ccc::DD5x8y12::~DD5x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x8y12E(Test__ZN3ccc8DD5x8y12E, "_ZN3ccc8DD5x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x8y12C1Ev();
extern void _ZN3ccc8DD5x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x8y12E[] = {
  NSPAIR(_ZN3ccc8DD5x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD5x8y12E[] = {
  // 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__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 _ZTIN3ccc8DD5x8y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x8y123abcEv,_ZTv0_n16_N3ccc8DD5x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x8y123abcEv,_ZThn4_N3ccc8DD5x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x8y123abcEv,_ZTv0_n16_N3ccc8DD5x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x8y12E[] = {
  {&(_ZTVN3ccc8DD5x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x8y12E[];
static VTBL_ENTRY alt_thunk_names170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x8y123abcEv,_ZTv0_n16_N3ccc8DD5x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x8y123abcEv,_ZThn4_N3ccc8DD5x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x8y12E = {  "_ZN3ccc8DD5x8y12E", // class name
  bases__ZN3ccc8DD5x8y12E, 2,
  &(vtc__ZN3ccc8DD5x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x8y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x8y12E),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  CC5x8y13  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC5x8y133efgEv
  ~CC5x8y13(); // tgen
  CC5x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC5x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x8y133efgEv");}
ccc::CC5x8y13 ::~CC5x8y13(){ note_dtor("_ZN3ccc8CC5x8y13E", this);} // tgen
ccc::CC5x8y13 ::CC5x8y13(){ note_ctor("_ZN3ccc8CC5x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x8y13E, buf);
    ::ccc::CC5x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x8y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC5x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x8y13E);
    dp->::ccc::CC5x8y13::~CC5x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x8y13E(Test__ZN3ccc8CC5x8y13E, "_ZN3ccc8CC5x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x8y13C1Ev();
extern void _ZN3ccc8CC5x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x8y13E[] = {
  NSPAIR(_ZN3ccc8CC5x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC5x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x8y13E[];
extern void _ZN3ccc8CC5x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x8y133efgEv,_ZTv0_n16_N3ccc8CC5x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y133efgEv,_ZThn4_N3ccc8CC5x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x8y133efgEv,_ZTv0_n16_N3ccc8CC5x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x8y13E[] = {
  {&(_ZTVN3ccc8CC5x8y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x8y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x8y13E[];
static VTBL_ENTRY alt_thunk_names171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x8y133efgEv,_ZTv0_n16_N3ccc8CC5x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y133efgEv,_ZThn4_N3ccc8CC5x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x8y13E = {  "_ZN3ccc8CC5x8y13E", // class name
  bases__ZN3ccc8CC5x8y13E, 2,
  &(vtc__ZN3ccc8CC5x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x8y13E),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  DD5x8y13  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD5x8y133efgEv
  ~DD5x8y13(); // tgen
  DD5x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x8y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD5x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x8y133efgEv");}
ccc::DD5x8y13 ::~DD5x8y13(){ note_dtor("_ZN3ccc8DD5x8y13E", this);} // tgen
ccc::DD5x8y13 ::DD5x8y13(){ note_ctor("_ZN3ccc8DD5x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x8y13E, buf);
    ::ccc::DD5x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x8y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD5x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x8y13E);
    dp->::ccc::DD5x8y13::~DD5x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x8y13E(Test__ZN3ccc8DD5x8y13E, "_ZN3ccc8DD5x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x8y13C1Ev();
extern void _ZN3ccc8DD5x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x8y13E[] = {
  NSPAIR(_ZN3ccc8DD5x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD5x8y13E[] = {
  // 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__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 _ZTIN3ccc8DD5x8y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x8y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x8y133efgEv,_ZTv0_n12_N3ccc8DD5x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x8y133efgEv,_ZThn4_N3ccc8DD5x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x8y133efgEv,_ZTv0_n12_N3ccc8DD5x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x8y13E[] = {
  {&(_ZTVN3ccc8DD5x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x8y13E[];
static VTBL_ENTRY alt_thunk_names172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x8y133efgEv,_ZTv0_n12_N3ccc8DD5x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x8y133efgEv,_ZThn4_N3ccc8DD5x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x8y13E = {  "_ZN3ccc8DD5x8y13E", // class name
  bases__ZN3ccc8DD5x8y13E, 2,
  &(vtc__ZN3ccc8DD5x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x8y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x8y13E),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  CC5x8y14  : virtual ::ccc::AA5 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC5x8y143pqrEv
  ~CC5x8y14(); // tgen
  CC5x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x8y143pqrEv");}
ccc::CC5x8y14 ::~CC5x8y14(){ note_dtor("_ZN3ccc8CC5x8y14E", this);} // tgen
ccc::CC5x8y14 ::CC5x8y14(){ note_ctor("_ZN3ccc8CC5x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x8y14E, buf);
    ::ccc::CC5x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x8y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC5x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x8y14E);
    dp->::ccc::CC5x8y14::~CC5x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x8y14E(Test__ZN3ccc8CC5x8y14E, "_ZN3ccc8CC5x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x8y14C1Ev();
extern void _ZN3ccc8CC5x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x8y14E[] = {
  NSPAIR(_ZN3ccc8CC5x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC5x8y14E[] = {
  // 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__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 _ZTIN3ccc8CC5x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC5x8y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x8y143pqrEv,_ZTv0_n12_N3ccc8CC5x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x8y143pqrEv,_ZThn4_N3ccc8CC5x8y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x8y143pqrEv,_ZTv0_n12_N3ccc8CC5x8y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x8y14E[] = {
  {&(_ZTVN3ccc8CC5x8y14E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x8y14E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x8y14E[];
static VTBL_ENTRY alt_thunk_names173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x8y143pqrEv,_ZTv0_n12_N3ccc8CC5x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x8y143pqrEv,_ZThn4_N3ccc8CC5x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x8y14E = {  "_ZN3ccc8CC5x8y14E", // class name
  bases__ZN3ccc8CC5x8y14E, 2,
  &(vtc__ZN3ccc8CC5x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y14E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x8y14E),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  DD5x8y14  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD5x8y143pqrEv
  ~DD5x8y14(); // tgen
  DD5x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x8y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x8y143pqrEv");}
ccc::DD5x8y14 ::~DD5x8y14(){ note_dtor("_ZN3ccc8DD5x8y14E", this);} // tgen
ccc::DD5x8y14 ::DD5x8y14(){ note_ctor("_ZN3ccc8DD5x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x8y14E, buf);
    ::ccc::DD5x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x8y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD5x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x8y14E);
    dp->::ccc::DD5x8y14::~DD5x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x8y14E(Test__ZN3ccc8DD5x8y14E, "_ZN3ccc8DD5x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x8y14C1Ev();
extern void _ZN3ccc8DD5x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x8y14E[] = {
  NSPAIR(_ZN3ccc8DD5x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD5x8y14E[] = {
  // 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__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 _ZTIN3ccc8DD5x8y14E[];
extern void _ZN3ccc8DD5x8y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x8y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x8y14E[] = {
  {&(_ZTVN3ccc8DD5x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x8y14E[];
Class_Descriptor cd__ZN3ccc8DD5x8y14E = {  "_ZN3ccc8DD5x8y14E", // class name
  bases__ZN3ccc8DD5x8y14E, 2,
  &(vtc__ZN3ccc8DD5x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x8y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x8y14E),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  CC5x8y15  : virtual ::ccc::AA5 , ::ccc::BB8 {
  ~CC5x8y15(); // tgen
  CC5x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x8y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC5x8y15 ::~CC5x8y15(){ note_dtor("_ZN3ccc8CC5x8y15E", this);} // tgen
ccc::CC5x8y15 ::CC5x8y15(){ note_ctor("_ZN3ccc8CC5x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x8y15E, buf);
    ::ccc::CC5x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x8y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC5x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x8y15E);
    dp->::ccc::CC5x8y15::~CC5x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x8y15E(Test__ZN3ccc8CC5x8y15E, "_ZN3ccc8CC5x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x8y15C1Ev();
extern void _ZN3ccc8CC5x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x8y15E[] = {
  NSPAIR(_ZN3ccc8CC5x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC5x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x8y15E[] = {
  {&(_ZTVN3ccc8CC5x8y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x8y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x8y15E[];
Class_Descriptor cd__ZN3ccc8CC5x8y15E = {  "_ZN3ccc8CC5x8y15E", // class name
  bases__ZN3ccc8CC5x8y15E, 2,
  &(vtc__ZN3ccc8CC5x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x8y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x8y15E),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  DD5x8y15  : virtual ::ccc::AA5 , virtual ::ccc::BB8 {
  ~DD5x8y15(); // tgen
  DD5x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x8y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD5x8y15 ::~DD5x8y15(){ note_dtor("_ZN3ccc8DD5x8y15E", this);} // tgen
ccc::DD5x8y15 ::DD5x8y15(){ note_ctor("_ZN3ccc8DD5x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x8y15E, buf);
    ::ccc::DD5x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x8y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD5x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x8y15E);
    dp->::ccc::DD5x8y15::~DD5x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x8y15E(Test__ZN3ccc8DD5x8y15E, "_ZN3ccc8DD5x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x8y15C1Ev();
extern void _ZN3ccc8DD5x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x8y15E[] = {
  NSPAIR(_ZN3ccc8DD5x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD5x8y15E[] = {
  // 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__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 _ZTIN3ccc8DD5x8y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x8y15E[] = {
  {&(_ZTVN3ccc8DD5x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x8y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x8y15E[];
Class_Descriptor cd__ZN3ccc8DD5x8y15E = {  "_ZN3ccc8DD5x8y15E", // class name
  bases__ZN3ccc8DD5x8y15E, 2,
  &(vtc__ZN3ccc8DD5x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x8y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x8y15E),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  CC5x9y0  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC5x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y03pqrEv
  ~CC5x9y0(); // tgen
  CC5x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y0E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y03abcEv");}
void  ccc::CC5x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y03efgEv");}
void  ccc::CC5x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y03pqrEv");}
ccc::CC5x9y0 ::~CC5x9y0(){ note_dtor("_ZN3ccc7CC5x9y0E", this);} // tgen
ccc::CC5x9y0 ::CC5x9y0(){ note_ctor("_ZN3ccc7CC5x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y0E, buf);
    ::ccc::CC5x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y0E);
    dp->::ccc::CC5x9y0::~CC5x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y0E(Test__ZN3ccc7CC5x9y0E, "_ZN3ccc7CC5x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y0C1Ev();
extern void _ZN3ccc7CC5x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y0E[] = {
  NSPAIR(_ZN3ccc7CC5x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y0E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y0E[];
extern void _ZN3ccc7CC5x9y03efgEv();
extern void _ZN3ccc7CC5x9y03pqrEv();
extern void _ZN3ccc7CC5x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y03pqrEv,_ZTv0_n12_N3ccc7CC5x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y03pqrEv,_ZThn4_N3ccc7CC5x9y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y03efgEv,_ZTv0_n16_N3ccc7CC5x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y03efgEv,_ZThn4_N3ccc7CC5x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y03abcEv,_ZTv0_n20_N3ccc7CC5x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y03abcEv,_ZThn4_N3ccc7CC5x9y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y03pqrEv,_ZTv0_n12_N3ccc7CC5x9y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y03efgEv,_ZTv0_n16_N3ccc7CC5x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y03abcEv,_ZTv0_n20_N3ccc7CC5x9y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y0E[] = {
  {&(_ZTVN3ccc7CC5x9y0E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y0E[];
static VTBL_ENTRY alt_thunk_names174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y03abcEv,_ZTv0_n20_N3ccc7CC5x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y03abcEv,_ZThn4_N3ccc7CC5x9y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y03efgEv,_ZTv0_n16_N3ccc7CC5x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y03efgEv,_ZThn4_N3ccc7CC5x9y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y03pqrEv,_ZTv0_n12_N3ccc7CC5x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y03pqrEv,_ZThn4_N3ccc7CC5x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y0E = {  "_ZN3ccc7CC5x9y0E", // class name
  bases__ZN3ccc7CC5x9y0E, 2,
  &(vtc__ZN3ccc7CC5x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y0E),2, //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  DD5x9y0  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD5x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD5x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x9y03pqrEv
  ~DD5x9y0(); // tgen
  DD5x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y03abcEv");}
void  ccc::DD5x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y03efgEv");}
void  ccc::DD5x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y03pqrEv");}
ccc::DD5x9y0 ::~DD5x9y0(){ note_dtor("_ZN3ccc7DD5x9y0E", this);} // tgen
ccc::DD5x9y0 ::DD5x9y0(){ note_ctor("_ZN3ccc7DD5x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y0E, buf);
    ::ccc::DD5x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y0E);
    dp->::ccc::DD5x9y0::~DD5x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y0E(Test__ZN3ccc7DD5x9y0E, "_ZN3ccc7DD5x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y0C1Ev();
extern void _ZN3ccc7DD5x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y0E[] = {
  NSPAIR(_ZN3ccc7DD5x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y0E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y0E[];
extern void _ZN3ccc7DD5x9y03pqrEv();
extern void _ZN3ccc7DD5x9y03efgEv();
extern void _ZN3ccc7DD5x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y03efgEv,_ZTv0_n12_N3ccc7DD5x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y03efgEv,_ZThn4_N3ccc7DD5x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y03pqrEv,_ZTv0_n16_N3ccc7DD5x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y03pqrEv,_ZThn4_N3ccc7DD5x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y03efgEv,_ZTv0_n12_N3ccc7DD5x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y03pqrEv,_ZTv0_n16_N3ccc7DD5x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y0E[] = {
  {&(_ZTVN3ccc7DD5x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y0E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y0E[];
static VTBL_ENTRY alt_thunk_names175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y03pqrEv,_ZTv0_n16_N3ccc7DD5x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y03pqrEv,_ZThn4_N3ccc7DD5x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y03efgEv,_ZTv0_n12_N3ccc7DD5x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y03efgEv,_ZThn4_N3ccc7DD5x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y0E = {  "_ZN3ccc7DD5x9y0E", // class name
  bases__ZN3ccc7DD5x9y0E, 2,
  &(vtc__ZN3ccc7DD5x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y0E),3, //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  CC5x9y1  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x9y13efgEv
  ~CC5x9y1(); // tgen
  CC5x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y1E) C1{ VBC2{ v2 v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y13abcEv");}
void  ccc::CC5x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y13pqrEv");}
void  ccc::CC5x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y13efgEv");}
ccc::CC5x9y1 ::~CC5x9y1(){ note_dtor("_ZN3ccc7CC5x9y1E", this);} // tgen
ccc::CC5x9y1 ::CC5x9y1(){ note_ctor("_ZN3ccc7CC5x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y1E, buf);
    ::ccc::CC5x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y1E);
    dp->::ccc::CC5x9y1::~CC5x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y1E(Test__ZN3ccc7CC5x9y1E, "_ZN3ccc7CC5x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y1C1Ev();
extern void _ZN3ccc7CC5x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y1E[] = {
  NSPAIR(_ZN3ccc7CC5x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y1E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y1E[];
extern void _ZN3ccc7CC5x9y13efgEv();
extern void _ZN3ccc7CC5x9y13pqrEv();
extern void _ZN3ccc7CC5x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y13pqrEv,_ZTv0_n12_N3ccc7CC5x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y13pqrEv,_ZThn4_N3ccc7CC5x9y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y13efgEv,_ZTv0_n16_N3ccc7CC5x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y13efgEv,_ZThn4_N3ccc7CC5x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y13abcEv,_ZTv0_n20_N3ccc7CC5x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y13abcEv,_ZThn4_N3ccc7CC5x9y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y13pqrEv,_ZTv0_n12_N3ccc7CC5x9y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y13efgEv,_ZTv0_n16_N3ccc7CC5x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y13abcEv,_ZTv0_n20_N3ccc7CC5x9y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y1E[] = {
  {&(_ZTVN3ccc7CC5x9y1E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y1E[];
static VTBL_ENTRY alt_thunk_names176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y13abcEv,_ZTv0_n20_N3ccc7CC5x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y13abcEv,_ZThn4_N3ccc7CC5x9y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y13efgEv,_ZTv0_n16_N3ccc7CC5x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y13efgEv,_ZThn4_N3ccc7CC5x9y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y13pqrEv,_ZTv0_n12_N3ccc7CC5x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y13pqrEv,_ZThn4_N3ccc7CC5x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y1E = {  "_ZN3ccc7CC5x9y1E", // class name
  bases__ZN3ccc7CC5x9y1E, 2,
  &(vtc__ZN3ccc7CC5x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y1E),2, //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  DD5x9y1  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD5x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x9y13efgEv
  ~DD5x9y1(); // tgen
  DD5x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y13abcEv");}
void  ccc::DD5x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y13pqrEv");}
void  ccc::DD5x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y13efgEv");}
ccc::DD5x9y1 ::~DD5x9y1(){ note_dtor("_ZN3ccc7DD5x9y1E", this);} // tgen
ccc::DD5x9y1 ::DD5x9y1(){ note_ctor("_ZN3ccc7DD5x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y1E, buf);
    ::ccc::DD5x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y1E);
    dp->::ccc::DD5x9y1::~DD5x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y1E(Test__ZN3ccc7DD5x9y1E, "_ZN3ccc7DD5x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y1C1Ev();
extern void _ZN3ccc7DD5x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y1E[] = {
  NSPAIR(_ZN3ccc7DD5x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y1E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y1E[];
extern void _ZN3ccc7DD5x9y13pqrEv();
extern void _ZN3ccc7DD5x9y13efgEv();
extern void _ZN3ccc7DD5x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y13efgEv,_ZTv0_n12_N3ccc7DD5x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y13efgEv,_ZThn4_N3ccc7DD5x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y13pqrEv,_ZTv0_n16_N3ccc7DD5x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y13pqrEv,_ZThn4_N3ccc7DD5x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y13efgEv,_ZTv0_n12_N3ccc7DD5x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y13pqrEv,_ZTv0_n16_N3ccc7DD5x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y1E[] = {
  {&(_ZTVN3ccc7DD5x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y1E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y1E[];
static VTBL_ENTRY alt_thunk_names177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y13pqrEv,_ZTv0_n16_N3ccc7DD5x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y13pqrEv,_ZThn4_N3ccc7DD5x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y13efgEv,_ZTv0_n12_N3ccc7DD5x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y13efgEv,_ZThn4_N3ccc7DD5x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y1E = {  "_ZN3ccc7DD5x9y1E", // class name
  bases__ZN3ccc7DD5x9y1E, 2,
  &(vtc__ZN3ccc7DD5x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y1E),3, //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  CC5x9y2  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC5x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y23pqrEv
  ~CC5x9y2(); // tgen
  CC5x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y2E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y23efgEv");}
void  ccc::CC5x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y23abcEv");}
void  ccc::CC5x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y23pqrEv");}
ccc::CC5x9y2 ::~CC5x9y2(){ note_dtor("_ZN3ccc7CC5x9y2E", this);} // tgen
ccc::CC5x9y2 ::CC5x9y2(){ note_ctor("_ZN3ccc7CC5x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y2E, buf);
    ::ccc::CC5x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y2E);
    dp->::ccc::CC5x9y2::~CC5x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y2E(Test__ZN3ccc7CC5x9y2E, "_ZN3ccc7CC5x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y2C1Ev();
extern void _ZN3ccc7CC5x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y2E[] = {
  NSPAIR(_ZN3ccc7CC5x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y2E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y2E[];
extern void _ZN3ccc7CC5x9y23efgEv();
extern void _ZN3ccc7CC5x9y23pqrEv();
extern void _ZN3ccc7CC5x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y23pqrEv,_ZTv0_n12_N3ccc7CC5x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y23pqrEv,_ZThn4_N3ccc7CC5x9y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y23efgEv,_ZTv0_n16_N3ccc7CC5x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y23efgEv,_ZThn4_N3ccc7CC5x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y23abcEv,_ZTv0_n20_N3ccc7CC5x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y23abcEv,_ZThn4_N3ccc7CC5x9y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y23pqrEv,_ZTv0_n12_N3ccc7CC5x9y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y23efgEv,_ZTv0_n16_N3ccc7CC5x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y23abcEv,_ZTv0_n20_N3ccc7CC5x9y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y2E[] = {
  {&(_ZTVN3ccc7CC5x9y2E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y2E[];
static VTBL_ENTRY alt_thunk_names178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y23abcEv,_ZTv0_n20_N3ccc7CC5x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y23abcEv,_ZThn4_N3ccc7CC5x9y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y23efgEv,_ZTv0_n16_N3ccc7CC5x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y23efgEv,_ZThn4_N3ccc7CC5x9y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y23pqrEv,_ZTv0_n12_N3ccc7CC5x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y23pqrEv,_ZThn4_N3ccc7CC5x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y2E = {  "_ZN3ccc7CC5x9y2E", // class name
  bases__ZN3ccc7CC5x9y2E, 2,
  &(vtc__ZN3ccc7CC5x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y2E),2, //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  DD5x9y2  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD5x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD5x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x9y23pqrEv
  ~DD5x9y2(); // tgen
  DD5x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y23efgEv");}
void  ccc::DD5x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y23abcEv");}
void  ccc::DD5x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y23pqrEv");}
ccc::DD5x9y2 ::~DD5x9y2(){ note_dtor("_ZN3ccc7DD5x9y2E", this);} // tgen
ccc::DD5x9y2 ::DD5x9y2(){ note_ctor("_ZN3ccc7DD5x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y2E, buf);
    ::ccc::DD5x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y2E);
    dp->::ccc::DD5x9y2::~DD5x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y2E(Test__ZN3ccc7DD5x9y2E, "_ZN3ccc7DD5x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y2C1Ev();
extern void _ZN3ccc7DD5x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y2E[] = {
  NSPAIR(_ZN3ccc7DD5x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y2E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y2E[];
extern void _ZN3ccc7DD5x9y23pqrEv();
extern void _ZN3ccc7DD5x9y23efgEv();
extern void _ZN3ccc7DD5x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y23efgEv,_ZTv0_n12_N3ccc7DD5x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y23efgEv,_ZThn4_N3ccc7DD5x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y23pqrEv,_ZTv0_n16_N3ccc7DD5x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y23pqrEv,_ZThn4_N3ccc7DD5x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y23efgEv,_ZTv0_n12_N3ccc7DD5x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y23pqrEv,_ZTv0_n16_N3ccc7DD5x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y2E[] = {
  {&(_ZTVN3ccc7DD5x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y2E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y2E[];
static VTBL_ENTRY alt_thunk_names179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y23pqrEv,_ZTv0_n16_N3ccc7DD5x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y23pqrEv,_ZThn4_N3ccc7DD5x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y23efgEv,_ZTv0_n12_N3ccc7DD5x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y23efgEv,_ZThn4_N3ccc7DD5x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y2E = {  "_ZN3ccc7DD5x9y2E", // class name
  bases__ZN3ccc7DD5x9y2E, 2,
  &(vtc__ZN3ccc7DD5x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y2E),3, //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  CC5x9y3  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x9y33abcEv
  ~CC5x9y3(); // tgen
  CC5x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y3E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y33efgEv");}
void  ccc::CC5x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y33pqrEv");}
void  ccc::CC5x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y33abcEv");}
ccc::CC5x9y3 ::~CC5x9y3(){ note_dtor("_ZN3ccc7CC5x9y3E", this);} // tgen
ccc::CC5x9y3 ::CC5x9y3(){ note_ctor("_ZN3ccc7CC5x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y3E, buf);
    ::ccc::CC5x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y3E);
    dp->::ccc::CC5x9y3::~CC5x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y3E(Test__ZN3ccc7CC5x9y3E, "_ZN3ccc7CC5x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y3C1Ev();
extern void _ZN3ccc7CC5x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y3E[] = {
  NSPAIR(_ZN3ccc7CC5x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y3E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y3E[];
extern void _ZN3ccc7CC5x9y33efgEv();
extern void _ZN3ccc7CC5x9y33pqrEv();
extern void _ZN3ccc7CC5x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y33pqrEv,_ZTv0_n12_N3ccc7CC5x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y33pqrEv,_ZThn4_N3ccc7CC5x9y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y33efgEv,_ZTv0_n16_N3ccc7CC5x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y33efgEv,_ZThn4_N3ccc7CC5x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y33abcEv,_ZTv0_n20_N3ccc7CC5x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y33abcEv,_ZThn4_N3ccc7CC5x9y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y33pqrEv,_ZTv0_n12_N3ccc7CC5x9y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y33efgEv,_ZTv0_n16_N3ccc7CC5x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y33abcEv,_ZTv0_n20_N3ccc7CC5x9y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y3E[] = {
  {&(_ZTVN3ccc7CC5x9y3E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y3E[];
static VTBL_ENTRY alt_thunk_names180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y33abcEv,_ZTv0_n20_N3ccc7CC5x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y33abcEv,_ZThn4_N3ccc7CC5x9y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y33efgEv,_ZTv0_n16_N3ccc7CC5x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y33efgEv,_ZThn4_N3ccc7CC5x9y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y33pqrEv,_ZTv0_n12_N3ccc7CC5x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y33pqrEv,_ZThn4_N3ccc7CC5x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y3E = {  "_ZN3ccc7CC5x9y3E", // class name
  bases__ZN3ccc7CC5x9y3E, 2,
  &(vtc__ZN3ccc7CC5x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y3E),2, //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  DD5x9y3  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD5x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x9y33abcEv
  ~DD5x9y3(); // tgen
  DD5x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y33efgEv");}
void  ccc::DD5x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y33pqrEv");}
void  ccc::DD5x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y33abcEv");}
ccc::DD5x9y3 ::~DD5x9y3(){ note_dtor("_ZN3ccc7DD5x9y3E", this);} // tgen
ccc::DD5x9y3 ::DD5x9y3(){ note_ctor("_ZN3ccc7DD5x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y3E, buf);
    ::ccc::DD5x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y3E);
    dp->::ccc::DD5x9y3::~DD5x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y3E(Test__ZN3ccc7DD5x9y3E, "_ZN3ccc7DD5x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y3C1Ev();
extern void _ZN3ccc7DD5x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y3E[] = {
  NSPAIR(_ZN3ccc7DD5x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y3E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y3E[];
extern void _ZN3ccc7DD5x9y33pqrEv();
extern void _ZN3ccc7DD5x9y33efgEv();
extern void _ZN3ccc7DD5x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y33efgEv,_ZTv0_n12_N3ccc7DD5x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y33efgEv,_ZThn4_N3ccc7DD5x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y33pqrEv,_ZTv0_n16_N3ccc7DD5x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y33pqrEv,_ZThn4_N3ccc7DD5x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y33efgEv,_ZTv0_n12_N3ccc7DD5x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y33pqrEv,_ZTv0_n16_N3ccc7DD5x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y3E[] = {
  {&(_ZTVN3ccc7DD5x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y3E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y3E[];
static VTBL_ENTRY alt_thunk_names181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y33pqrEv,_ZTv0_n16_N3ccc7DD5x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y33pqrEv,_ZThn4_N3ccc7DD5x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y33efgEv,_ZTv0_n12_N3ccc7DD5x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y33efgEv,_ZThn4_N3ccc7DD5x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y3E = {  "_ZN3ccc7DD5x9y3E", // class name
  bases__ZN3ccc7DD5x9y3E, 2,
  &(vtc__ZN3ccc7DD5x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y3E),3, //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  CC5x9y4  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC5x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC5x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC5x9y43efgEv
  ~CC5x9y4(); // tgen
  CC5x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y4E) C1{ VBC2{ v1 v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y43pqrEv");}
void  ccc::CC5x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y43abcEv");}
void  ccc::CC5x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y43efgEv");}
ccc::CC5x9y4 ::~CC5x9y4(){ note_dtor("_ZN3ccc7CC5x9y4E", this);} // tgen
ccc::CC5x9y4 ::CC5x9y4(){ note_ctor("_ZN3ccc7CC5x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y4E, buf);
    ::ccc::CC5x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y4E);
    dp->::ccc::CC5x9y4::~CC5x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y4E(Test__ZN3ccc7CC5x9y4E, "_ZN3ccc7CC5x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y4C1Ev();
extern void _ZN3ccc7CC5x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y4E[] = {
  NSPAIR(_ZN3ccc7CC5x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y4E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y4E[];
extern void _ZN3ccc7CC5x9y43efgEv();
extern void _ZN3ccc7CC5x9y43pqrEv();
extern void _ZN3ccc7CC5x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y43pqrEv,_ZTv0_n12_N3ccc7CC5x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y43pqrEv,_ZThn4_N3ccc7CC5x9y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y43efgEv,_ZTv0_n16_N3ccc7CC5x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y43efgEv,_ZThn4_N3ccc7CC5x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y43abcEv,_ZTv0_n20_N3ccc7CC5x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y43abcEv,_ZThn4_N3ccc7CC5x9y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y43pqrEv,_ZTv0_n12_N3ccc7CC5x9y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y43efgEv,_ZTv0_n16_N3ccc7CC5x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y43abcEv,_ZTv0_n20_N3ccc7CC5x9y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y4E[] = {
  {&(_ZTVN3ccc7CC5x9y4E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y4E[];
static VTBL_ENTRY alt_thunk_names182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y43abcEv,_ZTv0_n20_N3ccc7CC5x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y43abcEv,_ZThn4_N3ccc7CC5x9y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y43efgEv,_ZTv0_n16_N3ccc7CC5x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y43efgEv,_ZThn4_N3ccc7CC5x9y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y43pqrEv,_ZTv0_n12_N3ccc7CC5x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y43pqrEv,_ZThn4_N3ccc7CC5x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y4E = {  "_ZN3ccc7CC5x9y4E", // class name
  bases__ZN3ccc7CC5x9y4E, 2,
  &(vtc__ZN3ccc7CC5x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y4E),2, //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  DD5x9y4  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD5x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD5x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD5x9y43efgEv
  ~DD5x9y4(); // tgen
  DD5x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y43pqrEv");}
void  ccc::DD5x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y43abcEv");}
void  ccc::DD5x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y43efgEv");}
ccc::DD5x9y4 ::~DD5x9y4(){ note_dtor("_ZN3ccc7DD5x9y4E", this);} // tgen
ccc::DD5x9y4 ::DD5x9y4(){ note_ctor("_ZN3ccc7DD5x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y4E, buf);
    ::ccc::DD5x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y4E);
    dp->::ccc::DD5x9y4::~DD5x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y4E(Test__ZN3ccc7DD5x9y4E, "_ZN3ccc7DD5x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y4C1Ev();
extern void _ZN3ccc7DD5x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y4E[] = {
  NSPAIR(_ZN3ccc7DD5x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y4E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y4E[];
extern void _ZN3ccc7DD5x9y43pqrEv();
extern void _ZN3ccc7DD5x9y43efgEv();
extern void _ZN3ccc7DD5x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y43efgEv,_ZTv0_n12_N3ccc7DD5x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y43efgEv,_ZThn4_N3ccc7DD5x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y43pqrEv,_ZTv0_n16_N3ccc7DD5x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y43pqrEv,_ZThn4_N3ccc7DD5x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y43efgEv,_ZTv0_n12_N3ccc7DD5x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y43pqrEv,_ZTv0_n16_N3ccc7DD5x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y4E[] = {
  {&(_ZTVN3ccc7DD5x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y4E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y4E[];
static VTBL_ENTRY alt_thunk_names183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y43pqrEv,_ZTv0_n16_N3ccc7DD5x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y43pqrEv,_ZThn4_N3ccc7DD5x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y43efgEv,_ZTv0_n12_N3ccc7DD5x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y43efgEv,_ZThn4_N3ccc7DD5x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y4E = {  "_ZN3ccc7DD5x9y4E", // class name
  bases__ZN3ccc7DD5x9y4E, 2,
  &(vtc__ZN3ccc7DD5x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y4E),3, //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  CC5x9y5  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC5x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC5x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC5x9y53abcEv
  ~CC5x9y5(); // tgen
  CC5x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y5E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y53pqrEv");}
void  ccc::CC5x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y53efgEv");}
void  ccc::CC5x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y53abcEv");}
ccc::CC5x9y5 ::~CC5x9y5(){ note_dtor("_ZN3ccc7CC5x9y5E", this);} // tgen
ccc::CC5x9y5 ::CC5x9y5(){ note_ctor("_ZN3ccc7CC5x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y5E, buf);
    ::ccc::CC5x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y5E);
    dp->::ccc::CC5x9y5::~CC5x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y5E(Test__ZN3ccc7CC5x9y5E, "_ZN3ccc7CC5x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y5C1Ev();
extern void _ZN3ccc7CC5x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y5E[] = {
  NSPAIR(_ZN3ccc7CC5x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y5E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y5E[];
extern void _ZN3ccc7CC5x9y53efgEv();
extern void _ZN3ccc7CC5x9y53pqrEv();
extern void _ZN3ccc7CC5x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y53pqrEv,_ZTv0_n12_N3ccc7CC5x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y53pqrEv,_ZThn4_N3ccc7CC5x9y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y53efgEv,_ZTv0_n16_N3ccc7CC5x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y53efgEv,_ZThn4_N3ccc7CC5x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y53abcEv,_ZTv0_n20_N3ccc7CC5x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y53abcEv,_ZThn4_N3ccc7CC5x9y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y53pqrEv,_ZTv0_n12_N3ccc7CC5x9y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y53efgEv,_ZTv0_n16_N3ccc7CC5x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y53abcEv,_ZTv0_n20_N3ccc7CC5x9y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y5E[] = {
  {&(_ZTVN3ccc7CC5x9y5E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y5E[];
static VTBL_ENTRY alt_thunk_names184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y53abcEv,_ZTv0_n20_N3ccc7CC5x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y53abcEv,_ZThn4_N3ccc7CC5x9y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y53efgEv,_ZTv0_n16_N3ccc7CC5x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y53efgEv,_ZThn4_N3ccc7CC5x9y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y53pqrEv,_ZTv0_n12_N3ccc7CC5x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y53pqrEv,_ZThn4_N3ccc7CC5x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y5E = {  "_ZN3ccc7CC5x9y5E", // class name
  bases__ZN3ccc7CC5x9y5E, 2,
  &(vtc__ZN3ccc7CC5x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y5E),2, //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  DD5x9y5  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD5x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD5x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD5x9y53abcEv
  ~DD5x9y5(); // tgen
  DD5x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y53pqrEv");}
void  ccc::DD5x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y53efgEv");}
void  ccc::DD5x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y53abcEv");}
ccc::DD5x9y5 ::~DD5x9y5(){ note_dtor("_ZN3ccc7DD5x9y5E", this);} // tgen
ccc::DD5x9y5 ::DD5x9y5(){ note_ctor("_ZN3ccc7DD5x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y5E, buf);
    ::ccc::DD5x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y5E);
    dp->::ccc::DD5x9y5::~DD5x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y5E(Test__ZN3ccc7DD5x9y5E, "_ZN3ccc7DD5x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y5C1Ev();
extern void _ZN3ccc7DD5x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y5E[] = {
  NSPAIR(_ZN3ccc7DD5x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y5E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y5E[];
extern void _ZN3ccc7DD5x9y53pqrEv();
extern void _ZN3ccc7DD5x9y53efgEv();
extern void _ZN3ccc7DD5x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y53efgEv,_ZTv0_n12_N3ccc7DD5x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y53efgEv,_ZThn4_N3ccc7DD5x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y53pqrEv,_ZTv0_n16_N3ccc7DD5x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y53pqrEv,_ZThn4_N3ccc7DD5x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y53efgEv,_ZTv0_n12_N3ccc7DD5x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y53pqrEv,_ZTv0_n16_N3ccc7DD5x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y5E[] = {
  {&(_ZTVN3ccc7DD5x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y5E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y5E[];
static VTBL_ENTRY alt_thunk_names185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y53pqrEv,_ZTv0_n16_N3ccc7DD5x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y53pqrEv,_ZThn4_N3ccc7DD5x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y53efgEv,_ZTv0_n12_N3ccc7DD5x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y53efgEv,_ZThn4_N3ccc7DD5x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y5E = {  "_ZN3ccc7DD5x9y5E", // class name
  bases__ZN3ccc7DD5x9y5E, 2,
  &(vtc__ZN3ccc7DD5x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y5E),3, //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  CC5x9y6  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC5x9y63efgEv
  ~CC5x9y6(); // tgen
  CC5x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y6E) C1{ VBC2{ v3 v2 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y63abcEv");}
void  ccc::CC5x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y63efgEv");}
ccc::CC5x9y6 ::~CC5x9y6(){ note_dtor("_ZN3ccc7CC5x9y6E", this);} // tgen
ccc::CC5x9y6 ::CC5x9y6(){ note_ctor("_ZN3ccc7CC5x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y6E, buf);
    ::ccc::CC5x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y6E);
    dp->::ccc::CC5x9y6::~CC5x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y6E(Test__ZN3ccc7CC5x9y6E, "_ZN3ccc7CC5x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y6C1Ev();
extern void _ZN3ccc7CC5x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y6E[] = {
  NSPAIR(_ZN3ccc7CC5x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y6E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y6E[];
extern void _ZN3ccc7CC5x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC5x9y63abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y63efgEv,_ZTv0_n16_N3ccc7CC5x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y63efgEv,_ZThn4_N3ccc7CC5x9y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y63abcEv,_ZTv0_n20_N3ccc7CC5x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y63abcEv,_ZThn4_N3ccc7CC5x9y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y63efgEv,_ZTv0_n16_N3ccc7CC5x9y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y63abcEv,_ZTv0_n20_N3ccc7CC5x9y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y6E[] = {
  {&(_ZTVN3ccc7CC5x9y6E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y6E[];
static VTBL_ENTRY alt_thunk_names186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y63abcEv,_ZTv0_n20_N3ccc7CC5x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y63abcEv,_ZThn4_N3ccc7CC5x9y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y63efgEv,_ZTv0_n16_N3ccc7CC5x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y63efgEv,_ZThn4_N3ccc7CC5x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y6E = {  "_ZN3ccc7CC5x9y6E", // class name
  bases__ZN3ccc7CC5x9y6E, 2,
  &(vtc__ZN3ccc7CC5x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y6E),2, //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  DD5x9y6  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD5x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD5x9y63efgEv
  ~DD5x9y6(); // tgen
  DD5x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y63abcEv");}
void  ccc::DD5x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y63efgEv");}
ccc::DD5x9y6 ::~DD5x9y6(){ note_dtor("_ZN3ccc7DD5x9y6E", this);} // tgen
ccc::DD5x9y6 ::DD5x9y6(){ note_ctor("_ZN3ccc7DD5x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y6E, buf);
    ::ccc::DD5x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y6E);
    dp->::ccc::DD5x9y6::~DD5x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y6E(Test__ZN3ccc7DD5x9y6E, "_ZN3ccc7DD5x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y6C1Ev();
extern void _ZN3ccc7DD5x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y6E[] = {
  NSPAIR(_ZN3ccc7DD5x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y6E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x9y63efgEv();
extern void _ZN3ccc7DD5x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y63efgEv,_ZTv0_n12_N3ccc7DD5x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y63efgEv,_ZThn4_N3ccc7DD5x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y63efgEv,_ZTv0_n12_N3ccc7DD5x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y6E[] = {
  {&(_ZTVN3ccc7DD5x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y6E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y6E[];
static VTBL_ENTRY alt_thunk_names187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y63efgEv,_ZTv0_n12_N3ccc7DD5x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y63efgEv,_ZThn4_N3ccc7DD5x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y6E = {  "_ZN3ccc7DD5x9y6E", // class name
  bases__ZN3ccc7DD5x9y6E, 2,
  &(vtc__ZN3ccc7DD5x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y6E),3, //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  CC5x9y7  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC5x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y73pqrEv
  ~CC5x9y7(); // tgen
  CC5x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y7E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y73abcEv");}
void  ccc::CC5x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y73pqrEv");}
ccc::CC5x9y7 ::~CC5x9y7(){ note_dtor("_ZN3ccc7CC5x9y7E", this);} // tgen
ccc::CC5x9y7 ::CC5x9y7(){ note_ctor("_ZN3ccc7CC5x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y7E, buf);
    ::ccc::CC5x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y7E);
    dp->::ccc::CC5x9y7::~CC5x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y7E(Test__ZN3ccc7CC5x9y7E, "_ZN3ccc7CC5x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y7C1Ev();
extern void _ZN3ccc7CC5x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y7E[] = {
  NSPAIR(_ZN3ccc7CC5x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y7E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC5x9y73pqrEv();
extern void _ZN3ccc7CC5x9y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y73pqrEv,_ZTv0_n12_N3ccc7CC5x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y73pqrEv,_ZThn4_N3ccc7CC5x9y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y73abcEv,_ZTv0_n20_N3ccc7CC5x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y73abcEv,_ZThn4_N3ccc7CC5x9y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y73pqrEv,_ZTv0_n12_N3ccc7CC5x9y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y73abcEv,_ZTv0_n20_N3ccc7CC5x9y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y7E[] = {
  {&(_ZTVN3ccc7CC5x9y7E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y7E[];
static VTBL_ENTRY alt_thunk_names188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y73abcEv,_ZTv0_n20_N3ccc7CC5x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y73abcEv,_ZThn4_N3ccc7CC5x9y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y73pqrEv,_ZTv0_n12_N3ccc7CC5x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y73pqrEv,_ZThn4_N3ccc7CC5x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y7E = {  "_ZN3ccc7CC5x9y7E", // class name
  bases__ZN3ccc7CC5x9y7E, 2,
  &(vtc__ZN3ccc7CC5x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y7E),2, //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  DD5x9y7  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD5x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD5x9y73pqrEv
  ~DD5x9y7(); // tgen
  DD5x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y73abcEv");}
void  ccc::DD5x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y73pqrEv");}
ccc::DD5x9y7 ::~DD5x9y7(){ note_dtor("_ZN3ccc7DD5x9y7E", this);} // tgen
ccc::DD5x9y7 ::DD5x9y7(){ note_ctor("_ZN3ccc7DD5x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y7E, buf);
    ::ccc::DD5x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y7E);
    dp->::ccc::DD5x9y7::~DD5x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y7E(Test__ZN3ccc7DD5x9y7E, "_ZN3ccc7DD5x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y7C1Ev();
extern void _ZN3ccc7DD5x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y7E[] = {
  NSPAIR(_ZN3ccc7DD5x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y7E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y7E[];
extern void _ZN3ccc7DD5x9y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc7DD5x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y73pqrEv,_ZTv0_n16_N3ccc7DD5x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y73pqrEv,_ZThn4_N3ccc7DD5x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y73pqrEv,_ZTv0_n16_N3ccc7DD5x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y7E[] = {
  {&(_ZTVN3ccc7DD5x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y7E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y7E[];
static VTBL_ENTRY alt_thunk_names189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y73pqrEv,_ZTv0_n16_N3ccc7DD5x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y73pqrEv,_ZThn4_N3ccc7DD5x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y7E = {  "_ZN3ccc7DD5x9y7E", // class name
  bases__ZN3ccc7DD5x9y7E, 2,
  &(vtc__ZN3ccc7DD5x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y7E),3, //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  CC5x9y8  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC5x9y83abcEv
  ~CC5x9y8(); // tgen
  CC5x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y8E) C1{ VBC2{ v3 v1 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y83efgEv");}
void  ccc::CC5x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC5x9y83abcEv");}
ccc::CC5x9y8 ::~CC5x9y8(){ note_dtor("_ZN3ccc7CC5x9y8E", this);} // tgen
ccc::CC5x9y8 ::CC5x9y8(){ note_ctor("_ZN3ccc7CC5x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y8E, buf);
    ::ccc::CC5x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y8E);
    dp->::ccc::CC5x9y8::~CC5x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y8E(Test__ZN3ccc7CC5x9y8E, "_ZN3ccc7CC5x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y8C1Ev();
extern void _ZN3ccc7CC5x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y8E[] = {
  NSPAIR(_ZN3ccc7CC5x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y8E[] = {
  // 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__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 _ZTIN3ccc7CC5x9y8E[];
extern void _ZN3ccc7CC5x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC5x9y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y83efgEv,_ZTv0_n16_N3ccc7CC5x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y83efgEv,_ZThn4_N3ccc7CC5x9y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7CC5x9y83abcEv,_ZTv0_n20_N3ccc7CC5x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y83abcEv,_ZThn4_N3ccc7CC5x9y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y83efgEv,_ZTv0_n16_N3ccc7CC5x9y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7CC5x9y83abcEv,_ZTv0_n20_N3ccc7CC5x9y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y8E[] = {
  {&(_ZTVN3ccc7CC5x9y8E[3]),  3,14},
  {&(_ZTVN3ccc7CC5x9y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y8E[];
static VTBL_ENTRY alt_thunk_names190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7CC5x9y83abcEv,_ZTv0_n20_N3ccc7CC5x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y83abcEv,_ZThn4_N3ccc7CC5x9y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y83efgEv,_ZTv0_n16_N3ccc7CC5x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y83efgEv,_ZThn4_N3ccc7CC5x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y8E = {  "_ZN3ccc7CC5x9y8E", // class name
  bases__ZN3ccc7CC5x9y8E, 2,
  &(vtc__ZN3ccc7CC5x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y8E),2, //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  DD5x9y8  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD5x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD5x9y83abcEv
  ~DD5x9y8(); // tgen
  DD5x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y83efgEv");}
void  ccc::DD5x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD5x9y83abcEv");}
ccc::DD5x9y8 ::~DD5x9y8(){ note_dtor("_ZN3ccc7DD5x9y8E", this);} // tgen
ccc::DD5x9y8 ::DD5x9y8(){ note_ctor("_ZN3ccc7DD5x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y8E, buf);
    ::ccc::DD5x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y8E);
    dp->::ccc::DD5x9y8::~DD5x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y8E(Test__ZN3ccc7DD5x9y8E, "_ZN3ccc7DD5x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y8C1Ev();
extern void _ZN3ccc7DD5x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y8E[] = {
  NSPAIR(_ZN3ccc7DD5x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y8E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc7DD5x9y83efgEv();
extern void _ZN3ccc7DD5x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y83efgEv,_ZTv0_n12_N3ccc7DD5x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y83efgEv,_ZThn4_N3ccc7DD5x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y83efgEv,_ZTv0_n12_N3ccc7DD5x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y8E[] = {
  {&(_ZTVN3ccc7DD5x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y8E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y8E[];
static VTBL_ENTRY alt_thunk_names191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y83efgEv,_ZTv0_n12_N3ccc7DD5x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y83efgEv,_ZThn4_N3ccc7DD5x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y8E = {  "_ZN3ccc7DD5x9y8E", // class name
  bases__ZN3ccc7DD5x9y8E, 2,
  &(vtc__ZN3ccc7DD5x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y8E),3, //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  CC5x9y9  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC5x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC5x9y93pqrEv
  ~CC5x9y9(); // tgen
  CC5x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC5x9y9E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC5x9y93efgEv");}
void  ccc::CC5x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC5x9y93pqrEv");}
ccc::CC5x9y9 ::~CC5x9y9(){ note_dtor("_ZN3ccc7CC5x9y9E", this);} // tgen
ccc::CC5x9y9 ::CC5x9y9(){ note_ctor("_ZN3ccc7CC5x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC5x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC5x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC5x9y9E, buf);
    ::ccc::CC5x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC5x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC5x9y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc7CC5x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC5x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC5x9y9E);
    dp->::ccc::CC5x9y9::~CC5x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC5x9y9E(Test__ZN3ccc7CC5x9y9E, "_ZN3ccc7CC5x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC5x9y9C1Ev();
extern void _ZN3ccc7CC5x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC5x9y9E[] = {
  NSPAIR(_ZN3ccc7CC5x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC5x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC5x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc7CC5x9y9E[];
extern void _ZN3ccc7CC5x9y93efgEv();
extern void _ZN3ccc7CC5x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC5x9y93pqrEv,_ZTv0_n12_N3ccc7CC5x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y93pqrEv,_ZThn4_N3ccc7CC5x9y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC5x9y93efgEv,_ZTv0_n16_N3ccc7CC5x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC5x9y93efgEv,_ZThn4_N3ccc7CC5x9y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC5x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC5x9y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC5x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC5x9y93pqrEv,_ZTv0_n12_N3ccc7CC5x9y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC5x9y93efgEv,_ZTv0_n16_N3ccc7CC5x9y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC5x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC5x9y9E[] = {
  {&(_ZTVN3ccc7CC5x9y9E[3]),  3,13},
  {&(_ZTVN3ccc7CC5x9y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc7CC5x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC5x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC5x9y9E[];
static VTBL_ENTRY alt_thunk_names192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC5x9y93efgEv,_ZTv0_n16_N3ccc7CC5x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y93efgEv,_ZThn4_N3ccc7CC5x9y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC5x9y93pqrEv,_ZTv0_n12_N3ccc7CC5x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC5x9y93pqrEv,_ZThn4_N3ccc7CC5x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC5x9y9E = {  "_ZN3ccc7CC5x9y9E", // class name
  bases__ZN3ccc7CC5x9y9E, 2,
  &(vtc__ZN3ccc7CC5x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC5x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC5x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC5x9y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC5x9y9E),2, //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  DD5x9y9  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD5x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD5x9y93pqrEv
  ~DD5x9y9(); // tgen
  DD5x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD5x9y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD5x9y93efgEv");}
void  ccc::DD5x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD5x9y93pqrEv");}
ccc::DD5x9y9 ::~DD5x9y9(){ note_dtor("_ZN3ccc7DD5x9y9E", this);} // tgen
ccc::DD5x9y9 ::DD5x9y9(){ note_ctor("_ZN3ccc7DD5x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD5x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD5x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD5x9y9E, buf);
    ::ccc::DD5x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD5x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD5x9y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc7DD5x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD5x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD5x9y9E);
    dp->::ccc::DD5x9y9::~DD5x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD5x9y9E(Test__ZN3ccc7DD5x9y9E, "_ZN3ccc7DD5x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD5x9y9C1Ev();
extern void _ZN3ccc7DD5x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD5x9y9E[] = {
  NSPAIR(_ZN3ccc7DD5x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD5x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD5x9y9E[] = {
  // 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__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 _ZTIN3ccc7DD5x9y9E[];
extern void _ZN3ccc7DD5x9y93pqrEv();
extern void _ZN3ccc7DD5x9y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD5x9y93efgEv,_ZTv0_n12_N3ccc7DD5x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y93efgEv,_ZThn4_N3ccc7DD5x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD5x9y93pqrEv,_ZTv0_n16_N3ccc7DD5x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD5x9y93pqrEv,_ZThn4_N3ccc7DD5x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD5x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD5x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD5x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD5x9y93efgEv,_ZTv0_n12_N3ccc7DD5x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD5x9y93pqrEv,_ZTv0_n16_N3ccc7DD5x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD5x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD5x9y9E[] = {
  {&(_ZTVN3ccc7DD5x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y9E[7]),  7,16},
  {&(_ZTVN3ccc7DD5x9y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD5x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD5x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD5x9y9E[];
static VTBL_ENTRY alt_thunk_names193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD5x9y93pqrEv,_ZTv0_n16_N3ccc7DD5x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y93pqrEv,_ZThn4_N3ccc7DD5x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD5x9y93efgEv,_ZTv0_n12_N3ccc7DD5x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD5x9y93efgEv,_ZThn4_N3ccc7DD5x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD5x9y9E = {  "_ZN3ccc7DD5x9y9E", // class name
  bases__ZN3ccc7DD5x9y9E, 2,
  &(vtc__ZN3ccc7DD5x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD5x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD5x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD5x9y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD5x9y9E),3, //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  CC5x9y10  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC5x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x9y103abcEv
  ~CC5x9y10(); // tgen
  CC5x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y10E) C1{ VBC2{ v1 v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x9y103pqrEv");}
void  ccc::CC5x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x9y103abcEv");}
ccc::CC5x9y10 ::~CC5x9y10(){ note_dtor("_ZN3ccc8CC5x9y10E", this);} // tgen
ccc::CC5x9y10 ::CC5x9y10(){ note_ctor("_ZN3ccc8CC5x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC5x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x9y10E, buf);
    ::ccc::CC5x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x9y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC5x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x9y10E);
    dp->::ccc::CC5x9y10::~CC5x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x9y10E(Test__ZN3ccc8CC5x9y10E, "_ZN3ccc8CC5x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x9y10C1Ev();
extern void _ZN3ccc8CC5x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC5x9y10E[] = {
  NSPAIR(_ZN3ccc8CC5x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC5x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC5x9y10E[] = {
  // 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__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 _ZTIN3ccc8CC5x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC5x9y103pqrEv();
extern void _ZN3ccc8CC5x9y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x9y103pqrEv,_ZTv0_n12_N3ccc8CC5x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y103pqrEv,_ZThn4_N3ccc8CC5x9y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x9y103abcEv,_ZTv0_n20_N3ccc8CC5x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y103abcEv,_ZThn4_N3ccc8CC5x9y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x9y103pqrEv,_ZTv0_n12_N3ccc8CC5x9y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x9y103abcEv,_ZTv0_n20_N3ccc8CC5x9y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x9y10E[] = {
  {&(_ZTVN3ccc8CC5x9y10E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x9y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x9y10E[];
static VTBL_ENTRY alt_thunk_names194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x9y103abcEv,_ZTv0_n20_N3ccc8CC5x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y103abcEv,_ZThn4_N3ccc8CC5x9y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x9y103pqrEv,_ZTv0_n12_N3ccc8CC5x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y103pqrEv,_ZThn4_N3ccc8CC5x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x9y10E = {  "_ZN3ccc8CC5x9y10E", // class name
  bases__ZN3ccc8CC5x9y10E, 2,
  &(vtc__ZN3ccc8CC5x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x9y10E),2, //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  DD5x9y10  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD5x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x9y103abcEv
  ~DD5x9y10(); // tgen
  DD5x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD5x9y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x9y103pqrEv");}
void  ccc::DD5x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x9y103abcEv");}
ccc::DD5x9y10 ::~DD5x9y10(){ note_dtor("_ZN3ccc8DD5x9y10E", this);} // tgen
ccc::DD5x9y10 ::DD5x9y10(){ note_ctor("_ZN3ccc8DD5x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD5x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x9y10E, buf);
    ::ccc::DD5x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x9y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD5x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x9y10E);
    dp->::ccc::DD5x9y10::~DD5x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x9y10E(Test__ZN3ccc8DD5x9y10E, "_ZN3ccc8DD5x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x9y10C1Ev();
extern void _ZN3ccc8DD5x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD5x9y10E[] = {
  NSPAIR(_ZN3ccc8DD5x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD5x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD5x9y10E[] = {
  // 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__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 _ZTIN3ccc8DD5x9y10E[];
extern void _ZN3ccc8DD5x9y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x9y103pqrEv,_ZTv0_n16_N3ccc8DD5x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x9y103pqrEv,_ZThn4_N3ccc8DD5x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x9y103pqrEv,_ZTv0_n16_N3ccc8DD5x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x9y10E[] = {
  {&(_ZTVN3ccc8DD5x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y10E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x9y10E[];
static VTBL_ENTRY alt_thunk_names195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x9y103pqrEv,_ZTv0_n16_N3ccc8DD5x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x9y103pqrEv,_ZThn4_N3ccc8DD5x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x9y10E = {  "_ZN3ccc8DD5x9y10E", // class name
  bases__ZN3ccc8DD5x9y10E, 2,
  &(vtc__ZN3ccc8DD5x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x9y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x9y10E),3, //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  CC5x9y11  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC5x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x9y113efgEv
  ~CC5x9y11(); // tgen
  CC5x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y11E) C1{ VBC2{ v1 v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x9y113pqrEv");}
void  ccc::CC5x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x9y113efgEv");}
ccc::CC5x9y11 ::~CC5x9y11(){ note_dtor("_ZN3ccc8CC5x9y11E", this);} // tgen
ccc::CC5x9y11 ::CC5x9y11(){ note_ctor("_ZN3ccc8CC5x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC5x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x9y11E, buf);
    ::ccc::CC5x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x9y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC5x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x9y11E);
    dp->::ccc::CC5x9y11::~CC5x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x9y11E(Test__ZN3ccc8CC5x9y11E, "_ZN3ccc8CC5x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x9y11C1Ev();
extern void _ZN3ccc8CC5x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC5x9y11E[] = {
  NSPAIR(_ZN3ccc8CC5x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC5x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC5x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x9y11E[];
extern void _ZN3ccc8CC5x9y113efgEv();
extern void _ZN3ccc8CC5x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x9y113pqrEv,_ZTv0_n12_N3ccc8CC5x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y113pqrEv,_ZThn4_N3ccc8CC5x9y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x9y113efgEv,_ZTv0_n16_N3ccc8CC5x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y113efgEv,_ZThn4_N3ccc8CC5x9y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x9y113pqrEv,_ZTv0_n12_N3ccc8CC5x9y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x9y113efgEv,_ZTv0_n16_N3ccc8CC5x9y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x9y11E[] = {
  {&(_ZTVN3ccc8CC5x9y11E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x9y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x9y11E[];
static VTBL_ENTRY alt_thunk_names196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x9y113efgEv,_ZTv0_n16_N3ccc8CC5x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y113efgEv,_ZThn4_N3ccc8CC5x9y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x9y113pqrEv,_ZTv0_n12_N3ccc8CC5x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y113pqrEv,_ZThn4_N3ccc8CC5x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x9y11E = {  "_ZN3ccc8CC5x9y11E", // class name
  bases__ZN3ccc8CC5x9y11E, 2,
  &(vtc__ZN3ccc8CC5x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x9y11E),2, //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  DD5x9y11  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD5x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x9y113efgEv
  ~DD5x9y11(); // tgen
  DD5x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD5x9y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x9y113pqrEv");}
void  ccc::DD5x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x9y113efgEv");}
ccc::DD5x9y11 ::~DD5x9y11(){ note_dtor("_ZN3ccc8DD5x9y11E", this);} // tgen
ccc::DD5x9y11 ::DD5x9y11(){ note_ctor("_ZN3ccc8DD5x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD5x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x9y11E, buf);
    ::ccc::DD5x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x9y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD5x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x9y11E);
    dp->::ccc::DD5x9y11::~DD5x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x9y11E(Test__ZN3ccc8DD5x9y11E, "_ZN3ccc8DD5x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x9y11C1Ev();
extern void _ZN3ccc8DD5x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD5x9y11E[] = {
  NSPAIR(_ZN3ccc8DD5x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD5x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD5x9y11E[] = {
  // 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__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 _ZTIN3ccc8DD5x9y11E[];
extern void _ZN3ccc8DD5x9y113pqrEv();
extern void _ZN3ccc8DD5x9y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x9y113efgEv,_ZTv0_n12_N3ccc8DD5x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x9y113efgEv,_ZThn4_N3ccc8DD5x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x9y113pqrEv,_ZTv0_n16_N3ccc8DD5x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x9y113pqrEv,_ZThn4_N3ccc8DD5x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x9y113efgEv,_ZTv0_n12_N3ccc8DD5x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x9y113pqrEv,_ZTv0_n16_N3ccc8DD5x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x9y11E[] = {
  {&(_ZTVN3ccc8DD5x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y11E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x9y11E[];
static VTBL_ENTRY alt_thunk_names197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x9y113pqrEv,_ZTv0_n16_N3ccc8DD5x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x9y113pqrEv,_ZThn4_N3ccc8DD5x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x9y113efgEv,_ZTv0_n12_N3ccc8DD5x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x9y113efgEv,_ZThn4_N3ccc8DD5x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x9y11E = {  "_ZN3ccc8DD5x9y11E", // class name
  bases__ZN3ccc8DD5x9y11E, 2,
  &(vtc__ZN3ccc8DD5x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x9y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x9y11E),3, //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  CC5x9y12  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC5x9y123abcEv
  ~CC5x9y12(); // tgen
  CC5x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x9y123abcEv");}
ccc::CC5x9y12 ::~CC5x9y12(){ note_dtor("_ZN3ccc8CC5x9y12E", this);} // tgen
ccc::CC5x9y12 ::CC5x9y12(){ note_ctor("_ZN3ccc8CC5x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC5x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x9y12E, buf);
    ::ccc::CC5x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x9y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC5x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x9y12E);
    dp->::ccc::CC5x9y12::~CC5x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x9y12E(Test__ZN3ccc8CC5x9y12E, "_ZN3ccc8CC5x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x9y12C1Ev();
extern void _ZN3ccc8CC5x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC5x9y12E[] = {
  NSPAIR(_ZN3ccc8CC5x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC5x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC5x9y12E[] = {
  // 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__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 _ZTIN3ccc8CC5x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC5x9y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x9y123abcEv,_ZTv0_n20_N3ccc8CC5x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y123abcEv,_ZThn4_N3ccc8CC5x9y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x9y123abcEv,_ZTv0_n20_N3ccc8CC5x9y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x9y12E[] = {
  {&(_ZTVN3ccc8CC5x9y12E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x9y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x9y12E[];
static VTBL_ENTRY alt_thunk_names198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x9y123abcEv,_ZTv0_n20_N3ccc8CC5x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y123abcEv,_ZThn4_N3ccc8CC5x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x9y12E = {  "_ZN3ccc8CC5x9y12E", // class name
  bases__ZN3ccc8CC5x9y12E, 2,
  &(vtc__ZN3ccc8CC5x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x9y12E),2, //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  DD5x9y12  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD5x9y123abcEv
  ~DD5x9y12(); // tgen
  DD5x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD5x9y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x9y123abcEv");}
ccc::DD5x9y12 ::~DD5x9y12(){ note_dtor("_ZN3ccc8DD5x9y12E", this);} // tgen
ccc::DD5x9y12 ::DD5x9y12(){ note_ctor("_ZN3ccc8DD5x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD5x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x9y12E, buf);
    ::ccc::DD5x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x9y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD5x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x9y12E);
    dp->::ccc::DD5x9y12::~DD5x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x9y12E(Test__ZN3ccc8DD5x9y12E, "_ZN3ccc8DD5x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x9y12C1Ev();
extern void _ZN3ccc8DD5x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD5x9y12E[] = {
  NSPAIR(_ZN3ccc8DD5x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD5x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD5x9y12E[] = {
  // 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__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 _ZTIN3ccc8DD5x9y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x9y12E[] = {
  {&(_ZTVN3ccc8DD5x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y12E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x9y12E[];
Class_Descriptor cd__ZN3ccc8DD5x9y12E = {  "_ZN3ccc8DD5x9y12E", // class name
  bases__ZN3ccc8DD5x9y12E, 2,
  &(vtc__ZN3ccc8DD5x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x9y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x9y12E),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  CC5x9y13  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC5x9y133efgEv
  ~CC5x9y13(); // tgen
  CC5x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC5x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x9y133efgEv");}
ccc::CC5x9y13 ::~CC5x9y13(){ note_dtor("_ZN3ccc8CC5x9y13E", this);} // tgen
ccc::CC5x9y13 ::CC5x9y13(){ note_ctor("_ZN3ccc8CC5x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC5x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x9y13E, buf);
    ::ccc::CC5x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x9y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC5x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x9y13E);
    dp->::ccc::CC5x9y13::~CC5x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x9y13E(Test__ZN3ccc8CC5x9y13E, "_ZN3ccc8CC5x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x9y13C1Ev();
extern void _ZN3ccc8CC5x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC5x9y13E[] = {
  NSPAIR(_ZN3ccc8CC5x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC5x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC5x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x9y13E[];
extern void _ZN3ccc8CC5x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x9y133efgEv,_ZTv0_n16_N3ccc8CC5x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y133efgEv,_ZThn4_N3ccc8CC5x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x9y133efgEv,_ZTv0_n16_N3ccc8CC5x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x9y13E[] = {
  {&(_ZTVN3ccc8CC5x9y13E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x9y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x9y13E[];
static VTBL_ENTRY alt_thunk_names199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x9y133efgEv,_ZTv0_n16_N3ccc8CC5x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y133efgEv,_ZThn4_N3ccc8CC5x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x9y13E = {  "_ZN3ccc8CC5x9y13E", // class name
  bases__ZN3ccc8CC5x9y13E, 2,
  &(vtc__ZN3ccc8CC5x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x9y13E),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  DD5x9y13  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD5x9y133efgEv
  ~DD5x9y13(); // tgen
  DD5x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD5x9y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD5x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x9y133efgEv");}
ccc::DD5x9y13 ::~DD5x9y13(){ note_dtor("_ZN3ccc8DD5x9y13E", this);} // tgen
ccc::DD5x9y13 ::DD5x9y13(){ note_ctor("_ZN3ccc8DD5x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD5x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x9y13E, buf);
    ::ccc::DD5x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x9y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD5x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x9y13E);
    dp->::ccc::DD5x9y13::~DD5x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x9y13E(Test__ZN3ccc8DD5x9y13E, "_ZN3ccc8DD5x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x9y13C1Ev();
extern void _ZN3ccc8DD5x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD5x9y13E[] = {
  NSPAIR(_ZN3ccc8DD5x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD5x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD5x9y13E[] = {
  // 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__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 _ZTIN3ccc8DD5x9y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x9y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x9y133efgEv,_ZTv0_n12_N3ccc8DD5x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x9y133efgEv,_ZThn4_N3ccc8DD5x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x9y133efgEv,_ZTv0_n12_N3ccc8DD5x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x9y13E[] = {
  {&(_ZTVN3ccc8DD5x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y13E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x9y13E[];
static VTBL_ENTRY alt_thunk_names200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x9y133efgEv,_ZTv0_n12_N3ccc8DD5x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x9y133efgEv,_ZThn4_N3ccc8DD5x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x9y13E = {  "_ZN3ccc8DD5x9y13E", // class name
  bases__ZN3ccc8DD5x9y13E, 2,
  &(vtc__ZN3ccc8DD5x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x9y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x9y13E),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  CC5x9y14  : virtual ::ccc::AA5 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC5x9y143pqrEv
  ~CC5x9y14(); // tgen
  CC5x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC5x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x9y143pqrEv");}
ccc::CC5x9y14 ::~CC5x9y14(){ note_dtor("_ZN3ccc8CC5x9y14E", this);} // tgen
ccc::CC5x9y14 ::CC5x9y14(){ note_ctor("_ZN3ccc8CC5x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC5x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x9y14E, buf);
    ::ccc::CC5x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x9y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC5x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x9y14E);
    dp->::ccc::CC5x9y14::~CC5x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x9y14E(Test__ZN3ccc8CC5x9y14E, "_ZN3ccc8CC5x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x9y14C1Ev();
extern void _ZN3ccc8CC5x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC5x9y14E[] = {
  NSPAIR(_ZN3ccc8CC5x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC5x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC5x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC5x9y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x9y143pqrEv,_ZTv0_n12_N3ccc8CC5x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x9y143pqrEv,_ZThn4_N3ccc8CC5x9y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x9y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x9y143pqrEv,_ZTv0_n12_N3ccc8CC5x9y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x9y14E[] = {
  {&(_ZTVN3ccc8CC5x9y14E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x9y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x9y14E[];
static VTBL_ENTRY alt_thunk_names201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x9y143pqrEv,_ZTv0_n12_N3ccc8CC5x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x9y143pqrEv,_ZThn4_N3ccc8CC5x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x9y14E = {  "_ZN3ccc8CC5x9y14E", // class name
  bases__ZN3ccc8CC5x9y14E, 2,
  &(vtc__ZN3ccc8CC5x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x9y14E),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  DD5x9y14  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD5x9y143pqrEv
  ~DD5x9y14(); // tgen
  DD5x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD5x9y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD5x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x9y143pqrEv");}
ccc::DD5x9y14 ::~DD5x9y14(){ note_dtor("_ZN3ccc8DD5x9y14E", this);} // tgen
ccc::DD5x9y14 ::DD5x9y14(){ note_ctor("_ZN3ccc8DD5x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD5x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x9y14E, buf);
    ::ccc::DD5x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x9y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD5x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x9y14E);
    dp->::ccc::DD5x9y14::~DD5x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x9y14E(Test__ZN3ccc8DD5x9y14E, "_ZN3ccc8DD5x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x9y14C1Ev();
extern void _ZN3ccc8DD5x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD5x9y14E[] = {
  NSPAIR(_ZN3ccc8DD5x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD5x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD5x9y14E[] = {
  // 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__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 _ZTIN3ccc8DD5x9y14E[];
extern void _ZN3ccc8DD5x9y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x9y143pqrEv,_ZTv0_n16_N3ccc8DD5x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x9y143pqrEv,_ZThn4_N3ccc8DD5x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x9y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x9y143pqrEv,_ZTv0_n16_N3ccc8DD5x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x9y14E[] = {
  {&(_ZTVN3ccc8DD5x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y14E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x9y14E[];
static VTBL_ENTRY alt_thunk_names202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x9y143pqrEv,_ZTv0_n16_N3ccc8DD5x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x9y143pqrEv,_ZThn4_N3ccc8DD5x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x9y14E = {  "_ZN3ccc8DD5x9y14E", // class name
  bases__ZN3ccc8DD5x9y14E, 2,
  &(vtc__ZN3ccc8DD5x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x9y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x9y14E),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  CC5x9y15  : virtual ::ccc::AA5 , ::ccc::BB9 {
  ~CC5x9y15(); // tgen
  CC5x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC5x9y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC5x9y15 ::~CC5x9y15(){ note_dtor("_ZN3ccc8CC5x9y15E", this);} // tgen
ccc::CC5x9y15 ::CC5x9y15(){ note_ctor("_ZN3ccc8CC5x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC5x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x9y15E, buf);
    ::ccc::CC5x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x9y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC5x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x9y15E);
    dp->::ccc::CC5x9y15::~CC5x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x9y15E(Test__ZN3ccc8CC5x9y15E, "_ZN3ccc8CC5x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x9y15C1Ev();
extern void _ZN3ccc8CC5x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC5x9y15E[] = {
  NSPAIR(_ZN3ccc8CC5x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC5x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC5x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x9y15E[] = {
  {&(_ZTVN3ccc8CC5x9y15E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x9y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x9y15E[];
Class_Descriptor cd__ZN3ccc8CC5x9y15E = {  "_ZN3ccc8CC5x9y15E", // class name
  bases__ZN3ccc8CC5x9y15E, 2,
  &(vtc__ZN3ccc8CC5x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x9y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x9y15E),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  DD5x9y15  : virtual ::ccc::AA5 , virtual ::ccc::BB9 {
  ~DD5x9y15(); // tgen
  DD5x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD5x9y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD5x9y15 ::~DD5x9y15(){ note_dtor("_ZN3ccc8DD5x9y15E", this);} // tgen
ccc::DD5x9y15 ::DD5x9y15(){ note_ctor("_ZN3ccc8DD5x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD5x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x9y15E, buf);
    ::ccc::DD5x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x9y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD5x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x9y15E);
    dp->::ccc::DD5x9y15::~DD5x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x9y15E(Test__ZN3ccc8DD5x9y15E, "_ZN3ccc8DD5x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x9y15C1Ev();
extern void _ZN3ccc8DD5x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD5x9y15E[] = {
  NSPAIR(_ZN3ccc8DD5x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD5x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD5x9y15E[] = {
  // 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__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 _ZTIN3ccc8DD5x9y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x9y15E[] = {
  {&(_ZTVN3ccc8DD5x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y15E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x9y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x9y15E[];
Class_Descriptor cd__ZN3ccc8DD5x9y15E = {  "_ZN3ccc8DD5x9y15E", // class name
  bases__ZN3ccc8DD5x9y15E, 2,
  &(vtc__ZN3ccc8DD5x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x9y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x9y15E),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  CC5x10y0  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y03pqrEv
  ~CC5x10y0(); // tgen
  CC5x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y0E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y03abcEv");}
void  ccc::CC5x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y03efgEv");}
void  ccc::CC5x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y03pqrEv");}
ccc::CC5x10y0 ::~CC5x10y0(){ note_dtor("_ZN3ccc8CC5x10y0E", this);} // tgen
ccc::CC5x10y0 ::CC5x10y0(){ note_ctor("_ZN3ccc8CC5x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y0E, buf);
    ::ccc::CC5x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y0E);
    dp->::ccc::CC5x10y0::~CC5x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y0E(Test__ZN3ccc8CC5x10y0E, "_ZN3ccc8CC5x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y0C1Ev();
extern void _ZN3ccc8CC5x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y0E[] = {
  NSPAIR(_ZN3ccc8CC5x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y0E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y0E[];
extern void _ZN3ccc8CC5x10y03pqrEv();
extern void _ZN3ccc8CC5x10y03abcEv();
extern void _ZN3ccc8CC5x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y03pqrEv,_ZTv0_n12_N3ccc8CC5x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y03pqrEv,_ZThn4_N3ccc8CC5x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y03efgEv,_ZTv0_n16_N3ccc8CC5x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y03efgEv,_ZThn4_N3ccc8CC5x10y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y03abcEv,_ZTv0_n20_N3ccc8CC5x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y03abcEv,_ZThn4_N3ccc8CC5x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y03pqrEv,_ZTv0_n12_N3ccc8CC5x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y03efgEv,_ZTv0_n16_N3ccc8CC5x10y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y03abcEv,_ZTv0_n20_N3ccc8CC5x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y0E[] = {
  {&(_ZTVN3ccc8CC5x10y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y0E[];
static VTBL_ENTRY alt_thunk_names203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y03abcEv,_ZTv0_n20_N3ccc8CC5x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y03abcEv,_ZThn4_N3ccc8CC5x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y03efgEv,_ZTv0_n16_N3ccc8CC5x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y03efgEv,_ZThn4_N3ccc8CC5x10y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y03pqrEv,_ZTv0_n12_N3ccc8CC5x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y03pqrEv,_ZThn4_N3ccc8CC5x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y0E = {  "_ZN3ccc8CC5x10y0E", // class name
  bases__ZN3ccc8CC5x10y0E, 2,
  &(vtc__ZN3ccc8CC5x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y0E),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  DD5x10y0  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD5x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD5x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x10y03pqrEv
  ~DD5x10y0(); // tgen
  DD5x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y03abcEv");}
void  ccc::DD5x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y03efgEv");}
void  ccc::DD5x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y03pqrEv");}
ccc::DD5x10y0 ::~DD5x10y0(){ note_dtor("_ZN3ccc8DD5x10y0E", this);} // tgen
ccc::DD5x10y0 ::DD5x10y0(){ note_ctor("_ZN3ccc8DD5x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y0E, buf);
    ::ccc::DD5x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y0E);
    dp->::ccc::DD5x10y0::~DD5x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y0E(Test__ZN3ccc8DD5x10y0E, "_ZN3ccc8DD5x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y0C1Ev();
extern void _ZN3ccc8DD5x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y0E[] = {
  NSPAIR(_ZN3ccc8DD5x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y0E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y0E[];
extern void _ZN3ccc8DD5x10y03pqrEv();
extern void _ZN3ccc8DD5x10y03efgEv();
extern void _ZN3ccc8DD5x10y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y03pqrEv,_ZTv0_n12_N3ccc8DD5x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y03pqrEv,_ZThn4_N3ccc8DD5x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y03abcEv,_ZTv0_n16_N3ccc8DD5x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y03abcEv,_ZThn4_N3ccc8DD5x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y03pqrEv,_ZTv0_n12_N3ccc8DD5x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y03abcEv,_ZTv0_n16_N3ccc8DD5x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y0E[] = {
  {&(_ZTVN3ccc8DD5x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y0E[];
static VTBL_ENTRY alt_thunk_names204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y03abcEv,_ZTv0_n16_N3ccc8DD5x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y03abcEv,_ZThn4_N3ccc8DD5x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y03pqrEv,_ZTv0_n12_N3ccc8DD5x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y03pqrEv,_ZThn4_N3ccc8DD5x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y0E = {  "_ZN3ccc8DD5x10y0E", // class name
  bases__ZN3ccc8DD5x10y0E, 2,
  &(vtc__ZN3ccc8DD5x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y0E),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  CC5x10y1  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x10y13efgEv
  ~CC5x10y1(); // tgen
  CC5x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y1E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y13abcEv");}
void  ccc::CC5x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y13pqrEv");}
void  ccc::CC5x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y13efgEv");}
ccc::CC5x10y1 ::~CC5x10y1(){ note_dtor("_ZN3ccc8CC5x10y1E", this);} // tgen
ccc::CC5x10y1 ::CC5x10y1(){ note_ctor("_ZN3ccc8CC5x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y1E, buf);
    ::ccc::CC5x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y1E);
    dp->::ccc::CC5x10y1::~CC5x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y1E(Test__ZN3ccc8CC5x10y1E, "_ZN3ccc8CC5x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y1C1Ev();
extern void _ZN3ccc8CC5x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y1E[] = {
  NSPAIR(_ZN3ccc8CC5x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y1E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y1E[];
extern void _ZN3ccc8CC5x10y13pqrEv();
extern void _ZN3ccc8CC5x10y13abcEv();
extern void _ZN3ccc8CC5x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y13pqrEv,_ZTv0_n12_N3ccc8CC5x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y13pqrEv,_ZThn4_N3ccc8CC5x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y13efgEv,_ZTv0_n16_N3ccc8CC5x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y13efgEv,_ZThn4_N3ccc8CC5x10y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y13abcEv,_ZTv0_n20_N3ccc8CC5x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y13abcEv,_ZThn4_N3ccc8CC5x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y13pqrEv,_ZTv0_n12_N3ccc8CC5x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y13efgEv,_ZTv0_n16_N3ccc8CC5x10y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y13abcEv,_ZTv0_n20_N3ccc8CC5x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y1E[] = {
  {&(_ZTVN3ccc8CC5x10y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y1E[];
static VTBL_ENTRY alt_thunk_names205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y13abcEv,_ZTv0_n20_N3ccc8CC5x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y13abcEv,_ZThn4_N3ccc8CC5x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y13efgEv,_ZTv0_n16_N3ccc8CC5x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y13efgEv,_ZThn4_N3ccc8CC5x10y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y13pqrEv,_ZTv0_n12_N3ccc8CC5x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y13pqrEv,_ZThn4_N3ccc8CC5x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y1E = {  "_ZN3ccc8CC5x10y1E", // class name
  bases__ZN3ccc8CC5x10y1E, 2,
  &(vtc__ZN3ccc8CC5x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y1E),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  DD5x10y1  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD5x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x10y13efgEv
  ~DD5x10y1(); // tgen
  DD5x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y13abcEv");}
void  ccc::DD5x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y13pqrEv");}
void  ccc::DD5x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y13efgEv");}
ccc::DD5x10y1 ::~DD5x10y1(){ note_dtor("_ZN3ccc8DD5x10y1E", this);} // tgen
ccc::DD5x10y1 ::DD5x10y1(){ note_ctor("_ZN3ccc8DD5x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y1E, buf);
    ::ccc::DD5x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y1E);
    dp->::ccc::DD5x10y1::~DD5x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y1E(Test__ZN3ccc8DD5x10y1E, "_ZN3ccc8DD5x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y1C1Ev();
extern void _ZN3ccc8DD5x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y1E[] = {
  NSPAIR(_ZN3ccc8DD5x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y1E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y1E[];
extern void _ZN3ccc8DD5x10y13pqrEv();
extern void _ZN3ccc8DD5x10y13efgEv();
extern void _ZN3ccc8DD5x10y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y13pqrEv,_ZTv0_n12_N3ccc8DD5x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y13pqrEv,_ZThn4_N3ccc8DD5x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y13abcEv,_ZTv0_n16_N3ccc8DD5x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y13abcEv,_ZThn4_N3ccc8DD5x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y13pqrEv,_ZTv0_n12_N3ccc8DD5x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y13abcEv,_ZTv0_n16_N3ccc8DD5x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y1E[] = {
  {&(_ZTVN3ccc8DD5x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y1E[];
static VTBL_ENTRY alt_thunk_names206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y13abcEv,_ZTv0_n16_N3ccc8DD5x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y13abcEv,_ZThn4_N3ccc8DD5x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y13pqrEv,_ZTv0_n12_N3ccc8DD5x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y13pqrEv,_ZThn4_N3ccc8DD5x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y1E = {  "_ZN3ccc8DD5x10y1E", // class name
  bases__ZN3ccc8DD5x10y1E, 2,
  &(vtc__ZN3ccc8DD5x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y1E),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  CC5x10y2  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y23pqrEv
  ~CC5x10y2(); // tgen
  CC5x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y2E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y23efgEv");}
void  ccc::CC5x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y23abcEv");}
void  ccc::CC5x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y23pqrEv");}
ccc::CC5x10y2 ::~CC5x10y2(){ note_dtor("_ZN3ccc8CC5x10y2E", this);} // tgen
ccc::CC5x10y2 ::CC5x10y2(){ note_ctor("_ZN3ccc8CC5x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y2E, buf);
    ::ccc::CC5x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y2E);
    dp->::ccc::CC5x10y2::~CC5x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y2E(Test__ZN3ccc8CC5x10y2E, "_ZN3ccc8CC5x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y2C1Ev();
extern void _ZN3ccc8CC5x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y2E[] = {
  NSPAIR(_ZN3ccc8CC5x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y2E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y2E[];
extern void _ZN3ccc8CC5x10y23pqrEv();
extern void _ZN3ccc8CC5x10y23abcEv();
extern void _ZN3ccc8CC5x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y23pqrEv,_ZTv0_n12_N3ccc8CC5x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y23pqrEv,_ZThn4_N3ccc8CC5x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y23efgEv,_ZTv0_n16_N3ccc8CC5x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y23efgEv,_ZThn4_N3ccc8CC5x10y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y23abcEv,_ZTv0_n20_N3ccc8CC5x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y23abcEv,_ZThn4_N3ccc8CC5x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y23pqrEv,_ZTv0_n12_N3ccc8CC5x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y23efgEv,_ZTv0_n16_N3ccc8CC5x10y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y23abcEv,_ZTv0_n20_N3ccc8CC5x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y2E[] = {
  {&(_ZTVN3ccc8CC5x10y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y2E[];
static VTBL_ENTRY alt_thunk_names207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y23abcEv,_ZTv0_n20_N3ccc8CC5x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y23abcEv,_ZThn4_N3ccc8CC5x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y23efgEv,_ZTv0_n16_N3ccc8CC5x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y23efgEv,_ZThn4_N3ccc8CC5x10y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y23pqrEv,_ZTv0_n12_N3ccc8CC5x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y23pqrEv,_ZThn4_N3ccc8CC5x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y2E = {  "_ZN3ccc8CC5x10y2E", // class name
  bases__ZN3ccc8CC5x10y2E, 2,
  &(vtc__ZN3ccc8CC5x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y2E),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  DD5x10y2  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD5x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD5x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x10y23pqrEv
  ~DD5x10y2(); // tgen
  DD5x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y23efgEv");}
void  ccc::DD5x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y23abcEv");}
void  ccc::DD5x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y23pqrEv");}
ccc::DD5x10y2 ::~DD5x10y2(){ note_dtor("_ZN3ccc8DD5x10y2E", this);} // tgen
ccc::DD5x10y2 ::DD5x10y2(){ note_ctor("_ZN3ccc8DD5x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y2E, buf);
    ::ccc::DD5x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y2E);
    dp->::ccc::DD5x10y2::~DD5x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y2E(Test__ZN3ccc8DD5x10y2E, "_ZN3ccc8DD5x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y2C1Ev();
extern void _ZN3ccc8DD5x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y2E[] = {
  NSPAIR(_ZN3ccc8DD5x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y2E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y2E[];
extern void _ZN3ccc8DD5x10y23pqrEv();
extern void _ZN3ccc8DD5x10y23efgEv();
extern void _ZN3ccc8DD5x10y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y23pqrEv,_ZTv0_n12_N3ccc8DD5x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y23pqrEv,_ZThn4_N3ccc8DD5x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y23abcEv,_ZTv0_n16_N3ccc8DD5x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y23abcEv,_ZThn4_N3ccc8DD5x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y23pqrEv,_ZTv0_n12_N3ccc8DD5x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y23abcEv,_ZTv0_n16_N3ccc8DD5x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y2E[] = {
  {&(_ZTVN3ccc8DD5x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y2E[];
static VTBL_ENTRY alt_thunk_names208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y23abcEv,_ZTv0_n16_N3ccc8DD5x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y23abcEv,_ZThn4_N3ccc8DD5x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y23pqrEv,_ZTv0_n12_N3ccc8DD5x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y23pqrEv,_ZThn4_N3ccc8DD5x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y2E = {  "_ZN3ccc8DD5x10y2E", // class name
  bases__ZN3ccc8DD5x10y2E, 2,
  &(vtc__ZN3ccc8DD5x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y2E),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  CC5x10y3  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x10y33abcEv
  ~CC5x10y3(); // tgen
  CC5x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y3E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y33efgEv");}
void  ccc::CC5x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y33pqrEv");}
void  ccc::CC5x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y33abcEv");}
ccc::CC5x10y3 ::~CC5x10y3(){ note_dtor("_ZN3ccc8CC5x10y3E", this);} // tgen
ccc::CC5x10y3 ::CC5x10y3(){ note_ctor("_ZN3ccc8CC5x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y3E, buf);
    ::ccc::CC5x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y3E);
    dp->::ccc::CC5x10y3::~CC5x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y3E(Test__ZN3ccc8CC5x10y3E, "_ZN3ccc8CC5x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y3C1Ev();
extern void _ZN3ccc8CC5x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y3E[] = {
  NSPAIR(_ZN3ccc8CC5x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y3E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y3E[];
extern void _ZN3ccc8CC5x10y33pqrEv();
extern void _ZN3ccc8CC5x10y33abcEv();
extern void _ZN3ccc8CC5x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y33pqrEv,_ZTv0_n12_N3ccc8CC5x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y33pqrEv,_ZThn4_N3ccc8CC5x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y33efgEv,_ZTv0_n16_N3ccc8CC5x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y33efgEv,_ZThn4_N3ccc8CC5x10y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y33abcEv,_ZTv0_n20_N3ccc8CC5x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y33abcEv,_ZThn4_N3ccc8CC5x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y33pqrEv,_ZTv0_n12_N3ccc8CC5x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y33efgEv,_ZTv0_n16_N3ccc8CC5x10y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y33abcEv,_ZTv0_n20_N3ccc8CC5x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y3E[] = {
  {&(_ZTVN3ccc8CC5x10y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y3E[];
static VTBL_ENTRY alt_thunk_names209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y33abcEv,_ZTv0_n20_N3ccc8CC5x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y33abcEv,_ZThn4_N3ccc8CC5x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y33efgEv,_ZTv0_n16_N3ccc8CC5x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y33efgEv,_ZThn4_N3ccc8CC5x10y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y33pqrEv,_ZTv0_n12_N3ccc8CC5x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y33pqrEv,_ZThn4_N3ccc8CC5x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y3E = {  "_ZN3ccc8CC5x10y3E", // class name
  bases__ZN3ccc8CC5x10y3E, 2,
  &(vtc__ZN3ccc8CC5x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y3E),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  DD5x10y3  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD5x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x10y33abcEv
  ~DD5x10y3(); // tgen
  DD5x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y33efgEv");}
void  ccc::DD5x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y33pqrEv");}
void  ccc::DD5x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y33abcEv");}
ccc::DD5x10y3 ::~DD5x10y3(){ note_dtor("_ZN3ccc8DD5x10y3E", this);} // tgen
ccc::DD5x10y3 ::DD5x10y3(){ note_ctor("_ZN3ccc8DD5x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y3E, buf);
    ::ccc::DD5x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y3E);
    dp->::ccc::DD5x10y3::~DD5x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y3E(Test__ZN3ccc8DD5x10y3E, "_ZN3ccc8DD5x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y3C1Ev();
extern void _ZN3ccc8DD5x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y3E[] = {
  NSPAIR(_ZN3ccc8DD5x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y3E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y3E[];
extern void _ZN3ccc8DD5x10y33pqrEv();
extern void _ZN3ccc8DD5x10y33efgEv();
extern void _ZN3ccc8DD5x10y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y33pqrEv,_ZTv0_n12_N3ccc8DD5x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y33pqrEv,_ZThn4_N3ccc8DD5x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y33abcEv,_ZTv0_n16_N3ccc8DD5x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y33abcEv,_ZThn4_N3ccc8DD5x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y33pqrEv,_ZTv0_n12_N3ccc8DD5x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y33abcEv,_ZTv0_n16_N3ccc8DD5x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y3E[] = {
  {&(_ZTVN3ccc8DD5x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y3E[];
static VTBL_ENTRY alt_thunk_names210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y33abcEv,_ZTv0_n16_N3ccc8DD5x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y33abcEv,_ZThn4_N3ccc8DD5x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y33pqrEv,_ZTv0_n12_N3ccc8DD5x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y33pqrEv,_ZThn4_N3ccc8DD5x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y3E = {  "_ZN3ccc8DD5x10y3E", // class name
  bases__ZN3ccc8DD5x10y3E, 2,
  &(vtc__ZN3ccc8DD5x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y3E),3, //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  CC5x10y4  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC5x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x10y43efgEv
  ~CC5x10y4(); // tgen
  CC5x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y4E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y43pqrEv");}
void  ccc::CC5x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y43abcEv");}
void  ccc::CC5x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y43efgEv");}
ccc::CC5x10y4 ::~CC5x10y4(){ note_dtor("_ZN3ccc8CC5x10y4E", this);} // tgen
ccc::CC5x10y4 ::CC5x10y4(){ note_ctor("_ZN3ccc8CC5x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y4E, buf);
    ::ccc::CC5x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y4E);
    dp->::ccc::CC5x10y4::~CC5x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y4E(Test__ZN3ccc8CC5x10y4E, "_ZN3ccc8CC5x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y4C1Ev();
extern void _ZN3ccc8CC5x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y4E[] = {
  NSPAIR(_ZN3ccc8CC5x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y4E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y4E[];
extern void _ZN3ccc8CC5x10y43pqrEv();
extern void _ZN3ccc8CC5x10y43abcEv();
extern void _ZN3ccc8CC5x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y43pqrEv,_ZTv0_n12_N3ccc8CC5x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y43pqrEv,_ZThn4_N3ccc8CC5x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y43efgEv,_ZTv0_n16_N3ccc8CC5x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y43efgEv,_ZThn4_N3ccc8CC5x10y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y43abcEv,_ZTv0_n20_N3ccc8CC5x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y43abcEv,_ZThn4_N3ccc8CC5x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y43pqrEv,_ZTv0_n12_N3ccc8CC5x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y43efgEv,_ZTv0_n16_N3ccc8CC5x10y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y43abcEv,_ZTv0_n20_N3ccc8CC5x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y4E[] = {
  {&(_ZTVN3ccc8CC5x10y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y4E[];
static VTBL_ENTRY alt_thunk_names211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y43abcEv,_ZTv0_n20_N3ccc8CC5x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y43abcEv,_ZThn4_N3ccc8CC5x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y43efgEv,_ZTv0_n16_N3ccc8CC5x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y43efgEv,_ZThn4_N3ccc8CC5x10y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y43pqrEv,_ZTv0_n12_N3ccc8CC5x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y43pqrEv,_ZThn4_N3ccc8CC5x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y4E = {  "_ZN3ccc8CC5x10y4E", // class name
  bases__ZN3ccc8CC5x10y4E, 2,
  &(vtc__ZN3ccc8CC5x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y4E),2, //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  DD5x10y4  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD5x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD5x10y43efgEv
  ~DD5x10y4(); // tgen
  DD5x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y43pqrEv");}
void  ccc::DD5x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y43abcEv");}
void  ccc::DD5x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y43efgEv");}
ccc::DD5x10y4 ::~DD5x10y4(){ note_dtor("_ZN3ccc8DD5x10y4E", this);} // tgen
ccc::DD5x10y4 ::DD5x10y4(){ note_ctor("_ZN3ccc8DD5x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y4E, buf);
    ::ccc::DD5x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y4E);
    dp->::ccc::DD5x10y4::~DD5x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y4E(Test__ZN3ccc8DD5x10y4E, "_ZN3ccc8DD5x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y4C1Ev();
extern void _ZN3ccc8DD5x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y4E[] = {
  NSPAIR(_ZN3ccc8DD5x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y4E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y4E[];
extern void _ZN3ccc8DD5x10y43pqrEv();
extern void _ZN3ccc8DD5x10y43efgEv();
extern void _ZN3ccc8DD5x10y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y43pqrEv,_ZTv0_n12_N3ccc8DD5x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y43pqrEv,_ZThn4_N3ccc8DD5x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y43abcEv,_ZTv0_n16_N3ccc8DD5x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y43abcEv,_ZThn4_N3ccc8DD5x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y43pqrEv,_ZTv0_n12_N3ccc8DD5x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y43abcEv,_ZTv0_n16_N3ccc8DD5x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y4E[] = {
  {&(_ZTVN3ccc8DD5x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y4E[];
static VTBL_ENTRY alt_thunk_names212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y43abcEv,_ZTv0_n16_N3ccc8DD5x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y43abcEv,_ZThn4_N3ccc8DD5x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y43pqrEv,_ZTv0_n12_N3ccc8DD5x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y43pqrEv,_ZThn4_N3ccc8DD5x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y4E = {  "_ZN3ccc8DD5x10y4E", // class name
  bases__ZN3ccc8DD5x10y4E, 2,
  &(vtc__ZN3ccc8DD5x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y4E),3, //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  CC5x10y5  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC5x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x10y53abcEv
  ~CC5x10y5(); // tgen
  CC5x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y5E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y53pqrEv");}
void  ccc::CC5x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y53efgEv");}
void  ccc::CC5x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y53abcEv");}
ccc::CC5x10y5 ::~CC5x10y5(){ note_dtor("_ZN3ccc8CC5x10y5E", this);} // tgen
ccc::CC5x10y5 ::CC5x10y5(){ note_ctor("_ZN3ccc8CC5x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y5E, buf);
    ::ccc::CC5x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y5E);
    dp->::ccc::CC5x10y5::~CC5x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y5E(Test__ZN3ccc8CC5x10y5E, "_ZN3ccc8CC5x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y5C1Ev();
extern void _ZN3ccc8CC5x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y5E[] = {
  NSPAIR(_ZN3ccc8CC5x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y5E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y5E[];
extern void _ZN3ccc8CC5x10y53pqrEv();
extern void _ZN3ccc8CC5x10y53abcEv();
extern void _ZN3ccc8CC5x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y53pqrEv,_ZTv0_n12_N3ccc8CC5x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y53pqrEv,_ZThn4_N3ccc8CC5x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y53efgEv,_ZTv0_n16_N3ccc8CC5x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y53efgEv,_ZThn4_N3ccc8CC5x10y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y53abcEv,_ZTv0_n20_N3ccc8CC5x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y53abcEv,_ZThn4_N3ccc8CC5x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y53pqrEv,_ZTv0_n12_N3ccc8CC5x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y53efgEv,_ZTv0_n16_N3ccc8CC5x10y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y53abcEv,_ZTv0_n20_N3ccc8CC5x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y5E[] = {
  {&(_ZTVN3ccc8CC5x10y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y5E[];
static VTBL_ENTRY alt_thunk_names213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y53abcEv,_ZTv0_n20_N3ccc8CC5x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y53abcEv,_ZThn4_N3ccc8CC5x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y53efgEv,_ZTv0_n16_N3ccc8CC5x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y53efgEv,_ZThn4_N3ccc8CC5x10y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y53pqrEv,_ZTv0_n12_N3ccc8CC5x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y53pqrEv,_ZThn4_N3ccc8CC5x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y5E = {  "_ZN3ccc8CC5x10y5E", // class name
  bases__ZN3ccc8CC5x10y5E, 2,
  &(vtc__ZN3ccc8CC5x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y5E),2, //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  DD5x10y5  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD5x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD5x10y53abcEv
  ~DD5x10y5(); // tgen
  DD5x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y53pqrEv");}
void  ccc::DD5x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y53efgEv");}
void  ccc::DD5x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y53abcEv");}
ccc::DD5x10y5 ::~DD5x10y5(){ note_dtor("_ZN3ccc8DD5x10y5E", this);} // tgen
ccc::DD5x10y5 ::DD5x10y5(){ note_ctor("_ZN3ccc8DD5x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y5E, buf);
    ::ccc::DD5x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y5E);
    dp->::ccc::DD5x10y5::~DD5x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y5E(Test__ZN3ccc8DD5x10y5E, "_ZN3ccc8DD5x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y5C1Ev();
extern void _ZN3ccc8DD5x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y5E[] = {
  NSPAIR(_ZN3ccc8DD5x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y5E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y5E[];
extern void _ZN3ccc8DD5x10y53pqrEv();
extern void _ZN3ccc8DD5x10y53efgEv();
extern void _ZN3ccc8DD5x10y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y53pqrEv,_ZTv0_n12_N3ccc8DD5x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y53pqrEv,_ZThn4_N3ccc8DD5x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y53abcEv,_ZTv0_n16_N3ccc8DD5x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y53abcEv,_ZThn4_N3ccc8DD5x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y53pqrEv,_ZTv0_n12_N3ccc8DD5x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y53abcEv,_ZTv0_n16_N3ccc8DD5x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y5E[] = {
  {&(_ZTVN3ccc8DD5x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y5E[];
static VTBL_ENTRY alt_thunk_names214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y53abcEv,_ZTv0_n16_N3ccc8DD5x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y53abcEv,_ZThn4_N3ccc8DD5x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y53pqrEv,_ZTv0_n12_N3ccc8DD5x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y53pqrEv,_ZThn4_N3ccc8DD5x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y5E = {  "_ZN3ccc8DD5x10y5E", // class name
  bases__ZN3ccc8DD5x10y5E, 2,
  &(vtc__ZN3ccc8DD5x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y5E),3, //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  CC5x10y6  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x10y63efgEv
  ~CC5x10y6(); // tgen
  CC5x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y6E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y63abcEv");}
void  ccc::CC5x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y63efgEv");}
ccc::CC5x10y6 ::~CC5x10y6(){ note_dtor("_ZN3ccc8CC5x10y6E", this);} // tgen
ccc::CC5x10y6 ::CC5x10y6(){ note_ctor("_ZN3ccc8CC5x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y6E, buf);
    ::ccc::CC5x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y6E);
    dp->::ccc::CC5x10y6::~CC5x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y6E(Test__ZN3ccc8CC5x10y6E, "_ZN3ccc8CC5x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y6C1Ev();
extern void _ZN3ccc8CC5x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y6E[] = {
  NSPAIR(_ZN3ccc8CC5x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y6E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC5x10y63abcEv();
extern void _ZN3ccc8CC5x10y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y63efgEv,_ZTv0_n16_N3ccc8CC5x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y63efgEv,_ZThn4_N3ccc8CC5x10y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y63abcEv,_ZTv0_n20_N3ccc8CC5x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y63abcEv,_ZThn4_N3ccc8CC5x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y63efgEv,_ZTv0_n16_N3ccc8CC5x10y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y63abcEv,_ZTv0_n20_N3ccc8CC5x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y6E[] = {
  {&(_ZTVN3ccc8CC5x10y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y6E[];
static VTBL_ENTRY alt_thunk_names215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y63abcEv,_ZTv0_n20_N3ccc8CC5x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y63abcEv,_ZThn4_N3ccc8CC5x10y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y63efgEv,_ZTv0_n16_N3ccc8CC5x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y63efgEv,_ZThn4_N3ccc8CC5x10y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y6E = {  "_ZN3ccc8CC5x10y6E", // class name
  bases__ZN3ccc8CC5x10y6E, 2,
  &(vtc__ZN3ccc8CC5x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y6E),2, //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  DD5x10y6  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD5x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD5x10y63efgEv
  ~DD5x10y6(); // tgen
  DD5x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y63abcEv");}
void  ccc::DD5x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y63efgEv");}
ccc::DD5x10y6 ::~DD5x10y6(){ note_dtor("_ZN3ccc8DD5x10y6E", this);} // tgen
ccc::DD5x10y6 ::DD5x10y6(){ note_ctor("_ZN3ccc8DD5x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y6E, buf);
    ::ccc::DD5x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y6E);
    dp->::ccc::DD5x10y6::~DD5x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y6E(Test__ZN3ccc8DD5x10y6E, "_ZN3ccc8DD5x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y6C1Ev();
extern void _ZN3ccc8DD5x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y6E[] = {
  NSPAIR(_ZN3ccc8DD5x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y6E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x10y63efgEv();
extern void _ZN3ccc8DD5x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y63abcEv,_ZTv0_n16_N3ccc8DD5x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y63abcEv,_ZThn4_N3ccc8DD5x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y63abcEv,_ZTv0_n16_N3ccc8DD5x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y6E[] = {
  {&(_ZTVN3ccc8DD5x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y6E[];
static VTBL_ENTRY alt_thunk_names216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y63abcEv,_ZTv0_n16_N3ccc8DD5x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y63abcEv,_ZThn4_N3ccc8DD5x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y6E = {  "_ZN3ccc8DD5x10y6E", // class name
  bases__ZN3ccc8DD5x10y6E, 2,
  &(vtc__ZN3ccc8DD5x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y6E),3, //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  CC5x10y7  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC5x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y73pqrEv
  ~CC5x10y7(); // tgen
  CC5x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y7E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y73abcEv");}
void  ccc::CC5x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y73pqrEv");}
ccc::CC5x10y7 ::~CC5x10y7(){ note_dtor("_ZN3ccc8CC5x10y7E", this);} // tgen
ccc::CC5x10y7 ::CC5x10y7(){ note_ctor("_ZN3ccc8CC5x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y7E, buf);
    ::ccc::CC5x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y7E);
    dp->::ccc::CC5x10y7::~CC5x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y7E(Test__ZN3ccc8CC5x10y7E, "_ZN3ccc8CC5x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y7C1Ev();
extern void _ZN3ccc8CC5x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y7E[] = {
  NSPAIR(_ZN3ccc8CC5x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x10y7E[];
extern void _ZN3ccc8CC5x10y73pqrEv();
extern void _ZN3ccc8CC5x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y73pqrEv,_ZTv0_n12_N3ccc8CC5x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y73pqrEv,_ZThn4_N3ccc8CC5x10y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y73abcEv,_ZTv0_n20_N3ccc8CC5x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y73abcEv,_ZThn4_N3ccc8CC5x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y73pqrEv,_ZTv0_n12_N3ccc8CC5x10y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y73abcEv,_ZTv0_n20_N3ccc8CC5x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y7E[] = {
  {&(_ZTVN3ccc8CC5x10y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x10y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y7E[];
static VTBL_ENTRY alt_thunk_names217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y73abcEv,_ZTv0_n20_N3ccc8CC5x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y73abcEv,_ZThn4_N3ccc8CC5x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y73pqrEv,_ZTv0_n12_N3ccc8CC5x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y73pqrEv,_ZThn4_N3ccc8CC5x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y7E = {  "_ZN3ccc8CC5x10y7E", // class name
  bases__ZN3ccc8CC5x10y7E, 2,
  &(vtc__ZN3ccc8CC5x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y7E),2, //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  DD5x10y7  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD5x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x10y73pqrEv
  ~DD5x10y7(); // tgen
  DD5x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y73abcEv");}
void  ccc::DD5x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y73pqrEv");}
ccc::DD5x10y7 ::~DD5x10y7(){ note_dtor("_ZN3ccc8DD5x10y7E", this);} // tgen
ccc::DD5x10y7 ::DD5x10y7(){ note_ctor("_ZN3ccc8DD5x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y7E, buf);
    ::ccc::DD5x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y7E);
    dp->::ccc::DD5x10y7::~DD5x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y7E(Test__ZN3ccc8DD5x10y7E, "_ZN3ccc8DD5x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y7C1Ev();
extern void _ZN3ccc8DD5x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y7E[] = {
  NSPAIR(_ZN3ccc8DD5x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y7E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y7E[];
extern void _ZN3ccc8DD5x10y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y73pqrEv,_ZTv0_n12_N3ccc8DD5x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y73pqrEv,_ZThn4_N3ccc8DD5x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y73abcEv,_ZTv0_n16_N3ccc8DD5x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y73abcEv,_ZThn4_N3ccc8DD5x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y73pqrEv,_ZTv0_n12_N3ccc8DD5x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y73abcEv,_ZTv0_n16_N3ccc8DD5x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y7E[] = {
  {&(_ZTVN3ccc8DD5x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y7E[];
static VTBL_ENTRY alt_thunk_names218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y73abcEv,_ZTv0_n16_N3ccc8DD5x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y73abcEv,_ZThn4_N3ccc8DD5x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y73pqrEv,_ZTv0_n12_N3ccc8DD5x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y73pqrEv,_ZThn4_N3ccc8DD5x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y7E = {  "_ZN3ccc8DD5x10y7E", // class name
  bases__ZN3ccc8DD5x10y7E, 2,
  &(vtc__ZN3ccc8DD5x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y7E),3, //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  CC5x10y8  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x10y83abcEv
  ~CC5x10y8(); // tgen
  CC5x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y8E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y83efgEv");}
void  ccc::CC5x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x10y83abcEv");}
ccc::CC5x10y8 ::~CC5x10y8(){ note_dtor("_ZN3ccc8CC5x10y8E", this);} // tgen
ccc::CC5x10y8 ::CC5x10y8(){ note_ctor("_ZN3ccc8CC5x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y8E, buf);
    ::ccc::CC5x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y8E);
    dp->::ccc::CC5x10y8::~CC5x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y8E(Test__ZN3ccc8CC5x10y8E, "_ZN3ccc8CC5x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y8C1Ev();
extern void _ZN3ccc8CC5x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y8E[] = {
  NSPAIR(_ZN3ccc8CC5x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y8E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC5x10y83abcEv();
extern void _ZN3ccc8CC5x10y83efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y83efgEv,_ZTv0_n16_N3ccc8CC5x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y83efgEv,_ZThn4_N3ccc8CC5x10y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x10y83abcEv,_ZTv0_n20_N3ccc8CC5x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y83abcEv,_ZThn4_N3ccc8CC5x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y83efgEv,_ZTv0_n16_N3ccc8CC5x10y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x10y83abcEv,_ZTv0_n20_N3ccc8CC5x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y8E[] = {
  {&(_ZTVN3ccc8CC5x10y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y8E[];
static VTBL_ENTRY alt_thunk_names219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x10y83abcEv,_ZTv0_n20_N3ccc8CC5x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y83abcEv,_ZThn4_N3ccc8CC5x10y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y83efgEv,_ZTv0_n16_N3ccc8CC5x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y83efgEv,_ZThn4_N3ccc8CC5x10y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y8E = {  "_ZN3ccc8CC5x10y8E", // class name
  bases__ZN3ccc8CC5x10y8E, 2,
  &(vtc__ZN3ccc8CC5x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y8E),2, //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  DD5x10y8  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD5x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD5x10y83abcEv
  ~DD5x10y8(); // tgen
  DD5x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y83efgEv");}
void  ccc::DD5x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x10y83abcEv");}
ccc::DD5x10y8 ::~DD5x10y8(){ note_dtor("_ZN3ccc8DD5x10y8E", this);} // tgen
ccc::DD5x10y8 ::DD5x10y8(){ note_ctor("_ZN3ccc8DD5x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y8E, buf);
    ::ccc::DD5x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y8E);
    dp->::ccc::DD5x10y8::~DD5x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y8E(Test__ZN3ccc8DD5x10y8E, "_ZN3ccc8DD5x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y8C1Ev();
extern void _ZN3ccc8DD5x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y8E[] = {
  NSPAIR(_ZN3ccc8DD5x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y8E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x10y83efgEv();
extern void _ZN3ccc8DD5x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x10y83abcEv,_ZTv0_n16_N3ccc8DD5x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y83abcEv,_ZThn4_N3ccc8DD5x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x10y83abcEv,_ZTv0_n16_N3ccc8DD5x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y8E[] = {
  {&(_ZTVN3ccc8DD5x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y8E[];
static VTBL_ENTRY alt_thunk_names220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x10y83abcEv,_ZTv0_n16_N3ccc8DD5x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y83abcEv,_ZThn4_N3ccc8DD5x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y8E = {  "_ZN3ccc8DD5x10y8E", // class name
  bases__ZN3ccc8DD5x10y8E, 2,
  &(vtc__ZN3ccc8DD5x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y8E),3, //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  CC5x10y9  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC5x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x10y93pqrEv
  ~CC5x10y9(); // tgen
  CC5x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x10y9E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x10y93efgEv");}
void  ccc::CC5x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x10y93pqrEv");}
ccc::CC5x10y9 ::~CC5x10y9(){ note_dtor("_ZN3ccc8CC5x10y9E", this);} // tgen
ccc::CC5x10y9 ::CC5x10y9(){ note_ctor("_ZN3ccc8CC5x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC5x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x10y9E, buf);
    ::ccc::CC5x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x10y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC5x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x10y9E);
    dp->::ccc::CC5x10y9::~CC5x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x10y9E(Test__ZN3ccc8CC5x10y9E, "_ZN3ccc8CC5x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x10y9C1Ev();
extern void _ZN3ccc8CC5x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC5x10y9E[] = {
  NSPAIR(_ZN3ccc8CC5x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC5x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC5x10y9E[] = {
  // 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__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 _ZTIN3ccc8CC5x10y9E[];
extern void _ZN3ccc8CC5x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC5x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x10y93pqrEv,_ZTv0_n12_N3ccc8CC5x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y93pqrEv,_ZThn4_N3ccc8CC5x10y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x10y93efgEv,_ZTv0_n16_N3ccc8CC5x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x10y93efgEv,_ZThn4_N3ccc8CC5x10y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x10y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x10y93pqrEv,_ZTv0_n12_N3ccc8CC5x10y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x10y93efgEv,_ZTv0_n16_N3ccc8CC5x10y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x10y9E[] = {
  {&(_ZTVN3ccc8CC5x10y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x10y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x10y9E[];
static VTBL_ENTRY alt_thunk_names221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x10y93efgEv,_ZTv0_n16_N3ccc8CC5x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y93efgEv,_ZThn4_N3ccc8CC5x10y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x10y93pqrEv,_ZTv0_n12_N3ccc8CC5x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x10y93pqrEv,_ZThn4_N3ccc8CC5x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x10y9E = {  "_ZN3ccc8CC5x10y9E", // class name
  bases__ZN3ccc8CC5x10y9E, 2,
  &(vtc__ZN3ccc8CC5x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x10y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x10y9E),2, //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  DD5x10y9  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD5x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x10y93pqrEv
  ~DD5x10y9(); // tgen
  DD5x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD5x10y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x10y93efgEv");}
void  ccc::DD5x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x10y93pqrEv");}
ccc::DD5x10y9 ::~DD5x10y9(){ note_dtor("_ZN3ccc8DD5x10y9E", this);} // tgen
ccc::DD5x10y9 ::DD5x10y9(){ note_ctor("_ZN3ccc8DD5x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD5x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x10y9E, buf);
    ::ccc::DD5x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x10y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD5x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x10y9E);
    dp->::ccc::DD5x10y9::~DD5x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x10y9E(Test__ZN3ccc8DD5x10y9E, "_ZN3ccc8DD5x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x10y9C1Ev();
extern void _ZN3ccc8DD5x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD5x10y9E[] = {
  NSPAIR(_ZN3ccc8DD5x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD5x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD5x10y9E[] = {
  // 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__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 _ZTIN3ccc8DD5x10y9E[];
extern void _ZN3ccc8DD5x10y93pqrEv();
extern void _ZN3ccc8DD5x10y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x10y93pqrEv,_ZTv0_n12_N3ccc8DD5x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x10y93pqrEv,_ZThn4_N3ccc8DD5x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x10y93pqrEv,_ZTv0_n12_N3ccc8DD5x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x10y9E[] = {
  {&(_ZTVN3ccc8DD5x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x10y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x10y9E[];
static VTBL_ENTRY alt_thunk_names222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x10y93pqrEv,_ZTv0_n12_N3ccc8DD5x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x10y93pqrEv,_ZThn4_N3ccc8DD5x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x10y9E = {  "_ZN3ccc8DD5x10y9E", // class name
  bases__ZN3ccc8DD5x10y9E, 2,
  &(vtc__ZN3ccc8DD5x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x10y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x10y9E),3, //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  CC5x10y10  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC5x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x10y103abcEv
  ~CC5x10y10(); // tgen
  CC5x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y10E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x10y103pqrEv");}
void  ccc::CC5x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x10y103abcEv");}
ccc::CC5x10y10 ::~CC5x10y10(){ note_dtor("_ZN3ccc9CC5x10y10E", this);} // tgen
ccc::CC5x10y10 ::CC5x10y10(){ note_ctor("_ZN3ccc9CC5x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC5x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x10y10E, buf);
    ::ccc::CC5x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x10y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC5x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x10y10E);
    dp->::ccc::CC5x10y10::~CC5x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x10y10E(Test__ZN3ccc9CC5x10y10E, "_ZN3ccc9CC5x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x10y10C1Ev();
extern void _ZN3ccc9CC5x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC5x10y10E[] = {
  NSPAIR(_ZN3ccc9CC5x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC5x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC5x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x10y10E[];
extern void _ZN3ccc9CC5x10y103pqrEv();
extern void _ZN3ccc9CC5x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x10y103pqrEv,_ZTv0_n12_N3ccc9CC5x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y103pqrEv,_ZThn4_N3ccc9CC5x10y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x10y103abcEv,_ZTv0_n20_N3ccc9CC5x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y103abcEv,_ZThn4_N3ccc9CC5x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x10y103pqrEv,_ZTv0_n12_N3ccc9CC5x10y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x10y103abcEv,_ZTv0_n20_N3ccc9CC5x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x10y10E[] = {
  {&(_ZTVN3ccc9CC5x10y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x10y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x10y10E[];
static VTBL_ENTRY alt_thunk_names223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x10y103abcEv,_ZTv0_n20_N3ccc9CC5x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y103abcEv,_ZThn4_N3ccc9CC5x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x10y103pqrEv,_ZTv0_n12_N3ccc9CC5x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y103pqrEv,_ZThn4_N3ccc9CC5x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x10y10E = {  "_ZN3ccc9CC5x10y10E", // class name
  bases__ZN3ccc9CC5x10y10E, 2,
  &(vtc__ZN3ccc9CC5x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x10y10E),2, //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  DD5x10y10  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD5x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD5x10y103abcEv
  ~DD5x10y10(); // tgen
  DD5x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD5x10y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x10y103pqrEv");}
void  ccc::DD5x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x10y103abcEv");}
ccc::DD5x10y10 ::~DD5x10y10(){ note_dtor("_ZN3ccc9DD5x10y10E", this);} // tgen
ccc::DD5x10y10 ::DD5x10y10(){ note_ctor("_ZN3ccc9DD5x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD5x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x10y10E, buf);
    ::ccc::DD5x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x10y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD5x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x10y10E);
    dp->::ccc::DD5x10y10::~DD5x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x10y10E(Test__ZN3ccc9DD5x10y10E, "_ZN3ccc9DD5x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x10y10C1Ev();
extern void _ZN3ccc9DD5x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD5x10y10E[] = {
  NSPAIR(_ZN3ccc9DD5x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD5x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD5x10y10E[] = {
  // 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__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 _ZTIN3ccc9DD5x10y10E[];
extern void _ZN3ccc9DD5x10y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x10y103pqrEv,_ZTv0_n12_N3ccc9DD5x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x10y103pqrEv,_ZThn4_N3ccc9DD5x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD5x10y103abcEv,_ZTv0_n16_N3ccc9DD5x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x10y103abcEv,_ZThn4_N3ccc9DD5x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x10y103pqrEv,_ZTv0_n12_N3ccc9DD5x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD5x10y103abcEv,_ZTv0_n16_N3ccc9DD5x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x10y10E[] = {
  {&(_ZTVN3ccc9DD5x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x10y10E[];
static VTBL_ENTRY alt_thunk_names224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD5x10y103abcEv,_ZTv0_n16_N3ccc9DD5x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x10y103abcEv,_ZThn4_N3ccc9DD5x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x10y103pqrEv,_ZTv0_n12_N3ccc9DD5x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x10y103pqrEv,_ZThn4_N3ccc9DD5x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x10y10E = {  "_ZN3ccc9DD5x10y10E", // class name
  bases__ZN3ccc9DD5x10y10E, 2,
  &(vtc__ZN3ccc9DD5x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x10y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x10y10E),3, //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  CC5x10y11  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC5x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x10y113efgEv
  ~CC5x10y11(); // tgen
  CC5x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y11E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x10y113pqrEv");}
void  ccc::CC5x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x10y113efgEv");}
ccc::CC5x10y11 ::~CC5x10y11(){ note_dtor("_ZN3ccc9CC5x10y11E", this);} // tgen
ccc::CC5x10y11 ::CC5x10y11(){ note_ctor("_ZN3ccc9CC5x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC5x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x10y11E, buf);
    ::ccc::CC5x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x10y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC5x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x10y11E);
    dp->::ccc::CC5x10y11::~CC5x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x10y11E(Test__ZN3ccc9CC5x10y11E, "_ZN3ccc9CC5x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x10y11C1Ev();
extern void _ZN3ccc9CC5x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC5x10y11E[] = {
  NSPAIR(_ZN3ccc9CC5x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC5x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC5x10y11E[] = {
  // 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__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 _ZTIN3ccc9CC5x10y11E[];
extern void _ZN3ccc9CC5x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC5x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x10y113pqrEv,_ZTv0_n12_N3ccc9CC5x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y113pqrEv,_ZThn4_N3ccc9CC5x10y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x10y113efgEv,_ZTv0_n16_N3ccc9CC5x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y113efgEv,_ZThn4_N3ccc9CC5x10y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x10y113pqrEv,_ZTv0_n12_N3ccc9CC5x10y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x10y113efgEv,_ZTv0_n16_N3ccc9CC5x10y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x10y11E[] = {
  {&(_ZTVN3ccc9CC5x10y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC5x10y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x10y11E[];
static VTBL_ENTRY alt_thunk_names225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x10y113efgEv,_ZTv0_n16_N3ccc9CC5x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y113efgEv,_ZThn4_N3ccc9CC5x10y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x10y113pqrEv,_ZTv0_n12_N3ccc9CC5x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y113pqrEv,_ZThn4_N3ccc9CC5x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x10y11E = {  "_ZN3ccc9CC5x10y11E", // class name
  bases__ZN3ccc9CC5x10y11E, 2,
  &(vtc__ZN3ccc9CC5x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x10y11E),2, //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  DD5x10y11  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD5x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD5x10y113efgEv
  ~DD5x10y11(); // tgen
  DD5x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD5x10y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x10y113pqrEv");}
void  ccc::DD5x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x10y113efgEv");}
ccc::DD5x10y11 ::~DD5x10y11(){ note_dtor("_ZN3ccc9DD5x10y11E", this);} // tgen
ccc::DD5x10y11 ::DD5x10y11(){ note_ctor("_ZN3ccc9DD5x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD5x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x10y11E, buf);
    ::ccc::DD5x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x10y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD5x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x10y11E);
    dp->::ccc::DD5x10y11::~DD5x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x10y11E(Test__ZN3ccc9DD5x10y11E, "_ZN3ccc9DD5x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x10y11C1Ev();
extern void _ZN3ccc9DD5x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD5x10y11E[] = {
  NSPAIR(_ZN3ccc9DD5x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD5x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD5x10y11E[] = {
  // 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__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 _ZTIN3ccc9DD5x10y11E[];
extern void _ZN3ccc9DD5x10y113pqrEv();
extern void _ZN3ccc9DD5x10y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x10y113pqrEv,_ZTv0_n12_N3ccc9DD5x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x10y113pqrEv,_ZThn4_N3ccc9DD5x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x10y113pqrEv,_ZTv0_n12_N3ccc9DD5x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x10y11E[] = {
  {&(_ZTVN3ccc9DD5x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x10y11E[];
static VTBL_ENTRY alt_thunk_names226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x10y113pqrEv,_ZTv0_n12_N3ccc9DD5x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x10y113pqrEv,_ZThn4_N3ccc9DD5x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x10y11E = {  "_ZN3ccc9DD5x10y11E", // class name
  bases__ZN3ccc9DD5x10y11E, 2,
  &(vtc__ZN3ccc9DD5x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x10y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x10y11E),3, //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  CC5x10y12  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC5x10y123abcEv
  ~CC5x10y12(); // tgen
  CC5x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC5x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x10y123abcEv");}
ccc::CC5x10y12 ::~CC5x10y12(){ note_dtor("_ZN3ccc9CC5x10y12E", this);} // tgen
ccc::CC5x10y12 ::CC5x10y12(){ note_ctor("_ZN3ccc9CC5x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC5x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x10y12E, buf);
    ::ccc::CC5x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x10y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC5x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x10y12E);
    dp->::ccc::CC5x10y12::~CC5x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x10y12E(Test__ZN3ccc9CC5x10y12E, "_ZN3ccc9CC5x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x10y12C1Ev();
extern void _ZN3ccc9CC5x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC5x10y12E[] = {
  NSPAIR(_ZN3ccc9CC5x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC5x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC5x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC5x10y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x10y123abcEv,_ZTv0_n20_N3ccc9CC5x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y123abcEv,_ZThn4_N3ccc9CC5x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x10y123abcEv,_ZTv0_n20_N3ccc9CC5x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x10y12E[] = {
  {&(_ZTVN3ccc9CC5x10y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x10y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x10y12E[];
static VTBL_ENTRY alt_thunk_names227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x10y123abcEv,_ZTv0_n20_N3ccc9CC5x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y123abcEv,_ZThn4_N3ccc9CC5x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x10y12E = {  "_ZN3ccc9CC5x10y12E", // class name
  bases__ZN3ccc9CC5x10y12E, 2,
  &(vtc__ZN3ccc9CC5x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x10y12E),2, //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  DD5x10y12  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD5x10y123abcEv
  ~DD5x10y12(); // tgen
  DD5x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD5x10y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD5x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x10y123abcEv");}
ccc::DD5x10y12 ::~DD5x10y12(){ note_dtor("_ZN3ccc9DD5x10y12E", this);} // tgen
ccc::DD5x10y12 ::DD5x10y12(){ note_ctor("_ZN3ccc9DD5x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD5x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x10y12E, buf);
    ::ccc::DD5x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x10y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD5x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x10y12E);
    dp->::ccc::DD5x10y12::~DD5x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x10y12E(Test__ZN3ccc9DD5x10y12E, "_ZN3ccc9DD5x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x10y12C1Ev();
extern void _ZN3ccc9DD5x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD5x10y12E[] = {
  NSPAIR(_ZN3ccc9DD5x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD5x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD5x10y12E[] = {
  // 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__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 _ZTIN3ccc9DD5x10y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD5x10y123abcEv,_ZTv0_n16_N3ccc9DD5x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x10y123abcEv,_ZThn4_N3ccc9DD5x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD5x10y123abcEv,_ZTv0_n16_N3ccc9DD5x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x10y12E[] = {
  {&(_ZTVN3ccc9DD5x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x10y12E[];
static VTBL_ENTRY alt_thunk_names228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD5x10y123abcEv,_ZTv0_n16_N3ccc9DD5x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x10y123abcEv,_ZThn4_N3ccc9DD5x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x10y12E = {  "_ZN3ccc9DD5x10y12E", // class name
  bases__ZN3ccc9DD5x10y12E, 2,
  &(vtc__ZN3ccc9DD5x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x10y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x10y12E),3, //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  CC5x10y13  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC5x10y133efgEv
  ~CC5x10y13(); // tgen
  CC5x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x10y133efgEv");}
ccc::CC5x10y13 ::~CC5x10y13(){ note_dtor("_ZN3ccc9CC5x10y13E", this);} // tgen
ccc::CC5x10y13 ::CC5x10y13(){ note_ctor("_ZN3ccc9CC5x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC5x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x10y13E, buf);
    ::ccc::CC5x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x10y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC5x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x10y13E);
    dp->::ccc::CC5x10y13::~CC5x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x10y13E(Test__ZN3ccc9CC5x10y13E, "_ZN3ccc9CC5x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x10y13C1Ev();
extern void _ZN3ccc9CC5x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC5x10y13E[] = {
  NSPAIR(_ZN3ccc9CC5x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC5x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC5x10y13E[] = {
  // 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__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 _ZTIN3ccc9CC5x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC5x10y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x10y133efgEv,_ZTv0_n16_N3ccc9CC5x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y133efgEv,_ZThn4_N3ccc9CC5x10y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x10y133efgEv,_ZTv0_n16_N3ccc9CC5x10y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x10y13E[] = {
  {&(_ZTVN3ccc9CC5x10y13E[3]),  3,14},
  {&(_ZTVN3ccc9CC5x10y13E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x10y13E[];
static VTBL_ENTRY alt_thunk_names229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x10y133efgEv,_ZTv0_n16_N3ccc9CC5x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y133efgEv,_ZThn4_N3ccc9CC5x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x10y13E = {  "_ZN3ccc9CC5x10y13E", // class name
  bases__ZN3ccc9CC5x10y13E, 2,
  &(vtc__ZN3ccc9CC5x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y13E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x10y13E),2, //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  DD5x10y13  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD5x10y133efgEv
  ~DD5x10y13(); // tgen
  DD5x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD5x10y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x10y133efgEv");}
ccc::DD5x10y13 ::~DD5x10y13(){ note_dtor("_ZN3ccc9DD5x10y13E", this);} // tgen
ccc::DD5x10y13 ::DD5x10y13(){ note_ctor("_ZN3ccc9DD5x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD5x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x10y13E, buf);
    ::ccc::DD5x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x10y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD5x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x10y13E);
    dp->::ccc::DD5x10y13::~DD5x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x10y13E(Test__ZN3ccc9DD5x10y13E, "_ZN3ccc9DD5x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x10y13C1Ev();
extern void _ZN3ccc9DD5x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD5x10y13E[] = {
  NSPAIR(_ZN3ccc9DD5x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD5x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD5x10y13E[] = {
  // 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__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 _ZTIN3ccc9DD5x10y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9DD5x10y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x10y13E[] = {
  {&(_ZTVN3ccc9DD5x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x10y13E[];
Class_Descriptor cd__ZN3ccc9DD5x10y13E = {  "_ZN3ccc9DD5x10y13E", // class name
  bases__ZN3ccc9DD5x10y13E, 2,
  &(vtc__ZN3ccc9DD5x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x10y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x10y13E),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  CC5x10y14  : virtual ::ccc::AA5 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC5x10y143pqrEv
  ~CC5x10y14(); // tgen
  CC5x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC5x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x10y143pqrEv");}
ccc::CC5x10y14 ::~CC5x10y14(){ note_dtor("_ZN3ccc9CC5x10y14E", this);} // tgen
ccc::CC5x10y14 ::CC5x10y14(){ note_ctor("_ZN3ccc9CC5x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC5x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x10y14E, buf);
    ::ccc::CC5x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x10y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC5x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x10y14E);
    dp->::ccc::CC5x10y14::~CC5x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x10y14E(Test__ZN3ccc9CC5x10y14E, "_ZN3ccc9CC5x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x10y14C1Ev();
extern void _ZN3ccc9CC5x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC5x10y14E[] = {
  NSPAIR(_ZN3ccc9CC5x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC5x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC5x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x10y14E[];
extern void _ZN3ccc9CC5x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x10y143pqrEv,_ZTv0_n12_N3ccc9CC5x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x10y143pqrEv,_ZThn4_N3ccc9CC5x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x10y143pqrEv,_ZTv0_n12_N3ccc9CC5x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x10y14E[] = {
  {&(_ZTVN3ccc9CC5x10y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x10y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x10y14E[];
static VTBL_ENTRY alt_thunk_names230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x10y143pqrEv,_ZTv0_n12_N3ccc9CC5x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x10y143pqrEv,_ZThn4_N3ccc9CC5x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x10y14E = {  "_ZN3ccc9CC5x10y14E", // class name
  bases__ZN3ccc9CC5x10y14E, 2,
  &(vtc__ZN3ccc9CC5x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x10y14E),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  DD5x10y14  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD5x10y143pqrEv
  ~DD5x10y14(); // tgen
  DD5x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD5x10y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD5x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x10y143pqrEv");}
ccc::DD5x10y14 ::~DD5x10y14(){ note_dtor("_ZN3ccc9DD5x10y14E", this);} // tgen
ccc::DD5x10y14 ::DD5x10y14(){ note_ctor("_ZN3ccc9DD5x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD5x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x10y14E, buf);
    ::ccc::DD5x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x10y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD5x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x10y14E);
    dp->::ccc::DD5x10y14::~DD5x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x10y14E(Test__ZN3ccc9DD5x10y14E, "_ZN3ccc9DD5x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x10y14C1Ev();
extern void _ZN3ccc9DD5x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD5x10y14E[] = {
  NSPAIR(_ZN3ccc9DD5x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD5x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD5x10y14E[] = {
  // 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__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 _ZTIN3ccc9DD5x10y14E[];
extern void _ZN3ccc9DD5x10y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x10y143pqrEv,_ZTv0_n12_N3ccc9DD5x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x10y143pqrEv,_ZThn4_N3ccc9DD5x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x10y143pqrEv,_ZTv0_n12_N3ccc9DD5x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x10y14E[] = {
  {&(_ZTVN3ccc9DD5x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x10y14E[];
static VTBL_ENTRY alt_thunk_names231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x10y143pqrEv,_ZTv0_n12_N3ccc9DD5x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x10y143pqrEv,_ZThn4_N3ccc9DD5x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x10y14E = {  "_ZN3ccc9DD5x10y14E", // class name
  bases__ZN3ccc9DD5x10y14E, 2,
  &(vtc__ZN3ccc9DD5x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x10y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x10y14E),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  CC5x10y15  : virtual ::ccc::AA5 , ::ccc::BB10 {
  ~CC5x10y15(); // tgen
  CC5x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x10y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC5x10y15 ::~CC5x10y15(){ note_dtor("_ZN3ccc9CC5x10y15E", this);} // tgen
ccc::CC5x10y15 ::CC5x10y15(){ note_ctor("_ZN3ccc9CC5x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC5x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x10y15E, buf);
    ::ccc::CC5x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x10y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC5x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x10y15E);
    dp->::ccc::CC5x10y15::~CC5x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x10y15E(Test__ZN3ccc9CC5x10y15E, "_ZN3ccc9CC5x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x10y15C1Ev();
extern void _ZN3ccc9CC5x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC5x10y15E[] = {
  NSPAIR(_ZN3ccc9CC5x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC5x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC5x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x10y15E[] = {
  {&(_ZTVN3ccc9CC5x10y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x10y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x10y15E[];
Class_Descriptor cd__ZN3ccc9CC5x10y15E = {  "_ZN3ccc9CC5x10y15E", // class name
  bases__ZN3ccc9CC5x10y15E, 2,
  &(vtc__ZN3ccc9CC5x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x10y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x10y15E),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  DD5x10y15  : virtual ::ccc::AA5 , virtual ::ccc::BB10 {
  ~DD5x10y15(); // tgen
  DD5x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD5x10y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD5x10y15 ::~DD5x10y15(){ note_dtor("_ZN3ccc9DD5x10y15E", this);} // tgen
ccc::DD5x10y15 ::DD5x10y15(){ note_ctor("_ZN3ccc9DD5x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD5x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x10y15E, buf);
    ::ccc::DD5x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x10y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD5x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x10y15E);
    dp->::ccc::DD5x10y15::~DD5x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x10y15E(Test__ZN3ccc9DD5x10y15E, "_ZN3ccc9DD5x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x10y15C1Ev();
extern void _ZN3ccc9DD5x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD5x10y15E[] = {
  NSPAIR(_ZN3ccc9DD5x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD5x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD5x10y15E[] = {
  // 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__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 _ZTIN3ccc9DD5x10y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x10y15E[] = {
  {&(_ZTVN3ccc9DD5x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x10y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x10y15E[];
Class_Descriptor cd__ZN3ccc9DD5x10y15E = {  "_ZN3ccc9DD5x10y15E", // class name
  bases__ZN3ccc9DD5x10y15E, 2,
  &(vtc__ZN3ccc9DD5x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x10y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x10y15E),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  CC5x11y0  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y03pqrEv
  ~CC5x11y0(); // tgen
  CC5x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y0E) C1{ VBC2{ v3 v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y03abcEv");}
void  ccc::CC5x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y03efgEv");}
void  ccc::CC5x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y03pqrEv");}
ccc::CC5x11y0 ::~CC5x11y0(){ note_dtor("_ZN3ccc8CC5x11y0E", this);} // tgen
ccc::CC5x11y0 ::CC5x11y0(){ note_ctor("_ZN3ccc8CC5x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y0E, buf);
    ::ccc::CC5x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y0E);
    dp->::ccc::CC5x11y0::~CC5x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y0E(Test__ZN3ccc8CC5x11y0E, "_ZN3ccc8CC5x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y0C1Ev();
extern void _ZN3ccc8CC5x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y0E[] = {
  NSPAIR(_ZN3ccc8CC5x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y0E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y0E[];
extern void _ZN3ccc8CC5x11y03pqrEv();
extern void _ZN3ccc8CC5x11y03efgEv();
extern void _ZN3ccc8CC5x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y03pqrEv,_ZTv0_n12_N3ccc8CC5x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y03pqrEv,_ZThn4_N3ccc8CC5x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y03efgEv,_ZTv0_n16_N3ccc8CC5x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y03efgEv,_ZThn4_N3ccc8CC5x11y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y03abcEv,_ZTv0_n20_N3ccc8CC5x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y03abcEv,_ZThn4_N3ccc8CC5x11y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y03pqrEv,_ZTv0_n12_N3ccc8CC5x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y03efgEv,_ZTv0_n16_N3ccc8CC5x11y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y03abcEv,_ZTv0_n20_N3ccc8CC5x11y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y0E[] = {
  {&(_ZTVN3ccc8CC5x11y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y0E[];
static VTBL_ENTRY alt_thunk_names232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y03abcEv,_ZTv0_n20_N3ccc8CC5x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y03abcEv,_ZThn4_N3ccc8CC5x11y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y03efgEv,_ZTv0_n16_N3ccc8CC5x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y03efgEv,_ZThn4_N3ccc8CC5x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y03pqrEv,_ZTv0_n12_N3ccc8CC5x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y03pqrEv,_ZThn4_N3ccc8CC5x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y0E = {  "_ZN3ccc8CC5x11y0E", // class name
  bases__ZN3ccc8CC5x11y0E, 2,
  &(vtc__ZN3ccc8CC5x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y0E),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  DD5x11y0  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD5x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD5x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x11y03pqrEv
  ~DD5x11y0(); // tgen
  DD5x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y03abcEv");}
void  ccc::DD5x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y03efgEv");}
void  ccc::DD5x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y03pqrEv");}
ccc::DD5x11y0 ::~DD5x11y0(){ note_dtor("_ZN3ccc8DD5x11y0E", this);} // tgen
ccc::DD5x11y0 ::DD5x11y0(){ note_ctor("_ZN3ccc8DD5x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y0E, buf);
    ::ccc::DD5x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y0E);
    dp->::ccc::DD5x11y0::~DD5x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y0E(Test__ZN3ccc8DD5x11y0E, "_ZN3ccc8DD5x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y0C1Ev();
extern void _ZN3ccc8DD5x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y0E[] = {
  NSPAIR(_ZN3ccc8DD5x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y0E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y0E[];
extern void _ZN3ccc8DD5x11y03pqrEv();
extern void _ZN3ccc8DD5x11y03efgEv();
extern void _ZN3ccc8DD5x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y03pqrEv,_ZTv0_n12_N3ccc8DD5x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y03pqrEv,_ZThn4_N3ccc8DD5x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y03efgEv,_ZTv0_n16_N3ccc8DD5x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y03efgEv,_ZThn4_N3ccc8DD5x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y03pqrEv,_ZTv0_n12_N3ccc8DD5x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y03efgEv,_ZTv0_n16_N3ccc8DD5x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y0E[] = {
  {&(_ZTVN3ccc8DD5x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y0E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y0E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y0E[];
static VTBL_ENTRY alt_thunk_names233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y03efgEv,_ZTv0_n16_N3ccc8DD5x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y03efgEv,_ZThn4_N3ccc8DD5x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y03pqrEv,_ZTv0_n12_N3ccc8DD5x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y03pqrEv,_ZThn4_N3ccc8DD5x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y0E = {  "_ZN3ccc8DD5x11y0E", // class name
  bases__ZN3ccc8DD5x11y0E, 2,
  &(vtc__ZN3ccc8DD5x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y0E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y0E),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  CC5x11y1  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x11y13efgEv
  ~CC5x11y1(); // tgen
  CC5x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y1E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y13abcEv");}
void  ccc::CC5x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y13pqrEv");}
void  ccc::CC5x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y13efgEv");}
ccc::CC5x11y1 ::~CC5x11y1(){ note_dtor("_ZN3ccc8CC5x11y1E", this);} // tgen
ccc::CC5x11y1 ::CC5x11y1(){ note_ctor("_ZN3ccc8CC5x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y1E, buf);
    ::ccc::CC5x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y1E);
    dp->::ccc::CC5x11y1::~CC5x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y1E(Test__ZN3ccc8CC5x11y1E, "_ZN3ccc8CC5x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y1C1Ev();
extern void _ZN3ccc8CC5x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y1E[] = {
  NSPAIR(_ZN3ccc8CC5x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y1E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y1E[];
extern void _ZN3ccc8CC5x11y13pqrEv();
extern void _ZN3ccc8CC5x11y13efgEv();
extern void _ZN3ccc8CC5x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y13pqrEv,_ZTv0_n12_N3ccc8CC5x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y13pqrEv,_ZThn4_N3ccc8CC5x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y13efgEv,_ZTv0_n16_N3ccc8CC5x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y13efgEv,_ZThn4_N3ccc8CC5x11y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y13abcEv,_ZTv0_n20_N3ccc8CC5x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y13abcEv,_ZThn4_N3ccc8CC5x11y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y13pqrEv,_ZTv0_n12_N3ccc8CC5x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y13efgEv,_ZTv0_n16_N3ccc8CC5x11y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y13abcEv,_ZTv0_n20_N3ccc8CC5x11y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y1E[] = {
  {&(_ZTVN3ccc8CC5x11y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y1E[];
static VTBL_ENTRY alt_thunk_names234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y13abcEv,_ZTv0_n20_N3ccc8CC5x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y13abcEv,_ZThn4_N3ccc8CC5x11y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y13efgEv,_ZTv0_n16_N3ccc8CC5x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y13efgEv,_ZThn4_N3ccc8CC5x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y13pqrEv,_ZTv0_n12_N3ccc8CC5x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y13pqrEv,_ZThn4_N3ccc8CC5x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y1E = {  "_ZN3ccc8CC5x11y1E", // class name
  bases__ZN3ccc8CC5x11y1E, 2,
  &(vtc__ZN3ccc8CC5x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y1E),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  DD5x11y1  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD5x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x11y13efgEv
  ~DD5x11y1(); // tgen
  DD5x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y13abcEv");}
void  ccc::DD5x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y13pqrEv");}
void  ccc::DD5x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y13efgEv");}
ccc::DD5x11y1 ::~DD5x11y1(){ note_dtor("_ZN3ccc8DD5x11y1E", this);} // tgen
ccc::DD5x11y1 ::DD5x11y1(){ note_ctor("_ZN3ccc8DD5x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y1E, buf);
    ::ccc::DD5x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y1E);
    dp->::ccc::DD5x11y1::~DD5x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y1E(Test__ZN3ccc8DD5x11y1E, "_ZN3ccc8DD5x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y1C1Ev();
extern void _ZN3ccc8DD5x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y1E[] = {
  NSPAIR(_ZN3ccc8DD5x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y1E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y1E[];
extern void _ZN3ccc8DD5x11y13pqrEv();
extern void _ZN3ccc8DD5x11y13efgEv();
extern void _ZN3ccc8DD5x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y13pqrEv,_ZTv0_n12_N3ccc8DD5x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y13pqrEv,_ZThn4_N3ccc8DD5x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y13efgEv,_ZTv0_n16_N3ccc8DD5x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y13efgEv,_ZThn4_N3ccc8DD5x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y13pqrEv,_ZTv0_n12_N3ccc8DD5x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y13efgEv,_ZTv0_n16_N3ccc8DD5x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y1E[] = {
  {&(_ZTVN3ccc8DD5x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y1E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y1E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y1E[];
static VTBL_ENTRY alt_thunk_names235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y13efgEv,_ZTv0_n16_N3ccc8DD5x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y13efgEv,_ZThn4_N3ccc8DD5x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y13pqrEv,_ZTv0_n12_N3ccc8DD5x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y13pqrEv,_ZThn4_N3ccc8DD5x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y1E = {  "_ZN3ccc8DD5x11y1E", // class name
  bases__ZN3ccc8DD5x11y1E, 2,
  &(vtc__ZN3ccc8DD5x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y1E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y1E),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  CC5x11y2  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y23pqrEv
  ~CC5x11y2(); // tgen
  CC5x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y2E) C1{ VBC2{ v3 v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y23efgEv");}
void  ccc::CC5x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y23abcEv");}
void  ccc::CC5x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y23pqrEv");}
ccc::CC5x11y2 ::~CC5x11y2(){ note_dtor("_ZN3ccc8CC5x11y2E", this);} // tgen
ccc::CC5x11y2 ::CC5x11y2(){ note_ctor("_ZN3ccc8CC5x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y2E, buf);
    ::ccc::CC5x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y2E);
    dp->::ccc::CC5x11y2::~CC5x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y2E(Test__ZN3ccc8CC5x11y2E, "_ZN3ccc8CC5x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y2C1Ev();
extern void _ZN3ccc8CC5x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y2E[] = {
  NSPAIR(_ZN3ccc8CC5x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y2E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y2E[];
extern void _ZN3ccc8CC5x11y23pqrEv();
extern void _ZN3ccc8CC5x11y23efgEv();
extern void _ZN3ccc8CC5x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y23pqrEv,_ZTv0_n12_N3ccc8CC5x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y23pqrEv,_ZThn4_N3ccc8CC5x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y23efgEv,_ZTv0_n16_N3ccc8CC5x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y23efgEv,_ZThn4_N3ccc8CC5x11y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y23abcEv,_ZTv0_n20_N3ccc8CC5x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y23abcEv,_ZThn4_N3ccc8CC5x11y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y23pqrEv,_ZTv0_n12_N3ccc8CC5x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y23efgEv,_ZTv0_n16_N3ccc8CC5x11y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y23abcEv,_ZTv0_n20_N3ccc8CC5x11y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y2E[] = {
  {&(_ZTVN3ccc8CC5x11y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y2E[];
static VTBL_ENTRY alt_thunk_names236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y23abcEv,_ZTv0_n20_N3ccc8CC5x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y23abcEv,_ZThn4_N3ccc8CC5x11y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y23efgEv,_ZTv0_n16_N3ccc8CC5x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y23efgEv,_ZThn4_N3ccc8CC5x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y23pqrEv,_ZTv0_n12_N3ccc8CC5x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y23pqrEv,_ZThn4_N3ccc8CC5x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y2E = {  "_ZN3ccc8CC5x11y2E", // class name
  bases__ZN3ccc8CC5x11y2E, 2,
  &(vtc__ZN3ccc8CC5x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y2E),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  DD5x11y2  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD5x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD5x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x11y23pqrEv
  ~DD5x11y2(); // tgen
  DD5x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y23efgEv");}
void  ccc::DD5x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y23abcEv");}
void  ccc::DD5x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y23pqrEv");}
ccc::DD5x11y2 ::~DD5x11y2(){ note_dtor("_ZN3ccc8DD5x11y2E", this);} // tgen
ccc::DD5x11y2 ::DD5x11y2(){ note_ctor("_ZN3ccc8DD5x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y2E, buf);
    ::ccc::DD5x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y2E);
    dp->::ccc::DD5x11y2::~DD5x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y2E(Test__ZN3ccc8DD5x11y2E, "_ZN3ccc8DD5x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y2C1Ev();
extern void _ZN3ccc8DD5x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y2E[] = {
  NSPAIR(_ZN3ccc8DD5x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y2E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y2E[];
extern void _ZN3ccc8DD5x11y23pqrEv();
extern void _ZN3ccc8DD5x11y23efgEv();
extern void _ZN3ccc8DD5x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y23pqrEv,_ZTv0_n12_N3ccc8DD5x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y23pqrEv,_ZThn4_N3ccc8DD5x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y23efgEv,_ZTv0_n16_N3ccc8DD5x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y23efgEv,_ZThn4_N3ccc8DD5x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y23pqrEv,_ZTv0_n12_N3ccc8DD5x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y23efgEv,_ZTv0_n16_N3ccc8DD5x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y2E[] = {
  {&(_ZTVN3ccc8DD5x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y2E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y2E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y2E[];
static VTBL_ENTRY alt_thunk_names237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y23efgEv,_ZTv0_n16_N3ccc8DD5x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y23efgEv,_ZThn4_N3ccc8DD5x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y23pqrEv,_ZTv0_n12_N3ccc8DD5x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y23pqrEv,_ZThn4_N3ccc8DD5x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y2E = {  "_ZN3ccc8DD5x11y2E", // class name
  bases__ZN3ccc8DD5x11y2E, 2,
  &(vtc__ZN3ccc8DD5x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y2E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y2E),3, //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  CC5x11y3  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x11y33abcEv
  ~CC5x11y3(); // tgen
  CC5x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y3E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y33efgEv");}
void  ccc::CC5x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y33pqrEv");}
void  ccc::CC5x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y33abcEv");}
ccc::CC5x11y3 ::~CC5x11y3(){ note_dtor("_ZN3ccc8CC5x11y3E", this);} // tgen
ccc::CC5x11y3 ::CC5x11y3(){ note_ctor("_ZN3ccc8CC5x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y3E, buf);
    ::ccc::CC5x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y3E);
    dp->::ccc::CC5x11y3::~CC5x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y3E(Test__ZN3ccc8CC5x11y3E, "_ZN3ccc8CC5x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y3C1Ev();
extern void _ZN3ccc8CC5x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y3E[] = {
  NSPAIR(_ZN3ccc8CC5x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y3E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y3E[];
extern void _ZN3ccc8CC5x11y33pqrEv();
extern void _ZN3ccc8CC5x11y33efgEv();
extern void _ZN3ccc8CC5x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y33pqrEv,_ZTv0_n12_N3ccc8CC5x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y33pqrEv,_ZThn4_N3ccc8CC5x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y33efgEv,_ZTv0_n16_N3ccc8CC5x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y33efgEv,_ZThn4_N3ccc8CC5x11y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y33abcEv,_ZTv0_n20_N3ccc8CC5x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y33abcEv,_ZThn4_N3ccc8CC5x11y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y33pqrEv,_ZTv0_n12_N3ccc8CC5x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y33efgEv,_ZTv0_n16_N3ccc8CC5x11y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y33abcEv,_ZTv0_n20_N3ccc8CC5x11y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y3E[] = {
  {&(_ZTVN3ccc8CC5x11y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y3E[];
static VTBL_ENTRY alt_thunk_names238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y33abcEv,_ZTv0_n20_N3ccc8CC5x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y33abcEv,_ZThn4_N3ccc8CC5x11y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y33efgEv,_ZTv0_n16_N3ccc8CC5x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y33efgEv,_ZThn4_N3ccc8CC5x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y33pqrEv,_ZTv0_n12_N3ccc8CC5x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y33pqrEv,_ZThn4_N3ccc8CC5x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y3E = {  "_ZN3ccc8CC5x11y3E", // class name
  bases__ZN3ccc8CC5x11y3E, 2,
  &(vtc__ZN3ccc8CC5x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y3E),2, //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  DD5x11y3  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD5x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x11y33abcEv
  ~DD5x11y3(); // tgen
  DD5x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y33efgEv");}
void  ccc::DD5x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y33pqrEv");}
void  ccc::DD5x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y33abcEv");}
ccc::DD5x11y3 ::~DD5x11y3(){ note_dtor("_ZN3ccc8DD5x11y3E", this);} // tgen
ccc::DD5x11y3 ::DD5x11y3(){ note_ctor("_ZN3ccc8DD5x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y3E, buf);
    ::ccc::DD5x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y3E);
    dp->::ccc::DD5x11y3::~DD5x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y3E(Test__ZN3ccc8DD5x11y3E, "_ZN3ccc8DD5x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y3C1Ev();
extern void _ZN3ccc8DD5x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y3E[] = {
  NSPAIR(_ZN3ccc8DD5x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y3E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y3E[];
extern void _ZN3ccc8DD5x11y33pqrEv();
extern void _ZN3ccc8DD5x11y33efgEv();
extern void _ZN3ccc8DD5x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y33pqrEv,_ZTv0_n12_N3ccc8DD5x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y33pqrEv,_ZThn4_N3ccc8DD5x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y33efgEv,_ZTv0_n16_N3ccc8DD5x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y33efgEv,_ZThn4_N3ccc8DD5x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y33pqrEv,_ZTv0_n12_N3ccc8DD5x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y33efgEv,_ZTv0_n16_N3ccc8DD5x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y3E[] = {
  {&(_ZTVN3ccc8DD5x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y3E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y3E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y3E[];
static VTBL_ENTRY alt_thunk_names239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y33efgEv,_ZTv0_n16_N3ccc8DD5x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y33efgEv,_ZThn4_N3ccc8DD5x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y33pqrEv,_ZTv0_n12_N3ccc8DD5x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y33pqrEv,_ZThn4_N3ccc8DD5x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y3E = {  "_ZN3ccc8DD5x11y3E", // class name
  bases__ZN3ccc8DD5x11y3E, 2,
  &(vtc__ZN3ccc8DD5x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y3E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y3E),3, //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  CC5x11y4  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC5x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x11y43efgEv
  ~CC5x11y4(); // tgen
  CC5x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y4E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y43pqrEv");}
void  ccc::CC5x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y43abcEv");}
void  ccc::CC5x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y43efgEv");}
ccc::CC5x11y4 ::~CC5x11y4(){ note_dtor("_ZN3ccc8CC5x11y4E", this);} // tgen
ccc::CC5x11y4 ::CC5x11y4(){ note_ctor("_ZN3ccc8CC5x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y4E, buf);
    ::ccc::CC5x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y4E);
    dp->::ccc::CC5x11y4::~CC5x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y4E(Test__ZN3ccc8CC5x11y4E, "_ZN3ccc8CC5x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y4C1Ev();
extern void _ZN3ccc8CC5x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y4E[] = {
  NSPAIR(_ZN3ccc8CC5x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y4E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y4E[];
extern void _ZN3ccc8CC5x11y43pqrEv();
extern void _ZN3ccc8CC5x11y43efgEv();
extern void _ZN3ccc8CC5x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y43pqrEv,_ZTv0_n12_N3ccc8CC5x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y43pqrEv,_ZThn4_N3ccc8CC5x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y43efgEv,_ZTv0_n16_N3ccc8CC5x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y43efgEv,_ZThn4_N3ccc8CC5x11y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y43abcEv,_ZTv0_n20_N3ccc8CC5x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y43abcEv,_ZThn4_N3ccc8CC5x11y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y43pqrEv,_ZTv0_n12_N3ccc8CC5x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y43efgEv,_ZTv0_n16_N3ccc8CC5x11y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y43abcEv,_ZTv0_n20_N3ccc8CC5x11y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y4E[] = {
  {&(_ZTVN3ccc8CC5x11y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y4E[];
static VTBL_ENTRY alt_thunk_names240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y43abcEv,_ZTv0_n20_N3ccc8CC5x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y43abcEv,_ZThn4_N3ccc8CC5x11y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y43efgEv,_ZTv0_n16_N3ccc8CC5x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y43efgEv,_ZThn4_N3ccc8CC5x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y43pqrEv,_ZTv0_n12_N3ccc8CC5x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y43pqrEv,_ZThn4_N3ccc8CC5x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y4E = {  "_ZN3ccc8CC5x11y4E", // class name
  bases__ZN3ccc8CC5x11y4E, 2,
  &(vtc__ZN3ccc8CC5x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y4E),2, //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  DD5x11y4  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD5x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD5x11y43efgEv
  ~DD5x11y4(); // tgen
  DD5x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y43pqrEv");}
void  ccc::DD5x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y43abcEv");}
void  ccc::DD5x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y43efgEv");}
ccc::DD5x11y4 ::~DD5x11y4(){ note_dtor("_ZN3ccc8DD5x11y4E", this);} // tgen
ccc::DD5x11y4 ::DD5x11y4(){ note_ctor("_ZN3ccc8DD5x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y4E, buf);
    ::ccc::DD5x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y4E);
    dp->::ccc::DD5x11y4::~DD5x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y4E(Test__ZN3ccc8DD5x11y4E, "_ZN3ccc8DD5x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y4C1Ev();
extern void _ZN3ccc8DD5x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y4E[] = {
  NSPAIR(_ZN3ccc8DD5x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y4E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y4E[];
extern void _ZN3ccc8DD5x11y43pqrEv();
extern void _ZN3ccc8DD5x11y43efgEv();
extern void _ZN3ccc8DD5x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y43pqrEv,_ZTv0_n12_N3ccc8DD5x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y43pqrEv,_ZThn4_N3ccc8DD5x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y43efgEv,_ZTv0_n16_N3ccc8DD5x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y43efgEv,_ZThn4_N3ccc8DD5x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y43pqrEv,_ZTv0_n12_N3ccc8DD5x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y43efgEv,_ZTv0_n16_N3ccc8DD5x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y4E[] = {
  {&(_ZTVN3ccc8DD5x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y4E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y4E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y4E[];
static VTBL_ENTRY alt_thunk_names241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y43efgEv,_ZTv0_n16_N3ccc8DD5x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y43efgEv,_ZThn4_N3ccc8DD5x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y43pqrEv,_ZTv0_n12_N3ccc8DD5x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y43pqrEv,_ZThn4_N3ccc8DD5x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y4E = {  "_ZN3ccc8DD5x11y4E", // class name
  bases__ZN3ccc8DD5x11y4E, 2,
  &(vtc__ZN3ccc8DD5x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y4E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y4E),3, //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  CC5x11y5  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC5x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x11y53abcEv
  ~CC5x11y5(); // tgen
  CC5x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y5E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y53pqrEv");}
void  ccc::CC5x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y53efgEv");}
void  ccc::CC5x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y53abcEv");}
ccc::CC5x11y5 ::~CC5x11y5(){ note_dtor("_ZN3ccc8CC5x11y5E", this);} // tgen
ccc::CC5x11y5 ::CC5x11y5(){ note_ctor("_ZN3ccc8CC5x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y5E, buf);
    ::ccc::CC5x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y5E);
    dp->::ccc::CC5x11y5::~CC5x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y5E(Test__ZN3ccc8CC5x11y5E, "_ZN3ccc8CC5x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y5C1Ev();
extern void _ZN3ccc8CC5x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y5E[] = {
  NSPAIR(_ZN3ccc8CC5x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y5E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y5E[];
extern void _ZN3ccc8CC5x11y53pqrEv();
extern void _ZN3ccc8CC5x11y53efgEv();
extern void _ZN3ccc8CC5x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y53pqrEv,_ZTv0_n12_N3ccc8CC5x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y53pqrEv,_ZThn4_N3ccc8CC5x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y53efgEv,_ZTv0_n16_N3ccc8CC5x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y53efgEv,_ZThn4_N3ccc8CC5x11y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y53abcEv,_ZTv0_n20_N3ccc8CC5x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y53abcEv,_ZThn4_N3ccc8CC5x11y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y53pqrEv,_ZTv0_n12_N3ccc8CC5x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y53efgEv,_ZTv0_n16_N3ccc8CC5x11y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y53abcEv,_ZTv0_n20_N3ccc8CC5x11y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y5E[] = {
  {&(_ZTVN3ccc8CC5x11y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y5E[];
static VTBL_ENTRY alt_thunk_names242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y53abcEv,_ZTv0_n20_N3ccc8CC5x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y53abcEv,_ZThn4_N3ccc8CC5x11y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y53efgEv,_ZTv0_n16_N3ccc8CC5x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y53efgEv,_ZThn4_N3ccc8CC5x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y53pqrEv,_ZTv0_n12_N3ccc8CC5x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y53pqrEv,_ZThn4_N3ccc8CC5x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y5E = {  "_ZN3ccc8CC5x11y5E", // class name
  bases__ZN3ccc8CC5x11y5E, 2,
  &(vtc__ZN3ccc8CC5x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y5E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names242,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x11y5  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD5x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD5x11y53abcEv
  ~DD5x11y5(); // tgen
  DD5x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y53pqrEv");}
void  ccc::DD5x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y53efgEv");}
void  ccc::DD5x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y53abcEv");}
ccc::DD5x11y5 ::~DD5x11y5(){ note_dtor("_ZN3ccc8DD5x11y5E", this);} // tgen
ccc::DD5x11y5 ::DD5x11y5(){ note_ctor("_ZN3ccc8DD5x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y5E, buf);
    ::ccc::DD5x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y5E);
    dp->::ccc::DD5x11y5::~DD5x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y5E(Test__ZN3ccc8DD5x11y5E, "_ZN3ccc8DD5x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y5C1Ev();
extern void _ZN3ccc8DD5x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y5E[] = {
  NSPAIR(_ZN3ccc8DD5x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y5E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y5E[];
extern void _ZN3ccc8DD5x11y53pqrEv();
extern void _ZN3ccc8DD5x11y53efgEv();
extern void _ZN3ccc8DD5x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y53pqrEv,_ZTv0_n12_N3ccc8DD5x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y53pqrEv,_ZThn4_N3ccc8DD5x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y53efgEv,_ZTv0_n16_N3ccc8DD5x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y53efgEv,_ZThn4_N3ccc8DD5x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y53pqrEv,_ZTv0_n12_N3ccc8DD5x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y53efgEv,_ZTv0_n16_N3ccc8DD5x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y5E[] = {
  {&(_ZTVN3ccc8DD5x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y5E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y5E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y5E[];
static VTBL_ENTRY alt_thunk_names243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y53efgEv,_ZTv0_n16_N3ccc8DD5x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y53efgEv,_ZThn4_N3ccc8DD5x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y53pqrEv,_ZTv0_n12_N3ccc8DD5x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y53pqrEv,_ZThn4_N3ccc8DD5x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y5E = {  "_ZN3ccc8DD5x11y5E", // class name
  bases__ZN3ccc8DD5x11y5E, 2,
  &(vtc__ZN3ccc8DD5x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y5E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y5E),3, //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  CC5x11y6  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x11y63efgEv
  ~CC5x11y6(); // tgen
  CC5x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y6E) C1{ VBC2{ v3 v2 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y63abcEv");}
void  ccc::CC5x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y63efgEv");}
ccc::CC5x11y6 ::~CC5x11y6(){ note_dtor("_ZN3ccc8CC5x11y6E", this);} // tgen
ccc::CC5x11y6 ::CC5x11y6(){ note_ctor("_ZN3ccc8CC5x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y6E, buf);
    ::ccc::CC5x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y6E);
    dp->::ccc::CC5x11y6::~CC5x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y6E(Test__ZN3ccc8CC5x11y6E, "_ZN3ccc8CC5x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y6C1Ev();
extern void _ZN3ccc8CC5x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y6E[] = {
  NSPAIR(_ZN3ccc8CC5x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y6E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC5x11y63efgEv();
extern void _ZN3ccc8CC5x11y63abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y63efgEv,_ZTv0_n16_N3ccc8CC5x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y63efgEv,_ZThn4_N3ccc8CC5x11y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y63abcEv,_ZTv0_n20_N3ccc8CC5x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y63abcEv,_ZThn4_N3ccc8CC5x11y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y63efgEv,_ZTv0_n16_N3ccc8CC5x11y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y63abcEv,_ZTv0_n20_N3ccc8CC5x11y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y6E[] = {
  {&(_ZTVN3ccc8CC5x11y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y6E[];
static VTBL_ENTRY alt_thunk_names244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y63abcEv,_ZTv0_n20_N3ccc8CC5x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y63abcEv,_ZThn4_N3ccc8CC5x11y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y63efgEv,_ZTv0_n16_N3ccc8CC5x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y63efgEv,_ZThn4_N3ccc8CC5x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y6E = {  "_ZN3ccc8CC5x11y6E", // class name
  bases__ZN3ccc8CC5x11y6E, 2,
  &(vtc__ZN3ccc8CC5x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y6E),2, //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  DD5x11y6  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD5x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD5x11y63efgEv
  ~DD5x11y6(); // tgen
  DD5x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y63abcEv");}
void  ccc::DD5x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y63efgEv");}
ccc::DD5x11y6 ::~DD5x11y6(){ note_dtor("_ZN3ccc8DD5x11y6E", this);} // tgen
ccc::DD5x11y6 ::DD5x11y6(){ note_ctor("_ZN3ccc8DD5x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y6E, buf);
    ::ccc::DD5x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y6E);
    dp->::ccc::DD5x11y6::~DD5x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y6E(Test__ZN3ccc8DD5x11y6E, "_ZN3ccc8DD5x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y6C1Ev();
extern void _ZN3ccc8DD5x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y6E[] = {
  NSPAIR(_ZN3ccc8DD5x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y6E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x11y63efgEv();
extern void _ZN3ccc8DD5x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y63efgEv,_ZTv0_n16_N3ccc8DD5x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y63efgEv,_ZThn4_N3ccc8DD5x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y63efgEv,_ZTv0_n16_N3ccc8DD5x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y6E[] = {
  {&(_ZTVN3ccc8DD5x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y6E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y6E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y6E[];
static VTBL_ENTRY alt_thunk_names245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y63efgEv,_ZTv0_n16_N3ccc8DD5x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y63efgEv,_ZThn4_N3ccc8DD5x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y6E = {  "_ZN3ccc8DD5x11y6E", // class name
  bases__ZN3ccc8DD5x11y6E, 2,
  &(vtc__ZN3ccc8DD5x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y6E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y6E),3, //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  CC5x11y7  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC5x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y73pqrEv
  ~CC5x11y7(); // tgen
  CC5x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y7E) C1{ VBC2{ v2 v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y73abcEv");}
void  ccc::CC5x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y73pqrEv");}
ccc::CC5x11y7 ::~CC5x11y7(){ note_dtor("_ZN3ccc8CC5x11y7E", this);} // tgen
ccc::CC5x11y7 ::CC5x11y7(){ note_ctor("_ZN3ccc8CC5x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y7E, buf);
    ::ccc::CC5x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y7E);
    dp->::ccc::CC5x11y7::~CC5x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y7E(Test__ZN3ccc8CC5x11y7E, "_ZN3ccc8CC5x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y7C1Ev();
extern void _ZN3ccc8CC5x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y7E[] = {
  NSPAIR(_ZN3ccc8CC5x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y7E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y7E[];
extern void _ZN3ccc8CC5x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC5x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y73pqrEv,_ZTv0_n12_N3ccc8CC5x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y73pqrEv,_ZThn4_N3ccc8CC5x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y73abcEv,_ZTv0_n20_N3ccc8CC5x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y73abcEv,_ZThn4_N3ccc8CC5x11y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y73pqrEv,_ZTv0_n12_N3ccc8CC5x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y73abcEv,_ZTv0_n20_N3ccc8CC5x11y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y7E[] = {
  {&(_ZTVN3ccc8CC5x11y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y7E[];
static VTBL_ENTRY alt_thunk_names246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y73abcEv,_ZTv0_n20_N3ccc8CC5x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y73abcEv,_ZThn4_N3ccc8CC5x11y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y73pqrEv,_ZTv0_n12_N3ccc8CC5x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y73pqrEv,_ZThn4_N3ccc8CC5x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y7E = {  "_ZN3ccc8CC5x11y7E", // class name
  bases__ZN3ccc8CC5x11y7E, 2,
  &(vtc__ZN3ccc8CC5x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y7E),2, //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  DD5x11y7  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD5x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x11y73pqrEv
  ~DD5x11y7(); // tgen
  DD5x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y73abcEv");}
void  ccc::DD5x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y73pqrEv");}
ccc::DD5x11y7 ::~DD5x11y7(){ note_dtor("_ZN3ccc8DD5x11y7E", this);} // tgen
ccc::DD5x11y7 ::DD5x11y7(){ note_ctor("_ZN3ccc8DD5x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y7E, buf);
    ::ccc::DD5x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y7E);
    dp->::ccc::DD5x11y7::~DD5x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y7E(Test__ZN3ccc8DD5x11y7E, "_ZN3ccc8DD5x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y7C1Ev();
extern void _ZN3ccc8DD5x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y7E[] = {
  NSPAIR(_ZN3ccc8DD5x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y7E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y7E[];
extern void _ZN3ccc8DD5x11y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y73pqrEv,_ZTv0_n12_N3ccc8DD5x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y73pqrEv,_ZThn4_N3ccc8DD5x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y73pqrEv,_ZTv0_n12_N3ccc8DD5x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y7E[] = {
  {&(_ZTVN3ccc8DD5x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y7E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y7E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y7E[];
static VTBL_ENTRY alt_thunk_names247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y73pqrEv,_ZTv0_n12_N3ccc8DD5x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y73pqrEv,_ZThn4_N3ccc8DD5x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y7E = {  "_ZN3ccc8DD5x11y7E", // class name
  bases__ZN3ccc8DD5x11y7E, 2,
  &(vtc__ZN3ccc8DD5x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y7E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y7E),3, //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  CC5x11y8  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x11y83abcEv
  ~CC5x11y8(); // tgen
  CC5x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y8E) C1{ VBC2{ v3 v1 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y83efgEv");}
void  ccc::CC5x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x11y83abcEv");}
ccc::CC5x11y8 ::~CC5x11y8(){ note_dtor("_ZN3ccc8CC5x11y8E", this);} // tgen
ccc::CC5x11y8 ::CC5x11y8(){ note_ctor("_ZN3ccc8CC5x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y8E, buf);
    ::ccc::CC5x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y8E);
    dp->::ccc::CC5x11y8::~CC5x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y8E(Test__ZN3ccc8CC5x11y8E, "_ZN3ccc8CC5x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y8C1Ev();
extern void _ZN3ccc8CC5x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y8E[] = {
  NSPAIR(_ZN3ccc8CC5x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y8E[] = {
  // 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__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 _ZTIN3ccc8CC5x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC5x11y83efgEv();
extern void _ZN3ccc8CC5x11y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y83efgEv,_ZTv0_n16_N3ccc8CC5x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y83efgEv,_ZThn4_N3ccc8CC5x11y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x11y83abcEv,_ZTv0_n20_N3ccc8CC5x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y83abcEv,_ZThn4_N3ccc8CC5x11y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y83efgEv,_ZTv0_n16_N3ccc8CC5x11y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x11y83abcEv,_ZTv0_n20_N3ccc8CC5x11y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y8E[] = {
  {&(_ZTVN3ccc8CC5x11y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x11y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y8E[];
static VTBL_ENTRY alt_thunk_names248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x11y83abcEv,_ZTv0_n20_N3ccc8CC5x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y83abcEv,_ZThn4_N3ccc8CC5x11y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y83efgEv,_ZTv0_n16_N3ccc8CC5x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y83efgEv,_ZThn4_N3ccc8CC5x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y8E = {  "_ZN3ccc8CC5x11y8E", // class name
  bases__ZN3ccc8CC5x11y8E, 2,
  &(vtc__ZN3ccc8CC5x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y8E),2, //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  DD5x11y8  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD5x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD5x11y83abcEv
  ~DD5x11y8(); // tgen
  DD5x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y83efgEv");}
void  ccc::DD5x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x11y83abcEv");}
ccc::DD5x11y8 ::~DD5x11y8(){ note_dtor("_ZN3ccc8DD5x11y8E", this);} // tgen
ccc::DD5x11y8 ::DD5x11y8(){ note_ctor("_ZN3ccc8DD5x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y8E, buf);
    ::ccc::DD5x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y8E);
    dp->::ccc::DD5x11y8::~DD5x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y8E(Test__ZN3ccc8DD5x11y8E, "_ZN3ccc8DD5x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y8C1Ev();
extern void _ZN3ccc8DD5x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y8E[] = {
  NSPAIR(_ZN3ccc8DD5x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y8E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x11y83efgEv();
extern void _ZN3ccc8DD5x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y83efgEv,_ZTv0_n16_N3ccc8DD5x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y83efgEv,_ZThn4_N3ccc8DD5x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y83efgEv,_ZTv0_n16_N3ccc8DD5x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y8E[] = {
  {&(_ZTVN3ccc8DD5x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y8E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y8E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y8E[];
static VTBL_ENTRY alt_thunk_names249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y83efgEv,_ZTv0_n16_N3ccc8DD5x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y83efgEv,_ZThn4_N3ccc8DD5x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y8E = {  "_ZN3ccc8DD5x11y8E", // class name
  bases__ZN3ccc8DD5x11y8E, 2,
  &(vtc__ZN3ccc8DD5x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y8E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y8E),3, //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  CC5x11y9  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC5x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x11y93pqrEv
  ~CC5x11y9(); // tgen
  CC5x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x11y9E) C1{ VBC2{ v2 v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x11y93efgEv");}
void  ccc::CC5x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x11y93pqrEv");}
ccc::CC5x11y9 ::~CC5x11y9(){ note_dtor("_ZN3ccc8CC5x11y9E", this);} // tgen
ccc::CC5x11y9 ::CC5x11y9(){ note_ctor("_ZN3ccc8CC5x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC5x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x11y9E, buf);
    ::ccc::CC5x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x11y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC5x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x11y9E);
    dp->::ccc::CC5x11y9::~CC5x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x11y9E(Test__ZN3ccc8CC5x11y9E, "_ZN3ccc8CC5x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x11y9C1Ev();
extern void _ZN3ccc8CC5x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC5x11y9E[] = {
  NSPAIR(_ZN3ccc8CC5x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC5x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC5x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x11y9E[];
extern void _ZN3ccc8CC5x11y93pqrEv();
extern void _ZN3ccc8CC5x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x11y93pqrEv,_ZTv0_n12_N3ccc8CC5x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y93pqrEv,_ZThn4_N3ccc8CC5x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x11y93efgEv,_ZTv0_n16_N3ccc8CC5x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x11y93efgEv,_ZThn4_N3ccc8CC5x11y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x11y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x11y93pqrEv,_ZTv0_n12_N3ccc8CC5x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x11y93efgEv,_ZTv0_n16_N3ccc8CC5x11y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x11y9E[] = {
  {&(_ZTVN3ccc8CC5x11y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x11y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x11y9E[];
static VTBL_ENTRY alt_thunk_names250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x11y93efgEv,_ZTv0_n16_N3ccc8CC5x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y93efgEv,_ZThn4_N3ccc8CC5x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x11y93pqrEv,_ZTv0_n12_N3ccc8CC5x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x11y93pqrEv,_ZThn4_N3ccc8CC5x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x11y9E = {  "_ZN3ccc8CC5x11y9E", // class name
  bases__ZN3ccc8CC5x11y9E, 2,
  &(vtc__ZN3ccc8CC5x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x11y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x11y9E),2, //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  DD5x11y9  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD5x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x11y93pqrEv
  ~DD5x11y9(); // tgen
  DD5x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD5x11y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x11y93efgEv");}
void  ccc::DD5x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x11y93pqrEv");}
ccc::DD5x11y9 ::~DD5x11y9(){ note_dtor("_ZN3ccc8DD5x11y9E", this);} // tgen
ccc::DD5x11y9 ::DD5x11y9(){ note_ctor("_ZN3ccc8DD5x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD5x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x11y9E, buf);
    ::ccc::DD5x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x11y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD5x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x11y9E);
    dp->::ccc::DD5x11y9::~DD5x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x11y9E(Test__ZN3ccc8DD5x11y9E, "_ZN3ccc8DD5x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x11y9C1Ev();
extern void _ZN3ccc8DD5x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD5x11y9E[] = {
  NSPAIR(_ZN3ccc8DD5x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD5x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD5x11y9E[] = {
  // 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__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 _ZTIN3ccc8DD5x11y9E[];
extern void _ZN3ccc8DD5x11y93pqrEv();
extern void _ZN3ccc8DD5x11y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x11y93pqrEv,_ZTv0_n12_N3ccc8DD5x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y93pqrEv,_ZThn4_N3ccc8DD5x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD5x11y93efgEv,_ZTv0_n16_N3ccc8DD5x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x11y93efgEv,_ZThn4_N3ccc8DD5x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x11y93pqrEv,_ZTv0_n12_N3ccc8DD5x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD5x11y93efgEv,_ZTv0_n16_N3ccc8DD5x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x11y9E[] = {
  {&(_ZTVN3ccc8DD5x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y9E[7]),  7,16},
  {&(_ZTVN3ccc8DD5x11y9E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x11y9E[];
static VTBL_ENTRY alt_thunk_names251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD5x11y93efgEv,_ZTv0_n16_N3ccc8DD5x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y93efgEv,_ZThn4_N3ccc8DD5x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x11y93pqrEv,_ZTv0_n12_N3ccc8DD5x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x11y93pqrEv,_ZThn4_N3ccc8DD5x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x11y9E = {  "_ZN3ccc8DD5x11y9E", // class name
  bases__ZN3ccc8DD5x11y9E, 2,
  &(vtc__ZN3ccc8DD5x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x11y9E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x11y9E),3, //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  CC5x11y10  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC5x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x11y103abcEv
  ~CC5x11y10(); // tgen
  CC5x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y10E) C1{ VBC2{ v1 v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x11y103pqrEv");}
void  ccc::CC5x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x11y103abcEv");}
ccc::CC5x11y10 ::~CC5x11y10(){ note_dtor("_ZN3ccc9CC5x11y10E", this);} // tgen
ccc::CC5x11y10 ::CC5x11y10(){ note_ctor("_ZN3ccc9CC5x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC5x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x11y10E, buf);
    ::ccc::CC5x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x11y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC5x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x11y10E);
    dp->::ccc::CC5x11y10::~CC5x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x11y10E(Test__ZN3ccc9CC5x11y10E, "_ZN3ccc9CC5x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x11y10C1Ev();
extern void _ZN3ccc9CC5x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC5x11y10E[] = {
  NSPAIR(_ZN3ccc9CC5x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC5x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC5x11y10E[] = {
  // 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__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 _ZTIN3ccc9CC5x11y10E[];
extern void _ZN3ccc9CC5x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC5x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x11y103pqrEv,_ZTv0_n12_N3ccc9CC5x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y103pqrEv,_ZThn4_N3ccc9CC5x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x11y103abcEv,_ZTv0_n20_N3ccc9CC5x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y103abcEv,_ZThn4_N3ccc9CC5x11y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x11y103pqrEv,_ZTv0_n12_N3ccc9CC5x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x11y103abcEv,_ZTv0_n20_N3ccc9CC5x11y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x11y10E[] = {
  {&(_ZTVN3ccc9CC5x11y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC5x11y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x11y10E[];
static VTBL_ENTRY alt_thunk_names252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x11y103abcEv,_ZTv0_n20_N3ccc9CC5x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y103abcEv,_ZThn4_N3ccc9CC5x11y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x11y103pqrEv,_ZTv0_n12_N3ccc9CC5x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y103pqrEv,_ZThn4_N3ccc9CC5x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x11y10E = {  "_ZN3ccc9CC5x11y10E", // class name
  bases__ZN3ccc9CC5x11y10E, 2,
  &(vtc__ZN3ccc9CC5x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x11y10E),2, //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  DD5x11y10  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD5x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD5x11y103abcEv
  ~DD5x11y10(); // tgen
  DD5x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD5x11y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x11y103pqrEv");}
void  ccc::DD5x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x11y103abcEv");}
ccc::DD5x11y10 ::~DD5x11y10(){ note_dtor("_ZN3ccc9DD5x11y10E", this);} // tgen
ccc::DD5x11y10 ::DD5x11y10(){ note_ctor("_ZN3ccc9DD5x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD5x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x11y10E, buf);
    ::ccc::DD5x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x11y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD5x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x11y10E);
    dp->::ccc::DD5x11y10::~DD5x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x11y10E(Test__ZN3ccc9DD5x11y10E, "_ZN3ccc9DD5x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x11y10C1Ev();
extern void _ZN3ccc9DD5x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD5x11y10E[] = {
  NSPAIR(_ZN3ccc9DD5x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD5x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD5x11y10E[] = {
  // 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__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 _ZTIN3ccc9DD5x11y10E[];
extern void _ZN3ccc9DD5x11y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x11y103pqrEv,_ZTv0_n12_N3ccc9DD5x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x11y103pqrEv,_ZThn4_N3ccc9DD5x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x11y103pqrEv,_ZTv0_n12_N3ccc9DD5x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x11y10E[] = {
  {&(_ZTVN3ccc9DD5x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y10E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y10E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x11y10E[];
static VTBL_ENTRY alt_thunk_names253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x11y103pqrEv,_ZTv0_n12_N3ccc9DD5x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x11y103pqrEv,_ZThn4_N3ccc9DD5x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x11y10E = {  "_ZN3ccc9DD5x11y10E", // class name
  bases__ZN3ccc9DD5x11y10E, 2,
  &(vtc__ZN3ccc9DD5x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x11y10E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x11y10E),3, //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  CC5x11y11  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC5x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x11y113efgEv
  ~CC5x11y11(); // tgen
  CC5x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y11E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x11y113pqrEv");}
void  ccc::CC5x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x11y113efgEv");}
ccc::CC5x11y11 ::~CC5x11y11(){ note_dtor("_ZN3ccc9CC5x11y11E", this);} // tgen
ccc::CC5x11y11 ::CC5x11y11(){ note_ctor("_ZN3ccc9CC5x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC5x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x11y11E, buf);
    ::ccc::CC5x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x11y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC5x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x11y11E);
    dp->::ccc::CC5x11y11::~CC5x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x11y11E(Test__ZN3ccc9CC5x11y11E, "_ZN3ccc9CC5x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x11y11C1Ev();
extern void _ZN3ccc9CC5x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC5x11y11E[] = {
  NSPAIR(_ZN3ccc9CC5x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC5x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC5x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x11y11E[];
extern void _ZN3ccc9CC5x11y113pqrEv();
extern void _ZN3ccc9CC5x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x11y113pqrEv,_ZTv0_n12_N3ccc9CC5x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y113pqrEv,_ZThn4_N3ccc9CC5x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x11y113efgEv,_ZTv0_n16_N3ccc9CC5x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y113efgEv,_ZThn4_N3ccc9CC5x11y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x11y113pqrEv,_ZTv0_n12_N3ccc9CC5x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x11y113efgEv,_ZTv0_n16_N3ccc9CC5x11y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x11y11E[] = {
  {&(_ZTVN3ccc9CC5x11y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x11y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x11y11E[];
static VTBL_ENTRY alt_thunk_names254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x11y113efgEv,_ZTv0_n16_N3ccc9CC5x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y113efgEv,_ZThn4_N3ccc9CC5x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x11y113pqrEv,_ZTv0_n12_N3ccc9CC5x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y113pqrEv,_ZThn4_N3ccc9CC5x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x11y11E = {  "_ZN3ccc9CC5x11y11E", // class name
  bases__ZN3ccc9CC5x11y11E, 2,
  &(vtc__ZN3ccc9CC5x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x11y11E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names254,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x11y11  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD5x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD5x11y113efgEv
  ~DD5x11y11(); // tgen
  DD5x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD5x11y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x11y113pqrEv");}
void  ccc::DD5x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x11y113efgEv");}
ccc::DD5x11y11 ::~DD5x11y11(){ note_dtor("_ZN3ccc9DD5x11y11E", this);} // tgen
ccc::DD5x11y11 ::DD5x11y11(){ note_ctor("_ZN3ccc9DD5x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD5x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x11y11E, buf);
    ::ccc::DD5x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x11y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD5x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x11y11E);
    dp->::ccc::DD5x11y11::~DD5x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x11y11E(Test__ZN3ccc9DD5x11y11E, "_ZN3ccc9DD5x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x11y11C1Ev();
extern void _ZN3ccc9DD5x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD5x11y11E[] = {
  NSPAIR(_ZN3ccc9DD5x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD5x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD5x11y11E[] = {
  // 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__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 _ZTIN3ccc9DD5x11y11E[];
extern void _ZN3ccc9DD5x11y113pqrEv();
extern void _ZN3ccc9DD5x11y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x11y113pqrEv,_ZTv0_n12_N3ccc9DD5x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x11y113pqrEv,_ZThn4_N3ccc9DD5x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD5x11y113efgEv,_ZTv0_n16_N3ccc9DD5x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x11y113efgEv,_ZThn4_N3ccc9DD5x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x11y113pqrEv,_ZTv0_n12_N3ccc9DD5x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD5x11y113efgEv,_ZTv0_n16_N3ccc9DD5x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x11y11E[] = {
  {&(_ZTVN3ccc9DD5x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y11E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y11E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x11y11E[];
static VTBL_ENTRY alt_thunk_names255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD5x11y113efgEv,_ZTv0_n16_N3ccc9DD5x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x11y113efgEv,_ZThn4_N3ccc9DD5x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x11y113pqrEv,_ZTv0_n12_N3ccc9DD5x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x11y113pqrEv,_ZThn4_N3ccc9DD5x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x11y11E = {  "_ZN3ccc9DD5x11y11E", // class name
  bases__ZN3ccc9DD5x11y11E, 2,
  &(vtc__ZN3ccc9DD5x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x11y11E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x11y11E),3, //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  CC5x11y12  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC5x11y123abcEv
  ~CC5x11y12(); // tgen
  CC5x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC5x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x11y123abcEv");}
ccc::CC5x11y12 ::~CC5x11y12(){ note_dtor("_ZN3ccc9CC5x11y12E", this);} // tgen
ccc::CC5x11y12 ::CC5x11y12(){ note_ctor("_ZN3ccc9CC5x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC5x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x11y12E, buf);
    ::ccc::CC5x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x11y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC5x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x11y12E);
    dp->::ccc::CC5x11y12::~CC5x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x11y12E(Test__ZN3ccc9CC5x11y12E, "_ZN3ccc9CC5x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x11y12C1Ev();
extern void _ZN3ccc9CC5x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC5x11y12E[] = {
  NSPAIR(_ZN3ccc9CC5x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC5x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC5x11y12E[] = {
  // 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__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 _ZTIN3ccc9CC5x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC5x11y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x11y123abcEv,_ZTv0_n20_N3ccc9CC5x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y123abcEv,_ZThn4_N3ccc9CC5x11y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x11y123abcEv,_ZTv0_n20_N3ccc9CC5x11y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x11y12E[] = {
  {&(_ZTVN3ccc9CC5x11y12E[3]),  3,14},
  {&(_ZTVN3ccc9CC5x11y12E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x11y12E[];
static VTBL_ENTRY alt_thunk_names256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x11y123abcEv,_ZTv0_n20_N3ccc9CC5x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y123abcEv,_ZThn4_N3ccc9CC5x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x11y12E = {  "_ZN3ccc9CC5x11y12E", // class name
  bases__ZN3ccc9CC5x11y12E, 2,
  &(vtc__ZN3ccc9CC5x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y12E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x11y12E),2, //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  DD5x11y12  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD5x11y123abcEv
  ~DD5x11y12(); // tgen
  DD5x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD5x11y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD5x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x11y123abcEv");}
ccc::DD5x11y12 ::~DD5x11y12(){ note_dtor("_ZN3ccc9DD5x11y12E", this);} // tgen
ccc::DD5x11y12 ::DD5x11y12(){ note_ctor("_ZN3ccc9DD5x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD5x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x11y12E, buf);
    ::ccc::DD5x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x11y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD5x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x11y12E);
    dp->::ccc::DD5x11y12::~DD5x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x11y12E(Test__ZN3ccc9DD5x11y12E, "_ZN3ccc9DD5x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x11y12C1Ev();
extern void _ZN3ccc9DD5x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD5x11y12E[] = {
  NSPAIR(_ZN3ccc9DD5x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD5x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD5x11y12E[] = {
  // 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__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 _ZTIN3ccc9DD5x11y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x11y12E[] = {
  {&(_ZTVN3ccc9DD5x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y12E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y12E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x11y12E[];
Class_Descriptor cd__ZN3ccc9DD5x11y12E = {  "_ZN3ccc9DD5x11y12E", // class name
  bases__ZN3ccc9DD5x11y12E, 2,
  &(vtc__ZN3ccc9DD5x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x11y12E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x11y12E),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  CC5x11y13  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC5x11y133efgEv
  ~CC5x11y13(); // tgen
  CC5x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC5x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x11y133efgEv");}
ccc::CC5x11y13 ::~CC5x11y13(){ note_dtor("_ZN3ccc9CC5x11y13E", this);} // tgen
ccc::CC5x11y13 ::CC5x11y13(){ note_ctor("_ZN3ccc9CC5x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC5x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x11y13E, buf);
    ::ccc::CC5x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x11y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC5x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x11y13E);
    dp->::ccc::CC5x11y13::~CC5x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x11y13E(Test__ZN3ccc9CC5x11y13E, "_ZN3ccc9CC5x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x11y13C1Ev();
extern void _ZN3ccc9CC5x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC5x11y13E[] = {
  NSPAIR(_ZN3ccc9CC5x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC5x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC5x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC5x11y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x11y133efgEv,_ZTv0_n16_N3ccc9CC5x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y133efgEv,_ZThn4_N3ccc9CC5x11y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x11y133efgEv,_ZTv0_n16_N3ccc9CC5x11y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x11y13E[] = {
  {&(_ZTVN3ccc9CC5x11y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x11y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x11y13E[];
static VTBL_ENTRY alt_thunk_names257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x11y133efgEv,_ZTv0_n16_N3ccc9CC5x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y133efgEv,_ZThn4_N3ccc9CC5x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x11y13E = {  "_ZN3ccc9CC5x11y13E", // class name
  bases__ZN3ccc9CC5x11y13E, 2,
  &(vtc__ZN3ccc9CC5x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x11y13E),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  DD5x11y13  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD5x11y133efgEv
  ~DD5x11y13(); // tgen
  DD5x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD5x11y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD5x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x11y133efgEv");}
ccc::DD5x11y13 ::~DD5x11y13(){ note_dtor("_ZN3ccc9DD5x11y13E", this);} // tgen
ccc::DD5x11y13 ::DD5x11y13(){ note_ctor("_ZN3ccc9DD5x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD5x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x11y13E, buf);
    ::ccc::DD5x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x11y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD5x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x11y13E);
    dp->::ccc::DD5x11y13::~DD5x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x11y13E(Test__ZN3ccc9DD5x11y13E, "_ZN3ccc9DD5x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x11y13C1Ev();
extern void _ZN3ccc9DD5x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD5x11y13E[] = {
  NSPAIR(_ZN3ccc9DD5x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD5x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD5x11y13E[] = {
  // 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__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 _ZTIN3ccc9DD5x11y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9DD5x11y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD5x11y133efgEv,_ZTv0_n16_N3ccc9DD5x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x11y133efgEv,_ZThn4_N3ccc9DD5x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD5x11y133efgEv,_ZTv0_n16_N3ccc9DD5x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x11y13E[] = {
  {&(_ZTVN3ccc9DD5x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y13E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y13E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x11y13E[];
static VTBL_ENTRY alt_thunk_names258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD5x11y133efgEv,_ZTv0_n16_N3ccc9DD5x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x11y133efgEv,_ZThn4_N3ccc9DD5x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x11y13E = {  "_ZN3ccc9DD5x11y13E", // class name
  bases__ZN3ccc9DD5x11y13E, 2,
  &(vtc__ZN3ccc9DD5x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x11y13E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x11y13E),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  CC5x11y14  : virtual ::ccc::AA5 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC5x11y143pqrEv
  ~CC5x11y14(); // tgen
  CC5x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC5x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x11y143pqrEv");}
ccc::CC5x11y14 ::~CC5x11y14(){ note_dtor("_ZN3ccc9CC5x11y14E", this);} // tgen
ccc::CC5x11y14 ::CC5x11y14(){ note_ctor("_ZN3ccc9CC5x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC5x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x11y14E, buf);
    ::ccc::CC5x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x11y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC5x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x11y14E);
    dp->::ccc::CC5x11y14::~CC5x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x11y14E(Test__ZN3ccc9CC5x11y14E, "_ZN3ccc9CC5x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x11y14C1Ev();
extern void _ZN3ccc9CC5x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC5x11y14E[] = {
  NSPAIR(_ZN3ccc9CC5x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC5x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC5x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x11y14E[];
extern void _ZN3ccc9CC5x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x11y143pqrEv,_ZTv0_n12_N3ccc9CC5x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x11y143pqrEv,_ZThn4_N3ccc9CC5x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x11y143pqrEv,_ZTv0_n12_N3ccc9CC5x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x11y14E[] = {
  {&(_ZTVN3ccc9CC5x11y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x11y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x11y14E[];
static VTBL_ENTRY alt_thunk_names259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x11y143pqrEv,_ZTv0_n12_N3ccc9CC5x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x11y143pqrEv,_ZThn4_N3ccc9CC5x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x11y14E = {  "_ZN3ccc9CC5x11y14E", // class name
  bases__ZN3ccc9CC5x11y14E, 2,
  &(vtc__ZN3ccc9CC5x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x11y14E),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  DD5x11y14  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD5x11y143pqrEv
  ~DD5x11y14(); // tgen
  DD5x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD5x11y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD5x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x11y143pqrEv");}
ccc::DD5x11y14 ::~DD5x11y14(){ note_dtor("_ZN3ccc9DD5x11y14E", this);} // tgen
ccc::DD5x11y14 ::DD5x11y14(){ note_ctor("_ZN3ccc9DD5x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD5x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x11y14E, buf);
    ::ccc::DD5x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x11y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD5x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x11y14E);
    dp->::ccc::DD5x11y14::~DD5x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x11y14E(Test__ZN3ccc9DD5x11y14E, "_ZN3ccc9DD5x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x11y14C1Ev();
extern void _ZN3ccc9DD5x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD5x11y14E[] = {
  NSPAIR(_ZN3ccc9DD5x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD5x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD5x11y14E[] = {
  // 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__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 _ZTIN3ccc9DD5x11y14E[];
extern void _ZN3ccc9DD5x11y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x11y143pqrEv,_ZTv0_n12_N3ccc9DD5x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x11y143pqrEv,_ZThn4_N3ccc9DD5x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x11y143pqrEv,_ZTv0_n12_N3ccc9DD5x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x11y14E[] = {
  {&(_ZTVN3ccc9DD5x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y14E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y14E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x11y14E[];
static VTBL_ENTRY alt_thunk_names260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x11y143pqrEv,_ZTv0_n12_N3ccc9DD5x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x11y143pqrEv,_ZThn4_N3ccc9DD5x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x11y14E = {  "_ZN3ccc9DD5x11y14E", // class name
  bases__ZN3ccc9DD5x11y14E, 2,
  &(vtc__ZN3ccc9DD5x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x11y14E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x11y14E),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  CC5x11y15  : virtual ::ccc::AA5 , ::ccc::BB11 {
  ~CC5x11y15(); // tgen
  CC5x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x11y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4 v5}}
}
namespace ccc { 
ccc::CC5x11y15 ::~CC5x11y15(){ note_dtor("_ZN3ccc9CC5x11y15E", this);} // tgen
ccc::CC5x11y15 ::CC5x11y15(){ note_ctor("_ZN3ccc9CC5x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC5x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x11y15E, buf);
    ::ccc::CC5x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x11y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC5x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x11y15E);
    dp->::ccc::CC5x11y15::~CC5x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x11y15E(Test__ZN3ccc9CC5x11y15E, "_ZN3ccc9CC5x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x11y15C1Ev();
extern void _ZN3ccc9CC5x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC5x11y15E[] = {
  NSPAIR(_ZN3ccc9CC5x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC5x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC5x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x11y15E[] = {
  {&(_ZTVN3ccc9CC5x11y15E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x11y15E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x11y15E[];
Class_Descriptor cd__ZN3ccc9CC5x11y15E = {  "_ZN3ccc9CC5x11y15E", // class name
  bases__ZN3ccc9CC5x11y15E, 2,
  &(vtc__ZN3ccc9CC5x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x11y15E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x11y15E),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  DD5x11y15  : virtual ::ccc::AA5 , virtual ::ccc::BB11 {
  ~DD5x11y15(); // tgen
  DD5x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD5x11y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4 v5}}
}
namespace ccc { 
ccc::DD5x11y15 ::~DD5x11y15(){ note_dtor("_ZN3ccc9DD5x11y15E", this);} // tgen
ccc::DD5x11y15 ::DD5x11y15(){ note_ctor("_ZN3ccc9DD5x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD5x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x11y15E, buf);
    ::ccc::DD5x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x11y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD5x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x11y15E);
    dp->::ccc::DD5x11y15::~DD5x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x11y15E(Test__ZN3ccc9DD5x11y15E, "_ZN3ccc9DD5x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x11y15C1Ev();
extern void _ZN3ccc9DD5x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD5x11y15E[] = {
  NSPAIR(_ZN3ccc9DD5x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD5x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD5x11y15E[] = {
  // 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__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 _ZTIN3ccc9DD5x11y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x11y15E[] = {
  {&(_ZTVN3ccc9DD5x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y15E[7]),  7,16},
  {&(_ZTVN3ccc9DD5x11y15E[14]),  14,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x11y15E[];
Class_Descriptor cd__ZN3ccc9DD5x11y15E = {  "_ZN3ccc9DD5x11y15E", // class name
  bases__ZN3ccc9DD5x11y15E, 2,
  &(vtc__ZN3ccc9DD5x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x11y15E),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x11y15E),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  CC5x12y0  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y03pqrEv
  ~CC5x12y0(); // tgen
  CC5x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y0E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y03abcEv");}
void  ccc::CC5x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y03efgEv");}
void  ccc::CC5x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y03pqrEv");}
ccc::CC5x12y0 ::~CC5x12y0(){ note_dtor("_ZN3ccc8CC5x12y0E", this);} // tgen
ccc::CC5x12y0 ::CC5x12y0(){ note_ctor("_ZN3ccc8CC5x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y0E, buf);
    ::ccc::CC5x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y0E);
    dp->::ccc::CC5x12y0::~CC5x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y0E(Test__ZN3ccc8CC5x12y0E, "_ZN3ccc8CC5x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y0C1Ev();
extern void _ZN3ccc8CC5x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y0E[] = {
  NSPAIR(_ZN3ccc8CC5x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y0E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y0E[];
extern void _ZN3ccc8CC5x12y03abcEv();
extern void _ZN3ccc8CC5x12y03efgEv();
extern void _ZN3ccc8CC5x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y03pqrEv,_ZTv0_n12_N3ccc8CC5x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y03pqrEv,_ZThn4_N3ccc8CC5x12y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y03efgEv,_ZTv0_n16_N3ccc8CC5x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y03efgEv,_ZThn4_N3ccc8CC5x12y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y03abcEv,_ZTv0_n20_N3ccc8CC5x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y03abcEv,_ZThn4_N3ccc8CC5x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y03pqrEv,_ZTv0_n12_N3ccc8CC5x12y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y03efgEv,_ZTv0_n16_N3ccc8CC5x12y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y03abcEv,_ZTv0_n20_N3ccc8CC5x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y0E[] = {
  {&(_ZTVN3ccc8CC5x12y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y0E[];
static VTBL_ENTRY alt_thunk_names261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y03abcEv,_ZTv0_n20_N3ccc8CC5x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y03abcEv,_ZThn4_N3ccc8CC5x12y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y03efgEv,_ZTv0_n16_N3ccc8CC5x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y03efgEv,_ZThn4_N3ccc8CC5x12y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y03pqrEv,_ZTv0_n12_N3ccc8CC5x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y03pqrEv,_ZThn4_N3ccc8CC5x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y0E = {  "_ZN3ccc8CC5x12y0E", // class name
  bases__ZN3ccc8CC5x12y0E, 2,
  &(vtc__ZN3ccc8CC5x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y0E),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  DD5x12y0  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD5x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD5x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x12y03pqrEv
  ~DD5x12y0(); // tgen
  DD5x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y03abcEv");}
void  ccc::DD5x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y03efgEv");}
void  ccc::DD5x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y03pqrEv");}
ccc::DD5x12y0 ::~DD5x12y0(){ note_dtor("_ZN3ccc8DD5x12y0E", this);} // tgen
ccc::DD5x12y0 ::DD5x12y0(){ note_ctor("_ZN3ccc8DD5x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y0E, buf);
    ::ccc::DD5x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y0E);
    dp->::ccc::DD5x12y0::~DD5x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y0E(Test__ZN3ccc8DD5x12y0E, "_ZN3ccc8DD5x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y0C1Ev();
extern void _ZN3ccc8DD5x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y0E[] = {
  NSPAIR(_ZN3ccc8DD5x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y0E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y0E[];
extern void _ZN3ccc8DD5x12y03pqrEv();
extern void _ZN3ccc8DD5x12y03efgEv();
extern void _ZN3ccc8DD5x12y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y03abcEv,_ZTv0_n12_N3ccc8DD5x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y03abcEv,_ZThn4_N3ccc8DD5x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y03abcEv,_ZTv0_n12_N3ccc8DD5x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y0E[] = {
  {&(_ZTVN3ccc8DD5x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y0E[];
static VTBL_ENTRY alt_thunk_names262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y03abcEv,_ZTv0_n12_N3ccc8DD5x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y03abcEv,_ZThn4_N3ccc8DD5x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y0E = {  "_ZN3ccc8DD5x12y0E", // class name
  bases__ZN3ccc8DD5x12y0E, 2,
  &(vtc__ZN3ccc8DD5x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y0E),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  CC5x12y1  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x12y13efgEv
  ~CC5x12y1(); // tgen
  CC5x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y1E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y13abcEv");}
void  ccc::CC5x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y13pqrEv");}
void  ccc::CC5x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y13efgEv");}
ccc::CC5x12y1 ::~CC5x12y1(){ note_dtor("_ZN3ccc8CC5x12y1E", this);} // tgen
ccc::CC5x12y1 ::CC5x12y1(){ note_ctor("_ZN3ccc8CC5x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y1E, buf);
    ::ccc::CC5x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y1E);
    dp->::ccc::CC5x12y1::~CC5x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y1E(Test__ZN3ccc8CC5x12y1E, "_ZN3ccc8CC5x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y1C1Ev();
extern void _ZN3ccc8CC5x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y1E[] = {
  NSPAIR(_ZN3ccc8CC5x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y1E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y1E[];
extern void _ZN3ccc8CC5x12y13abcEv();
extern void _ZN3ccc8CC5x12y13pqrEv();
extern void _ZN3ccc8CC5x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y13pqrEv,_ZTv0_n12_N3ccc8CC5x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y13pqrEv,_ZThn4_N3ccc8CC5x12y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y13efgEv,_ZTv0_n16_N3ccc8CC5x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y13efgEv,_ZThn4_N3ccc8CC5x12y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y13abcEv,_ZTv0_n20_N3ccc8CC5x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y13abcEv,_ZThn4_N3ccc8CC5x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y13pqrEv,_ZTv0_n12_N3ccc8CC5x12y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y13efgEv,_ZTv0_n16_N3ccc8CC5x12y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y13abcEv,_ZTv0_n20_N3ccc8CC5x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y1E[] = {
  {&(_ZTVN3ccc8CC5x12y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y1E[];
static VTBL_ENTRY alt_thunk_names263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y13abcEv,_ZTv0_n20_N3ccc8CC5x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y13abcEv,_ZThn4_N3ccc8CC5x12y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y13efgEv,_ZTv0_n16_N3ccc8CC5x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y13efgEv,_ZThn4_N3ccc8CC5x12y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y13pqrEv,_ZTv0_n12_N3ccc8CC5x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y13pqrEv,_ZThn4_N3ccc8CC5x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y1E = {  "_ZN3ccc8CC5x12y1E", // class name
  bases__ZN3ccc8CC5x12y1E, 2,
  &(vtc__ZN3ccc8CC5x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y1E),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  DD5x12y1  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD5x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x12y13efgEv
  ~DD5x12y1(); // tgen
  DD5x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y13abcEv");}
void  ccc::DD5x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y13pqrEv");}
void  ccc::DD5x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y13efgEv");}
ccc::DD5x12y1 ::~DD5x12y1(){ note_dtor("_ZN3ccc8DD5x12y1E", this);} // tgen
ccc::DD5x12y1 ::DD5x12y1(){ note_ctor("_ZN3ccc8DD5x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y1E, buf);
    ::ccc::DD5x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y1E);
    dp->::ccc::DD5x12y1::~DD5x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y1E(Test__ZN3ccc8DD5x12y1E, "_ZN3ccc8DD5x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y1C1Ev();
extern void _ZN3ccc8DD5x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y1E[] = {
  NSPAIR(_ZN3ccc8DD5x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y1E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y1E[];
extern void _ZN3ccc8DD5x12y13pqrEv();
extern void _ZN3ccc8DD5x12y13efgEv();
extern void _ZN3ccc8DD5x12y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y13abcEv,_ZTv0_n12_N3ccc8DD5x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y13abcEv,_ZThn4_N3ccc8DD5x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y13abcEv,_ZTv0_n12_N3ccc8DD5x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y1E[] = {
  {&(_ZTVN3ccc8DD5x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y1E[];
static VTBL_ENTRY alt_thunk_names264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y13abcEv,_ZTv0_n12_N3ccc8DD5x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y13abcEv,_ZThn4_N3ccc8DD5x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y1E = {  "_ZN3ccc8DD5x12y1E", // class name
  bases__ZN3ccc8DD5x12y1E, 2,
  &(vtc__ZN3ccc8DD5x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y1E),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  CC5x12y2  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y23pqrEv
  ~CC5x12y2(); // tgen
  CC5x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y2E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y23efgEv");}
void  ccc::CC5x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y23abcEv");}
void  ccc::CC5x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y23pqrEv");}
ccc::CC5x12y2 ::~CC5x12y2(){ note_dtor("_ZN3ccc8CC5x12y2E", this);} // tgen
ccc::CC5x12y2 ::CC5x12y2(){ note_ctor("_ZN3ccc8CC5x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y2E, buf);
    ::ccc::CC5x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y2E);
    dp->::ccc::CC5x12y2::~CC5x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y2E(Test__ZN3ccc8CC5x12y2E, "_ZN3ccc8CC5x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y2C1Ev();
extern void _ZN3ccc8CC5x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y2E[] = {
  NSPAIR(_ZN3ccc8CC5x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y2E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y2E[];
extern void _ZN3ccc8CC5x12y23abcEv();
extern void _ZN3ccc8CC5x12y23efgEv();
extern void _ZN3ccc8CC5x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y23pqrEv,_ZTv0_n12_N3ccc8CC5x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y23pqrEv,_ZThn4_N3ccc8CC5x12y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y23efgEv,_ZTv0_n16_N3ccc8CC5x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y23efgEv,_ZThn4_N3ccc8CC5x12y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y23abcEv,_ZTv0_n20_N3ccc8CC5x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y23abcEv,_ZThn4_N3ccc8CC5x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y23pqrEv,_ZTv0_n12_N3ccc8CC5x12y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y23efgEv,_ZTv0_n16_N3ccc8CC5x12y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y23abcEv,_ZTv0_n20_N3ccc8CC5x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y2E[] = {
  {&(_ZTVN3ccc8CC5x12y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y2E[];
static VTBL_ENTRY alt_thunk_names265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y23abcEv,_ZTv0_n20_N3ccc8CC5x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y23abcEv,_ZThn4_N3ccc8CC5x12y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y23efgEv,_ZTv0_n16_N3ccc8CC5x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y23efgEv,_ZThn4_N3ccc8CC5x12y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y23pqrEv,_ZTv0_n12_N3ccc8CC5x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y23pqrEv,_ZThn4_N3ccc8CC5x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y2E = {  "_ZN3ccc8CC5x12y2E", // class name
  bases__ZN3ccc8CC5x12y2E, 2,
  &(vtc__ZN3ccc8CC5x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y2E),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  DD5x12y2  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD5x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD5x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x12y23pqrEv
  ~DD5x12y2(); // tgen
  DD5x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y23efgEv");}
void  ccc::DD5x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y23abcEv");}
void  ccc::DD5x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y23pqrEv");}
ccc::DD5x12y2 ::~DD5x12y2(){ note_dtor("_ZN3ccc8DD5x12y2E", this);} // tgen
ccc::DD5x12y2 ::DD5x12y2(){ note_ctor("_ZN3ccc8DD5x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y2E, buf);
    ::ccc::DD5x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y2E);
    dp->::ccc::DD5x12y2::~DD5x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y2E(Test__ZN3ccc8DD5x12y2E, "_ZN3ccc8DD5x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y2C1Ev();
extern void _ZN3ccc8DD5x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y2E[] = {
  NSPAIR(_ZN3ccc8DD5x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y2E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y2E[];
extern void _ZN3ccc8DD5x12y23pqrEv();
extern void _ZN3ccc8DD5x12y23efgEv();
extern void _ZN3ccc8DD5x12y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y23abcEv,_ZTv0_n12_N3ccc8DD5x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y23abcEv,_ZThn4_N3ccc8DD5x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y23abcEv,_ZTv0_n12_N3ccc8DD5x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y2E[] = {
  {&(_ZTVN3ccc8DD5x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y2E[];
static VTBL_ENTRY alt_thunk_names266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y23abcEv,_ZTv0_n12_N3ccc8DD5x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y23abcEv,_ZThn4_N3ccc8DD5x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y2E = {  "_ZN3ccc8DD5x12y2E", // class name
  bases__ZN3ccc8DD5x12y2E, 2,
  &(vtc__ZN3ccc8DD5x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y2E),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  CC5x12y3  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x12y33abcEv
  ~CC5x12y3(); // tgen
  CC5x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y3E) C1{ VBC2{ v2 v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y33efgEv");}
void  ccc::CC5x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y33pqrEv");}
void  ccc::CC5x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y33abcEv");}
ccc::CC5x12y3 ::~CC5x12y3(){ note_dtor("_ZN3ccc8CC5x12y3E", this);} // tgen
ccc::CC5x12y3 ::CC5x12y3(){ note_ctor("_ZN3ccc8CC5x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y3E, buf);
    ::ccc::CC5x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y3E);
    dp->::ccc::CC5x12y3::~CC5x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y3E(Test__ZN3ccc8CC5x12y3E, "_ZN3ccc8CC5x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y3C1Ev();
extern void _ZN3ccc8CC5x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y3E[] = {
  NSPAIR(_ZN3ccc8CC5x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y3E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y3E[];
extern void _ZN3ccc8CC5x12y33abcEv();
extern void _ZN3ccc8CC5x12y33efgEv();
extern void _ZN3ccc8CC5x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y33pqrEv,_ZTv0_n12_N3ccc8CC5x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y33pqrEv,_ZThn4_N3ccc8CC5x12y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y33efgEv,_ZTv0_n16_N3ccc8CC5x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y33efgEv,_ZThn4_N3ccc8CC5x12y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y33abcEv,_ZTv0_n20_N3ccc8CC5x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y33abcEv,_ZThn4_N3ccc8CC5x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y33pqrEv,_ZTv0_n12_N3ccc8CC5x12y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y33efgEv,_ZTv0_n16_N3ccc8CC5x12y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y33abcEv,_ZTv0_n20_N3ccc8CC5x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y3E[] = {
  {&(_ZTVN3ccc8CC5x12y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y3E[];
static VTBL_ENTRY alt_thunk_names267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y33abcEv,_ZTv0_n20_N3ccc8CC5x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y33abcEv,_ZThn4_N3ccc8CC5x12y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y33efgEv,_ZTv0_n16_N3ccc8CC5x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y33efgEv,_ZThn4_N3ccc8CC5x12y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y33pqrEv,_ZTv0_n12_N3ccc8CC5x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y33pqrEv,_ZThn4_N3ccc8CC5x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y3E = {  "_ZN3ccc8CC5x12y3E", // class name
  bases__ZN3ccc8CC5x12y3E, 2,
  &(vtc__ZN3ccc8CC5x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y3E),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  DD5x12y3  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD5x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x12y33abcEv
  ~DD5x12y3(); // tgen
  DD5x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y33efgEv");}
void  ccc::DD5x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y33pqrEv");}
void  ccc::DD5x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y33abcEv");}
ccc::DD5x12y3 ::~DD5x12y3(){ note_dtor("_ZN3ccc8DD5x12y3E", this);} // tgen
ccc::DD5x12y3 ::DD5x12y3(){ note_ctor("_ZN3ccc8DD5x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y3E, buf);
    ::ccc::DD5x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y3E);
    dp->::ccc::DD5x12y3::~DD5x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y3E(Test__ZN3ccc8DD5x12y3E, "_ZN3ccc8DD5x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y3C1Ev();
extern void _ZN3ccc8DD5x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y3E[] = {
  NSPAIR(_ZN3ccc8DD5x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y3E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y3E[];
extern void _ZN3ccc8DD5x12y33pqrEv();
extern void _ZN3ccc8DD5x12y33efgEv();
extern void _ZN3ccc8DD5x12y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y33abcEv,_ZTv0_n12_N3ccc8DD5x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y33abcEv,_ZThn4_N3ccc8DD5x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y33abcEv,_ZTv0_n12_N3ccc8DD5x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y3E[] = {
  {&(_ZTVN3ccc8DD5x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y3E[];
static VTBL_ENTRY alt_thunk_names268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y33abcEv,_ZTv0_n12_N3ccc8DD5x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y33abcEv,_ZThn4_N3ccc8DD5x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y3E = {  "_ZN3ccc8DD5x12y3E", // class name
  bases__ZN3ccc8DD5x12y3E, 2,
  &(vtc__ZN3ccc8DD5x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y3E),3, //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  CC5x12y4  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC5x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x12y43efgEv
  ~CC5x12y4(); // tgen
  CC5x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y4E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y43pqrEv");}
void  ccc::CC5x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y43abcEv");}
void  ccc::CC5x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y43efgEv");}
ccc::CC5x12y4 ::~CC5x12y4(){ note_dtor("_ZN3ccc8CC5x12y4E", this);} // tgen
ccc::CC5x12y4 ::CC5x12y4(){ note_ctor("_ZN3ccc8CC5x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y4E, buf);
    ::ccc::CC5x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y4E);
    dp->::ccc::CC5x12y4::~CC5x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y4E(Test__ZN3ccc8CC5x12y4E, "_ZN3ccc8CC5x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y4C1Ev();
extern void _ZN3ccc8CC5x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y4E[] = {
  NSPAIR(_ZN3ccc8CC5x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y4E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y4E[];
extern void _ZN3ccc8CC5x12y43abcEv();
extern void _ZN3ccc8CC5x12y43pqrEv();
extern void _ZN3ccc8CC5x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y43pqrEv,_ZTv0_n12_N3ccc8CC5x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y43pqrEv,_ZThn4_N3ccc8CC5x12y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y43efgEv,_ZTv0_n16_N3ccc8CC5x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y43efgEv,_ZThn4_N3ccc8CC5x12y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y43abcEv,_ZTv0_n20_N3ccc8CC5x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y43abcEv,_ZThn4_N3ccc8CC5x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y43pqrEv,_ZTv0_n12_N3ccc8CC5x12y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y43efgEv,_ZTv0_n16_N3ccc8CC5x12y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y43abcEv,_ZTv0_n20_N3ccc8CC5x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y4E[] = {
  {&(_ZTVN3ccc8CC5x12y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y4E[];
static VTBL_ENTRY alt_thunk_names269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y43abcEv,_ZTv0_n20_N3ccc8CC5x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y43abcEv,_ZThn4_N3ccc8CC5x12y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y43efgEv,_ZTv0_n16_N3ccc8CC5x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y43efgEv,_ZThn4_N3ccc8CC5x12y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y43pqrEv,_ZTv0_n12_N3ccc8CC5x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y43pqrEv,_ZThn4_N3ccc8CC5x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y4E = {  "_ZN3ccc8CC5x12y4E", // class name
  bases__ZN3ccc8CC5x12y4E, 2,
  &(vtc__ZN3ccc8CC5x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y4E),2, //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  DD5x12y4  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD5x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD5x12y43efgEv
  ~DD5x12y4(); // tgen
  DD5x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y43pqrEv");}
void  ccc::DD5x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y43abcEv");}
void  ccc::DD5x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y43efgEv");}
ccc::DD5x12y4 ::~DD5x12y4(){ note_dtor("_ZN3ccc8DD5x12y4E", this);} // tgen
ccc::DD5x12y4 ::DD5x12y4(){ note_ctor("_ZN3ccc8DD5x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y4E, buf);
    ::ccc::DD5x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y4E);
    dp->::ccc::DD5x12y4::~DD5x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y4E(Test__ZN3ccc8DD5x12y4E, "_ZN3ccc8DD5x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y4C1Ev();
extern void _ZN3ccc8DD5x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y4E[] = {
  NSPAIR(_ZN3ccc8DD5x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y4E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y4E[];
extern void _ZN3ccc8DD5x12y43pqrEv();
extern void _ZN3ccc8DD5x12y43efgEv();
extern void _ZN3ccc8DD5x12y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y43abcEv,_ZTv0_n12_N3ccc8DD5x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y43abcEv,_ZThn4_N3ccc8DD5x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y43abcEv,_ZTv0_n12_N3ccc8DD5x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y4E[] = {
  {&(_ZTVN3ccc8DD5x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y4E[];
static VTBL_ENTRY alt_thunk_names270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y43abcEv,_ZTv0_n12_N3ccc8DD5x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y43abcEv,_ZThn4_N3ccc8DD5x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y4E = {  "_ZN3ccc8DD5x12y4E", // class name
  bases__ZN3ccc8DD5x12y4E, 2,
  &(vtc__ZN3ccc8DD5x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y4E),3, //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  CC5x12y5  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC5x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x12y53abcEv
  ~CC5x12y5(); // tgen
  CC5x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y5E) C1{ VBC2{ v1 v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y53pqrEv");}
void  ccc::CC5x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y53efgEv");}
void  ccc::CC5x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y53abcEv");}
ccc::CC5x12y5 ::~CC5x12y5(){ note_dtor("_ZN3ccc8CC5x12y5E", this);} // tgen
ccc::CC5x12y5 ::CC5x12y5(){ note_ctor("_ZN3ccc8CC5x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y5E, buf);
    ::ccc::CC5x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y5E);
    dp->::ccc::CC5x12y5::~CC5x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y5E(Test__ZN3ccc8CC5x12y5E, "_ZN3ccc8CC5x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y5C1Ev();
extern void _ZN3ccc8CC5x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y5E[] = {
  NSPAIR(_ZN3ccc8CC5x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y5E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y5E[];
extern void _ZN3ccc8CC5x12y53abcEv();
extern void _ZN3ccc8CC5x12y53pqrEv();
extern void _ZN3ccc8CC5x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y53pqrEv,_ZTv0_n12_N3ccc8CC5x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y53pqrEv,_ZThn4_N3ccc8CC5x12y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y53efgEv,_ZTv0_n16_N3ccc8CC5x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y53efgEv,_ZThn4_N3ccc8CC5x12y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y53abcEv,_ZTv0_n20_N3ccc8CC5x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y53abcEv,_ZThn4_N3ccc8CC5x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y53pqrEv,_ZTv0_n12_N3ccc8CC5x12y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y53efgEv,_ZTv0_n16_N3ccc8CC5x12y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y53abcEv,_ZTv0_n20_N3ccc8CC5x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y5E[] = {
  {&(_ZTVN3ccc8CC5x12y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y5E[];
static VTBL_ENTRY alt_thunk_names271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y53abcEv,_ZTv0_n20_N3ccc8CC5x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y53abcEv,_ZThn4_N3ccc8CC5x12y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y53efgEv,_ZTv0_n16_N3ccc8CC5x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y53efgEv,_ZThn4_N3ccc8CC5x12y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y53pqrEv,_ZTv0_n12_N3ccc8CC5x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y53pqrEv,_ZThn4_N3ccc8CC5x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y5E = {  "_ZN3ccc8CC5x12y5E", // class name
  bases__ZN3ccc8CC5x12y5E, 2,
  &(vtc__ZN3ccc8CC5x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y5E),2, //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  DD5x12y5  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD5x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD5x12y53abcEv
  ~DD5x12y5(); // tgen
  DD5x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y53pqrEv");}
void  ccc::DD5x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y53efgEv");}
void  ccc::DD5x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y53abcEv");}
ccc::DD5x12y5 ::~DD5x12y5(){ note_dtor("_ZN3ccc8DD5x12y5E", this);} // tgen
ccc::DD5x12y5 ::DD5x12y5(){ note_ctor("_ZN3ccc8DD5x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y5E, buf);
    ::ccc::DD5x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y5E);
    dp->::ccc::DD5x12y5::~DD5x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y5E(Test__ZN3ccc8DD5x12y5E, "_ZN3ccc8DD5x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y5C1Ev();
extern void _ZN3ccc8DD5x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y5E[] = {
  NSPAIR(_ZN3ccc8DD5x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y5E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y5E[];
extern void _ZN3ccc8DD5x12y53pqrEv();
extern void _ZN3ccc8DD5x12y53efgEv();
extern void _ZN3ccc8DD5x12y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y53abcEv,_ZTv0_n12_N3ccc8DD5x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y53abcEv,_ZThn4_N3ccc8DD5x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y53abcEv,_ZTv0_n12_N3ccc8DD5x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y5E[] = {
  {&(_ZTVN3ccc8DD5x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y5E[];
static VTBL_ENTRY alt_thunk_names272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y53abcEv,_ZTv0_n12_N3ccc8DD5x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y53abcEv,_ZThn4_N3ccc8DD5x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y5E = {  "_ZN3ccc8DD5x12y5E", // class name
  bases__ZN3ccc8DD5x12y5E, 2,
  &(vtc__ZN3ccc8DD5x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y5E),3, //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  CC5x12y6  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x12y63efgEv
  ~CC5x12y6(); // tgen
  CC5x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y6E) C1{ VBC2{ v3 v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y63abcEv");}
void  ccc::CC5x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y63efgEv");}
ccc::CC5x12y6 ::~CC5x12y6(){ note_dtor("_ZN3ccc8CC5x12y6E", this);} // tgen
ccc::CC5x12y6 ::CC5x12y6(){ note_ctor("_ZN3ccc8CC5x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y6E, buf);
    ::ccc::CC5x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y6E);
    dp->::ccc::CC5x12y6::~CC5x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y6E(Test__ZN3ccc8CC5x12y6E, "_ZN3ccc8CC5x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y6C1Ev();
extern void _ZN3ccc8CC5x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y6E[] = {
  NSPAIR(_ZN3ccc8CC5x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x12y6E[];
extern void _ZN3ccc8CC5x12y63abcEv();
extern void _ZN3ccc8CC5x12y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y63efgEv,_ZTv0_n16_N3ccc8CC5x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y63efgEv,_ZThn4_N3ccc8CC5x12y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y63abcEv,_ZTv0_n20_N3ccc8CC5x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y63abcEv,_ZThn4_N3ccc8CC5x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y63efgEv,_ZTv0_n16_N3ccc8CC5x12y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y63abcEv,_ZTv0_n20_N3ccc8CC5x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y6E[] = {
  {&(_ZTVN3ccc8CC5x12y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x12y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y6E[];
static VTBL_ENTRY alt_thunk_names273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y63abcEv,_ZTv0_n20_N3ccc8CC5x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y63abcEv,_ZThn4_N3ccc8CC5x12y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y63efgEv,_ZTv0_n16_N3ccc8CC5x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y63efgEv,_ZThn4_N3ccc8CC5x12y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y6E = {  "_ZN3ccc8CC5x12y6E", // class name
  bases__ZN3ccc8CC5x12y6E, 2,
  &(vtc__ZN3ccc8CC5x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y6E),2, //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  DD5x12y6  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD5x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD5x12y63efgEv
  ~DD5x12y6(); // tgen
  DD5x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y63abcEv");}
void  ccc::DD5x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y63efgEv");}
ccc::DD5x12y6 ::~DD5x12y6(){ note_dtor("_ZN3ccc8DD5x12y6E", this);} // tgen
ccc::DD5x12y6 ::DD5x12y6(){ note_ctor("_ZN3ccc8DD5x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y6E, buf);
    ::ccc::DD5x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y6E);
    dp->::ccc::DD5x12y6::~DD5x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y6E(Test__ZN3ccc8DD5x12y6E, "_ZN3ccc8DD5x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y6C1Ev();
extern void _ZN3ccc8DD5x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y6E[] = {
  NSPAIR(_ZN3ccc8DD5x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y6E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x12y63efgEv();
extern void _ZN3ccc8DD5x12y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y63abcEv,_ZTv0_n12_N3ccc8DD5x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y63abcEv,_ZThn4_N3ccc8DD5x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y63abcEv,_ZTv0_n12_N3ccc8DD5x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y6E[] = {
  {&(_ZTVN3ccc8DD5x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y6E[];
static VTBL_ENTRY alt_thunk_names274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y63abcEv,_ZTv0_n12_N3ccc8DD5x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y63abcEv,_ZThn4_N3ccc8DD5x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y6E = {  "_ZN3ccc8DD5x12y6E", // class name
  bases__ZN3ccc8DD5x12y6E, 2,
  &(vtc__ZN3ccc8DD5x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y6E),3, //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  CC5x12y7  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC5x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y73pqrEv
  ~CC5x12y7(); // tgen
  CC5x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y7E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y73abcEv");}
void  ccc::CC5x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y73pqrEv");}
ccc::CC5x12y7 ::~CC5x12y7(){ note_dtor("_ZN3ccc8CC5x12y7E", this);} // tgen
ccc::CC5x12y7 ::CC5x12y7(){ note_ctor("_ZN3ccc8CC5x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y7E, buf);
    ::ccc::CC5x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y7E);
    dp->::ccc::CC5x12y7::~CC5x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y7E(Test__ZN3ccc8CC5x12y7E, "_ZN3ccc8CC5x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y7C1Ev();
extern void _ZN3ccc8CC5x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y7E[] = {
  NSPAIR(_ZN3ccc8CC5x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x12y7E[];
extern void _ZN3ccc8CC5x12y73abcEv();
extern void _ZN3ccc8CC5x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y73pqrEv,_ZTv0_n12_N3ccc8CC5x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y73pqrEv,_ZThn4_N3ccc8CC5x12y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y73abcEv,_ZTv0_n20_N3ccc8CC5x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y73abcEv,_ZThn4_N3ccc8CC5x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y73pqrEv,_ZTv0_n12_N3ccc8CC5x12y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y73abcEv,_ZTv0_n20_N3ccc8CC5x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y7E[] = {
  {&(_ZTVN3ccc8CC5x12y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x12y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y7E[];
static VTBL_ENTRY alt_thunk_names275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y73abcEv,_ZTv0_n20_N3ccc8CC5x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y73abcEv,_ZThn4_N3ccc8CC5x12y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y73pqrEv,_ZTv0_n12_N3ccc8CC5x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y73pqrEv,_ZThn4_N3ccc8CC5x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y7E = {  "_ZN3ccc8CC5x12y7E", // class name
  bases__ZN3ccc8CC5x12y7E, 2,
  &(vtc__ZN3ccc8CC5x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y7E),2, //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  DD5x12y7  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD5x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x12y73pqrEv
  ~DD5x12y7(); // tgen
  DD5x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y73abcEv");}
void  ccc::DD5x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y73pqrEv");}
ccc::DD5x12y7 ::~DD5x12y7(){ note_dtor("_ZN3ccc8DD5x12y7E", this);} // tgen
ccc::DD5x12y7 ::DD5x12y7(){ note_ctor("_ZN3ccc8DD5x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y7E, buf);
    ::ccc::DD5x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y7E);
    dp->::ccc::DD5x12y7::~DD5x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y7E(Test__ZN3ccc8DD5x12y7E, "_ZN3ccc8DD5x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y7C1Ev();
extern void _ZN3ccc8DD5x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y7E[] = {
  NSPAIR(_ZN3ccc8DD5x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y7E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y7E[];
extern void _ZN3ccc8DD5x12y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x12y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y73abcEv,_ZTv0_n12_N3ccc8DD5x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y73abcEv,_ZThn4_N3ccc8DD5x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y73abcEv,_ZTv0_n12_N3ccc8DD5x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y7E[] = {
  {&(_ZTVN3ccc8DD5x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y7E[];
static VTBL_ENTRY alt_thunk_names276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y73abcEv,_ZTv0_n12_N3ccc8DD5x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y73abcEv,_ZThn4_N3ccc8DD5x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y7E = {  "_ZN3ccc8DD5x12y7E", // class name
  bases__ZN3ccc8DD5x12y7E, 2,
  &(vtc__ZN3ccc8DD5x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y7E),3, //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  CC5x12y8  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x12y83abcEv
  ~CC5x12y8(); // tgen
  CC5x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y8E) C1{ VBC2{ v3 v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y83efgEv");}
void  ccc::CC5x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x12y83abcEv");}
ccc::CC5x12y8 ::~CC5x12y8(){ note_dtor("_ZN3ccc8CC5x12y8E", this);} // tgen
ccc::CC5x12y8 ::CC5x12y8(){ note_ctor("_ZN3ccc8CC5x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y8E, buf);
    ::ccc::CC5x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y8E);
    dp->::ccc::CC5x12y8::~CC5x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y8E(Test__ZN3ccc8CC5x12y8E, "_ZN3ccc8CC5x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y8C1Ev();
extern void _ZN3ccc8CC5x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y8E[] = {
  NSPAIR(_ZN3ccc8CC5x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x12y8E[];
extern void _ZN3ccc8CC5x12y83abcEv();
extern void _ZN3ccc8CC5x12y83efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y83efgEv,_ZTv0_n16_N3ccc8CC5x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y83efgEv,_ZThn4_N3ccc8CC5x12y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x12y83abcEv,_ZTv0_n20_N3ccc8CC5x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y83abcEv,_ZThn4_N3ccc8CC5x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y83efgEv,_ZTv0_n16_N3ccc8CC5x12y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x12y83abcEv,_ZTv0_n20_N3ccc8CC5x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y8E[] = {
  {&(_ZTVN3ccc8CC5x12y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x12y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y8E[];
static VTBL_ENTRY alt_thunk_names277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x12y83abcEv,_ZTv0_n20_N3ccc8CC5x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y83abcEv,_ZThn4_N3ccc8CC5x12y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y83efgEv,_ZTv0_n16_N3ccc8CC5x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y83efgEv,_ZThn4_N3ccc8CC5x12y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y8E = {  "_ZN3ccc8CC5x12y8E", // class name
  bases__ZN3ccc8CC5x12y8E, 2,
  &(vtc__ZN3ccc8CC5x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y8E),2, //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  DD5x12y8  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD5x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD5x12y83abcEv
  ~DD5x12y8(); // tgen
  DD5x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y83efgEv");}
void  ccc::DD5x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x12y83abcEv");}
ccc::DD5x12y8 ::~DD5x12y8(){ note_dtor("_ZN3ccc8DD5x12y8E", this);} // tgen
ccc::DD5x12y8 ::DD5x12y8(){ note_ctor("_ZN3ccc8DD5x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y8E, buf);
    ::ccc::DD5x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y8E);
    dp->::ccc::DD5x12y8::~DD5x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y8E(Test__ZN3ccc8DD5x12y8E, "_ZN3ccc8DD5x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y8C1Ev();
extern void _ZN3ccc8DD5x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y8E[] = {
  NSPAIR(_ZN3ccc8DD5x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y8E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x12y83efgEv();
extern void _ZN3ccc8DD5x12y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x12y83abcEv,_ZTv0_n12_N3ccc8DD5x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x12y83abcEv,_ZThn4_N3ccc8DD5x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x12y83abcEv,_ZTv0_n12_N3ccc8DD5x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y8E[] = {
  {&(_ZTVN3ccc8DD5x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y8E[];
static VTBL_ENTRY alt_thunk_names278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x12y83abcEv,_ZTv0_n12_N3ccc8DD5x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x12y83abcEv,_ZThn4_N3ccc8DD5x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x12y8E = {  "_ZN3ccc8DD5x12y8E", // class name
  bases__ZN3ccc8DD5x12y8E, 2,
  &(vtc__ZN3ccc8DD5x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y8E),3, //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  CC5x12y9  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC5x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x12y93pqrEv
  ~CC5x12y9(); // tgen
  CC5x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x12y9E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x12y93efgEv");}
void  ccc::CC5x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x12y93pqrEv");}
ccc::CC5x12y9 ::~CC5x12y9(){ note_dtor("_ZN3ccc8CC5x12y9E", this);} // tgen
ccc::CC5x12y9 ::CC5x12y9(){ note_ctor("_ZN3ccc8CC5x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC5x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x12y9E, buf);
    ::ccc::CC5x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x12y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC5x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x12y9E);
    dp->::ccc::CC5x12y9::~CC5x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x12y9E(Test__ZN3ccc8CC5x12y9E, "_ZN3ccc8CC5x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x12y9C1Ev();
extern void _ZN3ccc8CC5x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC5x12y9E[] = {
  NSPAIR(_ZN3ccc8CC5x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC5x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC5x12y9E[] = {
  // 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__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 _ZTIN3ccc8CC5x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC5x12y93efgEv();
extern void _ZN3ccc8CC5x12y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x12y93pqrEv,_ZTv0_n12_N3ccc8CC5x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y93pqrEv,_ZThn4_N3ccc8CC5x12y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x12y93efgEv,_ZTv0_n16_N3ccc8CC5x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x12y93efgEv,_ZThn4_N3ccc8CC5x12y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x12y93pqrEv,_ZTv0_n12_N3ccc8CC5x12y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x12y93efgEv,_ZTv0_n16_N3ccc8CC5x12y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x12y9E[] = {
  {&(_ZTVN3ccc8CC5x12y9E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x12y9E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x12y9E[];
static VTBL_ENTRY alt_thunk_names279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x12y93efgEv,_ZTv0_n16_N3ccc8CC5x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y93efgEv,_ZThn4_N3ccc8CC5x12y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x12y93pqrEv,_ZTv0_n12_N3ccc8CC5x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x12y93pqrEv,_ZThn4_N3ccc8CC5x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x12y9E = {  "_ZN3ccc8CC5x12y9E", // class name
  bases__ZN3ccc8CC5x12y9E, 2,
  &(vtc__ZN3ccc8CC5x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x12y9E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x12y9E),2, //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  DD5x12y9  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD5x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x12y93pqrEv
  ~DD5x12y9(); // tgen
  DD5x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD5x12y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x12y93efgEv");}
void  ccc::DD5x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x12y93pqrEv");}
ccc::DD5x12y9 ::~DD5x12y9(){ note_dtor("_ZN3ccc8DD5x12y9E", this);} // tgen
ccc::DD5x12y9 ::DD5x12y9(){ note_ctor("_ZN3ccc8DD5x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD5x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x12y9E, buf);
    ::ccc::DD5x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x12y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD5x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x12y9E);
    dp->::ccc::DD5x12y9::~DD5x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x12y9E(Test__ZN3ccc8DD5x12y9E, "_ZN3ccc8DD5x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x12y9C1Ev();
extern void _ZN3ccc8DD5x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD5x12y9E[] = {
  NSPAIR(_ZN3ccc8DD5x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD5x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD5x12y9E[] = {
  // 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__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 _ZTIN3ccc8DD5x12y9E[];
extern void _ZN3ccc8DD5x12y93pqrEv();
extern void _ZN3ccc8DD5x12y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x12y9E[] = {
  {&(_ZTVN3ccc8DD5x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x12y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x12y9E[];
Class_Descriptor cd__ZN3ccc8DD5x12y9E = {  "_ZN3ccc8DD5x12y9E", // class name
  bases__ZN3ccc8DD5x12y9E, 2,
  &(vtc__ZN3ccc8DD5x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x12y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x12y9E),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  CC5x12y10  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC5x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x12y103abcEv
  ~CC5x12y10(); // tgen
  CC5x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y10E) C1{ VBC2{ v1 v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x12y103pqrEv");}
void  ccc::CC5x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x12y103abcEv");}
ccc::CC5x12y10 ::~CC5x12y10(){ note_dtor("_ZN3ccc9CC5x12y10E", this);} // tgen
ccc::CC5x12y10 ::CC5x12y10(){ note_ctor("_ZN3ccc9CC5x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC5x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x12y10E, buf);
    ::ccc::CC5x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x12y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC5x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x12y10E);
    dp->::ccc::CC5x12y10::~CC5x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x12y10E(Test__ZN3ccc9CC5x12y10E, "_ZN3ccc9CC5x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x12y10C1Ev();
extern void _ZN3ccc9CC5x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC5x12y10E[] = {
  NSPAIR(_ZN3ccc9CC5x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC5x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC5x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x12y10E[];
extern void _ZN3ccc9CC5x12y103abcEv();
extern void _ZN3ccc9CC5x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x12y103pqrEv,_ZTv0_n12_N3ccc9CC5x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y103pqrEv,_ZThn4_N3ccc9CC5x12y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x12y103abcEv,_ZTv0_n20_N3ccc9CC5x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y103abcEv,_ZThn4_N3ccc9CC5x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x12y103pqrEv,_ZTv0_n12_N3ccc9CC5x12y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x12y103abcEv,_ZTv0_n20_N3ccc9CC5x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x12y10E[] = {
  {&(_ZTVN3ccc9CC5x12y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x12y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x12y10E[];
static VTBL_ENTRY alt_thunk_names280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x12y103abcEv,_ZTv0_n20_N3ccc9CC5x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y103abcEv,_ZThn4_N3ccc9CC5x12y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x12y103pqrEv,_ZTv0_n12_N3ccc9CC5x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y103pqrEv,_ZThn4_N3ccc9CC5x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x12y10E = {  "_ZN3ccc9CC5x12y10E", // class name
  bases__ZN3ccc9CC5x12y10E, 2,
  &(vtc__ZN3ccc9CC5x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x12y10E),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  DD5x12y10  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD5x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD5x12y103abcEv
  ~DD5x12y10(); // tgen
  DD5x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD5x12y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x12y103pqrEv");}
void  ccc::DD5x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x12y103abcEv");}
ccc::DD5x12y10 ::~DD5x12y10(){ note_dtor("_ZN3ccc9DD5x12y10E", this);} // tgen
ccc::DD5x12y10 ::DD5x12y10(){ note_ctor("_ZN3ccc9DD5x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD5x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x12y10E, buf);
    ::ccc::DD5x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x12y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD5x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x12y10E);
    dp->::ccc::DD5x12y10::~DD5x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x12y10E(Test__ZN3ccc9DD5x12y10E, "_ZN3ccc9DD5x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x12y10C1Ev();
extern void _ZN3ccc9DD5x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD5x12y10E[] = {
  NSPAIR(_ZN3ccc9DD5x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD5x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD5x12y10E[] = {
  // 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__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 _ZTIN3ccc9DD5x12y10E[];
extern void _ZN3ccc9DD5x12y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x12y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x12y103abcEv,_ZTv0_n12_N3ccc9DD5x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x12y103abcEv,_ZThn4_N3ccc9DD5x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x12y103abcEv,_ZTv0_n12_N3ccc9DD5x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x12y10E[] = {
  {&(_ZTVN3ccc9DD5x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x12y10E[];
static VTBL_ENTRY alt_thunk_names281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x12y103abcEv,_ZTv0_n12_N3ccc9DD5x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x12y103abcEv,_ZThn4_N3ccc9DD5x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x12y10E = {  "_ZN3ccc9DD5x12y10E", // class name
  bases__ZN3ccc9DD5x12y10E, 2,
  &(vtc__ZN3ccc9DD5x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x12y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x12y10E),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  CC5x12y11  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC5x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x12y113efgEv
  ~CC5x12y11(); // tgen
  CC5x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y11E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x12y113pqrEv");}
void  ccc::CC5x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x12y113efgEv");}
ccc::CC5x12y11 ::~CC5x12y11(){ note_dtor("_ZN3ccc9CC5x12y11E", this);} // tgen
ccc::CC5x12y11 ::CC5x12y11(){ note_ctor("_ZN3ccc9CC5x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC5x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x12y11E, buf);
    ::ccc::CC5x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x12y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC5x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x12y11E);
    dp->::ccc::CC5x12y11::~CC5x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x12y11E(Test__ZN3ccc9CC5x12y11E, "_ZN3ccc9CC5x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x12y11C1Ev();
extern void _ZN3ccc9CC5x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC5x12y11E[] = {
  NSPAIR(_ZN3ccc9CC5x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC5x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC5x12y11E[] = {
  // 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__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 _ZTIN3ccc9CC5x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC5x12y113pqrEv();
extern void _ZN3ccc9CC5x12y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x12y113pqrEv,_ZTv0_n12_N3ccc9CC5x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y113pqrEv,_ZThn4_N3ccc9CC5x12y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x12y113efgEv,_ZTv0_n16_N3ccc9CC5x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y113efgEv,_ZThn4_N3ccc9CC5x12y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x12y113pqrEv,_ZTv0_n12_N3ccc9CC5x12y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x12y113efgEv,_ZTv0_n16_N3ccc9CC5x12y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x12y11E[] = {
  {&(_ZTVN3ccc9CC5x12y11E[3]),  3,14},
  {&(_ZTVN3ccc9CC5x12y11E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x12y11E[];
static VTBL_ENTRY alt_thunk_names282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x12y113efgEv,_ZTv0_n16_N3ccc9CC5x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y113efgEv,_ZThn4_N3ccc9CC5x12y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x12y113pqrEv,_ZTv0_n12_N3ccc9CC5x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y113pqrEv,_ZThn4_N3ccc9CC5x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x12y11E = {  "_ZN3ccc9CC5x12y11E", // class name
  bases__ZN3ccc9CC5x12y11E, 2,
  &(vtc__ZN3ccc9CC5x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y11E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x12y11E),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  DD5x12y11  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD5x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD5x12y113efgEv
  ~DD5x12y11(); // tgen
  DD5x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD5x12y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x12y113pqrEv");}
void  ccc::DD5x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x12y113efgEv");}
ccc::DD5x12y11 ::~DD5x12y11(){ note_dtor("_ZN3ccc9DD5x12y11E", this);} // tgen
ccc::DD5x12y11 ::DD5x12y11(){ note_ctor("_ZN3ccc9DD5x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD5x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x12y11E, buf);
    ::ccc::DD5x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x12y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD5x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x12y11E);
    dp->::ccc::DD5x12y11::~DD5x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x12y11E(Test__ZN3ccc9DD5x12y11E, "_ZN3ccc9DD5x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x12y11C1Ev();
extern void _ZN3ccc9DD5x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD5x12y11E[] = {
  NSPAIR(_ZN3ccc9DD5x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD5x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD5x12y11E[] = {
  // 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__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 _ZTIN3ccc9DD5x12y11E[];
extern void _ZN3ccc9DD5x12y113pqrEv();
extern void _ZN3ccc9DD5x12y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x12y11E[] = {
  {&(_ZTVN3ccc9DD5x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x12y11E[];
Class_Descriptor cd__ZN3ccc9DD5x12y11E = {  "_ZN3ccc9DD5x12y11E", // class name
  bases__ZN3ccc9DD5x12y11E, 2,
  &(vtc__ZN3ccc9DD5x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x12y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x12y11E),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  CC5x12y12  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC5x12y123abcEv
  ~CC5x12y12(); // tgen
  CC5x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y12E) C1{ VBC2{ v2 v3 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC5x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x12y123abcEv");}
ccc::CC5x12y12 ::~CC5x12y12(){ note_dtor("_ZN3ccc9CC5x12y12E", this);} // tgen
ccc::CC5x12y12 ::CC5x12y12(){ note_ctor("_ZN3ccc9CC5x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC5x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x12y12E, buf);
    ::ccc::CC5x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x12y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC5x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x12y12E);
    dp->::ccc::CC5x12y12::~CC5x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x12y12E(Test__ZN3ccc9CC5x12y12E, "_ZN3ccc9CC5x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x12y12C1Ev();
extern void _ZN3ccc9CC5x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC5x12y12E[] = {
  NSPAIR(_ZN3ccc9CC5x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC5x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC5x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x12y12E[];
extern void _ZN3ccc9CC5x12y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x12y123abcEv,_ZTv0_n20_N3ccc9CC5x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y123abcEv,_ZThn4_N3ccc9CC5x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x12y123abcEv,_ZTv0_n20_N3ccc9CC5x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x12y12E[] = {
  {&(_ZTVN3ccc9CC5x12y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC5x12y12E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x12y12E[];
static VTBL_ENTRY alt_thunk_names283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x12y123abcEv,_ZTv0_n20_N3ccc9CC5x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y123abcEv,_ZThn4_N3ccc9CC5x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x12y12E = {  "_ZN3ccc9CC5x12y12E", // class name
  bases__ZN3ccc9CC5x12y12E, 2,
  &(vtc__ZN3ccc9CC5x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x12y12E),2, //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  DD5x12y12  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD5x12y123abcEv
  ~DD5x12y12(); // tgen
  DD5x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD5x12y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD5x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x12y123abcEv");}
ccc::DD5x12y12 ::~DD5x12y12(){ note_dtor("_ZN3ccc9DD5x12y12E", this);} // tgen
ccc::DD5x12y12 ::DD5x12y12(){ note_ctor("_ZN3ccc9DD5x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD5x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x12y12E, buf);
    ::ccc::DD5x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x12y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD5x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x12y12E);
    dp->::ccc::DD5x12y12::~DD5x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x12y12E(Test__ZN3ccc9DD5x12y12E, "_ZN3ccc9DD5x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x12y12C1Ev();
extern void _ZN3ccc9DD5x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD5x12y12E[] = {
  NSPAIR(_ZN3ccc9DD5x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD5x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD5x12y12E[] = {
  // 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__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 _ZTIN3ccc9DD5x12y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x12y123abcEv,_ZTv0_n12_N3ccc9DD5x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x12y123abcEv,_ZThn4_N3ccc9DD5x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y123abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x12y123abcEv,_ZTv0_n12_N3ccc9DD5x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x12y12E[] = {
  {&(_ZTVN3ccc9DD5x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x12y12E[];
static VTBL_ENTRY alt_thunk_names284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x12y123abcEv,_ZTv0_n12_N3ccc9DD5x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x12y123abcEv,_ZThn4_N3ccc9DD5x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x12y12E = {  "_ZN3ccc9DD5x12y12E", // class name
  bases__ZN3ccc9DD5x12y12E, 2,
  &(vtc__ZN3ccc9DD5x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x12y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x12y12E),3, //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  CC5x12y13  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC5x12y133efgEv
  ~CC5x12y13(); // tgen
  CC5x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC5x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x12y133efgEv");}
ccc::CC5x12y13 ::~CC5x12y13(){ note_dtor("_ZN3ccc9CC5x12y13E", this);} // tgen
ccc::CC5x12y13 ::CC5x12y13(){ note_ctor("_ZN3ccc9CC5x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC5x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x12y13E, buf);
    ::ccc::CC5x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x12y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC5x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x12y13E);
    dp->::ccc::CC5x12y13::~CC5x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x12y13E(Test__ZN3ccc9CC5x12y13E, "_ZN3ccc9CC5x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x12y13C1Ev();
extern void _ZN3ccc9CC5x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC5x12y13E[] = {
  NSPAIR(_ZN3ccc9CC5x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC5x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC5x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC5x12y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x12y133efgEv,_ZTv0_n16_N3ccc9CC5x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y133efgEv,_ZThn4_N3ccc9CC5x12y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x12y133efgEv,_ZTv0_n16_N3ccc9CC5x12y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x12y13E[] = {
  {&(_ZTVN3ccc9CC5x12y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x12y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x12y13E[];
static VTBL_ENTRY alt_thunk_names285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x12y133efgEv,_ZTv0_n16_N3ccc9CC5x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y133efgEv,_ZThn4_N3ccc9CC5x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x12y13E = {  "_ZN3ccc9CC5x12y13E", // class name
  bases__ZN3ccc9CC5x12y13E, 2,
  &(vtc__ZN3ccc9CC5x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x12y13E),2, //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  DD5x12y13  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD5x12y133efgEv
  ~DD5x12y13(); // tgen
  DD5x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD5x12y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD5x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x12y133efgEv");}
ccc::DD5x12y13 ::~DD5x12y13(){ note_dtor("_ZN3ccc9DD5x12y13E", this);} // tgen
ccc::DD5x12y13 ::DD5x12y13(){ note_ctor("_ZN3ccc9DD5x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD5x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x12y13E, buf);
    ::ccc::DD5x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x12y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD5x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x12y13E);
    dp->::ccc::DD5x12y13::~DD5x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x12y13E(Test__ZN3ccc9DD5x12y13E, "_ZN3ccc9DD5x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x12y13C1Ev();
extern void _ZN3ccc9DD5x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD5x12y13E[] = {
  NSPAIR(_ZN3ccc9DD5x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD5x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD5x12y13E[] = {
  // 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__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 _ZTIN3ccc9DD5x12y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9DD5x12y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x12y13E[] = {
  {&(_ZTVN3ccc9DD5x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x12y13E[];
Class_Descriptor cd__ZN3ccc9DD5x12y13E = {  "_ZN3ccc9DD5x12y13E", // class name
  bases__ZN3ccc9DD5x12y13E, 2,
  &(vtc__ZN3ccc9DD5x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x12y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x12y13E),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  CC5x12y14  : virtual ::ccc::AA5 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC5x12y143pqrEv
  ~CC5x12y14(); // tgen
  CC5x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC5x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x12y143pqrEv");}
ccc::CC5x12y14 ::~CC5x12y14(){ note_dtor("_ZN3ccc9CC5x12y14E", this);} // tgen
ccc::CC5x12y14 ::CC5x12y14(){ note_ctor("_ZN3ccc9CC5x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC5x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x12y14E, buf);
    ::ccc::CC5x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x12y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC5x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x12y14E);
    dp->::ccc::CC5x12y14::~CC5x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x12y14E(Test__ZN3ccc9CC5x12y14E, "_ZN3ccc9CC5x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x12y14C1Ev();
extern void _ZN3ccc9CC5x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC5x12y14E[] = {
  NSPAIR(_ZN3ccc9CC5x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC5x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC5x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC5x12y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x12y143pqrEv,_ZTv0_n12_N3ccc9CC5x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x12y143pqrEv,_ZThn4_N3ccc9CC5x12y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x12y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x12y143pqrEv,_ZTv0_n12_N3ccc9CC5x12y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x12y14E[] = {
  {&(_ZTVN3ccc9CC5x12y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x12y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x12y14E[];
static VTBL_ENTRY alt_thunk_names286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x12y143pqrEv,_ZTv0_n12_N3ccc9CC5x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x12y143pqrEv,_ZThn4_N3ccc9CC5x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x12y14E = {  "_ZN3ccc9CC5x12y14E", // class name
  bases__ZN3ccc9CC5x12y14E, 2,
  &(vtc__ZN3ccc9CC5x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x12y14E),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  DD5x12y14  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD5x12y143pqrEv
  ~DD5x12y14(); // tgen
  DD5x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD5x12y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD5x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x12y143pqrEv");}
ccc::DD5x12y14 ::~DD5x12y14(){ note_dtor("_ZN3ccc9DD5x12y14E", this);} // tgen
ccc::DD5x12y14 ::DD5x12y14(){ note_ctor("_ZN3ccc9DD5x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD5x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x12y14E, buf);
    ::ccc::DD5x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x12y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD5x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x12y14E);
    dp->::ccc::DD5x12y14::~DD5x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x12y14E(Test__ZN3ccc9DD5x12y14E, "_ZN3ccc9DD5x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x12y14C1Ev();
extern void _ZN3ccc9DD5x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD5x12y14E[] = {
  NSPAIR(_ZN3ccc9DD5x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD5x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD5x12y14E[] = {
  // 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__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 _ZTIN3ccc9DD5x12y14E[];
extern void _ZN3ccc9DD5x12y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x12y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x12y14E[] = {
  {&(_ZTVN3ccc9DD5x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x12y14E[];
Class_Descriptor cd__ZN3ccc9DD5x12y14E = {  "_ZN3ccc9DD5x12y14E", // class name
  bases__ZN3ccc9DD5x12y14E, 2,
  &(vtc__ZN3ccc9DD5x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x12y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x12y14E),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  CC5x12y15  : virtual ::ccc::AA5 , ::ccc::BB12 {
  ~CC5x12y15(); // tgen
  CC5x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x12y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC5x12y15 ::~CC5x12y15(){ note_dtor("_ZN3ccc9CC5x12y15E", this);} // tgen
ccc::CC5x12y15 ::CC5x12y15(){ note_ctor("_ZN3ccc9CC5x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC5x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x12y15E, buf);
    ::ccc::CC5x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x12y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC5x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x12y15E);
    dp->::ccc::CC5x12y15::~CC5x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x12y15E(Test__ZN3ccc9CC5x12y15E, "_ZN3ccc9CC5x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x12y15C1Ev();
extern void _ZN3ccc9CC5x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC5x12y15E[] = {
  NSPAIR(_ZN3ccc9CC5x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC5x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC5x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x12y15E[] = {
  {&(_ZTVN3ccc9CC5x12y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC5x12y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x12y15E[];
Class_Descriptor cd__ZN3ccc9CC5x12y15E = {  "_ZN3ccc9CC5x12y15E", // class name
  bases__ZN3ccc9CC5x12y15E, 2,
  &(vtc__ZN3ccc9CC5x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x12y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x12y15E),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  DD5x12y15  : virtual ::ccc::AA5 , virtual ::ccc::BB12 {
  ~DD5x12y15(); // tgen
  DD5x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD5x12y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD5x12y15 ::~DD5x12y15(){ note_dtor("_ZN3ccc9DD5x12y15E", this);} // tgen
ccc::DD5x12y15 ::DD5x12y15(){ note_ctor("_ZN3ccc9DD5x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD5x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x12y15E, buf);
    ::ccc::DD5x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x12y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD5x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x12y15E);
    dp->::ccc::DD5x12y15::~DD5x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x12y15E(Test__ZN3ccc9DD5x12y15E, "_ZN3ccc9DD5x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x12y15C1Ev();
extern void _ZN3ccc9DD5x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD5x12y15E[] = {
  NSPAIR(_ZN3ccc9DD5x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD5x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD5x12y15E[] = {
  // 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__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 _ZTIN3ccc9DD5x12y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x12y15E[] = {
  {&(_ZTVN3ccc9DD5x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x12y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x12y15E[];
Class_Descriptor cd__ZN3ccc9DD5x12y15E = {  "_ZN3ccc9DD5x12y15E", // class name
  bases__ZN3ccc9DD5x12y15E, 2,
  &(vtc__ZN3ccc9DD5x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x12y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x12y15E),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  CC5x13y0  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y03pqrEv
  ~CC5x13y0(); // tgen
  CC5x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y0E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y03abcEv");}
void  ccc::CC5x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y03efgEv");}
void  ccc::CC5x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y03pqrEv");}
ccc::CC5x13y0 ::~CC5x13y0(){ note_dtor("_ZN3ccc8CC5x13y0E", this);} // tgen
ccc::CC5x13y0 ::CC5x13y0(){ note_ctor("_ZN3ccc8CC5x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y0E, buf);
    ::ccc::CC5x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y0E);
    dp->::ccc::CC5x13y0::~CC5x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y0E(Test__ZN3ccc8CC5x13y0E, "_ZN3ccc8CC5x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y0C1Ev();
extern void _ZN3ccc8CC5x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y0E[] = {
  NSPAIR(_ZN3ccc8CC5x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y0E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y0E[];
extern void _ZN3ccc8CC5x13y03efgEv();
extern void _ZN3ccc8CC5x13y03abcEv();
extern void _ZN3ccc8CC5x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y03pqrEv,_ZTv0_n12_N3ccc8CC5x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y03pqrEv,_ZThn4_N3ccc8CC5x13y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y03efgEv,_ZTv0_n16_N3ccc8CC5x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y03efgEv,_ZThn4_N3ccc8CC5x13y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y03abcEv,_ZTv0_n20_N3ccc8CC5x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y03abcEv,_ZThn4_N3ccc8CC5x13y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y03pqrEv,_ZTv0_n12_N3ccc8CC5x13y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y03efgEv,_ZTv0_n16_N3ccc8CC5x13y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y03abcEv,_ZTv0_n20_N3ccc8CC5x13y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y0E[] = {
  {&(_ZTVN3ccc8CC5x13y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y0E[];
static VTBL_ENTRY alt_thunk_names287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y03abcEv,_ZTv0_n20_N3ccc8CC5x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y03abcEv,_ZThn4_N3ccc8CC5x13y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y03efgEv,_ZTv0_n16_N3ccc8CC5x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y03efgEv,_ZThn4_N3ccc8CC5x13y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y03pqrEv,_ZTv0_n12_N3ccc8CC5x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y03pqrEv,_ZThn4_N3ccc8CC5x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y0E = {  "_ZN3ccc8CC5x13y0E", // class name
  bases__ZN3ccc8CC5x13y0E, 2,
  &(vtc__ZN3ccc8CC5x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y0E),2, //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  DD5x13y0  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD5x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD5x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x13y03pqrEv
  ~DD5x13y0(); // tgen
  DD5x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y03abcEv");}
void  ccc::DD5x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y03efgEv");}
void  ccc::DD5x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y03pqrEv");}
ccc::DD5x13y0 ::~DD5x13y0(){ note_dtor("_ZN3ccc8DD5x13y0E", this);} // tgen
ccc::DD5x13y0 ::DD5x13y0(){ note_ctor("_ZN3ccc8DD5x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y0E, buf);
    ::ccc::DD5x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y0E);
    dp->::ccc::DD5x13y0::~DD5x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y0E(Test__ZN3ccc8DD5x13y0E, "_ZN3ccc8DD5x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y0C1Ev();
extern void _ZN3ccc8DD5x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y0E[] = {
  NSPAIR(_ZN3ccc8DD5x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y0E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y0E[];
extern void _ZN3ccc8DD5x13y03pqrEv();
extern void _ZN3ccc8DD5x13y03efgEv();
extern void _ZN3ccc8DD5x13y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y03efgEv,_ZTv0_n12_N3ccc8DD5x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y03efgEv,_ZThn4_N3ccc8DD5x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y03efgEv,_ZTv0_n12_N3ccc8DD5x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y0E[] = {
  {&(_ZTVN3ccc8DD5x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y0E[];
static VTBL_ENTRY alt_thunk_names288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y03efgEv,_ZTv0_n12_N3ccc8DD5x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y03efgEv,_ZThn4_N3ccc8DD5x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y0E = {  "_ZN3ccc8DD5x13y0E", // class name
  bases__ZN3ccc8DD5x13y0E, 2,
  &(vtc__ZN3ccc8DD5x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y0E),3, //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  CC5x13y1  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x13y13efgEv
  ~CC5x13y1(); // tgen
  CC5x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y1E) C1{ VBC2{ v2 v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y13abcEv");}
void  ccc::CC5x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y13pqrEv");}
void  ccc::CC5x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y13efgEv");}
ccc::CC5x13y1 ::~CC5x13y1(){ note_dtor("_ZN3ccc8CC5x13y1E", this);} // tgen
ccc::CC5x13y1 ::CC5x13y1(){ note_ctor("_ZN3ccc8CC5x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y1E, buf);
    ::ccc::CC5x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y1E);
    dp->::ccc::CC5x13y1::~CC5x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y1E(Test__ZN3ccc8CC5x13y1E, "_ZN3ccc8CC5x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y1C1Ev();
extern void _ZN3ccc8CC5x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y1E[] = {
  NSPAIR(_ZN3ccc8CC5x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y1E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y1E[];
extern void _ZN3ccc8CC5x13y13efgEv();
extern void _ZN3ccc8CC5x13y13abcEv();
extern void _ZN3ccc8CC5x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y13pqrEv,_ZTv0_n12_N3ccc8CC5x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y13pqrEv,_ZThn4_N3ccc8CC5x13y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y13efgEv,_ZTv0_n16_N3ccc8CC5x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y13efgEv,_ZThn4_N3ccc8CC5x13y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y13abcEv,_ZTv0_n20_N3ccc8CC5x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y13abcEv,_ZThn4_N3ccc8CC5x13y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y13pqrEv,_ZTv0_n12_N3ccc8CC5x13y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y13efgEv,_ZTv0_n16_N3ccc8CC5x13y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y13abcEv,_ZTv0_n20_N3ccc8CC5x13y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y1E[] = {
  {&(_ZTVN3ccc8CC5x13y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y1E[];
static VTBL_ENTRY alt_thunk_names289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y13abcEv,_ZTv0_n20_N3ccc8CC5x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y13abcEv,_ZThn4_N3ccc8CC5x13y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y13efgEv,_ZTv0_n16_N3ccc8CC5x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y13efgEv,_ZThn4_N3ccc8CC5x13y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y13pqrEv,_ZTv0_n12_N3ccc8CC5x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y13pqrEv,_ZThn4_N3ccc8CC5x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y1E = {  "_ZN3ccc8CC5x13y1E", // class name
  bases__ZN3ccc8CC5x13y1E, 2,
  &(vtc__ZN3ccc8CC5x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y1E),2, //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  DD5x13y1  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD5x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x13y13efgEv
  ~DD5x13y1(); // tgen
  DD5x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y13abcEv");}
void  ccc::DD5x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y13pqrEv");}
void  ccc::DD5x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y13efgEv");}
ccc::DD5x13y1 ::~DD5x13y1(){ note_dtor("_ZN3ccc8DD5x13y1E", this);} // tgen
ccc::DD5x13y1 ::DD5x13y1(){ note_ctor("_ZN3ccc8DD5x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y1E, buf);
    ::ccc::DD5x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y1E);
    dp->::ccc::DD5x13y1::~DD5x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y1E(Test__ZN3ccc8DD5x13y1E, "_ZN3ccc8DD5x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y1C1Ev();
extern void _ZN3ccc8DD5x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y1E[] = {
  NSPAIR(_ZN3ccc8DD5x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y1E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y1E[];
extern void _ZN3ccc8DD5x13y13pqrEv();
extern void _ZN3ccc8DD5x13y13efgEv();
extern void _ZN3ccc8DD5x13y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y13efgEv,_ZTv0_n12_N3ccc8DD5x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y13efgEv,_ZThn4_N3ccc8DD5x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y13efgEv,_ZTv0_n12_N3ccc8DD5x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y1E[] = {
  {&(_ZTVN3ccc8DD5x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y1E[];
static VTBL_ENTRY alt_thunk_names290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y13efgEv,_ZTv0_n12_N3ccc8DD5x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y13efgEv,_ZThn4_N3ccc8DD5x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y1E = {  "_ZN3ccc8DD5x13y1E", // class name
  bases__ZN3ccc8DD5x13y1E, 2,
  &(vtc__ZN3ccc8DD5x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y1E),3, //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  CC5x13y2  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y23pqrEv
  ~CC5x13y2(); // tgen
  CC5x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y2E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y23efgEv");}
void  ccc::CC5x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y23abcEv");}
void  ccc::CC5x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y23pqrEv");}
ccc::CC5x13y2 ::~CC5x13y2(){ note_dtor("_ZN3ccc8CC5x13y2E", this);} // tgen
ccc::CC5x13y2 ::CC5x13y2(){ note_ctor("_ZN3ccc8CC5x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y2E, buf);
    ::ccc::CC5x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y2E);
    dp->::ccc::CC5x13y2::~CC5x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y2E(Test__ZN3ccc8CC5x13y2E, "_ZN3ccc8CC5x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y2C1Ev();
extern void _ZN3ccc8CC5x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y2E[] = {
  NSPAIR(_ZN3ccc8CC5x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y2E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y2E[];
extern void _ZN3ccc8CC5x13y23efgEv();
extern void _ZN3ccc8CC5x13y23abcEv();
extern void _ZN3ccc8CC5x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y23pqrEv,_ZTv0_n12_N3ccc8CC5x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y23pqrEv,_ZThn4_N3ccc8CC5x13y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y23efgEv,_ZTv0_n16_N3ccc8CC5x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y23efgEv,_ZThn4_N3ccc8CC5x13y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y23abcEv,_ZTv0_n20_N3ccc8CC5x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y23abcEv,_ZThn4_N3ccc8CC5x13y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y23pqrEv,_ZTv0_n12_N3ccc8CC5x13y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y23efgEv,_ZTv0_n16_N3ccc8CC5x13y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y23abcEv,_ZTv0_n20_N3ccc8CC5x13y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y2E[] = {
  {&(_ZTVN3ccc8CC5x13y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y2E[];
static VTBL_ENTRY alt_thunk_names291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y23abcEv,_ZTv0_n20_N3ccc8CC5x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y23abcEv,_ZThn4_N3ccc8CC5x13y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y23efgEv,_ZTv0_n16_N3ccc8CC5x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y23efgEv,_ZThn4_N3ccc8CC5x13y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y23pqrEv,_ZTv0_n12_N3ccc8CC5x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y23pqrEv,_ZThn4_N3ccc8CC5x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y2E = {  "_ZN3ccc8CC5x13y2E", // class name
  bases__ZN3ccc8CC5x13y2E, 2,
  &(vtc__ZN3ccc8CC5x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y2E),2, //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  DD5x13y2  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD5x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD5x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x13y23pqrEv
  ~DD5x13y2(); // tgen
  DD5x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y23efgEv");}
void  ccc::DD5x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y23abcEv");}
void  ccc::DD5x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y23pqrEv");}
ccc::DD5x13y2 ::~DD5x13y2(){ note_dtor("_ZN3ccc8DD5x13y2E", this);} // tgen
ccc::DD5x13y2 ::DD5x13y2(){ note_ctor("_ZN3ccc8DD5x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y2E, buf);
    ::ccc::DD5x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y2E);
    dp->::ccc::DD5x13y2::~DD5x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y2E(Test__ZN3ccc8DD5x13y2E, "_ZN3ccc8DD5x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y2C1Ev();
extern void _ZN3ccc8DD5x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y2E[] = {
  NSPAIR(_ZN3ccc8DD5x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y2E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y2E[];
extern void _ZN3ccc8DD5x13y23pqrEv();
extern void _ZN3ccc8DD5x13y23efgEv();
extern void _ZN3ccc8DD5x13y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y23efgEv,_ZTv0_n12_N3ccc8DD5x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y23efgEv,_ZThn4_N3ccc8DD5x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y23efgEv,_ZTv0_n12_N3ccc8DD5x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y2E[] = {
  {&(_ZTVN3ccc8DD5x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y2E[];
static VTBL_ENTRY alt_thunk_names292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y23efgEv,_ZTv0_n12_N3ccc8DD5x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y23efgEv,_ZThn4_N3ccc8DD5x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y2E = {  "_ZN3ccc8DD5x13y2E", // class name
  bases__ZN3ccc8DD5x13y2E, 2,
  &(vtc__ZN3ccc8DD5x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y2E),3, //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  CC5x13y3  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x13y33abcEv
  ~CC5x13y3(); // tgen
  CC5x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y3E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y33efgEv");}
void  ccc::CC5x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y33pqrEv");}
void  ccc::CC5x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y33abcEv");}
ccc::CC5x13y3 ::~CC5x13y3(){ note_dtor("_ZN3ccc8CC5x13y3E", this);} // tgen
ccc::CC5x13y3 ::CC5x13y3(){ note_ctor("_ZN3ccc8CC5x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y3E, buf);
    ::ccc::CC5x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y3E);
    dp->::ccc::CC5x13y3::~CC5x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y3E(Test__ZN3ccc8CC5x13y3E, "_ZN3ccc8CC5x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y3C1Ev();
extern void _ZN3ccc8CC5x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y3E[] = {
  NSPAIR(_ZN3ccc8CC5x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y3E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y3E[];
extern void _ZN3ccc8CC5x13y33efgEv();
extern void _ZN3ccc8CC5x13y33pqrEv();
extern void _ZN3ccc8CC5x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y33pqrEv,_ZTv0_n12_N3ccc8CC5x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y33pqrEv,_ZThn4_N3ccc8CC5x13y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y33efgEv,_ZTv0_n16_N3ccc8CC5x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y33efgEv,_ZThn4_N3ccc8CC5x13y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y33abcEv,_ZTv0_n20_N3ccc8CC5x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y33abcEv,_ZThn4_N3ccc8CC5x13y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y33pqrEv,_ZTv0_n12_N3ccc8CC5x13y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y33efgEv,_ZTv0_n16_N3ccc8CC5x13y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y33abcEv,_ZTv0_n20_N3ccc8CC5x13y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y3E[] = {
  {&(_ZTVN3ccc8CC5x13y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y3E[];
static VTBL_ENTRY alt_thunk_names293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y33abcEv,_ZTv0_n20_N3ccc8CC5x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y33abcEv,_ZThn4_N3ccc8CC5x13y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y33efgEv,_ZTv0_n16_N3ccc8CC5x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y33efgEv,_ZThn4_N3ccc8CC5x13y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y33pqrEv,_ZTv0_n12_N3ccc8CC5x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y33pqrEv,_ZThn4_N3ccc8CC5x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y3E = {  "_ZN3ccc8CC5x13y3E", // class name
  bases__ZN3ccc8CC5x13y3E, 2,
  &(vtc__ZN3ccc8CC5x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y3E),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  DD5x13y3  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD5x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x13y33abcEv
  ~DD5x13y3(); // tgen
  DD5x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y33efgEv");}
void  ccc::DD5x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y33pqrEv");}
void  ccc::DD5x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y33abcEv");}
ccc::DD5x13y3 ::~DD5x13y3(){ note_dtor("_ZN3ccc8DD5x13y3E", this);} // tgen
ccc::DD5x13y3 ::DD5x13y3(){ note_ctor("_ZN3ccc8DD5x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y3E, buf);
    ::ccc::DD5x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y3E);
    dp->::ccc::DD5x13y3::~DD5x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y3E(Test__ZN3ccc8DD5x13y3E, "_ZN3ccc8DD5x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y3C1Ev();
extern void _ZN3ccc8DD5x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y3E[] = {
  NSPAIR(_ZN3ccc8DD5x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y3E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y3E[];
extern void _ZN3ccc8DD5x13y33pqrEv();
extern void _ZN3ccc8DD5x13y33efgEv();
extern void _ZN3ccc8DD5x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y33efgEv,_ZTv0_n12_N3ccc8DD5x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y33efgEv,_ZThn4_N3ccc8DD5x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y33efgEv,_ZTv0_n12_N3ccc8DD5x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y3E[] = {
  {&(_ZTVN3ccc8DD5x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y3E[];
static VTBL_ENTRY alt_thunk_names294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y33efgEv,_ZTv0_n12_N3ccc8DD5x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y33efgEv,_ZThn4_N3ccc8DD5x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y3E = {  "_ZN3ccc8DD5x13y3E", // class name
  bases__ZN3ccc8DD5x13y3E, 2,
  &(vtc__ZN3ccc8DD5x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y3E),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  CC5x13y4  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC5x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x13y43efgEv
  ~CC5x13y4(); // tgen
  CC5x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y4E) C1{ VBC2{ v1 v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y43pqrEv");}
void  ccc::CC5x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y43abcEv");}
void  ccc::CC5x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y43efgEv");}
ccc::CC5x13y4 ::~CC5x13y4(){ note_dtor("_ZN3ccc8CC5x13y4E", this);} // tgen
ccc::CC5x13y4 ::CC5x13y4(){ note_ctor("_ZN3ccc8CC5x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y4E, buf);
    ::ccc::CC5x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y4E);
    dp->::ccc::CC5x13y4::~CC5x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y4E(Test__ZN3ccc8CC5x13y4E, "_ZN3ccc8CC5x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y4C1Ev();
extern void _ZN3ccc8CC5x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y4E[] = {
  NSPAIR(_ZN3ccc8CC5x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y4E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y4E[];
extern void _ZN3ccc8CC5x13y43efgEv();
extern void _ZN3ccc8CC5x13y43pqrEv();
extern void _ZN3ccc8CC5x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y43pqrEv,_ZTv0_n12_N3ccc8CC5x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y43pqrEv,_ZThn4_N3ccc8CC5x13y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y43efgEv,_ZTv0_n16_N3ccc8CC5x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y43efgEv,_ZThn4_N3ccc8CC5x13y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y43abcEv,_ZTv0_n20_N3ccc8CC5x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y43abcEv,_ZThn4_N3ccc8CC5x13y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y43pqrEv,_ZTv0_n12_N3ccc8CC5x13y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y43efgEv,_ZTv0_n16_N3ccc8CC5x13y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y43abcEv,_ZTv0_n20_N3ccc8CC5x13y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y4E[] = {
  {&(_ZTVN3ccc8CC5x13y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y4E[];
static VTBL_ENTRY alt_thunk_names295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y43abcEv,_ZTv0_n20_N3ccc8CC5x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y43abcEv,_ZThn4_N3ccc8CC5x13y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y43efgEv,_ZTv0_n16_N3ccc8CC5x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y43efgEv,_ZThn4_N3ccc8CC5x13y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y43pqrEv,_ZTv0_n12_N3ccc8CC5x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y43pqrEv,_ZThn4_N3ccc8CC5x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y4E = {  "_ZN3ccc8CC5x13y4E", // class name
  bases__ZN3ccc8CC5x13y4E, 2,
  &(vtc__ZN3ccc8CC5x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y4E),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  DD5x13y4  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD5x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD5x13y43efgEv
  ~DD5x13y4(); // tgen
  DD5x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y43pqrEv");}
void  ccc::DD5x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y43abcEv");}
void  ccc::DD5x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y43efgEv");}
ccc::DD5x13y4 ::~DD5x13y4(){ note_dtor("_ZN3ccc8DD5x13y4E", this);} // tgen
ccc::DD5x13y4 ::DD5x13y4(){ note_ctor("_ZN3ccc8DD5x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y4E, buf);
    ::ccc::DD5x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y4E);
    dp->::ccc::DD5x13y4::~DD5x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y4E(Test__ZN3ccc8DD5x13y4E, "_ZN3ccc8DD5x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y4C1Ev();
extern void _ZN3ccc8DD5x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y4E[] = {
  NSPAIR(_ZN3ccc8DD5x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y4E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y4E[];
extern void _ZN3ccc8DD5x13y43pqrEv();
extern void _ZN3ccc8DD5x13y43efgEv();
extern void _ZN3ccc8DD5x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y43efgEv,_ZTv0_n12_N3ccc8DD5x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y43efgEv,_ZThn4_N3ccc8DD5x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y43efgEv,_ZTv0_n12_N3ccc8DD5x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y4E[] = {
  {&(_ZTVN3ccc8DD5x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y4E[];
static VTBL_ENTRY alt_thunk_names296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y43efgEv,_ZTv0_n12_N3ccc8DD5x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y43efgEv,_ZThn4_N3ccc8DD5x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y4E = {  "_ZN3ccc8DD5x13y4E", // class name
  bases__ZN3ccc8DD5x13y4E, 2,
  &(vtc__ZN3ccc8DD5x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y4E),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  CC5x13y5  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC5x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x13y53abcEv
  ~CC5x13y5(); // tgen
  CC5x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y5E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y53pqrEv");}
void  ccc::CC5x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y53efgEv");}
void  ccc::CC5x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y53abcEv");}
ccc::CC5x13y5 ::~CC5x13y5(){ note_dtor("_ZN3ccc8CC5x13y5E", this);} // tgen
ccc::CC5x13y5 ::CC5x13y5(){ note_ctor("_ZN3ccc8CC5x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y5E, buf);
    ::ccc::CC5x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y5E);
    dp->::ccc::CC5x13y5::~CC5x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y5E(Test__ZN3ccc8CC5x13y5E, "_ZN3ccc8CC5x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y5C1Ev();
extern void _ZN3ccc8CC5x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y5E[] = {
  NSPAIR(_ZN3ccc8CC5x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y5E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y5E[];
extern void _ZN3ccc8CC5x13y53efgEv();
extern void _ZN3ccc8CC5x13y53pqrEv();
extern void _ZN3ccc8CC5x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y53pqrEv,_ZTv0_n12_N3ccc8CC5x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y53pqrEv,_ZThn4_N3ccc8CC5x13y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y53efgEv,_ZTv0_n16_N3ccc8CC5x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y53efgEv,_ZThn4_N3ccc8CC5x13y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y53abcEv,_ZTv0_n20_N3ccc8CC5x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y53abcEv,_ZThn4_N3ccc8CC5x13y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y53pqrEv,_ZTv0_n12_N3ccc8CC5x13y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y53efgEv,_ZTv0_n16_N3ccc8CC5x13y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y53abcEv,_ZTv0_n20_N3ccc8CC5x13y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y5E[] = {
  {&(_ZTVN3ccc8CC5x13y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y5E[];
static VTBL_ENTRY alt_thunk_names297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y53abcEv,_ZTv0_n20_N3ccc8CC5x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y53abcEv,_ZThn4_N3ccc8CC5x13y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y53efgEv,_ZTv0_n16_N3ccc8CC5x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y53efgEv,_ZThn4_N3ccc8CC5x13y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y53pqrEv,_ZTv0_n12_N3ccc8CC5x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y53pqrEv,_ZThn4_N3ccc8CC5x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y5E = {  "_ZN3ccc8CC5x13y5E", // class name
  bases__ZN3ccc8CC5x13y5E, 2,
  &(vtc__ZN3ccc8CC5x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y5E),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  DD5x13y5  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD5x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD5x13y53abcEv
  ~DD5x13y5(); // tgen
  DD5x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y53pqrEv");}
void  ccc::DD5x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y53efgEv");}
void  ccc::DD5x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y53abcEv");}
ccc::DD5x13y5 ::~DD5x13y5(){ note_dtor("_ZN3ccc8DD5x13y5E", this);} // tgen
ccc::DD5x13y5 ::DD5x13y5(){ note_ctor("_ZN3ccc8DD5x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y5E, buf);
    ::ccc::DD5x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y5E);
    dp->::ccc::DD5x13y5::~DD5x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y5E(Test__ZN3ccc8DD5x13y5E, "_ZN3ccc8DD5x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y5C1Ev();
extern void _ZN3ccc8DD5x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y5E[] = {
  NSPAIR(_ZN3ccc8DD5x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y5E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y5E[];
extern void _ZN3ccc8DD5x13y53pqrEv();
extern void _ZN3ccc8DD5x13y53efgEv();
extern void _ZN3ccc8DD5x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y53efgEv,_ZTv0_n12_N3ccc8DD5x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y53efgEv,_ZThn4_N3ccc8DD5x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y53efgEv,_ZTv0_n12_N3ccc8DD5x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y5E[] = {
  {&(_ZTVN3ccc8DD5x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y5E[];
static VTBL_ENTRY alt_thunk_names298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y53efgEv,_ZTv0_n12_N3ccc8DD5x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y53efgEv,_ZThn4_N3ccc8DD5x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y5E = {  "_ZN3ccc8DD5x13y5E", // class name
  bases__ZN3ccc8DD5x13y5E, 2,
  &(vtc__ZN3ccc8DD5x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y5E),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  CC5x13y6  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x13y63efgEv
  ~CC5x13y6(); // tgen
  CC5x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y6E) C1{ VBC2{ v3 v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y63abcEv");}
void  ccc::CC5x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y63efgEv");}
ccc::CC5x13y6 ::~CC5x13y6(){ note_dtor("_ZN3ccc8CC5x13y6E", this);} // tgen
ccc::CC5x13y6 ::CC5x13y6(){ note_ctor("_ZN3ccc8CC5x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y6E, buf);
    ::ccc::CC5x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y6E);
    dp->::ccc::CC5x13y6::~CC5x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y6E(Test__ZN3ccc8CC5x13y6E, "_ZN3ccc8CC5x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y6C1Ev();
extern void _ZN3ccc8CC5x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y6E[] = {
  NSPAIR(_ZN3ccc8CC5x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x13y6E[];
extern void _ZN3ccc8CC5x13y63efgEv();
extern void _ZN3ccc8CC5x13y63abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y63efgEv,_ZTv0_n16_N3ccc8CC5x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y63efgEv,_ZThn4_N3ccc8CC5x13y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y63abcEv,_ZTv0_n20_N3ccc8CC5x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y63abcEv,_ZThn4_N3ccc8CC5x13y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y63efgEv,_ZTv0_n16_N3ccc8CC5x13y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y63abcEv,_ZTv0_n20_N3ccc8CC5x13y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y6E[] = {
  {&(_ZTVN3ccc8CC5x13y6E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x13y6E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y6E[];
static VTBL_ENTRY alt_thunk_names299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y63abcEv,_ZTv0_n20_N3ccc8CC5x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y63abcEv,_ZThn4_N3ccc8CC5x13y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y63efgEv,_ZTv0_n16_N3ccc8CC5x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y63efgEv,_ZThn4_N3ccc8CC5x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y6E = {  "_ZN3ccc8CC5x13y6E", // class name
  bases__ZN3ccc8CC5x13y6E, 2,
  &(vtc__ZN3ccc8CC5x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y6E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y6E),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  DD5x13y6  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD5x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD5x13y63efgEv
  ~DD5x13y6(); // tgen
  DD5x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y63abcEv");}
void  ccc::DD5x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y63efgEv");}
ccc::DD5x13y6 ::~DD5x13y6(){ note_dtor("_ZN3ccc8DD5x13y6E", this);} // tgen
ccc::DD5x13y6 ::DD5x13y6(){ note_ctor("_ZN3ccc8DD5x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y6E, buf);
    ::ccc::DD5x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y6E);
    dp->::ccc::DD5x13y6::~DD5x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y6E(Test__ZN3ccc8DD5x13y6E, "_ZN3ccc8DD5x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y6C1Ev();
extern void _ZN3ccc8DD5x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y6E[] = {
  NSPAIR(_ZN3ccc8DD5x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y6E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x13y63efgEv();
extern void _ZN3ccc8DD5x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y63efgEv,_ZTv0_n12_N3ccc8DD5x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y63efgEv,_ZThn4_N3ccc8DD5x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y63efgEv,_ZTv0_n12_N3ccc8DD5x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y6E[] = {
  {&(_ZTVN3ccc8DD5x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y6E[];
static VTBL_ENTRY alt_thunk_names300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y63efgEv,_ZTv0_n12_N3ccc8DD5x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y63efgEv,_ZThn4_N3ccc8DD5x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y6E = {  "_ZN3ccc8DD5x13y6E", // class name
  bases__ZN3ccc8DD5x13y6E, 2,
  &(vtc__ZN3ccc8DD5x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y6E),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  CC5x13y7  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC5x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y73pqrEv
  ~CC5x13y7(); // tgen
  CC5x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y7E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y73abcEv");}
void  ccc::CC5x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y73pqrEv");}
ccc::CC5x13y7 ::~CC5x13y7(){ note_dtor("_ZN3ccc8CC5x13y7E", this);} // tgen
ccc::CC5x13y7 ::CC5x13y7(){ note_ctor("_ZN3ccc8CC5x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y7E, buf);
    ::ccc::CC5x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y7E);
    dp->::ccc::CC5x13y7::~CC5x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y7E(Test__ZN3ccc8CC5x13y7E, "_ZN3ccc8CC5x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y7C1Ev();
extern void _ZN3ccc8CC5x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y7E[] = {
  NSPAIR(_ZN3ccc8CC5x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y7E[] = {
  // 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__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 _ZTIN3ccc8CC5x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC5x13y73abcEv();
extern void _ZN3ccc8CC5x13y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y73pqrEv,_ZTv0_n12_N3ccc8CC5x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y73pqrEv,_ZThn4_N3ccc8CC5x13y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y73abcEv,_ZTv0_n20_N3ccc8CC5x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y73abcEv,_ZThn4_N3ccc8CC5x13y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y73pqrEv,_ZTv0_n12_N3ccc8CC5x13y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y73abcEv,_ZTv0_n20_N3ccc8CC5x13y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y7E[] = {
  {&(_ZTVN3ccc8CC5x13y7E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x13y7E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y7E[];
static VTBL_ENTRY alt_thunk_names301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y73abcEv,_ZTv0_n20_N3ccc8CC5x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y73abcEv,_ZThn4_N3ccc8CC5x13y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y73pqrEv,_ZTv0_n12_N3ccc8CC5x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y73pqrEv,_ZThn4_N3ccc8CC5x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y7E = {  "_ZN3ccc8CC5x13y7E", // class name
  bases__ZN3ccc8CC5x13y7E, 2,
  &(vtc__ZN3ccc8CC5x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y7E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y7E),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  DD5x13y7  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD5x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x13y73pqrEv
  ~DD5x13y7(); // tgen
  DD5x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y73abcEv");}
void  ccc::DD5x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y73pqrEv");}
ccc::DD5x13y7 ::~DD5x13y7(){ note_dtor("_ZN3ccc8DD5x13y7E", this);} // tgen
ccc::DD5x13y7 ::DD5x13y7(){ note_ctor("_ZN3ccc8DD5x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y7E, buf);
    ::ccc::DD5x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y7E);
    dp->::ccc::DD5x13y7::~DD5x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y7E(Test__ZN3ccc8DD5x13y7E, "_ZN3ccc8DD5x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y7C1Ev();
extern void _ZN3ccc8DD5x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y7E[] = {
  NSPAIR(_ZN3ccc8DD5x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y7E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y7E[];
extern void _ZN3ccc8DD5x13y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y73abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y7E[] = {
  {&(_ZTVN3ccc8DD5x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y7E[];
Class_Descriptor cd__ZN3ccc8DD5x13y7E = {  "_ZN3ccc8DD5x13y7E", // class name
  bases__ZN3ccc8DD5x13y7E, 2,
  &(vtc__ZN3ccc8DD5x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y7E),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  CC5x13y8  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x13y83abcEv
  ~CC5x13y8(); // tgen
  CC5x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y8E) C1{ VBC2{ v3 v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y83efgEv");}
void  ccc::CC5x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x13y83abcEv");}
ccc::CC5x13y8 ::~CC5x13y8(){ note_dtor("_ZN3ccc8CC5x13y8E", this);} // tgen
ccc::CC5x13y8 ::CC5x13y8(){ note_ctor("_ZN3ccc8CC5x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y8E, buf);
    ::ccc::CC5x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y8E);
    dp->::ccc::CC5x13y8::~CC5x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y8E(Test__ZN3ccc8CC5x13y8E, "_ZN3ccc8CC5x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y8C1Ev();
extern void _ZN3ccc8CC5x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y8E[] = {
  NSPAIR(_ZN3ccc8CC5x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x13y8E[];
extern void _ZN3ccc8CC5x13y83efgEv();
extern void _ZN3ccc8CC5x13y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y83efgEv,_ZTv0_n16_N3ccc8CC5x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y83efgEv,_ZThn4_N3ccc8CC5x13y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x13y83abcEv,_ZTv0_n20_N3ccc8CC5x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y83abcEv,_ZThn4_N3ccc8CC5x13y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y83efgEv,_ZTv0_n16_N3ccc8CC5x13y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x13y83abcEv,_ZTv0_n20_N3ccc8CC5x13y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y8E[] = {
  {&(_ZTVN3ccc8CC5x13y8E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x13y8E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y8E[];
static VTBL_ENTRY alt_thunk_names302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x13y83abcEv,_ZTv0_n20_N3ccc8CC5x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y83abcEv,_ZThn4_N3ccc8CC5x13y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y83efgEv,_ZTv0_n16_N3ccc8CC5x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y83efgEv,_ZThn4_N3ccc8CC5x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y8E = {  "_ZN3ccc8CC5x13y8E", // class name
  bases__ZN3ccc8CC5x13y8E, 2,
  &(vtc__ZN3ccc8CC5x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y8E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y8E),2, //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  DD5x13y8  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD5x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD5x13y83abcEv
  ~DD5x13y8(); // tgen
  DD5x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y83efgEv");}
void  ccc::DD5x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x13y83abcEv");}
ccc::DD5x13y8 ::~DD5x13y8(){ note_dtor("_ZN3ccc8DD5x13y8E", this);} // tgen
ccc::DD5x13y8 ::DD5x13y8(){ note_ctor("_ZN3ccc8DD5x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y8E, buf);
    ::ccc::DD5x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y8E);
    dp->::ccc::DD5x13y8::~DD5x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y8E(Test__ZN3ccc8DD5x13y8E, "_ZN3ccc8DD5x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y8C1Ev();
extern void _ZN3ccc8DD5x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y8E[] = {
  NSPAIR(_ZN3ccc8DD5x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y8E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x13y83efgEv();
extern void _ZN3ccc8DD5x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y83efgEv,_ZTv0_n12_N3ccc8DD5x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y83efgEv,_ZThn4_N3ccc8DD5x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y83efgEv,_ZTv0_n12_N3ccc8DD5x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y8E[] = {
  {&(_ZTVN3ccc8DD5x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y8E[];
static VTBL_ENTRY alt_thunk_names303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y83efgEv,_ZTv0_n12_N3ccc8DD5x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y83efgEv,_ZThn4_N3ccc8DD5x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y8E = {  "_ZN3ccc8DD5x13y8E", // class name
  bases__ZN3ccc8DD5x13y8E, 2,
  &(vtc__ZN3ccc8DD5x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y8E),3, //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  CC5x13y9  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC5x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x13y93pqrEv
  ~CC5x13y9(); // tgen
  CC5x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x13y9E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x13y93efgEv");}
void  ccc::CC5x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x13y93pqrEv");}
ccc::CC5x13y9 ::~CC5x13y9(){ note_dtor("_ZN3ccc8CC5x13y9E", this);} // tgen
ccc::CC5x13y9 ::CC5x13y9(){ note_ctor("_ZN3ccc8CC5x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC5x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x13y9E, buf);
    ::ccc::CC5x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x13y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC5x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x13y9E);
    dp->::ccc::CC5x13y9::~CC5x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x13y9E(Test__ZN3ccc8CC5x13y9E, "_ZN3ccc8CC5x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x13y9C1Ev();
extern void _ZN3ccc8CC5x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC5x13y9E[] = {
  NSPAIR(_ZN3ccc8CC5x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC5x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC5x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x13y9E[];
extern void _ZN3ccc8CC5x13y93efgEv();
extern void _ZN3ccc8CC5x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x13y93pqrEv,_ZTv0_n12_N3ccc8CC5x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y93pqrEv,_ZThn4_N3ccc8CC5x13y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x13y93efgEv,_ZTv0_n16_N3ccc8CC5x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x13y93efgEv,_ZThn4_N3ccc8CC5x13y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x13y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x13y93pqrEv,_ZTv0_n12_N3ccc8CC5x13y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x13y93efgEv,_ZTv0_n16_N3ccc8CC5x13y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x13y9E[] = {
  {&(_ZTVN3ccc8CC5x13y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x13y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x13y9E[];
static VTBL_ENTRY alt_thunk_names304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x13y93efgEv,_ZTv0_n16_N3ccc8CC5x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y93efgEv,_ZThn4_N3ccc8CC5x13y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x13y93pqrEv,_ZTv0_n12_N3ccc8CC5x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x13y93pqrEv,_ZThn4_N3ccc8CC5x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x13y9E = {  "_ZN3ccc8CC5x13y9E", // class name
  bases__ZN3ccc8CC5x13y9E, 2,
  &(vtc__ZN3ccc8CC5x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x13y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x13y9E),2, //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  DD5x13y9  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD5x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x13y93pqrEv
  ~DD5x13y9(); // tgen
  DD5x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD5x13y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x13y93efgEv");}
void  ccc::DD5x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x13y93pqrEv");}
ccc::DD5x13y9 ::~DD5x13y9(){ note_dtor("_ZN3ccc8DD5x13y9E", this);} // tgen
ccc::DD5x13y9 ::DD5x13y9(){ note_ctor("_ZN3ccc8DD5x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD5x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x13y9E, buf);
    ::ccc::DD5x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x13y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD5x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x13y9E);
    dp->::ccc::DD5x13y9::~DD5x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x13y9E(Test__ZN3ccc8DD5x13y9E, "_ZN3ccc8DD5x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x13y9C1Ev();
extern void _ZN3ccc8DD5x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD5x13y9E[] = {
  NSPAIR(_ZN3ccc8DD5x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD5x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD5x13y9E[] = {
  // 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__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 _ZTIN3ccc8DD5x13y9E[];
extern void _ZN3ccc8DD5x13y93pqrEv();
extern void _ZN3ccc8DD5x13y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x13y93efgEv,_ZTv0_n12_N3ccc8DD5x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x13y93efgEv,_ZThn4_N3ccc8DD5x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x13y93efgEv,_ZTv0_n12_N3ccc8DD5x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x13y9E[] = {
  {&(_ZTVN3ccc8DD5x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x13y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x13y9E[];
static VTBL_ENTRY alt_thunk_names305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x13y93efgEv,_ZTv0_n12_N3ccc8DD5x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x13y93efgEv,_ZThn4_N3ccc8DD5x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x13y9E = {  "_ZN3ccc8DD5x13y9E", // class name
  bases__ZN3ccc8DD5x13y9E, 2,
  &(vtc__ZN3ccc8DD5x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x13y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x13y9E),3, //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  CC5x13y10  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC5x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x13y103abcEv
  ~CC5x13y10(); // tgen
  CC5x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y10E) C1{ VBC2{ v1 v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x13y103pqrEv");}
void  ccc::CC5x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x13y103abcEv");}
ccc::CC5x13y10 ::~CC5x13y10(){ note_dtor("_ZN3ccc9CC5x13y10E", this);} // tgen
ccc::CC5x13y10 ::CC5x13y10(){ note_ctor("_ZN3ccc9CC5x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC5x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x13y10E, buf);
    ::ccc::CC5x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x13y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC5x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x13y10E);
    dp->::ccc::CC5x13y10::~CC5x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x13y10E(Test__ZN3ccc9CC5x13y10E, "_ZN3ccc9CC5x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x13y10C1Ev();
extern void _ZN3ccc9CC5x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC5x13y10E[] = {
  NSPAIR(_ZN3ccc9CC5x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC5x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC5x13y10E[] = {
  // 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__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 _ZTIN3ccc9CC5x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC5x13y103pqrEv();
extern void _ZN3ccc9CC5x13y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x13y103pqrEv,_ZTv0_n12_N3ccc9CC5x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y103pqrEv,_ZThn4_N3ccc9CC5x13y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x13y103abcEv,_ZTv0_n20_N3ccc9CC5x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y103abcEv,_ZThn4_N3ccc9CC5x13y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x13y103pqrEv,_ZTv0_n12_N3ccc9CC5x13y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x13y103abcEv,_ZTv0_n20_N3ccc9CC5x13y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x13y10E[] = {
  {&(_ZTVN3ccc9CC5x13y10E[3]),  3,14},
  {&(_ZTVN3ccc9CC5x13y10E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x13y10E[];
static VTBL_ENTRY alt_thunk_names306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x13y103abcEv,_ZTv0_n20_N3ccc9CC5x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y103abcEv,_ZThn4_N3ccc9CC5x13y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x13y103pqrEv,_ZTv0_n12_N3ccc9CC5x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y103pqrEv,_ZThn4_N3ccc9CC5x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x13y10E = {  "_ZN3ccc9CC5x13y10E", // class name
  bases__ZN3ccc9CC5x13y10E, 2,
  &(vtc__ZN3ccc9CC5x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y10E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x13y10E),2, //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  DD5x13y10  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD5x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD5x13y103abcEv
  ~DD5x13y10(); // tgen
  DD5x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD5x13y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x13y103pqrEv");}
void  ccc::DD5x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x13y103abcEv");}
ccc::DD5x13y10 ::~DD5x13y10(){ note_dtor("_ZN3ccc9DD5x13y10E", this);} // tgen
ccc::DD5x13y10 ::DD5x13y10(){ note_ctor("_ZN3ccc9DD5x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD5x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x13y10E, buf);
    ::ccc::DD5x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x13y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD5x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x13y10E);
    dp->::ccc::DD5x13y10::~DD5x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x13y10E(Test__ZN3ccc9DD5x13y10E, "_ZN3ccc9DD5x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x13y10C1Ev();
extern void _ZN3ccc9DD5x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD5x13y10E[] = {
  NSPAIR(_ZN3ccc9DD5x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD5x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD5x13y10E[] = {
  // 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__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 _ZTIN3ccc9DD5x13y10E[];
extern void _ZN3ccc9DD5x13y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y103abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x13y10E[] = {
  {&(_ZTVN3ccc9DD5x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x13y10E[];
Class_Descriptor cd__ZN3ccc9DD5x13y10E = {  "_ZN3ccc9DD5x13y10E", // class name
  bases__ZN3ccc9DD5x13y10E, 2,
  &(vtc__ZN3ccc9DD5x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x13y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x13y10E),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  CC5x13y11  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC5x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x13y113efgEv
  ~CC5x13y11(); // tgen
  CC5x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y11E) C1{ VBC2{ v1 v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x13y113pqrEv");}
void  ccc::CC5x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x13y113efgEv");}
ccc::CC5x13y11 ::~CC5x13y11(){ note_dtor("_ZN3ccc9CC5x13y11E", this);} // tgen
ccc::CC5x13y11 ::CC5x13y11(){ note_ctor("_ZN3ccc9CC5x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC5x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x13y11E, buf);
    ::ccc::CC5x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x13y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC5x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x13y11E);
    dp->::ccc::CC5x13y11::~CC5x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x13y11E(Test__ZN3ccc9CC5x13y11E, "_ZN3ccc9CC5x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x13y11C1Ev();
extern void _ZN3ccc9CC5x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC5x13y11E[] = {
  NSPAIR(_ZN3ccc9CC5x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC5x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC5x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x13y11E[];
extern void _ZN3ccc9CC5x13y113efgEv();
extern void _ZN3ccc9CC5x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x13y113pqrEv,_ZTv0_n12_N3ccc9CC5x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y113pqrEv,_ZThn4_N3ccc9CC5x13y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x13y113efgEv,_ZTv0_n16_N3ccc9CC5x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y113efgEv,_ZThn4_N3ccc9CC5x13y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x13y113pqrEv,_ZTv0_n12_N3ccc9CC5x13y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x13y113efgEv,_ZTv0_n16_N3ccc9CC5x13y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x13y11E[] = {
  {&(_ZTVN3ccc9CC5x13y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x13y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x13y11E[];
static VTBL_ENTRY alt_thunk_names307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x13y113efgEv,_ZTv0_n16_N3ccc9CC5x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y113efgEv,_ZThn4_N3ccc9CC5x13y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x13y113pqrEv,_ZTv0_n12_N3ccc9CC5x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y113pqrEv,_ZThn4_N3ccc9CC5x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x13y11E = {  "_ZN3ccc9CC5x13y11E", // class name
  bases__ZN3ccc9CC5x13y11E, 2,
  &(vtc__ZN3ccc9CC5x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x13y11E),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  DD5x13y11  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD5x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD5x13y113efgEv
  ~DD5x13y11(); // tgen
  DD5x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD5x13y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x13y113pqrEv");}
void  ccc::DD5x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x13y113efgEv");}
ccc::DD5x13y11 ::~DD5x13y11(){ note_dtor("_ZN3ccc9DD5x13y11E", this);} // tgen
ccc::DD5x13y11 ::DD5x13y11(){ note_ctor("_ZN3ccc9DD5x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD5x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x13y11E, buf);
    ::ccc::DD5x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x13y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD5x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x13y11E);
    dp->::ccc::DD5x13y11::~DD5x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x13y11E(Test__ZN3ccc9DD5x13y11E, "_ZN3ccc9DD5x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x13y11C1Ev();
extern void _ZN3ccc9DD5x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD5x13y11E[] = {
  NSPAIR(_ZN3ccc9DD5x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD5x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD5x13y11E[] = {
  // 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__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 _ZTIN3ccc9DD5x13y11E[];
extern void _ZN3ccc9DD5x13y113pqrEv();
extern void _ZN3ccc9DD5x13y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x13y113efgEv,_ZTv0_n12_N3ccc9DD5x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x13y113efgEv,_ZThn4_N3ccc9DD5x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x13y113efgEv,_ZTv0_n12_N3ccc9DD5x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x13y11E[] = {
  {&(_ZTVN3ccc9DD5x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x13y11E[];
static VTBL_ENTRY alt_thunk_names308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x13y113efgEv,_ZTv0_n12_N3ccc9DD5x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x13y113efgEv,_ZThn4_N3ccc9DD5x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x13y11E = {  "_ZN3ccc9DD5x13y11E", // class name
  bases__ZN3ccc9DD5x13y11E, 2,
  &(vtc__ZN3ccc9DD5x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x13y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x13y11E),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  CC5x13y12  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC5x13y123abcEv
  ~CC5x13y12(); // tgen
  CC5x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC5x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x13y123abcEv");}
ccc::CC5x13y12 ::~CC5x13y12(){ note_dtor("_ZN3ccc9CC5x13y12E", this);} // tgen
ccc::CC5x13y12 ::CC5x13y12(){ note_ctor("_ZN3ccc9CC5x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC5x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x13y12E, buf);
    ::ccc::CC5x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x13y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC5x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x13y12E);
    dp->::ccc::CC5x13y12::~CC5x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x13y12E(Test__ZN3ccc9CC5x13y12E, "_ZN3ccc9CC5x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x13y12C1Ev();
extern void _ZN3ccc9CC5x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC5x13y12E[] = {
  NSPAIR(_ZN3ccc9CC5x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC5x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC5x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC5x13y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x13y123abcEv,_ZTv0_n20_N3ccc9CC5x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y123abcEv,_ZThn4_N3ccc9CC5x13y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x13y123abcEv,_ZTv0_n20_N3ccc9CC5x13y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x13y12E[] = {
  {&(_ZTVN3ccc9CC5x13y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x13y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x13y12E[];
static VTBL_ENTRY alt_thunk_names309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x13y123abcEv,_ZTv0_n20_N3ccc9CC5x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y123abcEv,_ZThn4_N3ccc9CC5x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x13y12E = {  "_ZN3ccc9CC5x13y12E", // class name
  bases__ZN3ccc9CC5x13y12E, 2,
  &(vtc__ZN3ccc9CC5x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x13y12E),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  DD5x13y12  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD5x13y123abcEv
  ~DD5x13y12(); // tgen
  DD5x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD5x13y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD5x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x13y123abcEv");}
ccc::DD5x13y12 ::~DD5x13y12(){ note_dtor("_ZN3ccc9DD5x13y12E", this);} // tgen
ccc::DD5x13y12 ::DD5x13y12(){ note_ctor("_ZN3ccc9DD5x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD5x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x13y12E, buf);
    ::ccc::DD5x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x13y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD5x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x13y12E);
    dp->::ccc::DD5x13y12::~DD5x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x13y12E(Test__ZN3ccc9DD5x13y12E, "_ZN3ccc9DD5x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x13y12C1Ev();
extern void _ZN3ccc9DD5x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD5x13y12E[] = {
  NSPAIR(_ZN3ccc9DD5x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD5x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD5x13y12E[] = {
  // 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__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 _ZTIN3ccc9DD5x13y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x13y12E[] = {
  {&(_ZTVN3ccc9DD5x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x13y12E[];
Class_Descriptor cd__ZN3ccc9DD5x13y12E = {  "_ZN3ccc9DD5x13y12E", // class name
  bases__ZN3ccc9DD5x13y12E, 2,
  &(vtc__ZN3ccc9DD5x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x13y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x13y12E),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  CC5x13y13  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC5x13y133efgEv
  ~CC5x13y13(); // tgen
  CC5x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y13E) C1{ VBC2{ v2 v1 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC5x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x13y133efgEv");}
ccc::CC5x13y13 ::~CC5x13y13(){ note_dtor("_ZN3ccc9CC5x13y13E", this);} // tgen
ccc::CC5x13y13 ::CC5x13y13(){ note_ctor("_ZN3ccc9CC5x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC5x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x13y13E, buf);
    ::ccc::CC5x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x13y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC5x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x13y13E);
    dp->::ccc::CC5x13y13::~CC5x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x13y13E(Test__ZN3ccc9CC5x13y13E, "_ZN3ccc9CC5x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x13y13C1Ev();
extern void _ZN3ccc9CC5x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC5x13y13E[] = {
  NSPAIR(_ZN3ccc9CC5x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC5x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC5x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x13y13E[];
extern void _ZN3ccc9CC5x13y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x13y133efgEv,_ZTv0_n16_N3ccc9CC5x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y133efgEv,_ZThn4_N3ccc9CC5x13y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x13y133efgEv,_ZTv0_n16_N3ccc9CC5x13y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x13y13E[] = {
  {&(_ZTVN3ccc9CC5x13y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC5x13y13E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x13y13E[];
static VTBL_ENTRY alt_thunk_names310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x13y133efgEv,_ZTv0_n16_N3ccc9CC5x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y133efgEv,_ZThn4_N3ccc9CC5x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x13y13E = {  "_ZN3ccc9CC5x13y13E", // class name
  bases__ZN3ccc9CC5x13y13E, 2,
  &(vtc__ZN3ccc9CC5x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x13y13E),2, //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  DD5x13y13  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD5x13y133efgEv
  ~DD5x13y13(); // tgen
  DD5x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD5x13y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD5x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x13y133efgEv");}
ccc::DD5x13y13 ::~DD5x13y13(){ note_dtor("_ZN3ccc9DD5x13y13E", this);} // tgen
ccc::DD5x13y13 ::DD5x13y13(){ note_ctor("_ZN3ccc9DD5x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD5x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x13y13E, buf);
    ::ccc::DD5x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x13y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD5x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x13y13E);
    dp->::ccc::DD5x13y13::~DD5x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x13y13E(Test__ZN3ccc9DD5x13y13E, "_ZN3ccc9DD5x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x13y13C1Ev();
extern void _ZN3ccc9DD5x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD5x13y13E[] = {
  NSPAIR(_ZN3ccc9DD5x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD5x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD5x13y13E[] = {
  // 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__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 _ZTIN3ccc9DD5x13y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9DD5x13y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x13y133efgEv,_ZTv0_n12_N3ccc9DD5x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x13y133efgEv,_ZThn4_N3ccc9DD5x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x13y133efgEv,_ZTv0_n12_N3ccc9DD5x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x13y13E[] = {
  {&(_ZTVN3ccc9DD5x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x13y13E[];
static VTBL_ENTRY alt_thunk_names311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x13y133efgEv,_ZTv0_n12_N3ccc9DD5x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x13y133efgEv,_ZThn4_N3ccc9DD5x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x13y13E = {  "_ZN3ccc9DD5x13y13E", // class name
  bases__ZN3ccc9DD5x13y13E, 2,
  &(vtc__ZN3ccc9DD5x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x13y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x13y13E),3, //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  CC5x13y14  : virtual ::ccc::AA5 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC5x13y143pqrEv
  ~CC5x13y14(); // tgen
  CC5x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y14E) C1{ VBC2{ v1 v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC5x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x13y143pqrEv");}
ccc::CC5x13y14 ::~CC5x13y14(){ note_dtor("_ZN3ccc9CC5x13y14E", this);} // tgen
ccc::CC5x13y14 ::CC5x13y14(){ note_ctor("_ZN3ccc9CC5x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC5x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x13y14E, buf);
    ::ccc::CC5x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x13y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC5x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x13y14E);
    dp->::ccc::CC5x13y14::~CC5x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x13y14E(Test__ZN3ccc9CC5x13y14E, "_ZN3ccc9CC5x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x13y14C1Ev();
extern void _ZN3ccc9CC5x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC5x13y14E[] = {
  NSPAIR(_ZN3ccc9CC5x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC5x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC5x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC5x13y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x13y143pqrEv,_ZTv0_n12_N3ccc9CC5x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x13y143pqrEv,_ZThn4_N3ccc9CC5x13y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x13y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x13y143pqrEv,_ZTv0_n12_N3ccc9CC5x13y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x13y14E[] = {
  {&(_ZTVN3ccc9CC5x13y14E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x13y14E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x13y14E[];
static VTBL_ENTRY alt_thunk_names312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x13y143pqrEv,_ZTv0_n12_N3ccc9CC5x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x13y143pqrEv,_ZThn4_N3ccc9CC5x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x13y14E = {  "_ZN3ccc9CC5x13y14E", // class name
  bases__ZN3ccc9CC5x13y14E, 2,
  &(vtc__ZN3ccc9CC5x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y14E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x13y14E),2, //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  DD5x13y14  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD5x13y143pqrEv
  ~DD5x13y14(); // tgen
  DD5x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD5x13y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD5x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x13y143pqrEv");}
ccc::DD5x13y14 ::~DD5x13y14(){ note_dtor("_ZN3ccc9DD5x13y14E", this);} // tgen
ccc::DD5x13y14 ::DD5x13y14(){ note_ctor("_ZN3ccc9DD5x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD5x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x13y14E, buf);
    ::ccc::DD5x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x13y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD5x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x13y14E);
    dp->::ccc::DD5x13y14::~DD5x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x13y14E(Test__ZN3ccc9DD5x13y14E, "_ZN3ccc9DD5x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x13y14C1Ev();
extern void _ZN3ccc9DD5x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD5x13y14E[] = {
  NSPAIR(_ZN3ccc9DD5x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD5x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD5x13y14E[] = {
  // 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__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 _ZTIN3ccc9DD5x13y14E[];
extern void _ZN3ccc9DD5x13y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x13y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x13y14E[] = {
  {&(_ZTVN3ccc9DD5x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x13y14E[];
Class_Descriptor cd__ZN3ccc9DD5x13y14E = {  "_ZN3ccc9DD5x13y14E", // class name
  bases__ZN3ccc9DD5x13y14E, 2,
  &(vtc__ZN3ccc9DD5x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x13y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x13y14E),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  CC5x13y15  : virtual ::ccc::AA5 , ::ccc::BB13 {
  ~CC5x13y15(); // tgen
  CC5x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x13y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC5x13y15 ::~CC5x13y15(){ note_dtor("_ZN3ccc9CC5x13y15E", this);} // tgen
ccc::CC5x13y15 ::CC5x13y15(){ note_ctor("_ZN3ccc9CC5x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC5x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x13y15E, buf);
    ::ccc::CC5x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x13y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC5x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x13y15E);
    dp->::ccc::CC5x13y15::~CC5x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x13y15E(Test__ZN3ccc9CC5x13y15E, "_ZN3ccc9CC5x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x13y15C1Ev();
extern void _ZN3ccc9CC5x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC5x13y15E[] = {
  NSPAIR(_ZN3ccc9CC5x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC5x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC5x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x13y15E[] = {
  {&(_ZTVN3ccc9CC5x13y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC5x13y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x13y15E[];
Class_Descriptor cd__ZN3ccc9CC5x13y15E = {  "_ZN3ccc9CC5x13y15E", // class name
  bases__ZN3ccc9CC5x13y15E, 2,
  &(vtc__ZN3ccc9CC5x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x13y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x13y15E),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  DD5x13y15  : virtual ::ccc::AA5 , virtual ::ccc::BB13 {
  ~DD5x13y15(); // tgen
  DD5x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD5x13y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD5x13y15 ::~DD5x13y15(){ note_dtor("_ZN3ccc9DD5x13y15E", this);} // tgen
ccc::DD5x13y15 ::DD5x13y15(){ note_ctor("_ZN3ccc9DD5x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD5x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x13y15E, buf);
    ::ccc::DD5x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x13y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD5x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x13y15E);
    dp->::ccc::DD5x13y15::~DD5x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x13y15E(Test__ZN3ccc9DD5x13y15E, "_ZN3ccc9DD5x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x13y15C1Ev();
extern void _ZN3ccc9DD5x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD5x13y15E[] = {
  NSPAIR(_ZN3ccc9DD5x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD5x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD5x13y15E[] = {
  // 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__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 _ZTIN3ccc9DD5x13y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x13y15E[] = {
  {&(_ZTVN3ccc9DD5x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x13y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x13y15E[];
Class_Descriptor cd__ZN3ccc9DD5x13y15E = {  "_ZN3ccc9DD5x13y15E", // class name
  bases__ZN3ccc9DD5x13y15E, 2,
  &(vtc__ZN3ccc9DD5x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x13y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x13y15E),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  CC5x14y0  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y03pqrEv
  ~CC5x14y0(); // tgen
  CC5x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y0E) C1{ VBC2{ v3 v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y03abcEv");}
void  ccc::CC5x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y03efgEv");}
void  ccc::CC5x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y03pqrEv");}
ccc::CC5x14y0 ::~CC5x14y0(){ note_dtor("_ZN3ccc8CC5x14y0E", this);} // tgen
ccc::CC5x14y0 ::CC5x14y0(){ note_ctor("_ZN3ccc8CC5x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y0E, buf);
    ::ccc::CC5x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y0E);
    dp->::ccc::CC5x14y0::~CC5x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y0E(Test__ZN3ccc8CC5x14y0E, "_ZN3ccc8CC5x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y0C1Ev();
extern void _ZN3ccc8CC5x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y0E[] = {
  NSPAIR(_ZN3ccc8CC5x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y0E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y0E[];
extern void _ZN3ccc8CC5x14y03pqrEv();
extern void _ZN3ccc8CC5x14y03abcEv();
extern void _ZN3ccc8CC5x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y03pqrEv,_ZTv0_n12_N3ccc8CC5x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y03pqrEv,_ZThn4_N3ccc8CC5x14y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y03efgEv,_ZTv0_n16_N3ccc8CC5x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y03efgEv,_ZThn4_N3ccc8CC5x14y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y03abcEv,_ZTv0_n20_N3ccc8CC5x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y03abcEv,_ZThn4_N3ccc8CC5x14y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y03pqrEv,_ZTv0_n12_N3ccc8CC5x14y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y03efgEv,_ZTv0_n16_N3ccc8CC5x14y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y03abcEv,_ZTv0_n20_N3ccc8CC5x14y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y0E[] = {
  {&(_ZTVN3ccc8CC5x14y0E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y0E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y0E[];
static VTBL_ENTRY alt_thunk_names313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y03abcEv,_ZTv0_n20_N3ccc8CC5x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y03abcEv,_ZThn4_N3ccc8CC5x14y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y03efgEv,_ZTv0_n16_N3ccc8CC5x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y03efgEv,_ZThn4_N3ccc8CC5x14y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y03pqrEv,_ZTv0_n12_N3ccc8CC5x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y03pqrEv,_ZThn4_N3ccc8CC5x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y0E = {  "_ZN3ccc8CC5x14y0E", // class name
  bases__ZN3ccc8CC5x14y0E, 2,
  &(vtc__ZN3ccc8CC5x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y0E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y0E),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  DD5x14y0  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD5x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD5x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x14y03pqrEv
  ~DD5x14y0(); // tgen
  DD5x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y0E) C1{ VBC2{ v3 v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y03abcEv");}
void  ccc::DD5x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y03efgEv");}
void  ccc::DD5x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y03pqrEv");}
ccc::DD5x14y0 ::~DD5x14y0(){ note_dtor("_ZN3ccc8DD5x14y0E", this);} // tgen
ccc::DD5x14y0 ::DD5x14y0(){ note_ctor("_ZN3ccc8DD5x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y0E, buf);
    ::ccc::DD5x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y0E);
    dp->::ccc::DD5x14y0::~DD5x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y0E(Test__ZN3ccc8DD5x14y0E, "_ZN3ccc8DD5x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y0C1Ev();
extern void _ZN3ccc8DD5x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y0E[] = {
  NSPAIR(_ZN3ccc8DD5x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y0E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y0E[];
extern void _ZN3ccc8DD5x14y03pqrEv();
extern void _ZN3ccc8DD5x14y03efgEv();
extern void _ZN3ccc8DD5x14y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y03pqrEv,_ZTv0_n12_N3ccc8DD5x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y03pqrEv,_ZThn4_N3ccc8DD5x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y03pqrEv,_ZTv0_n12_N3ccc8DD5x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y0E[] = {
  {&(_ZTVN3ccc8DD5x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y0E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y0E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y0E[];
static VTBL_ENTRY alt_thunk_names314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y03pqrEv,_ZTv0_n12_N3ccc8DD5x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y03pqrEv,_ZThn4_N3ccc8DD5x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y0E = {  "_ZN3ccc8DD5x14y0E", // class name
  bases__ZN3ccc8DD5x14y0E, 2,
  &(vtc__ZN3ccc8DD5x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y0E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y0E),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  CC5x14y1  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x14y13efgEv
  ~CC5x14y1(); // tgen
  CC5x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y1E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y13abcEv");}
void  ccc::CC5x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y13pqrEv");}
void  ccc::CC5x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y13efgEv");}
ccc::CC5x14y1 ::~CC5x14y1(){ note_dtor("_ZN3ccc8CC5x14y1E", this);} // tgen
ccc::CC5x14y1 ::CC5x14y1(){ note_ctor("_ZN3ccc8CC5x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y1E, buf);
    ::ccc::CC5x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y1E);
    dp->::ccc::CC5x14y1::~CC5x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y1E(Test__ZN3ccc8CC5x14y1E, "_ZN3ccc8CC5x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y1C1Ev();
extern void _ZN3ccc8CC5x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y1E[] = {
  NSPAIR(_ZN3ccc8CC5x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y1E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y1E[];
extern void _ZN3ccc8CC5x14y13pqrEv();
extern void _ZN3ccc8CC5x14y13abcEv();
extern void _ZN3ccc8CC5x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y13pqrEv,_ZTv0_n12_N3ccc8CC5x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y13pqrEv,_ZThn4_N3ccc8CC5x14y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y13efgEv,_ZTv0_n16_N3ccc8CC5x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y13efgEv,_ZThn4_N3ccc8CC5x14y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y13abcEv,_ZTv0_n20_N3ccc8CC5x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y13abcEv,_ZThn4_N3ccc8CC5x14y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y13pqrEv,_ZTv0_n12_N3ccc8CC5x14y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y13efgEv,_ZTv0_n16_N3ccc8CC5x14y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y13abcEv,_ZTv0_n20_N3ccc8CC5x14y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y1E[] = {
  {&(_ZTVN3ccc8CC5x14y1E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y1E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y1E[];
static VTBL_ENTRY alt_thunk_names315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y13abcEv,_ZTv0_n20_N3ccc8CC5x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y13abcEv,_ZThn4_N3ccc8CC5x14y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y13efgEv,_ZTv0_n16_N3ccc8CC5x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y13efgEv,_ZThn4_N3ccc8CC5x14y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y13pqrEv,_ZTv0_n12_N3ccc8CC5x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y13pqrEv,_ZThn4_N3ccc8CC5x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y1E = {  "_ZN3ccc8CC5x14y1E", // class name
  bases__ZN3ccc8CC5x14y1E, 2,
  &(vtc__ZN3ccc8CC5x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y1E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y1E),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  DD5x14y1  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD5x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x14y13efgEv
  ~DD5x14y1(); // tgen
  DD5x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y1E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y13abcEv");}
void  ccc::DD5x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y13pqrEv");}
void  ccc::DD5x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y13efgEv");}
ccc::DD5x14y1 ::~DD5x14y1(){ note_dtor("_ZN3ccc8DD5x14y1E", this);} // tgen
ccc::DD5x14y1 ::DD5x14y1(){ note_ctor("_ZN3ccc8DD5x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y1E, buf);
    ::ccc::DD5x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y1E);
    dp->::ccc::DD5x14y1::~DD5x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y1E(Test__ZN3ccc8DD5x14y1E, "_ZN3ccc8DD5x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y1C1Ev();
extern void _ZN3ccc8DD5x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y1E[] = {
  NSPAIR(_ZN3ccc8DD5x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y1E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y1E[];
extern void _ZN3ccc8DD5x14y13pqrEv();
extern void _ZN3ccc8DD5x14y13efgEv();
extern void _ZN3ccc8DD5x14y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y13pqrEv,_ZTv0_n12_N3ccc8DD5x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y13pqrEv,_ZThn4_N3ccc8DD5x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y13pqrEv,_ZTv0_n12_N3ccc8DD5x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y1E[] = {
  {&(_ZTVN3ccc8DD5x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y1E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y1E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y1E[];
static VTBL_ENTRY alt_thunk_names316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y13pqrEv,_ZTv0_n12_N3ccc8DD5x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y13pqrEv,_ZThn4_N3ccc8DD5x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y1E = {  "_ZN3ccc8DD5x14y1E", // class name
  bases__ZN3ccc8DD5x14y1E, 2,
  &(vtc__ZN3ccc8DD5x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y1E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y1E),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  CC5x14y2  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y23pqrEv
  ~CC5x14y2(); // tgen
  CC5x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y2E) C1{ VBC2{ v3 v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y23efgEv");}
void  ccc::CC5x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y23abcEv");}
void  ccc::CC5x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y23pqrEv");}
ccc::CC5x14y2 ::~CC5x14y2(){ note_dtor("_ZN3ccc8CC5x14y2E", this);} // tgen
ccc::CC5x14y2 ::CC5x14y2(){ note_ctor("_ZN3ccc8CC5x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y2E, buf);
    ::ccc::CC5x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y2E);
    dp->::ccc::CC5x14y2::~CC5x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y2E(Test__ZN3ccc8CC5x14y2E, "_ZN3ccc8CC5x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y2C1Ev();
extern void _ZN3ccc8CC5x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y2E[] = {
  NSPAIR(_ZN3ccc8CC5x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y2E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y2E[];
extern void _ZN3ccc8CC5x14y23pqrEv();
extern void _ZN3ccc8CC5x14y23efgEv();
extern void _ZN3ccc8CC5x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y23pqrEv,_ZTv0_n12_N3ccc8CC5x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y23pqrEv,_ZThn4_N3ccc8CC5x14y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y23efgEv,_ZTv0_n16_N3ccc8CC5x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y23efgEv,_ZThn4_N3ccc8CC5x14y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y23abcEv,_ZTv0_n20_N3ccc8CC5x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y23abcEv,_ZThn4_N3ccc8CC5x14y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y23pqrEv,_ZTv0_n12_N3ccc8CC5x14y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y23efgEv,_ZTv0_n16_N3ccc8CC5x14y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y23abcEv,_ZTv0_n20_N3ccc8CC5x14y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y2E[] = {
  {&(_ZTVN3ccc8CC5x14y2E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y2E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y2E[];
static VTBL_ENTRY alt_thunk_names317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y23abcEv,_ZTv0_n20_N3ccc8CC5x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y23abcEv,_ZThn4_N3ccc8CC5x14y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y23efgEv,_ZTv0_n16_N3ccc8CC5x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y23efgEv,_ZThn4_N3ccc8CC5x14y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y23pqrEv,_ZTv0_n12_N3ccc8CC5x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y23pqrEv,_ZThn4_N3ccc8CC5x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y2E = {  "_ZN3ccc8CC5x14y2E", // class name
  bases__ZN3ccc8CC5x14y2E, 2,
  &(vtc__ZN3ccc8CC5x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y2E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y2E),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  DD5x14y2  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD5x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD5x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x14y23pqrEv
  ~DD5x14y2(); // tgen
  DD5x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y2E) C1{ VBC2{ v3 v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y23efgEv");}
void  ccc::DD5x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y23abcEv");}
void  ccc::DD5x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y23pqrEv");}
ccc::DD5x14y2 ::~DD5x14y2(){ note_dtor("_ZN3ccc8DD5x14y2E", this);} // tgen
ccc::DD5x14y2 ::DD5x14y2(){ note_ctor("_ZN3ccc8DD5x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y2E, buf);
    ::ccc::DD5x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y2E);
    dp->::ccc::DD5x14y2::~DD5x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y2E(Test__ZN3ccc8DD5x14y2E, "_ZN3ccc8DD5x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y2C1Ev();
extern void _ZN3ccc8DD5x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y2E[] = {
  NSPAIR(_ZN3ccc8DD5x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y2E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y2E[];
extern void _ZN3ccc8DD5x14y23pqrEv();
extern void _ZN3ccc8DD5x14y23efgEv();
extern void _ZN3ccc8DD5x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y23pqrEv,_ZTv0_n12_N3ccc8DD5x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y23pqrEv,_ZThn4_N3ccc8DD5x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y23pqrEv,_ZTv0_n12_N3ccc8DD5x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y2E[] = {
  {&(_ZTVN3ccc8DD5x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y2E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y2E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y2E[];
static VTBL_ENTRY alt_thunk_names318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y23pqrEv,_ZTv0_n12_N3ccc8DD5x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y23pqrEv,_ZThn4_N3ccc8DD5x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y2E = {  "_ZN3ccc8DD5x14y2E", // class name
  bases__ZN3ccc8DD5x14y2E, 2,
  &(vtc__ZN3ccc8DD5x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y2E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y2E),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  CC5x14y3  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x14y33abcEv
  ~CC5x14y3(); // tgen
  CC5x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y3E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y33efgEv");}
void  ccc::CC5x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y33pqrEv");}
void  ccc::CC5x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y33abcEv");}
ccc::CC5x14y3 ::~CC5x14y3(){ note_dtor("_ZN3ccc8CC5x14y3E", this);} // tgen
ccc::CC5x14y3 ::CC5x14y3(){ note_ctor("_ZN3ccc8CC5x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y3E, buf);
    ::ccc::CC5x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y3E);
    dp->::ccc::CC5x14y3::~CC5x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y3E(Test__ZN3ccc8CC5x14y3E, "_ZN3ccc8CC5x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y3C1Ev();
extern void _ZN3ccc8CC5x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y3E[] = {
  NSPAIR(_ZN3ccc8CC5x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y3E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y3E[];
extern void _ZN3ccc8CC5x14y33pqrEv();
extern void _ZN3ccc8CC5x14y33efgEv();
extern void _ZN3ccc8CC5x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y33pqrEv,_ZTv0_n12_N3ccc8CC5x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y33pqrEv,_ZThn4_N3ccc8CC5x14y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y33efgEv,_ZTv0_n16_N3ccc8CC5x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y33efgEv,_ZThn4_N3ccc8CC5x14y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y33abcEv,_ZTv0_n20_N3ccc8CC5x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y33abcEv,_ZThn4_N3ccc8CC5x14y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y33pqrEv,_ZTv0_n12_N3ccc8CC5x14y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y33efgEv,_ZTv0_n16_N3ccc8CC5x14y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y33abcEv,_ZTv0_n20_N3ccc8CC5x14y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y3E[] = {
  {&(_ZTVN3ccc8CC5x14y3E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y3E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y3E[];
static VTBL_ENTRY alt_thunk_names319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y33abcEv,_ZTv0_n20_N3ccc8CC5x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y33abcEv,_ZThn4_N3ccc8CC5x14y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y33efgEv,_ZTv0_n16_N3ccc8CC5x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y33efgEv,_ZThn4_N3ccc8CC5x14y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y33pqrEv,_ZTv0_n12_N3ccc8CC5x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y33pqrEv,_ZThn4_N3ccc8CC5x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y3E = {  "_ZN3ccc8CC5x14y3E", // class name
  bases__ZN3ccc8CC5x14y3E, 2,
  &(vtc__ZN3ccc8CC5x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y3E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y3E),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  DD5x14y3  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD5x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x14y33abcEv
  ~DD5x14y3(); // tgen
  DD5x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y3E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y33efgEv");}
void  ccc::DD5x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y33pqrEv");}
void  ccc::DD5x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y33abcEv");}
ccc::DD5x14y3 ::~DD5x14y3(){ note_dtor("_ZN3ccc8DD5x14y3E", this);} // tgen
ccc::DD5x14y3 ::DD5x14y3(){ note_ctor("_ZN3ccc8DD5x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y3E, buf);
    ::ccc::DD5x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y3E);
    dp->::ccc::DD5x14y3::~DD5x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y3E(Test__ZN3ccc8DD5x14y3E, "_ZN3ccc8DD5x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y3C1Ev();
extern void _ZN3ccc8DD5x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y3E[] = {
  NSPAIR(_ZN3ccc8DD5x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y3E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y3E[];
extern void _ZN3ccc8DD5x14y33pqrEv();
extern void _ZN3ccc8DD5x14y33efgEv();
extern void _ZN3ccc8DD5x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y33pqrEv,_ZTv0_n12_N3ccc8DD5x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y33pqrEv,_ZThn4_N3ccc8DD5x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y33pqrEv,_ZTv0_n12_N3ccc8DD5x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y3E[] = {
  {&(_ZTVN3ccc8DD5x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y3E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y3E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y3E[];
static VTBL_ENTRY alt_thunk_names320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y33pqrEv,_ZTv0_n12_N3ccc8DD5x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y33pqrEv,_ZThn4_N3ccc8DD5x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y3E = {  "_ZN3ccc8DD5x14y3E", // class name
  bases__ZN3ccc8DD5x14y3E, 2,
  &(vtc__ZN3ccc8DD5x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y3E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y3E),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  CC5x14y4  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC5x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x14y43efgEv
  ~CC5x14y4(); // tgen
  CC5x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y4E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y43pqrEv");}
void  ccc::CC5x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y43abcEv");}
void  ccc::CC5x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y43efgEv");}
ccc::CC5x14y4 ::~CC5x14y4(){ note_dtor("_ZN3ccc8CC5x14y4E", this);} // tgen
ccc::CC5x14y4 ::CC5x14y4(){ note_ctor("_ZN3ccc8CC5x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y4E, buf);
    ::ccc::CC5x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y4E);
    dp->::ccc::CC5x14y4::~CC5x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y4E(Test__ZN3ccc8CC5x14y4E, "_ZN3ccc8CC5x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y4C1Ev();
extern void _ZN3ccc8CC5x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y4E[] = {
  NSPAIR(_ZN3ccc8CC5x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y4E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y4E[];
extern void _ZN3ccc8CC5x14y43pqrEv();
extern void _ZN3ccc8CC5x14y43abcEv();
extern void _ZN3ccc8CC5x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y43pqrEv,_ZTv0_n12_N3ccc8CC5x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y43pqrEv,_ZThn4_N3ccc8CC5x14y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y43efgEv,_ZTv0_n16_N3ccc8CC5x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y43efgEv,_ZThn4_N3ccc8CC5x14y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y43abcEv,_ZTv0_n20_N3ccc8CC5x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y43abcEv,_ZThn4_N3ccc8CC5x14y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y43pqrEv,_ZTv0_n12_N3ccc8CC5x14y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y43efgEv,_ZTv0_n16_N3ccc8CC5x14y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y43abcEv,_ZTv0_n20_N3ccc8CC5x14y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y4E[] = {
  {&(_ZTVN3ccc8CC5x14y4E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y4E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y4E[];
static VTBL_ENTRY alt_thunk_names321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y43abcEv,_ZTv0_n20_N3ccc8CC5x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y43abcEv,_ZThn4_N3ccc8CC5x14y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y43efgEv,_ZTv0_n16_N3ccc8CC5x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y43efgEv,_ZThn4_N3ccc8CC5x14y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y43pqrEv,_ZTv0_n12_N3ccc8CC5x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y43pqrEv,_ZThn4_N3ccc8CC5x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y4E = {  "_ZN3ccc8CC5x14y4E", // class name
  bases__ZN3ccc8CC5x14y4E, 2,
  &(vtc__ZN3ccc8CC5x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y4E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y4E),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  DD5x14y4  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD5x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD5x14y43efgEv
  ~DD5x14y4(); // tgen
  DD5x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y4E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y43pqrEv");}
void  ccc::DD5x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y43abcEv");}
void  ccc::DD5x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y43efgEv");}
ccc::DD5x14y4 ::~DD5x14y4(){ note_dtor("_ZN3ccc8DD5x14y4E", this);} // tgen
ccc::DD5x14y4 ::DD5x14y4(){ note_ctor("_ZN3ccc8DD5x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y4E, buf);
    ::ccc::DD5x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y4E);
    dp->::ccc::DD5x14y4::~DD5x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y4E(Test__ZN3ccc8DD5x14y4E, "_ZN3ccc8DD5x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y4C1Ev();
extern void _ZN3ccc8DD5x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y4E[] = {
  NSPAIR(_ZN3ccc8DD5x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y4E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y4E[];
extern void _ZN3ccc8DD5x14y43pqrEv();
extern void _ZN3ccc8DD5x14y43efgEv();
extern void _ZN3ccc8DD5x14y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y43pqrEv,_ZTv0_n12_N3ccc8DD5x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y43pqrEv,_ZThn4_N3ccc8DD5x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y43pqrEv,_ZTv0_n12_N3ccc8DD5x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y4E[] = {
  {&(_ZTVN3ccc8DD5x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y4E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y4E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y4E[];
static VTBL_ENTRY alt_thunk_names322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y43pqrEv,_ZTv0_n12_N3ccc8DD5x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y43pqrEv,_ZThn4_N3ccc8DD5x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y4E = {  "_ZN3ccc8DD5x14y4E", // class name
  bases__ZN3ccc8DD5x14y4E, 2,
  &(vtc__ZN3ccc8DD5x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y4E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y4E),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  CC5x14y5  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC5x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x14y53abcEv
  ~CC5x14y5(); // tgen
  CC5x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y5E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y53pqrEv");}
void  ccc::CC5x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y53efgEv");}
void  ccc::CC5x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y53abcEv");}
ccc::CC5x14y5 ::~CC5x14y5(){ note_dtor("_ZN3ccc8CC5x14y5E", this);} // tgen
ccc::CC5x14y5 ::CC5x14y5(){ note_ctor("_ZN3ccc8CC5x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y5E, buf);
    ::ccc::CC5x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y5E);
    dp->::ccc::CC5x14y5::~CC5x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y5E(Test__ZN3ccc8CC5x14y5E, "_ZN3ccc8CC5x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y5C1Ev();
extern void _ZN3ccc8CC5x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y5E[] = {
  NSPAIR(_ZN3ccc8CC5x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y5E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y5E[];
extern void _ZN3ccc8CC5x14y53pqrEv();
extern void _ZN3ccc8CC5x14y53efgEv();
extern void _ZN3ccc8CC5x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y53pqrEv,_ZTv0_n12_N3ccc8CC5x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y53pqrEv,_ZThn4_N3ccc8CC5x14y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y53efgEv,_ZTv0_n16_N3ccc8CC5x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y53efgEv,_ZThn4_N3ccc8CC5x14y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y53abcEv,_ZTv0_n20_N3ccc8CC5x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y53abcEv,_ZThn4_N3ccc8CC5x14y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y53pqrEv,_ZTv0_n12_N3ccc8CC5x14y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y53efgEv,_ZTv0_n16_N3ccc8CC5x14y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y53abcEv,_ZTv0_n20_N3ccc8CC5x14y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y5E[] = {
  {&(_ZTVN3ccc8CC5x14y5E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y5E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y5E[];
static VTBL_ENTRY alt_thunk_names323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y53abcEv,_ZTv0_n20_N3ccc8CC5x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y53abcEv,_ZThn4_N3ccc8CC5x14y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y53efgEv,_ZTv0_n16_N3ccc8CC5x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y53efgEv,_ZThn4_N3ccc8CC5x14y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y53pqrEv,_ZTv0_n12_N3ccc8CC5x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y53pqrEv,_ZThn4_N3ccc8CC5x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y5E = {  "_ZN3ccc8CC5x14y5E", // class name
  bases__ZN3ccc8CC5x14y5E, 2,
  &(vtc__ZN3ccc8CC5x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y5E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y5E),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  DD5x14y5  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD5x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD5x14y53abcEv
  ~DD5x14y5(); // tgen
  DD5x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y5E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y53pqrEv");}
void  ccc::DD5x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y53efgEv");}
void  ccc::DD5x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y53abcEv");}
ccc::DD5x14y5 ::~DD5x14y5(){ note_dtor("_ZN3ccc8DD5x14y5E", this);} // tgen
ccc::DD5x14y5 ::DD5x14y5(){ note_ctor("_ZN3ccc8DD5x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y5E, buf);
    ::ccc::DD5x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y5E);
    dp->::ccc::DD5x14y5::~DD5x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y5E(Test__ZN3ccc8DD5x14y5E, "_ZN3ccc8DD5x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y5C1Ev();
extern void _ZN3ccc8DD5x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y5E[] = {
  NSPAIR(_ZN3ccc8DD5x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y5E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y5E[];
extern void _ZN3ccc8DD5x14y53pqrEv();
extern void _ZN3ccc8DD5x14y53efgEv();
extern void _ZN3ccc8DD5x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y53pqrEv,_ZTv0_n12_N3ccc8DD5x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y53pqrEv,_ZThn4_N3ccc8DD5x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y53pqrEv,_ZTv0_n12_N3ccc8DD5x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y5E[] = {
  {&(_ZTVN3ccc8DD5x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y5E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y5E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y5E[];
static VTBL_ENTRY alt_thunk_names324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y53pqrEv,_ZTv0_n12_N3ccc8DD5x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y53pqrEv,_ZThn4_N3ccc8DD5x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y5E = {  "_ZN3ccc8DD5x14y5E", // class name
  bases__ZN3ccc8DD5x14y5E, 2,
  &(vtc__ZN3ccc8DD5x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y5E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y5E),3, //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  CC5x14y6  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x14y63efgEv
  ~CC5x14y6(); // tgen
  CC5x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y6E) C1{ VBC2{ v3 v2 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y63abcEv");}
void  ccc::CC5x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y63efgEv");}
ccc::CC5x14y6 ::~CC5x14y6(){ note_dtor("_ZN3ccc8CC5x14y6E", this);} // tgen
ccc::CC5x14y6 ::CC5x14y6(){ note_ctor("_ZN3ccc8CC5x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y6E, buf);
    ::ccc::CC5x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y6E);
    dp->::ccc::CC5x14y6::~CC5x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y6E(Test__ZN3ccc8CC5x14y6E, "_ZN3ccc8CC5x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y6C1Ev();
extern void _ZN3ccc8CC5x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y6E[] = {
  NSPAIR(_ZN3ccc8CC5x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y6E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC5x14y63abcEv();
extern void _ZN3ccc8CC5x14y63efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y63efgEv,_ZTv0_n16_N3ccc8CC5x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y63efgEv,_ZThn4_N3ccc8CC5x14y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y63abcEv,_ZTv0_n20_N3ccc8CC5x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y63abcEv,_ZThn4_N3ccc8CC5x14y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y63efgEv,_ZTv0_n16_N3ccc8CC5x14y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y63abcEv,_ZTv0_n20_N3ccc8CC5x14y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y6E[] = {
  {&(_ZTVN3ccc8CC5x14y6E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y6E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y6E[];
static VTBL_ENTRY alt_thunk_names325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y63abcEv,_ZTv0_n20_N3ccc8CC5x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y63abcEv,_ZThn4_N3ccc8CC5x14y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y63efgEv,_ZTv0_n16_N3ccc8CC5x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y63efgEv,_ZThn4_N3ccc8CC5x14y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y6E = {  "_ZN3ccc8CC5x14y6E", // class name
  bases__ZN3ccc8CC5x14y6E, 2,
  &(vtc__ZN3ccc8CC5x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y6E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y6E),2, //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  DD5x14y6  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD5x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD5x14y63efgEv
  ~DD5x14y6(); // tgen
  DD5x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y6E) C1{ VBC2{ v3 v2 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y63abcEv");}
void  ccc::DD5x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y63efgEv");}
ccc::DD5x14y6 ::~DD5x14y6(){ note_dtor("_ZN3ccc8DD5x14y6E", this);} // tgen
ccc::DD5x14y6 ::DD5x14y6(){ note_ctor("_ZN3ccc8DD5x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y6E, buf);
    ::ccc::DD5x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y6E);
    dp->::ccc::DD5x14y6::~DD5x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y6E(Test__ZN3ccc8DD5x14y6E, "_ZN3ccc8DD5x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y6C1Ev();
extern void _ZN3ccc8DD5x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y6E[] = {
  NSPAIR(_ZN3ccc8DD5x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y6E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x14y63efgEv();
extern void _ZN3ccc8DD5x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y63abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y6E[] = {
  {&(_ZTVN3ccc8DD5x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y6E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y6E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y6E[];
Class_Descriptor cd__ZN3ccc8DD5x14y6E = {  "_ZN3ccc8DD5x14y6E", // class name
  bases__ZN3ccc8DD5x14y6E, 2,
  &(vtc__ZN3ccc8DD5x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y6E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y6E),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  CC5x14y7  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC5x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y73pqrEv
  ~CC5x14y7(); // tgen
  CC5x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y7E) C1{ VBC2{ v2 v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y73abcEv");}
void  ccc::CC5x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y73pqrEv");}
ccc::CC5x14y7 ::~CC5x14y7(){ note_dtor("_ZN3ccc8CC5x14y7E", this);} // tgen
ccc::CC5x14y7 ::CC5x14y7(){ note_ctor("_ZN3ccc8CC5x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y7E, buf);
    ::ccc::CC5x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y7E);
    dp->::ccc::CC5x14y7::~CC5x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y7E(Test__ZN3ccc8CC5x14y7E, "_ZN3ccc8CC5x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y7C1Ev();
extern void _ZN3ccc8CC5x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y7E[] = {
  NSPAIR(_ZN3ccc8CC5x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x14y7E[];
extern void _ZN3ccc8CC5x14y73pqrEv();
extern void _ZN3ccc8CC5x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y73pqrEv,_ZTv0_n12_N3ccc8CC5x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y73pqrEv,_ZThn4_N3ccc8CC5x14y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y73abcEv,_ZTv0_n20_N3ccc8CC5x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y73abcEv,_ZThn4_N3ccc8CC5x14y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y73pqrEv,_ZTv0_n12_N3ccc8CC5x14y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y73abcEv,_ZTv0_n20_N3ccc8CC5x14y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y7E[] = {
  {&(_ZTVN3ccc8CC5x14y7E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x14y7E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y7E[];
static VTBL_ENTRY alt_thunk_names326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y73abcEv,_ZTv0_n20_N3ccc8CC5x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y73abcEv,_ZThn4_N3ccc8CC5x14y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y73pqrEv,_ZTv0_n12_N3ccc8CC5x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y73pqrEv,_ZThn4_N3ccc8CC5x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y7E = {  "_ZN3ccc8CC5x14y7E", // class name
  bases__ZN3ccc8CC5x14y7E, 2,
  &(vtc__ZN3ccc8CC5x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y7E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y7E),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  DD5x14y7  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD5x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x14y73pqrEv
  ~DD5x14y7(); // tgen
  DD5x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y7E) C1{ VBC2{ v2 v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y73abcEv");}
void  ccc::DD5x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y73pqrEv");}
ccc::DD5x14y7 ::~DD5x14y7(){ note_dtor("_ZN3ccc8DD5x14y7E", this);} // tgen
ccc::DD5x14y7 ::DD5x14y7(){ note_ctor("_ZN3ccc8DD5x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y7E, buf);
    ::ccc::DD5x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y7E);
    dp->::ccc::DD5x14y7::~DD5x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y7E(Test__ZN3ccc8DD5x14y7E, "_ZN3ccc8DD5x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y7C1Ev();
extern void _ZN3ccc8DD5x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y7E[] = {
  NSPAIR(_ZN3ccc8DD5x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y7E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y7E[];
extern void _ZN3ccc8DD5x14y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y73pqrEv,_ZTv0_n12_N3ccc8DD5x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y73pqrEv,_ZThn4_N3ccc8DD5x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y73pqrEv,_ZTv0_n12_N3ccc8DD5x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y7E[] = {
  {&(_ZTVN3ccc8DD5x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y7E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y7E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y7E[];
static VTBL_ENTRY alt_thunk_names327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y73pqrEv,_ZTv0_n12_N3ccc8DD5x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y73pqrEv,_ZThn4_N3ccc8DD5x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y7E = {  "_ZN3ccc8DD5x14y7E", // class name
  bases__ZN3ccc8DD5x14y7E, 2,
  &(vtc__ZN3ccc8DD5x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y7E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y7E),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  CC5x14y8  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x14y83abcEv
  ~CC5x14y8(); // tgen
  CC5x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y8E) C1{ VBC2{ v3 v1 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC5x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y83efgEv");}
void  ccc::CC5x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x14y83abcEv");}
ccc::CC5x14y8 ::~CC5x14y8(){ note_dtor("_ZN3ccc8CC5x14y8E", this);} // tgen
ccc::CC5x14y8 ::CC5x14y8(){ note_ctor("_ZN3ccc8CC5x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y8E, buf);
    ::ccc::CC5x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y8E);
    dp->::ccc::CC5x14y8::~CC5x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y8E(Test__ZN3ccc8CC5x14y8E, "_ZN3ccc8CC5x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y8C1Ev();
extern void _ZN3ccc8CC5x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y8E[] = {
  NSPAIR(_ZN3ccc8CC5x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y8E[] = {
  // 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__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 _ZTIN3ccc8CC5x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC5x14y83efgEv();
extern void _ZN3ccc8CC5x14y83abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y83efgEv,_ZTv0_n16_N3ccc8CC5x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y83efgEv,_ZThn4_N3ccc8CC5x14y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8CC5x14y83abcEv,_ZTv0_n20_N3ccc8CC5x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y83abcEv,_ZThn4_N3ccc8CC5x14y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y83efgEv,_ZTv0_n16_N3ccc8CC5x14y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8CC5x14y83abcEv,_ZTv0_n20_N3ccc8CC5x14y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y8E[] = {
  {&(_ZTVN3ccc8CC5x14y8E[3]),  3,14},
  {&(_ZTVN3ccc8CC5x14y8E[11]),  11,14},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y8E[];
static VTBL_ENTRY alt_thunk_names328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8CC5x14y83abcEv,_ZTv0_n20_N3ccc8CC5x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y83abcEv,_ZThn4_N3ccc8CC5x14y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y83efgEv,_ZTv0_n16_N3ccc8CC5x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y83efgEv,_ZThn4_N3ccc8CC5x14y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y8E = {  "_ZN3ccc8CC5x14y8E", // class name
  bases__ZN3ccc8CC5x14y8E, 2,
  &(vtc__ZN3ccc8CC5x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y8E),14, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y8E),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  DD5x14y8  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD5x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD5x14y83abcEv
  ~DD5x14y8(); // tgen
  DD5x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y8E) C1{ VBC2{ v3 v1 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD5x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y83efgEv");}
void  ccc::DD5x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x14y83abcEv");}
ccc::DD5x14y8 ::~DD5x14y8(){ note_dtor("_ZN3ccc8DD5x14y8E", this);} // tgen
ccc::DD5x14y8 ::DD5x14y8(){ note_ctor("_ZN3ccc8DD5x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y8E, buf);
    ::ccc::DD5x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y8E);
    dp->::ccc::DD5x14y8::~DD5x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y8E(Test__ZN3ccc8DD5x14y8E, "_ZN3ccc8DD5x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y8C1Ev();
extern void _ZN3ccc8DD5x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y8E[] = {
  NSPAIR(_ZN3ccc8DD5x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y8E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x14y83efgEv();
extern void _ZN3ccc8DD5x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y8E[] = {
  {&(_ZTVN3ccc8DD5x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y8E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y8E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y8E[];
Class_Descriptor cd__ZN3ccc8DD5x14y8E = {  "_ZN3ccc8DD5x14y8E", // class name
  bases__ZN3ccc8DD5x14y8E, 2,
  &(vtc__ZN3ccc8DD5x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y8E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y8E),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  CC5x14y9  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC5x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x14y93pqrEv
  ~CC5x14y9(); // tgen
  CC5x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x14y9E) C1{ VBC2{ v2 v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC5x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x14y93efgEv");}
void  ccc::CC5x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x14y93pqrEv");}
ccc::CC5x14y9 ::~CC5x14y9(){ note_dtor("_ZN3ccc8CC5x14y9E", this);} // tgen
ccc::CC5x14y9 ::CC5x14y9(){ note_ctor("_ZN3ccc8CC5x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC5x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC5x14y9E, buf);
    ::ccc::CC5x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC5x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x14y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc8CC5x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC5x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x14y9E);
    dp->::ccc::CC5x14y9::~CC5x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x14y9E(Test__ZN3ccc8CC5x14y9E, "_ZN3ccc8CC5x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC5x14y9C1Ev();
extern void _ZN3ccc8CC5x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC5x14y9E[] = {
  NSPAIR(_ZN3ccc8CC5x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC5x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC5x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc8CC5x14y9E[];
extern void _ZN3ccc8CC5x14y93pqrEv();
extern void _ZN3ccc8CC5x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC5x14y93pqrEv,_ZTv0_n12_N3ccc8CC5x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y93pqrEv,_ZThn4_N3ccc8CC5x14y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC5x14y93efgEv,_ZTv0_n16_N3ccc8CC5x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC5x14y93efgEv,_ZThn4_N3ccc8CC5x14y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x14y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC5x14y93pqrEv,_ZTv0_n12_N3ccc8CC5x14y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC5x14y93efgEv,_ZTv0_n16_N3ccc8CC5x14y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x14y9E[] = {
  {&(_ZTVN3ccc8CC5x14y9E[3]),  3,13},
  {&(_ZTVN3ccc8CC5x14y9E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x14y9E[];
static VTBL_ENTRY alt_thunk_names329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC5x14y93efgEv,_ZTv0_n16_N3ccc8CC5x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y93efgEv,_ZThn4_N3ccc8CC5x14y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC5x14y93pqrEv,_ZTv0_n12_N3ccc8CC5x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC5x14y93pqrEv,_ZThn4_N3ccc8CC5x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC5x14y9E = {  "_ZN3ccc8CC5x14y9E", // class name
  bases__ZN3ccc8CC5x14y9E, 2,
  &(vtc__ZN3ccc8CC5x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC5x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x14y9E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x14y9E),2, //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  DD5x14y9  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD5x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x14y93pqrEv
  ~DD5x14y9(); // tgen
  DD5x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD5x14y9E) C1{ VBC2{ v2 v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD5x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x14y93efgEv");}
void  ccc::DD5x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x14y93pqrEv");}
ccc::DD5x14y9 ::~DD5x14y9(){ note_dtor("_ZN3ccc8DD5x14y9E", this);} // tgen
ccc::DD5x14y9 ::DD5x14y9(){ note_ctor("_ZN3ccc8DD5x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD5x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD5x14y9E, buf);
    ::ccc::DD5x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD5x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x14y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD5x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x14y9E);
    dp->::ccc::DD5x14y9::~DD5x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x14y9E(Test__ZN3ccc8DD5x14y9E, "_ZN3ccc8DD5x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD5x14y9C1Ev();
extern void _ZN3ccc8DD5x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD5x14y9E[] = {
  NSPAIR(_ZN3ccc8DD5x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD5x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD5x14y9E[] = {
  // 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__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 _ZTIN3ccc8DD5x14y9E[];
extern void _ZN3ccc8DD5x14y93pqrEv();
extern void _ZN3ccc8DD5x14y93efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD5x14y93pqrEv,_ZTv0_n12_N3ccc8DD5x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD5x14y93pqrEv,_ZThn4_N3ccc8DD5x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD5x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD5x14y93pqrEv,_ZTv0_n12_N3ccc8DD5x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x14y9E[] = {
  {&(_ZTVN3ccc8DD5x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y9E[7]),  7,14},
  {&(_ZTVN3ccc8DD5x14y9E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x14y9E[];
static VTBL_ENTRY alt_thunk_names330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD5x14y93pqrEv,_ZTv0_n12_N3ccc8DD5x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD5x14y93pqrEv,_ZThn4_N3ccc8DD5x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD5x14y9E = {  "_ZN3ccc8DD5x14y9E", // class name
  bases__ZN3ccc8DD5x14y9E, 2,
  &(vtc__ZN3ccc8DD5x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD5x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x14y9E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x14y9E),3, //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  CC5x14y10  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC5x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x14y103abcEv
  ~CC5x14y10(); // tgen
  CC5x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y10E) C1{ VBC2{ v1 v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x14y103pqrEv");}
void  ccc::CC5x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x14y103abcEv");}
ccc::CC5x14y10 ::~CC5x14y10(){ note_dtor("_ZN3ccc9CC5x14y10E", this);} // tgen
ccc::CC5x14y10 ::CC5x14y10(){ note_ctor("_ZN3ccc9CC5x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC5x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x14y10E, buf);
    ::ccc::CC5x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x14y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC5x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x14y10E);
    dp->::ccc::CC5x14y10::~CC5x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x14y10E(Test__ZN3ccc9CC5x14y10E, "_ZN3ccc9CC5x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x14y10C1Ev();
extern void _ZN3ccc9CC5x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC5x14y10E[] = {
  NSPAIR(_ZN3ccc9CC5x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC5x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC5x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x14y10E[];
extern void _ZN3ccc9CC5x14y103pqrEv();
extern void _ZN3ccc9CC5x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x14y103pqrEv,_ZTv0_n12_N3ccc9CC5x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y103pqrEv,_ZThn4_N3ccc9CC5x14y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x14y103abcEv,_ZTv0_n20_N3ccc9CC5x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y103abcEv,_ZThn4_N3ccc9CC5x14y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x14y103pqrEv,_ZTv0_n12_N3ccc9CC5x14y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x14y103abcEv,_ZTv0_n20_N3ccc9CC5x14y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x14y10E[] = {
  {&(_ZTVN3ccc9CC5x14y10E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x14y10E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x14y10E[];
static VTBL_ENTRY alt_thunk_names331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x14y103abcEv,_ZTv0_n20_N3ccc9CC5x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y103abcEv,_ZThn4_N3ccc9CC5x14y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x14y103pqrEv,_ZTv0_n12_N3ccc9CC5x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y103pqrEv,_ZThn4_N3ccc9CC5x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x14y10E = {  "_ZN3ccc9CC5x14y10E", // class name
  bases__ZN3ccc9CC5x14y10E, 2,
  &(vtc__ZN3ccc9CC5x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y10E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x14y10E),2, //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  DD5x14y10  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD5x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD5x14y103abcEv
  ~DD5x14y10(); // tgen
  DD5x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD5x14y10E) C1{ VBC2{ v1 v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x14y103pqrEv");}
void  ccc::DD5x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x14y103abcEv");}
ccc::DD5x14y10 ::~DD5x14y10(){ note_dtor("_ZN3ccc9DD5x14y10E", this);} // tgen
ccc::DD5x14y10 ::DD5x14y10(){ note_ctor("_ZN3ccc9DD5x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD5x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x14y10E, buf);
    ::ccc::DD5x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x14y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD5x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x14y10E);
    dp->::ccc::DD5x14y10::~DD5x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x14y10E(Test__ZN3ccc9DD5x14y10E, "_ZN3ccc9DD5x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x14y10C1Ev();
extern void _ZN3ccc9DD5x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD5x14y10E[] = {
  NSPAIR(_ZN3ccc9DD5x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD5x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD5x14y10E[] = {
  // 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__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 _ZTIN3ccc9DD5x14y10E[];
extern void _ZN3ccc9DD5x14y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x14y103pqrEv,_ZTv0_n12_N3ccc9DD5x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x14y103pqrEv,_ZThn4_N3ccc9DD5x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x14y103pqrEv,_ZTv0_n12_N3ccc9DD5x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x14y10E[] = {
  {&(_ZTVN3ccc9DD5x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y10E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y10E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x14y10E[];
static VTBL_ENTRY alt_thunk_names332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x14y103pqrEv,_ZTv0_n12_N3ccc9DD5x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x14y103pqrEv,_ZThn4_N3ccc9DD5x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x14y10E = {  "_ZN3ccc9DD5x14y10E", // class name
  bases__ZN3ccc9DD5x14y10E, 2,
  &(vtc__ZN3ccc9DD5x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x14y10E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x14y10E),3, //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  CC5x14y11  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC5x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x14y113efgEv
  ~CC5x14y11(); // tgen
  CC5x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y11E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC5x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x14y113pqrEv");}
void  ccc::CC5x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x14y113efgEv");}
ccc::CC5x14y11 ::~CC5x14y11(){ note_dtor("_ZN3ccc9CC5x14y11E", this);} // tgen
ccc::CC5x14y11 ::CC5x14y11(){ note_ctor("_ZN3ccc9CC5x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC5x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x14y11E, buf);
    ::ccc::CC5x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x14y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC5x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x14y11E);
    dp->::ccc::CC5x14y11::~CC5x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x14y11E(Test__ZN3ccc9CC5x14y11E, "_ZN3ccc9CC5x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x14y11C1Ev();
extern void _ZN3ccc9CC5x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC5x14y11E[] = {
  NSPAIR(_ZN3ccc9CC5x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC5x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC5x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x14y11E[];
extern void _ZN3ccc9CC5x14y113pqrEv();
extern void _ZN3ccc9CC5x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x14y113pqrEv,_ZTv0_n12_N3ccc9CC5x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y113pqrEv,_ZThn4_N3ccc9CC5x14y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x14y113efgEv,_ZTv0_n16_N3ccc9CC5x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y113efgEv,_ZThn4_N3ccc9CC5x14y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x14y113pqrEv,_ZTv0_n12_N3ccc9CC5x14y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x14y113efgEv,_ZTv0_n16_N3ccc9CC5x14y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x14y11E[] = {
  {&(_ZTVN3ccc9CC5x14y11E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x14y11E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x14y11E[];
static VTBL_ENTRY alt_thunk_names333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x14y113efgEv,_ZTv0_n16_N3ccc9CC5x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y113efgEv,_ZThn4_N3ccc9CC5x14y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x14y113pqrEv,_ZTv0_n12_N3ccc9CC5x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y113pqrEv,_ZThn4_N3ccc9CC5x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x14y11E = {  "_ZN3ccc9CC5x14y11E", // class name
  bases__ZN3ccc9CC5x14y11E, 2,
  &(vtc__ZN3ccc9CC5x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y11E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x14y11E),2, //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  DD5x14y11  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD5x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD5x14y113efgEv
  ~DD5x14y11(); // tgen
  DD5x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD5x14y11E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD5x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x14y113pqrEv");}
void  ccc::DD5x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x14y113efgEv");}
ccc::DD5x14y11 ::~DD5x14y11(){ note_dtor("_ZN3ccc9DD5x14y11E", this);} // tgen
ccc::DD5x14y11 ::DD5x14y11(){ note_ctor("_ZN3ccc9DD5x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD5x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x14y11E, buf);
    ::ccc::DD5x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x14y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD5x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x14y11E);
    dp->::ccc::DD5x14y11::~DD5x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x14y11E(Test__ZN3ccc9DD5x14y11E, "_ZN3ccc9DD5x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x14y11C1Ev();
extern void _ZN3ccc9DD5x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD5x14y11E[] = {
  NSPAIR(_ZN3ccc9DD5x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD5x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD5x14y11E[] = {
  // 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__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 _ZTIN3ccc9DD5x14y11E[];
extern void _ZN3ccc9DD5x14y113pqrEv();
extern void _ZN3ccc9DD5x14y113efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x14y113pqrEv,_ZTv0_n12_N3ccc9DD5x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x14y113pqrEv,_ZThn4_N3ccc9DD5x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x14y113pqrEv,_ZTv0_n12_N3ccc9DD5x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x14y11E[] = {
  {&(_ZTVN3ccc9DD5x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y11E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y11E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x14y11E[];
static VTBL_ENTRY alt_thunk_names334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x14y113pqrEv,_ZTv0_n12_N3ccc9DD5x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x14y113pqrEv,_ZThn4_N3ccc9DD5x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x14y11E = {  "_ZN3ccc9DD5x14y11E", // class name
  bases__ZN3ccc9DD5x14y11E, 2,
  &(vtc__ZN3ccc9DD5x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x14y11E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x14y11E),3, //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  CC5x14y12  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC5x14y123abcEv
  ~CC5x14y12(); // tgen
  CC5x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y12E) C1{ VBC2{ v2 v3 v1} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC5x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x14y123abcEv");}
ccc::CC5x14y12 ::~CC5x14y12(){ note_dtor("_ZN3ccc9CC5x14y12E", this);} // tgen
ccc::CC5x14y12 ::CC5x14y12(){ note_ctor("_ZN3ccc9CC5x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC5x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x14y12E, buf);
    ::ccc::CC5x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x14y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC5x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x14y12E);
    dp->::ccc::CC5x14y12::~CC5x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x14y12E(Test__ZN3ccc9CC5x14y12E, "_ZN3ccc9CC5x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x14y12C1Ev();
extern void _ZN3ccc9CC5x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC5x14y12E[] = {
  NSPAIR(_ZN3ccc9CC5x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC5x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC5x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC5x14y123abcEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9CC5x14y123abcEv,_ZTv0_n20_N3ccc9CC5x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y123abcEv,_ZThn4_N3ccc9CC5x14y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9CC5x14y123abcEv,_ZTv0_n20_N3ccc9CC5x14y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x14y12E[] = {
  {&(_ZTVN3ccc9CC5x14y12E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x14y12E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x14y12E[];
static VTBL_ENTRY alt_thunk_names335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9CC5x14y123abcEv,_ZTv0_n20_N3ccc9CC5x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y123abcEv,_ZThn4_N3ccc9CC5x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x14y12E = {  "_ZN3ccc9CC5x14y12E", // class name
  bases__ZN3ccc9CC5x14y12E, 2,
  &(vtc__ZN3ccc9CC5x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y12E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x14y12E),2, //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  DD5x14y12  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD5x14y123abcEv
  ~DD5x14y12(); // tgen
  DD5x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD5x14y12E) C1{ VBC2{ v2 v3 v1} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD5x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x14y123abcEv");}
ccc::DD5x14y12 ::~DD5x14y12(){ note_dtor("_ZN3ccc9DD5x14y12E", this);} // tgen
ccc::DD5x14y12 ::DD5x14y12(){ note_ctor("_ZN3ccc9DD5x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD5x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x14y12E, buf);
    ::ccc::DD5x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x14y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD5x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x14y12E);
    dp->::ccc::DD5x14y12::~DD5x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x14y12E(Test__ZN3ccc9DD5x14y12E, "_ZN3ccc9DD5x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x14y12C1Ev();
extern void _ZN3ccc9DD5x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD5x14y12E[] = {
  NSPAIR(_ZN3ccc9DD5x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD5x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD5x14y12E[] = {
  // 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__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 _ZTIN3ccc9DD5x14y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x14y12E[] = {
  {&(_ZTVN3ccc9DD5x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y12E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y12E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x14y12E[];
Class_Descriptor cd__ZN3ccc9DD5x14y12E = {  "_ZN3ccc9DD5x14y12E", // class name
  bases__ZN3ccc9DD5x14y12E, 2,
  &(vtc__ZN3ccc9DD5x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x14y12E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x14y12E),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  CC5x14y13  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC5x14y133efgEv
  ~CC5x14y13(); // tgen
  CC5x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y13E) C1{ VBC2{ v2 v1 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC5x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x14y133efgEv");}
ccc::CC5x14y13 ::~CC5x14y13(){ note_dtor("_ZN3ccc9CC5x14y13E", this);} // tgen
ccc::CC5x14y13 ::CC5x14y13(){ note_ctor("_ZN3ccc9CC5x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC5x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x14y13E, buf);
    ::ccc::CC5x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x14y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC5x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x14y13E);
    dp->::ccc::CC5x14y13::~CC5x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x14y13E(Test__ZN3ccc9CC5x14y13E, "_ZN3ccc9CC5x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x14y13C1Ev();
extern void _ZN3ccc9CC5x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC5x14y13E[] = {
  NSPAIR(_ZN3ccc9CC5x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC5x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC5x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC5x14y133efgEv();
extern void _ZN3ccc3AA53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC5x14y133efgEv,_ZTv0_n16_N3ccc9CC5x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y133efgEv,_ZThn4_N3ccc9CC5x14y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC5x14y133efgEv,_ZTv0_n16_N3ccc9CC5x14y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x14y13E[] = {
  {&(_ZTVN3ccc9CC5x14y13E[3]),  3,13},
  {&(_ZTVN3ccc9CC5x14y13E[10]),  10,13},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x14y13E[];
static VTBL_ENTRY alt_thunk_names336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC5x14y133efgEv,_ZTv0_n16_N3ccc9CC5x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y133efgEv,_ZThn4_N3ccc9CC5x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x14y13E = {  "_ZN3ccc9CC5x14y13E", // class name
  bases__ZN3ccc9CC5x14y13E, 2,
  &(vtc__ZN3ccc9CC5x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y13E),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x14y13E),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  DD5x14y13  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD5x14y133efgEv
  ~DD5x14y13(); // tgen
  DD5x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD5x14y13E) C1{ VBC2{ v2 v1 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD5x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x14y133efgEv");}
ccc::DD5x14y13 ::~DD5x14y13(){ note_dtor("_ZN3ccc9DD5x14y13E", this);} // tgen
ccc::DD5x14y13 ::DD5x14y13(){ note_ctor("_ZN3ccc9DD5x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD5x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x14y13E, buf);
    ::ccc::DD5x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x14y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD5x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x14y13E);
    dp->::ccc::DD5x14y13::~DD5x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x14y13E(Test__ZN3ccc9DD5x14y13E, "_ZN3ccc9DD5x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x14y13C1Ev();
extern void _ZN3ccc9DD5x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD5x14y13E[] = {
  NSPAIR(_ZN3ccc9DD5x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD5x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD5x14y13E[] = {
  // 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__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 _ZTIN3ccc9DD5x14y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9DD5x14y133efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x14y13E[] = {
  {&(_ZTVN3ccc9DD5x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y13E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y13E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x14y13E[];
Class_Descriptor cd__ZN3ccc9DD5x14y13E = {  "_ZN3ccc9DD5x14y13E", // class name
  bases__ZN3ccc9DD5x14y13E, 2,
  &(vtc__ZN3ccc9DD5x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x14y13E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x14y13E),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  CC5x14y14  : virtual ::ccc::AA5 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC5x14y143pqrEv
  ~CC5x14y14(); // tgen
  CC5x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y14E) C1{ VBC2{ v1 v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC5x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x14y143pqrEv");}
ccc::CC5x14y14 ::~CC5x14y14(){ note_dtor("_ZN3ccc9CC5x14y14E", this);} // tgen
ccc::CC5x14y14 ::CC5x14y14(){ note_ctor("_ZN3ccc9CC5x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC5x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x14y14E, buf);
    ::ccc::CC5x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x14y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC5x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x14y14E);
    dp->::ccc::CC5x14y14::~CC5x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x14y14E(Test__ZN3ccc9CC5x14y14E, "_ZN3ccc9CC5x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x14y14C1Ev();
extern void _ZN3ccc9CC5x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC5x14y14E[] = {
  NSPAIR(_ZN3ccc9CC5x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC5x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC5x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x14y14E[];
extern void _ZN3ccc9CC5x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC5x14y143pqrEv,_ZTv0_n12_N3ccc9CC5x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC5x14y143pqrEv,_ZThn4_N3ccc9CC5x14y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x14y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC5x14y143pqrEv,_ZTv0_n12_N3ccc9CC5x14y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x14y14E[] = {
  {&(_ZTVN3ccc9CC5x14y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC5x14y14E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x14y14E[];
static VTBL_ENTRY alt_thunk_names337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC5x14y143pqrEv,_ZTv0_n12_N3ccc9CC5x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC5x14y143pqrEv,_ZThn4_N3ccc9CC5x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC5x14y14E = {  "_ZN3ccc9CC5x14y14E", // class name
  bases__ZN3ccc9CC5x14y14E, 2,
  &(vtc__ZN3ccc9CC5x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x14y14E),2, //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  DD5x14y14  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD5x14y143pqrEv
  ~DD5x14y14(); // tgen
  DD5x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD5x14y14E) C1{ VBC2{ v1 v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD5x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x14y143pqrEv");}
ccc::DD5x14y14 ::~DD5x14y14(){ note_dtor("_ZN3ccc9DD5x14y14E", this);} // tgen
ccc::DD5x14y14 ::DD5x14y14(){ note_ctor("_ZN3ccc9DD5x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD5x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x14y14E, buf);
    ::ccc::DD5x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x14y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD5x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x14y14E);
    dp->::ccc::DD5x14y14::~DD5x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x14y14E(Test__ZN3ccc9DD5x14y14E, "_ZN3ccc9DD5x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x14y14C1Ev();
extern void _ZN3ccc9DD5x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD5x14y14E[] = {
  NSPAIR(_ZN3ccc9DD5x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD5x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD5x14y14E[] = {
  // 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__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 _ZTIN3ccc9DD5x14y14E[];
extern void _ZN3ccc9DD5x14y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD5x14y143pqrEv,_ZTv0_n12_N3ccc9DD5x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD5x14y143pqrEv,_ZThn4_N3ccc9DD5x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD5x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x14y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD5x14y143pqrEv,_ZTv0_n12_N3ccc9DD5x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x14y14E[] = {
  {&(_ZTVN3ccc9DD5x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y14E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y14E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x14y14E[];
static VTBL_ENTRY alt_thunk_names338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD5x14y143pqrEv,_ZTv0_n12_N3ccc9DD5x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD5x14y143pqrEv,_ZThn4_N3ccc9DD5x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD5x14y14E = {  "_ZN3ccc9DD5x14y14E", // class name
  bases__ZN3ccc9DD5x14y14E, 2,
  &(vtc__ZN3ccc9DD5x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x14y14E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x14y14E),3, //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  CC5x14y15  : virtual ::ccc::AA5 , ::ccc::BB14 {
  ~CC5x14y15(); // tgen
  CC5x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x14y15E) C1{ VBC2{ v1 v2 v3} BC3{ v4}}
}
namespace ccc { 
ccc::CC5x14y15 ::~CC5x14y15(){ note_dtor("_ZN3ccc9CC5x14y15E", this);} // tgen
ccc::CC5x14y15 ::CC5x14y15(){ note_ctor("_ZN3ccc9CC5x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC5x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC5x14y15E, buf);
    ::ccc::CC5x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC5x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x14y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), ABISELECT(8,4), "_ZN3ccc9CC5x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC5x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x14y15E);
    dp->::ccc::CC5x14y15::~CC5x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x14y15E(Test__ZN3ccc9CC5x14y15E, "_ZN3ccc9CC5x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC5x14y15C1Ev();
extern void _ZN3ccc9CC5x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC5x14y15E[] = {
  NSPAIR(_ZN3ccc9CC5x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC5x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC5x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA5E,    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 _ZTIN3ccc9CC5x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x14y15E[] = {
  {&(_ZTVN3ccc9CC5x14y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC5x14y15E[9]),  9,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x14y15E[];
Class_Descriptor cd__ZN3ccc9CC5x14y15E = {  "_ZN3ccc9CC5x14y15E", // class name
  bases__ZN3ccc9CC5x14y15E, 2,
  &(vtc__ZN3ccc9CC5x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC5x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x14y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x14y15E),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  DD5x14y15  : virtual ::ccc::AA5 , virtual ::ccc::BB14 {
  ~DD5x14y15(); // tgen
  DD5x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD5x14y15E) C1{ VBC2{ v1 v2 v3} VBC3{ v4}}
}
namespace ccc { 
ccc::DD5x14y15 ::~DD5x14y15(){ note_dtor("_ZN3ccc9DD5x14y15E", this);} // tgen
ccc::DD5x14y15 ::DD5x14y15(){ note_ctor("_ZN3ccc9DD5x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD5x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD5x14y15E, buf);
    ::ccc::DD5x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD5x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD5x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x14y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD5x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x14y15E);
    dp->::ccc::DD5x14y15::~DD5x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x14y15E(Test__ZN3ccc9DD5x14y15E, "_ZN3ccc9DD5x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD5x14y15C1Ev();
extern void _ZN3ccc9DD5x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD5x14y15E[] = {
  NSPAIR(_ZN3ccc9DD5x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD5x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD5x14y15E[] = {
  // 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__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 _ZTIN3ccc9DD5x14y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x14y15E[] = {
  {&(_ZTVN3ccc9DD5x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y15E[7]),  7,14},
  {&(_ZTVN3ccc9DD5x14y15E[13]),  13,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x14y15E[];
Class_Descriptor cd__ZN3ccc9DD5x14y15E = {  "_ZN3ccc9DD5x14y15E", // class name
  bases__ZN3ccc9DD5x14y15E, 2,
  &(vtc__ZN3ccc9DD5x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD5x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x14y15E),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x14y15E),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  CC5x15y0  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC5x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y03pqrEv
  ~CC5x15y0(); // tgen
  CC5x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y0E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y03abcEv");}
void  ccc::CC5x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y03efgEv");}
void  ccc::CC5x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y03pqrEv");}
ccc::CC5x15y0 ::~CC5x15y0(){ note_dtor("_ZN3ccc8CC5x15y0E", this);} // tgen
ccc::CC5x15y0 ::CC5x15y0(){ note_ctor("_ZN3ccc8CC5x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y0E, buf);
    ::ccc::CC5x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y0E);
    dp->::ccc::CC5x15y0::~CC5x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y0E(Test__ZN3ccc8CC5x15y0E, "_ZN3ccc8CC5x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y0C1Ev();
extern void _ZN3ccc8CC5x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y0E[] = {
  NSPAIR(_ZN3ccc8CC5x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y0E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y0E[];
extern void _ZN3ccc8CC5x15y03pqrEv();
extern void _ZN3ccc8CC5x15y03efgEv();
extern void _ZN3ccc8CC5x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y0E[] = {
  {&(_ZTVN3ccc8CC5x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y0E[];
Class_Descriptor cd__ZN3ccc8CC5x15y0E = {  "_ZN3ccc8CC5x15y0E", // class name
  bases__ZN3ccc8CC5x15y0E, 2,
  &(vtc__ZN3ccc8CC5x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y0  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD5x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD5x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x15y03pqrEv
  ~DD5x15y0(); // tgen
  DD5x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y0E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y03abcEv");}
void  ccc::DD5x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y03efgEv");}
void  ccc::DD5x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y03pqrEv");}
ccc::DD5x15y0 ::~DD5x15y0(){ note_dtor("_ZN3ccc8DD5x15y0E", this);} // tgen
ccc::DD5x15y0 ::DD5x15y0(){ note_ctor("_ZN3ccc8DD5x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y0E, buf);
    ::ccc::DD5x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y0E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y0E);
    dp->::ccc::DD5x15y0::~DD5x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y0E(Test__ZN3ccc8DD5x15y0E, "_ZN3ccc8DD5x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y0C1Ev();
extern void _ZN3ccc8DD5x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y0E[] = {
  NSPAIR(_ZN3ccc8DD5x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y0E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y0E[];
extern void _ZN3ccc8DD5x15y03pqrEv();
extern void _ZN3ccc8DD5x15y03efgEv();
extern void _ZN3ccc8DD5x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y0E[] = {
  {&(_ZTVN3ccc8DD5x15y0E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y0E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y0E[];
Class_Descriptor cd__ZN3ccc8DD5x15y0E = {  "_ZN3ccc8DD5x15y0E", // class name
  bases__ZN3ccc8DD5x15y0E, 2,
  &(vtc__ZN3ccc8DD5x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y0E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y1  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x15y13efgEv
  ~CC5x15y1(); // tgen
  CC5x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y1E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y13abcEv");}
void  ccc::CC5x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y13pqrEv");}
void  ccc::CC5x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y13efgEv");}
ccc::CC5x15y1 ::~CC5x15y1(){ note_dtor("_ZN3ccc8CC5x15y1E", this);} // tgen
ccc::CC5x15y1 ::CC5x15y1(){ note_ctor("_ZN3ccc8CC5x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y1E, buf);
    ::ccc::CC5x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y1E);
    dp->::ccc::CC5x15y1::~CC5x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y1E(Test__ZN3ccc8CC5x15y1E, "_ZN3ccc8CC5x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y1C1Ev();
extern void _ZN3ccc8CC5x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y1E[] = {
  NSPAIR(_ZN3ccc8CC5x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y1E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y1E[];
extern void _ZN3ccc8CC5x15y13pqrEv();
extern void _ZN3ccc8CC5x15y13efgEv();
extern void _ZN3ccc8CC5x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y1E[] = {
  {&(_ZTVN3ccc8CC5x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y1E[];
Class_Descriptor cd__ZN3ccc8CC5x15y1E = {  "_ZN3ccc8CC5x15y1E", // class name
  bases__ZN3ccc8CC5x15y1E, 2,
  &(vtc__ZN3ccc8CC5x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y1  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD5x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x15y13efgEv
  ~DD5x15y1(); // tgen
  DD5x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y1E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y13abcEv");}
void  ccc::DD5x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y13pqrEv");}
void  ccc::DD5x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y13efgEv");}
ccc::DD5x15y1 ::~DD5x15y1(){ note_dtor("_ZN3ccc8DD5x15y1E", this);} // tgen
ccc::DD5x15y1 ::DD5x15y1(){ note_ctor("_ZN3ccc8DD5x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y1E, buf);
    ::ccc::DD5x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y1E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y1E);
    dp->::ccc::DD5x15y1::~DD5x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y1E(Test__ZN3ccc8DD5x15y1E, "_ZN3ccc8DD5x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y1C1Ev();
extern void _ZN3ccc8DD5x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y1E[] = {
  NSPAIR(_ZN3ccc8DD5x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y1E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y1E[];
extern void _ZN3ccc8DD5x15y13pqrEv();
extern void _ZN3ccc8DD5x15y13efgEv();
extern void _ZN3ccc8DD5x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y1E[] = {
  {&(_ZTVN3ccc8DD5x15y1E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y1E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y1E[];
Class_Descriptor cd__ZN3ccc8DD5x15y1E = {  "_ZN3ccc8DD5x15y1E", // class name
  bases__ZN3ccc8DD5x15y1E, 2,
  &(vtc__ZN3ccc8DD5x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y1E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y2  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC5x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y23pqrEv
  ~CC5x15y2(); // tgen
  CC5x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y2E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y23efgEv");}
void  ccc::CC5x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y23abcEv");}
void  ccc::CC5x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y23pqrEv");}
ccc::CC5x15y2 ::~CC5x15y2(){ note_dtor("_ZN3ccc8CC5x15y2E", this);} // tgen
ccc::CC5x15y2 ::CC5x15y2(){ note_ctor("_ZN3ccc8CC5x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y2E, buf);
    ::ccc::CC5x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y2E);
    dp->::ccc::CC5x15y2::~CC5x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y2E(Test__ZN3ccc8CC5x15y2E, "_ZN3ccc8CC5x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y2C1Ev();
extern void _ZN3ccc8CC5x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y2E[] = {
  NSPAIR(_ZN3ccc8CC5x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y2E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y2E[];
extern void _ZN3ccc8CC5x15y23pqrEv();
extern void _ZN3ccc8CC5x15y23efgEv();
extern void _ZN3ccc8CC5x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y2E[] = {
  {&(_ZTVN3ccc8CC5x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y2E[];
Class_Descriptor cd__ZN3ccc8CC5x15y2E = {  "_ZN3ccc8CC5x15y2E", // class name
  bases__ZN3ccc8CC5x15y2E, 2,
  &(vtc__ZN3ccc8CC5x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y2  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD5x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD5x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x15y23pqrEv
  ~DD5x15y2(); // tgen
  DD5x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y2E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y23efgEv");}
void  ccc::DD5x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y23abcEv");}
void  ccc::DD5x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y23pqrEv");}
ccc::DD5x15y2 ::~DD5x15y2(){ note_dtor("_ZN3ccc8DD5x15y2E", this);} // tgen
ccc::DD5x15y2 ::DD5x15y2(){ note_ctor("_ZN3ccc8DD5x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y2E, buf);
    ::ccc::DD5x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y2E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y2E);
    dp->::ccc::DD5x15y2::~DD5x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y2E(Test__ZN3ccc8DD5x15y2E, "_ZN3ccc8DD5x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y2C1Ev();
extern void _ZN3ccc8DD5x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y2E[] = {
  NSPAIR(_ZN3ccc8DD5x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y2E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y2E[];
extern void _ZN3ccc8DD5x15y23pqrEv();
extern void _ZN3ccc8DD5x15y23efgEv();
extern void _ZN3ccc8DD5x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y2E[] = {
  {&(_ZTVN3ccc8DD5x15y2E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y2E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y2E[];
Class_Descriptor cd__ZN3ccc8DD5x15y2E = {  "_ZN3ccc8DD5x15y2E", // class name
  bases__ZN3ccc8DD5x15y2E, 2,
  &(vtc__ZN3ccc8DD5x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y2E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y3  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x15y33abcEv
  ~CC5x15y3(); // tgen
  CC5x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y3E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y33efgEv");}
void  ccc::CC5x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y33pqrEv");}
void  ccc::CC5x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y33abcEv");}
ccc::CC5x15y3 ::~CC5x15y3(){ note_dtor("_ZN3ccc8CC5x15y3E", this);} // tgen
ccc::CC5x15y3 ::CC5x15y3(){ note_ctor("_ZN3ccc8CC5x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y3E, buf);
    ::ccc::CC5x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y3E);
    dp->::ccc::CC5x15y3::~CC5x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y3E(Test__ZN3ccc8CC5x15y3E, "_ZN3ccc8CC5x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y3C1Ev();
extern void _ZN3ccc8CC5x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y3E[] = {
  NSPAIR(_ZN3ccc8CC5x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y3E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y3E[];
extern void _ZN3ccc8CC5x15y33pqrEv();
extern void _ZN3ccc8CC5x15y33efgEv();
extern void _ZN3ccc8CC5x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y3E[] = {
  {&(_ZTVN3ccc8CC5x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y3E[];
Class_Descriptor cd__ZN3ccc8CC5x15y3E = {  "_ZN3ccc8CC5x15y3E", // class name
  bases__ZN3ccc8CC5x15y3E, 2,
  &(vtc__ZN3ccc8CC5x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y3  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD5x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x15y33abcEv
  ~DD5x15y3(); // tgen
  DD5x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y3E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y33efgEv");}
void  ccc::DD5x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y33pqrEv");}
void  ccc::DD5x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y33abcEv");}
ccc::DD5x15y3 ::~DD5x15y3(){ note_dtor("_ZN3ccc8DD5x15y3E", this);} // tgen
ccc::DD5x15y3 ::DD5x15y3(){ note_ctor("_ZN3ccc8DD5x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y3E, buf);
    ::ccc::DD5x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y3E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y3E);
    dp->::ccc::DD5x15y3::~DD5x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y3E(Test__ZN3ccc8DD5x15y3E, "_ZN3ccc8DD5x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y3C1Ev();
extern void _ZN3ccc8DD5x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y3E[] = {
  NSPAIR(_ZN3ccc8DD5x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y3E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y3E[];
extern void _ZN3ccc8DD5x15y33pqrEv();
extern void _ZN3ccc8DD5x15y33efgEv();
extern void _ZN3ccc8DD5x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y3E[] = {
  {&(_ZTVN3ccc8DD5x15y3E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y3E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y3E[];
Class_Descriptor cd__ZN3ccc8DD5x15y3E = {  "_ZN3ccc8DD5x15y3E", // class name
  bases__ZN3ccc8DD5x15y3E, 2,
  &(vtc__ZN3ccc8DD5x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y3E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y4  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC5x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC5x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC5x15y43efgEv
  ~CC5x15y4(); // tgen
  CC5x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y4E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y43pqrEv");}
void  ccc::CC5x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y43abcEv");}
void  ccc::CC5x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y43efgEv");}
ccc::CC5x15y4 ::~CC5x15y4(){ note_dtor("_ZN3ccc8CC5x15y4E", this);} // tgen
ccc::CC5x15y4 ::CC5x15y4(){ note_ctor("_ZN3ccc8CC5x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y4E, buf);
    ::ccc::CC5x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y4E);
    dp->::ccc::CC5x15y4::~CC5x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y4E(Test__ZN3ccc8CC5x15y4E, "_ZN3ccc8CC5x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y4C1Ev();
extern void _ZN3ccc8CC5x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y4E[] = {
  NSPAIR(_ZN3ccc8CC5x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y4E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y4E[];
extern void _ZN3ccc8CC5x15y43pqrEv();
extern void _ZN3ccc8CC5x15y43efgEv();
extern void _ZN3ccc8CC5x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y4E[] = {
  {&(_ZTVN3ccc8CC5x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y4E[];
Class_Descriptor cd__ZN3ccc8CC5x15y4E = {  "_ZN3ccc8CC5x15y4E", // class name
  bases__ZN3ccc8CC5x15y4E, 2,
  &(vtc__ZN3ccc8CC5x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y4  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD5x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD5x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD5x15y43efgEv
  ~DD5x15y4(); // tgen
  DD5x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y4E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y43pqrEv");}
void  ccc::DD5x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y43abcEv");}
void  ccc::DD5x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y43efgEv");}
ccc::DD5x15y4 ::~DD5x15y4(){ note_dtor("_ZN3ccc8DD5x15y4E", this);} // tgen
ccc::DD5x15y4 ::DD5x15y4(){ note_ctor("_ZN3ccc8DD5x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y4E, buf);
    ::ccc::DD5x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y4E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y4E);
    dp->::ccc::DD5x15y4::~DD5x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y4E(Test__ZN3ccc8DD5x15y4E, "_ZN3ccc8DD5x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y4C1Ev();
extern void _ZN3ccc8DD5x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y4E[] = {
  NSPAIR(_ZN3ccc8DD5x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y4E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y4E[];
extern void _ZN3ccc8DD5x15y43pqrEv();
extern void _ZN3ccc8DD5x15y43efgEv();
extern void _ZN3ccc8DD5x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y4E[] = {
  {&(_ZTVN3ccc8DD5x15y4E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y4E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y4E[];
Class_Descriptor cd__ZN3ccc8DD5x15y4E = {  "_ZN3ccc8DD5x15y4E", // class name
  bases__ZN3ccc8DD5x15y4E, 2,
  &(vtc__ZN3ccc8DD5x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y4E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y5  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC5x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC5x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC5x15y53abcEv
  ~CC5x15y5(); // tgen
  CC5x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y5E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC5x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y53pqrEv");}
void  ccc::CC5x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y53efgEv");}
void  ccc::CC5x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y53abcEv");}
ccc::CC5x15y5 ::~CC5x15y5(){ note_dtor("_ZN3ccc8CC5x15y5E", this);} // tgen
ccc::CC5x15y5 ::CC5x15y5(){ note_ctor("_ZN3ccc8CC5x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y5E, buf);
    ::ccc::CC5x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y5E);
    dp->::ccc::CC5x15y5::~CC5x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y5E(Test__ZN3ccc8CC5x15y5E, "_ZN3ccc8CC5x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y5C1Ev();
extern void _ZN3ccc8CC5x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y5E[] = {
  NSPAIR(_ZN3ccc8CC5x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y5E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y5E[];
extern void _ZN3ccc8CC5x15y53pqrEv();
extern void _ZN3ccc8CC5x15y53efgEv();
extern void _ZN3ccc8CC5x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y5E[] = {
  {&(_ZTVN3ccc8CC5x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y5E[];
Class_Descriptor cd__ZN3ccc8CC5x15y5E = {  "_ZN3ccc8CC5x15y5E", // class name
  bases__ZN3ccc8CC5x15y5E, 2,
  &(vtc__ZN3ccc8CC5x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y5  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD5x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD5x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD5x15y53abcEv
  ~DD5x15y5(); // tgen
  DD5x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y5E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD5x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y53pqrEv");}
void  ccc::DD5x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y53efgEv");}
void  ccc::DD5x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y53abcEv");}
ccc::DD5x15y5 ::~DD5x15y5(){ note_dtor("_ZN3ccc8DD5x15y5E", this);} // tgen
ccc::DD5x15y5 ::DD5x15y5(){ note_ctor("_ZN3ccc8DD5x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y5E, buf);
    ::ccc::DD5x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y5E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y5E);
    dp->::ccc::DD5x15y5::~DD5x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y5E(Test__ZN3ccc8DD5x15y5E, "_ZN3ccc8DD5x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y5C1Ev();
extern void _ZN3ccc8DD5x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y5E[] = {
  NSPAIR(_ZN3ccc8DD5x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y5E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y5E[];
extern void _ZN3ccc8DD5x15y53pqrEv();
extern void _ZN3ccc8DD5x15y53efgEv();
extern void _ZN3ccc8DD5x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y5E[] = {
  {&(_ZTVN3ccc8DD5x15y5E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y5E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y5E[];
Class_Descriptor cd__ZN3ccc8DD5x15y5E = {  "_ZN3ccc8DD5x15y5E", // class name
  bases__ZN3ccc8DD5x15y5E, 2,
  &(vtc__ZN3ccc8DD5x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y5E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y6  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC5x15y63efgEv
  ~CC5x15y6(); // tgen
  CC5x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y6E) C1{ VBC2{ v3 v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC5x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y63abcEv");}
void  ccc::CC5x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y63efgEv");}
ccc::CC5x15y6 ::~CC5x15y6(){ note_dtor("_ZN3ccc8CC5x15y6E", this);} // tgen
ccc::CC5x15y6 ::CC5x15y6(){ note_ctor("_ZN3ccc8CC5x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y6E, buf);
    ::ccc::CC5x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y6E);
    dp->::ccc::CC5x15y6::~CC5x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y6E(Test__ZN3ccc8CC5x15y6E, "_ZN3ccc8CC5x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y6C1Ev();
extern void _ZN3ccc8CC5x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y6E[] = {
  NSPAIR(_ZN3ccc8CC5x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y6E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x15y63efgEv();
extern void _ZN3ccc8CC5x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y6E[] = {
  {&(_ZTVN3ccc8CC5x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y6E[];
Class_Descriptor cd__ZN3ccc8CC5x15y6E = {  "_ZN3ccc8CC5x15y6E", // class name
  bases__ZN3ccc8CC5x15y6E, 2,
  &(vtc__ZN3ccc8CC5x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y6  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD5x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD5x15y63efgEv
  ~DD5x15y6(); // tgen
  DD5x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y6E) C1{ VBC2{ v3 v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD5x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y63abcEv");}
void  ccc::DD5x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y63efgEv");}
ccc::DD5x15y6 ::~DD5x15y6(){ note_dtor("_ZN3ccc8DD5x15y6E", this);} // tgen
ccc::DD5x15y6 ::DD5x15y6(){ note_ctor("_ZN3ccc8DD5x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y6E, buf);
    ::ccc::DD5x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y6E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y6E);
    dp->::ccc::DD5x15y6::~DD5x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y6E(Test__ZN3ccc8DD5x15y6E, "_ZN3ccc8DD5x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y6C1Ev();
extern void _ZN3ccc8DD5x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y6E[] = {
  NSPAIR(_ZN3ccc8DD5x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y6E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y6E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x15y63efgEv();
extern void _ZN3ccc8DD5x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y6E[] = {
  {&(_ZTVN3ccc8DD5x15y6E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y6E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y6E[];
Class_Descriptor cd__ZN3ccc8DD5x15y6E = {  "_ZN3ccc8DD5x15y6E", // class name
  bases__ZN3ccc8DD5x15y6E, 2,
  &(vtc__ZN3ccc8DD5x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y6E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y7  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC5x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y73pqrEv
  ~CC5x15y7(); // tgen
  CC5x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y7E) C1{ VBC2{ v2 v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC5x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y73abcEv");}
void  ccc::CC5x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y73pqrEv");}
ccc::CC5x15y7 ::~CC5x15y7(){ note_dtor("_ZN3ccc8CC5x15y7E", this);} // tgen
ccc::CC5x15y7 ::CC5x15y7(){ note_ctor("_ZN3ccc8CC5x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y7E, buf);
    ::ccc::CC5x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y7E);
    dp->::ccc::CC5x15y7::~CC5x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y7E(Test__ZN3ccc8CC5x15y7E, "_ZN3ccc8CC5x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y7C1Ev();
extern void _ZN3ccc8CC5x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y7E[] = {
  NSPAIR(_ZN3ccc8CC5x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y7E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y7E[];
extern void _ZN3ccc8CC5x15y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8CC5x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y7E[] = {
  {&(_ZTVN3ccc8CC5x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y7E[];
Class_Descriptor cd__ZN3ccc8CC5x15y7E = {  "_ZN3ccc8CC5x15y7E", // class name
  bases__ZN3ccc8CC5x15y7E, 2,
  &(vtc__ZN3ccc8CC5x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y7  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD5x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD5x15y73pqrEv
  ~DD5x15y7(); // tgen
  DD5x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y7E) C1{ VBC2{ v2 v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD5x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y73abcEv");}
void  ccc::DD5x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y73pqrEv");}
ccc::DD5x15y7 ::~DD5x15y7(){ note_dtor("_ZN3ccc8DD5x15y7E", this);} // tgen
ccc::DD5x15y7 ::DD5x15y7(){ note_ctor("_ZN3ccc8DD5x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y7E, buf);
    ::ccc::DD5x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y7E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y7E);
    dp->::ccc::DD5x15y7::~DD5x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y7E(Test__ZN3ccc8DD5x15y7E, "_ZN3ccc8DD5x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y7C1Ev();
extern void _ZN3ccc8DD5x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y7E[] = {
  NSPAIR(_ZN3ccc8DD5x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y7E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y7E[];
extern void _ZN3ccc8DD5x15y73pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc8DD5x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y7E[] = {
  {&(_ZTVN3ccc8DD5x15y7E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y7E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y7E[];
Class_Descriptor cd__ZN3ccc8DD5x15y7E = {  "_ZN3ccc8DD5x15y7E", // class name
  bases__ZN3ccc8DD5x15y7E, 2,
  &(vtc__ZN3ccc8DD5x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y7E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y8  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC5x15y83abcEv
  ~CC5x15y8(); // tgen
  CC5x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y8E) C1{ VBC2{ v3 v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC5x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y83efgEv");}
void  ccc::CC5x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC5x15y83abcEv");}
ccc::CC5x15y8 ::~CC5x15y8(){ note_dtor("_ZN3ccc8CC5x15y8E", this);} // tgen
ccc::CC5x15y8 ::CC5x15y8(){ note_ctor("_ZN3ccc8CC5x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y8E, buf);
    ::ccc::CC5x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y8E);
    dp->::ccc::CC5x15y8::~CC5x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y8E(Test__ZN3ccc8CC5x15y8E, "_ZN3ccc8CC5x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y8C1Ev();
extern void _ZN3ccc8CC5x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y8E[] = {
  NSPAIR(_ZN3ccc8CC5x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y8E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8CC5x15y83efgEv();
extern void _ZN3ccc8CC5x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y8E[] = {
  {&(_ZTVN3ccc8CC5x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y8E[];
Class_Descriptor cd__ZN3ccc8CC5x15y8E = {  "_ZN3ccc8CC5x15y8E", // class name
  bases__ZN3ccc8CC5x15y8E, 2,
  &(vtc__ZN3ccc8CC5x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y8  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD5x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD5x15y83abcEv
  ~DD5x15y8(); // tgen
  DD5x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y8E) C1{ VBC2{ v3 v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD5x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y83efgEv");}
void  ccc::DD5x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD5x15y83abcEv");}
ccc::DD5x15y8 ::~DD5x15y8(){ note_dtor("_ZN3ccc8DD5x15y8E", this);} // tgen
ccc::DD5x15y8 ::DD5x15y8(){ note_ctor("_ZN3ccc8DD5x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y8E, buf);
    ::ccc::DD5x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y8E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y8E);
    dp->::ccc::DD5x15y8::~DD5x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y8E(Test__ZN3ccc8DD5x15y8E, "_ZN3ccc8DD5x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y8C1Ev();
extern void _ZN3ccc8DD5x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y8E[] = {
  NSPAIR(_ZN3ccc8DD5x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y8E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y8E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc8DD5x15y83efgEv();
extern void _ZN3ccc8DD5x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y8E[] = {
  {&(_ZTVN3ccc8DD5x15y8E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y8E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y8E[];
Class_Descriptor cd__ZN3ccc8DD5x15y8E = {  "_ZN3ccc8DD5x15y8E", // class name
  bases__ZN3ccc8DD5x15y8E, 2,
  &(vtc__ZN3ccc8DD5x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y8E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y9  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC5x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC5x15y93pqrEv
  ~CC5x15y9(); // tgen
  CC5x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC5x15y9E) C1{ VBC2{ v2 v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC5x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC5x15y93efgEv");}
void  ccc::CC5x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC5x15y93pqrEv");}
ccc::CC5x15y9 ::~CC5x15y9(){ note_dtor("_ZN3ccc8CC5x15y9E", this);} // tgen
ccc::CC5x15y9 ::CC5x15y9(){ note_ctor("_ZN3ccc8CC5x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC5x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC5x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC5x15y9E, buf);
    ::ccc::CC5x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC5x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC5x15y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8CC5x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC5x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC5x15y9E);
    dp->::ccc::CC5x15y9::~CC5x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC5x15y9E(Test__ZN3ccc8CC5x15y9E, "_ZN3ccc8CC5x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC5x15y9C1Ev();
extern void _ZN3ccc8CC5x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC5x15y9E[] = {
  NSPAIR(_ZN3ccc8CC5x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC5x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC5x15y9E[] = {
  // 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__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 _ZTIN3ccc8CC5x15y9E[];
extern void _ZN3ccc8CC5x15y93pqrEv();
extern void _ZN3ccc8CC5x15y93efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC5x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC5x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC5x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC5x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC5x15y9E[] = {
  {&(_ZTVN3ccc8CC5x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8CC5x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8CC5x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC5x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC5x15y9E[];
Class_Descriptor cd__ZN3ccc8CC5x15y9E = {  "_ZN3ccc8CC5x15y9E", // class name
  bases__ZN3ccc8CC5x15y9E, 2,
  &(vtc__ZN3ccc8CC5x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC5x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC5x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC5x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC5x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y9  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD5x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD5x15y93pqrEv
  ~DD5x15y9(); // tgen
  DD5x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD5x15y9E) C1{ VBC2{ v2 v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD5x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD5x15y93efgEv");}
void  ccc::DD5x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD5x15y93pqrEv");}
ccc::DD5x15y9 ::~DD5x15y9(){ note_dtor("_ZN3ccc8DD5x15y9E", this);} // tgen
ccc::DD5x15y9 ::DD5x15y9(){ note_ctor("_ZN3ccc8DD5x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD5x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD5x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD5x15y9E, buf);
    ::ccc::DD5x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD5x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD5x15y9E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc8DD5x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD5x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD5x15y9E);
    dp->::ccc::DD5x15y9::~DD5x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD5x15y9E(Test__ZN3ccc8DD5x15y9E, "_ZN3ccc8DD5x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD5x15y9C1Ev();
extern void _ZN3ccc8DD5x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD5x15y9E[] = {
  NSPAIR(_ZN3ccc8DD5x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD5x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD5x15y9E[] = {
  // 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__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 _ZTIN3ccc8DD5x15y9E[];
extern void _ZN3ccc8DD5x15y93pqrEv();
extern void _ZN3ccc8DD5x15y93efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD5x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD5x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD5x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD5x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD5x15y9E[] = {
  {&(_ZTVN3ccc8DD5x15y9E[7]),  7,10},
  {&(_ZTVN3ccc8DD5x15y9E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc8DD5x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD5x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD5x15y9E[];
Class_Descriptor cd__ZN3ccc8DD5x15y9E = {  "_ZN3ccc8DD5x15y9E", // class name
  bases__ZN3ccc8DD5x15y9E, 2,
  &(vtc__ZN3ccc8DD5x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD5x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD5x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD5x15y9E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD5x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y10  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC5x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC5x15y103abcEv
  ~CC5x15y10(); // tgen
  CC5x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y10E) C1{ VBC2{ v1 v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC5x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x15y103pqrEv");}
void  ccc::CC5x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x15y103abcEv");}
ccc::CC5x15y10 ::~CC5x15y10(){ note_dtor("_ZN3ccc9CC5x15y10E", this);} // tgen
ccc::CC5x15y10 ::CC5x15y10(){ note_ctor("_ZN3ccc9CC5x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC5x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC5x15y10E, buf);
    ::ccc::CC5x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC5x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x15y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9CC5x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC5x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x15y10E);
    dp->::ccc::CC5x15y10::~CC5x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x15y10E(Test__ZN3ccc9CC5x15y10E, "_ZN3ccc9CC5x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC5x15y10C1Ev();
extern void _ZN3ccc9CC5x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC5x15y10E[] = {
  NSPAIR(_ZN3ccc9CC5x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC5x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC5x15y10E[] = {
  // 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__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 _ZTIN3ccc9CC5x15y10E[];
extern void _ZN3ccc9CC5x15y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x15y10E[] = {
  {&(_ZTVN3ccc9CC5x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9CC5x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x15y10E[];
Class_Descriptor cd__ZN3ccc9CC5x15y10E = {  "_ZN3ccc9CC5x15y10E", // class name
  bases__ZN3ccc9CC5x15y10E, 2,
  &(vtc__ZN3ccc9CC5x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y10  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD5x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD5x15y103abcEv
  ~DD5x15y10(); // tgen
  DD5x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD5x15y10E) C1{ VBC2{ v1 v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD5x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x15y103pqrEv");}
void  ccc::DD5x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x15y103abcEv");}
ccc::DD5x15y10 ::~DD5x15y10(){ note_dtor("_ZN3ccc9DD5x15y10E", this);} // tgen
ccc::DD5x15y10 ::DD5x15y10(){ note_ctor("_ZN3ccc9DD5x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD5x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD5x15y10E, buf);
    ::ccc::DD5x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD5x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x15y10E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD5x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x15y10E);
    dp->::ccc::DD5x15y10::~DD5x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x15y10E(Test__ZN3ccc9DD5x15y10E, "_ZN3ccc9DD5x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD5x15y10C1Ev();
extern void _ZN3ccc9DD5x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD5x15y10E[] = {
  NSPAIR(_ZN3ccc9DD5x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD5x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD5x15y10E[] = {
  // 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__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 _ZTIN3ccc9DD5x15y10E[];
extern void _ZN3ccc9DD5x15y103pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x15y10E[] = {
  {&(_ZTVN3ccc9DD5x15y10E[7]),  7,10},
  {&(_ZTVN3ccc9DD5x15y10E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x15y10E[];
Class_Descriptor cd__ZN3ccc9DD5x15y10E = {  "_ZN3ccc9DD5x15y10E", // class name
  bases__ZN3ccc9DD5x15y10E, 2,
  &(vtc__ZN3ccc9DD5x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD5x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x15y10E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y11  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC5x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC5x15y113efgEv
  ~CC5x15y11(); // tgen
  CC5x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y11E) C1{ VBC2{ v1 v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC5x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x15y113pqrEv");}
void  ccc::CC5x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x15y113efgEv");}
ccc::CC5x15y11 ::~CC5x15y11(){ note_dtor("_ZN3ccc9CC5x15y11E", this);} // tgen
ccc::CC5x15y11 ::CC5x15y11(){ note_ctor("_ZN3ccc9CC5x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC5x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC5x15y11E, buf);
    ::ccc::CC5x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC5x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x15y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9CC5x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC5x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x15y11E);
    dp->::ccc::CC5x15y11::~CC5x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x15y11E(Test__ZN3ccc9CC5x15y11E, "_ZN3ccc9CC5x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC5x15y11C1Ev();
extern void _ZN3ccc9CC5x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC5x15y11E[] = {
  NSPAIR(_ZN3ccc9CC5x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC5x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC5x15y11E[] = {
  // 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__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 _ZTIN3ccc9CC5x15y11E[];
extern void _ZN3ccc9CC5x15y113pqrEv();
extern void _ZN3ccc9CC5x15y113efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x15y11E[] = {
  {&(_ZTVN3ccc9CC5x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9CC5x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x15y11E[];
Class_Descriptor cd__ZN3ccc9CC5x15y11E = {  "_ZN3ccc9CC5x15y11E", // class name
  bases__ZN3ccc9CC5x15y11E, 2,
  &(vtc__ZN3ccc9CC5x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y11  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD5x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD5x15y113efgEv
  ~DD5x15y11(); // tgen
  DD5x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD5x15y11E) C1{ VBC2{ v1 v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD5x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x15y113pqrEv");}
void  ccc::DD5x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x15y113efgEv");}
ccc::DD5x15y11 ::~DD5x15y11(){ note_dtor("_ZN3ccc9DD5x15y11E", this);} // tgen
ccc::DD5x15y11 ::DD5x15y11(){ note_ctor("_ZN3ccc9DD5x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD5x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD5x15y11E, buf);
    ::ccc::DD5x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD5x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x15y11E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD5x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x15y11E);
    dp->::ccc::DD5x15y11::~DD5x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x15y11E(Test__ZN3ccc9DD5x15y11E, "_ZN3ccc9DD5x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD5x15y11C1Ev();
extern void _ZN3ccc9DD5x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD5x15y11E[] = {
  NSPAIR(_ZN3ccc9DD5x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD5x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD5x15y11E[] = {
  // 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__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 _ZTIN3ccc9DD5x15y11E[];
extern void _ZN3ccc9DD5x15y113pqrEv();
extern void _ZN3ccc9DD5x15y113efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x15y11E[] = {
  {&(_ZTVN3ccc9DD5x15y11E[7]),  7,10},
  {&(_ZTVN3ccc9DD5x15y11E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x15y11E[];
Class_Descriptor cd__ZN3ccc9DD5x15y11E = {  "_ZN3ccc9DD5x15y11E", // class name
  bases__ZN3ccc9DD5x15y11E, 2,
  &(vtc__ZN3ccc9DD5x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD5x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x15y11E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y12  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC5x15y123abcEv
  ~CC5x15y12(); // tgen
  CC5x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y12E) C1{ VBC2{ v2 v3 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC5x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC5x15y123abcEv");}
ccc::CC5x15y12 ::~CC5x15y12(){ note_dtor("_ZN3ccc9CC5x15y12E", this);} // tgen
ccc::CC5x15y12 ::CC5x15y12(){ note_ctor("_ZN3ccc9CC5x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC5x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC5x15y12E, buf);
    ::ccc::CC5x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC5x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x15y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9CC5x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC5x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x15y12E);
    dp->::ccc::CC5x15y12::~CC5x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x15y12E(Test__ZN3ccc9CC5x15y12E, "_ZN3ccc9CC5x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC5x15y12C1Ev();
extern void _ZN3ccc9CC5x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC5x15y12E[] = {
  NSPAIR(_ZN3ccc9CC5x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC5x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC5x15y12E[] = {
  // 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__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 _ZTIN3ccc9CC5x15y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9CC5x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x15y12E[] = {
  {&(_ZTVN3ccc9CC5x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9CC5x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x15y12E[];
Class_Descriptor cd__ZN3ccc9CC5x15y12E = {  "_ZN3ccc9CC5x15y12E", // class name
  bases__ZN3ccc9CC5x15y12E, 2,
  &(vtc__ZN3ccc9CC5x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y12  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD5x15y123abcEv
  ~DD5x15y12(); // tgen
  DD5x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD5x15y12E) C1{ VBC2{ v2 v3 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD5x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD5x15y123abcEv");}
ccc::DD5x15y12 ::~DD5x15y12(){ note_dtor("_ZN3ccc9DD5x15y12E", this);} // tgen
ccc::DD5x15y12 ::DD5x15y12(){ note_ctor("_ZN3ccc9DD5x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD5x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD5x15y12E, buf);
    ::ccc::DD5x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD5x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x15y12E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD5x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x15y12E);
    dp->::ccc::DD5x15y12::~DD5x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x15y12E(Test__ZN3ccc9DD5x15y12E, "_ZN3ccc9DD5x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD5x15y12C1Ev();
extern void _ZN3ccc9DD5x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD5x15y12E[] = {
  NSPAIR(_ZN3ccc9DD5x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD5x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD5x15y12E[] = {
  // 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__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 _ZTIN3ccc9DD5x15y12E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc9DD5x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x15y12E[] = {
  {&(_ZTVN3ccc9DD5x15y12E[7]),  7,10},
  {&(_ZTVN3ccc9DD5x15y12E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x15y12E[];
Class_Descriptor cd__ZN3ccc9DD5x15y12E = {  "_ZN3ccc9DD5x15y12E", // class name
  bases__ZN3ccc9DD5x15y12E, 2,
  &(vtc__ZN3ccc9DD5x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD5x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x15y12E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y13  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC5x15y133efgEv
  ~CC5x15y13(); // tgen
  CC5x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y13E) C1{ VBC2{ v2 v1 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC5x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC5x15y133efgEv");}
ccc::CC5x15y13 ::~CC5x15y13(){ note_dtor("_ZN3ccc9CC5x15y13E", this);} // tgen
ccc::CC5x15y13 ::CC5x15y13(){ note_ctor("_ZN3ccc9CC5x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC5x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC5x15y13E, buf);
    ::ccc::CC5x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC5x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x15y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9CC5x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC5x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x15y13E);
    dp->::ccc::CC5x15y13::~CC5x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x15y13E(Test__ZN3ccc9CC5x15y13E, "_ZN3ccc9CC5x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC5x15y13C1Ev();
extern void _ZN3ccc9CC5x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC5x15y13E[] = {
  NSPAIR(_ZN3ccc9CC5x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC5x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC5x15y13E[] = {
  // 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__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 _ZTIN3ccc9CC5x15y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9CC5x15y133efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x15y13E[] = {
  {&(_ZTVN3ccc9CC5x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9CC5x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x15y13E[];
Class_Descriptor cd__ZN3ccc9CC5x15y13E = {  "_ZN3ccc9CC5x15y13E", // class name
  bases__ZN3ccc9CC5x15y13E, 2,
  &(vtc__ZN3ccc9CC5x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y13  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD5x15y133efgEv
  ~DD5x15y13(); // tgen
  DD5x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD5x15y13E) C1{ VBC2{ v2 v1 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD5x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD5x15y133efgEv");}
ccc::DD5x15y13 ::~DD5x15y13(){ note_dtor("_ZN3ccc9DD5x15y13E", this);} // tgen
ccc::DD5x15y13 ::DD5x15y13(){ note_ctor("_ZN3ccc9DD5x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD5x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD5x15y13E, buf);
    ::ccc::DD5x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD5x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x15y13E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD5x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x15y13E);
    dp->::ccc::DD5x15y13::~DD5x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x15y13E(Test__ZN3ccc9DD5x15y13E, "_ZN3ccc9DD5x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD5x15y13C1Ev();
extern void _ZN3ccc9DD5x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD5x15y13E[] = {
  NSPAIR(_ZN3ccc9DD5x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD5x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD5x15y13E[] = {
  // 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__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 _ZTIN3ccc9DD5x15y13E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc9DD5x15y133efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x15y13E[] = {
  {&(_ZTVN3ccc9DD5x15y13E[7]),  7,10},
  {&(_ZTVN3ccc9DD5x15y13E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x15y13E[];
Class_Descriptor cd__ZN3ccc9DD5x15y13E = {  "_ZN3ccc9DD5x15y13E", // class name
  bases__ZN3ccc9DD5x15y13E, 2,
  &(vtc__ZN3ccc9DD5x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD5x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x15y13E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y14  : virtual ::ccc::AA5 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC5x15y143pqrEv
  ~CC5x15y14(); // tgen
  CC5x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y14E) C1{ VBC2{ v1 v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC5x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC5x15y143pqrEv");}
ccc::CC5x15y14 ::~CC5x15y14(){ note_dtor("_ZN3ccc9CC5x15y14E", this);} // tgen
ccc::CC5x15y14 ::CC5x15y14(){ note_ctor("_ZN3ccc9CC5x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC5x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC5x15y14E, buf);
    ::ccc::CC5x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC5x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x15y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9CC5x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC5x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x15y14E);
    dp->::ccc::CC5x15y14::~CC5x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x15y14E(Test__ZN3ccc9CC5x15y14E, "_ZN3ccc9CC5x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC5x15y14C1Ev();
extern void _ZN3ccc9CC5x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC5x15y14E[] = {
  NSPAIR(_ZN3ccc9CC5x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC5x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC5x15y14E[] = {
  // 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__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 _ZTIN3ccc9CC5x15y14E[];
extern void _ZN3ccc9CC5x15y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC5x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x15y14E[] = {
  {&(_ZTVN3ccc9CC5x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9CC5x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x15y14E[];
Class_Descriptor cd__ZN3ccc9CC5x15y14E = {  "_ZN3ccc9CC5x15y14E", // class name
  bases__ZN3ccc9CC5x15y14E, 2,
  &(vtc__ZN3ccc9CC5x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD5x15y14  : virtual ::ccc::AA5 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD5x15y143pqrEv
  ~DD5x15y14(); // tgen
  DD5x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD5x15y14E) C1{ VBC2{ v1 v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD5x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD5x15y143pqrEv");}
ccc::DD5x15y14 ::~DD5x15y14(){ note_dtor("_ZN3ccc9DD5x15y14E", this);} // tgen
ccc::DD5x15y14 ::DD5x15y14(){ note_ctor("_ZN3ccc9DD5x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD5x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD5x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD5x15y14E, buf);
    ::ccc::DD5x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD5x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD5x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD5x15y14E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9DD5x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD5x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD5x15y14E);
    dp->::ccc::DD5x15y14::~DD5x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD5x15y14E(Test__ZN3ccc9DD5x15y14E, "_ZN3ccc9DD5x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD5x15y14C1Ev();
extern void _ZN3ccc9DD5x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD5x15y14E[] = {
  NSPAIR(_ZN3ccc9DD5x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD5x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD5x15y14E[] = {
  // 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__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 _ZTIN3ccc9DD5x15y14E[];
extern void _ZN3ccc9DD5x15y143pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD5x15y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x15y14E[] = {
  {&(_ZTVN3ccc9DD5x15y14E[7]),  7,10},
  {&(_ZTVN3ccc9DD5x15y14E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x15y14E[];
Class_Descriptor cd__ZN3ccc9DD5x15y14E = {  "_ZN3ccc9DD5x15y14E", // class name
  bases__ZN3ccc9DD5x15y14E, 2,
  &(vtc__ZN3ccc9DD5x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD5x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x15y14E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC5x15y15  : virtual ::ccc::AA5 , ::ccc::BB15 {
  ~CC5x15y15(); // tgen
  CC5x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC5x15y15E) C1{ VBC2{ v1 v2 v3} BC3{}}
}
namespace ccc { 
ccc::CC5x15y15 ::~CC5x15y15(){ note_dtor("_ZN3ccc9CC5x15y15E", this);} // tgen
ccc::CC5x15y15 ::CC5x15y15(){ note_ctor("_ZN3ccc9CC5x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC5x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC5x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC5x15y15E, buf);
    ::ccc::CC5x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC5x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC5x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC5x15y15E)");
    check_base_class_offset(lv, (::ccc::AA5*), 0, "_ZN3ccc9CC5x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC5x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC5x15y15E);
    dp->::ccc::CC5x15y15::~CC5x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC5x15y15E(Test__ZN3ccc9CC5x15y15E, "_ZN3ccc9CC5x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC5x15y15C1Ev();
extern void _ZN3ccc9CC5x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC5x15y15E[] = {
  NSPAIR(_ZN3ccc9CC5x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC5x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC5x15y15E[] = {
  // 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__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 _ZTIN3ccc9CC5x15y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC5x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC5x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC5x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC5x15y15E[] = {
  {&(_ZTVN3ccc9CC5x15y15E[6]),  6,9},
  {&(_ZTVN3ccc9CC5x15y15E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9CC5x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC5x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC5x15y15E[];
Class_Descriptor cd__ZN3ccc9CC5x15y15E = {  "_ZN3ccc9CC5x15y15E", // class name
  bases__ZN3ccc9CC5x15y15E, 2,
  &(vtc__ZN3ccc9CC5x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC5x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC5x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC5x15y15E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC5x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

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

#else // __cplusplus

extern void _ZN3ccc9DD5x15y15C1Ev();
extern void _ZN3ccc9DD5x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD5x15y15E[] = {
  NSPAIR(_ZN3ccc9DD5x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD5x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA5E;
extern VTBL_ENTRY _ZTIN3ccc3AA5E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA5E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD5x15y15E[] = {
  // 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__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 _ZTIN3ccc9DD5x15y15E[];
extern void _ZN3ccc3AA53pqrEv();
extern void _ZN3ccc3AA53efgEv();
extern void _ZN3ccc3AA53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD5x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD5x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD5x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD5x15y15E[] = {
  {&(_ZTVN3ccc9DD5x15y15E[7]),  7,10},
  {&(_ZTVN3ccc9DD5x15y15E[7]),  7,10},
};
extern VTBL_ENTRY _ZTIN3ccc9DD5x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD5x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD5x15y15E[];
Class_Descriptor cd__ZN3ccc9DD5x15y15E = {  "_ZN3ccc9DD5x15y15E", // class name
  bases__ZN3ccc9DD5x15y15E, 2,
  &(vtc__ZN3ccc9DD5x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD5x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD5x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD5x15y15E),10, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD5x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x0y0  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y03pqrEv
  ~CC6x0y0(); // tgen
  CC6x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y0E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y03abcEv");}
void  ccc::CC6x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y03efgEv");}
void  ccc::CC6x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y03pqrEv");}
ccc::CC6x0y0 ::~CC6x0y0(){ note_dtor("_ZN3ccc7CC6x0y0E", this);} // tgen
ccc::CC6x0y0 ::CC6x0y0(){ note_ctor("_ZN3ccc7CC6x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y0E, buf);
    ::ccc::CC6x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y0E);
    dp->::ccc::CC6x0y0::~CC6x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y0E(Test__ZN3ccc7CC6x0y0E, "_ZN3ccc7CC6x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y0C1Ev();
extern void _ZN3ccc7CC6x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y0E[] = {
  NSPAIR(_ZN3ccc7CC6x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y0E[];
extern void _ZN3ccc7CC6x0y03abcEv();
extern void _ZN3ccc7CC6x0y03efgEv();
extern void _ZN3ccc7CC6x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y03abcEv,_ZTv0_n12_N3ccc7CC6x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y03abcEv,_ZThn4_N3ccc7CC6x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y03efgEv,_ZTv0_n16_N3ccc7CC6x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y03efgEv,_ZThn4_N3ccc7CC6x0y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y03abcEv,_ZTv0_n12_N3ccc7CC6x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y03efgEv,_ZTv0_n16_N3ccc7CC6x0y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y0E[] = {
  {&(_ZTVN3ccc7CC6x0y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y0E[];
static VTBL_ENTRY alt_thunk_names339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y03efgEv,_ZTv0_n16_N3ccc7CC6x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y03efgEv,_ZThn4_N3ccc7CC6x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y03abcEv,_ZTv0_n12_N3ccc7CC6x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y03abcEv,_ZThn4_N3ccc7CC6x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y0E = {  "_ZN3ccc7CC6x0y0E", // class name
  bases__ZN3ccc7CC6x0y0E, 2,
  &(vtc__ZN3ccc7CC6x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y0E),2, //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  DD6x0y0  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD6x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x0y03pqrEv
  ~DD6x0y0(); // tgen
  DD6x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y0E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y03abcEv");}
void  ccc::DD6x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y03efgEv");}
void  ccc::DD6x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y03pqrEv");}
ccc::DD6x0y0 ::~DD6x0y0(){ note_dtor("_ZN3ccc7DD6x0y0E", this);} // tgen
ccc::DD6x0y0 ::DD6x0y0(){ note_ctor("_ZN3ccc7DD6x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y0E, buf);
    ::ccc::DD6x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y0E);
    dp->::ccc::DD6x0y0::~DD6x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y0E(Test__ZN3ccc7DD6x0y0E, "_ZN3ccc7DD6x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y0C1Ev();
extern void _ZN3ccc7DD6x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y0E[] = {
  NSPAIR(_ZN3ccc7DD6x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y0E[];
extern void _ZN3ccc7DD6x0y03abcEv();
extern void _ZN3ccc7DD6x0y03efgEv();
extern void _ZN3ccc7DD6x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y03abcEv,_ZTv0_n12_N3ccc7DD6x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y03abcEv,_ZThn4_N3ccc7DD6x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y03efgEv,_ZTv0_n16_N3ccc7DD6x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y03efgEv,_ZThn4_N3ccc7DD6x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y03pqrEv,_ZTv0_n20_N3ccc7DD6x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y03pqrEv,_ZThn4_N3ccc7DD6x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y03abcEv,_ZTv0_n12_N3ccc7DD6x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y03efgEv,_ZTv0_n16_N3ccc7DD6x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y03pqrEv,_ZTv0_n20_N3ccc7DD6x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y0E[] = {
  {&(_ZTVN3ccc7DD6x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y0E[];
static VTBL_ENTRY alt_thunk_names340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y03pqrEv,_ZTv0_n20_N3ccc7DD6x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y03pqrEv,_ZThn4_N3ccc7DD6x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y03efgEv,_ZTv0_n16_N3ccc7DD6x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y03efgEv,_ZThn4_N3ccc7DD6x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y03abcEv,_ZTv0_n12_N3ccc7DD6x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y03abcEv,_ZThn4_N3ccc7DD6x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y0E = {  "_ZN3ccc7DD6x0y0E", // class name
  bases__ZN3ccc7DD6x0y0E, 2,
  &(vtc__ZN3ccc7DD6x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y0E),3, //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  CC6x0y1  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x0y13efgEv
  ~CC6x0y1(); // tgen
  CC6x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y1E) C1{ VBC2{ v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y13abcEv");}
void  ccc::CC6x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y13pqrEv");}
void  ccc::CC6x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y13efgEv");}
ccc::CC6x0y1 ::~CC6x0y1(){ note_dtor("_ZN3ccc7CC6x0y1E", this);} // tgen
ccc::CC6x0y1 ::CC6x0y1(){ note_ctor("_ZN3ccc7CC6x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y1E, buf);
    ::ccc::CC6x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y1E);
    dp->::ccc::CC6x0y1::~CC6x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y1E(Test__ZN3ccc7CC6x0y1E, "_ZN3ccc7CC6x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y1C1Ev();
extern void _ZN3ccc7CC6x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y1E[] = {
  NSPAIR(_ZN3ccc7CC6x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y1E[];
extern void _ZN3ccc7CC6x0y13abcEv();
extern void _ZN3ccc7CC6x0y13efgEv();
extern void _ZN3ccc7CC6x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y13abcEv,_ZTv0_n12_N3ccc7CC6x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y13abcEv,_ZThn4_N3ccc7CC6x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y13efgEv,_ZTv0_n16_N3ccc7CC6x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y13efgEv,_ZThn4_N3ccc7CC6x0y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y13abcEv,_ZTv0_n12_N3ccc7CC6x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y13efgEv,_ZTv0_n16_N3ccc7CC6x0y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y1E[] = {
  {&(_ZTVN3ccc7CC6x0y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y1E[];
static VTBL_ENTRY alt_thunk_names341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y13efgEv,_ZTv0_n16_N3ccc7CC6x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y13efgEv,_ZThn4_N3ccc7CC6x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y13abcEv,_ZTv0_n12_N3ccc7CC6x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y13abcEv,_ZThn4_N3ccc7CC6x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y1E = {  "_ZN3ccc7CC6x0y1E", // class name
  bases__ZN3ccc7CC6x0y1E, 2,
  &(vtc__ZN3ccc7CC6x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y1E),2, //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  DD6x0y1  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD6x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x0y13efgEv
  ~DD6x0y1(); // tgen
  DD6x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y1E) C1{ VBC2{ v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y13abcEv");}
void  ccc::DD6x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y13pqrEv");}
void  ccc::DD6x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y13efgEv");}
ccc::DD6x0y1 ::~DD6x0y1(){ note_dtor("_ZN3ccc7DD6x0y1E", this);} // tgen
ccc::DD6x0y1 ::DD6x0y1(){ note_ctor("_ZN3ccc7DD6x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y1E, buf);
    ::ccc::DD6x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y1E);
    dp->::ccc::DD6x0y1::~DD6x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y1E(Test__ZN3ccc7DD6x0y1E, "_ZN3ccc7DD6x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y1C1Ev();
extern void _ZN3ccc7DD6x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y1E[] = {
  NSPAIR(_ZN3ccc7DD6x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y1E[];
extern void _ZN3ccc7DD6x0y13abcEv();
extern void _ZN3ccc7DD6x0y13efgEv();
extern void _ZN3ccc7DD6x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y13abcEv,_ZTv0_n12_N3ccc7DD6x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y13abcEv,_ZThn4_N3ccc7DD6x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y13efgEv,_ZTv0_n16_N3ccc7DD6x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y13efgEv,_ZThn4_N3ccc7DD6x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y13pqrEv,_ZTv0_n20_N3ccc7DD6x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y13pqrEv,_ZThn4_N3ccc7DD6x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y13abcEv,_ZTv0_n12_N3ccc7DD6x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y13efgEv,_ZTv0_n16_N3ccc7DD6x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y13pqrEv,_ZTv0_n20_N3ccc7DD6x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y1E[] = {
  {&(_ZTVN3ccc7DD6x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y1E[];
static VTBL_ENTRY alt_thunk_names342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y13pqrEv,_ZTv0_n20_N3ccc7DD6x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y13pqrEv,_ZThn4_N3ccc7DD6x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y13efgEv,_ZTv0_n16_N3ccc7DD6x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y13efgEv,_ZThn4_N3ccc7DD6x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y13abcEv,_ZTv0_n12_N3ccc7DD6x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y13abcEv,_ZThn4_N3ccc7DD6x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y1E = {  "_ZN3ccc7DD6x0y1E", // class name
  bases__ZN3ccc7DD6x0y1E, 2,
  &(vtc__ZN3ccc7DD6x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y1E),3, //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  CC6x0y2  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y23pqrEv
  ~CC6x0y2(); // tgen
  CC6x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y2E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y23efgEv");}
void  ccc::CC6x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y23abcEv");}
void  ccc::CC6x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y23pqrEv");}
ccc::CC6x0y2 ::~CC6x0y2(){ note_dtor("_ZN3ccc7CC6x0y2E", this);} // tgen
ccc::CC6x0y2 ::CC6x0y2(){ note_ctor("_ZN3ccc7CC6x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y2E, buf);
    ::ccc::CC6x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y2E);
    dp->::ccc::CC6x0y2::~CC6x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y2E(Test__ZN3ccc7CC6x0y2E, "_ZN3ccc7CC6x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y2C1Ev();
extern void _ZN3ccc7CC6x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y2E[] = {
  NSPAIR(_ZN3ccc7CC6x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y2E[];
extern void _ZN3ccc7CC6x0y23abcEv();
extern void _ZN3ccc7CC6x0y23efgEv();
extern void _ZN3ccc7CC6x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y23abcEv,_ZTv0_n12_N3ccc7CC6x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y23abcEv,_ZThn4_N3ccc7CC6x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y23efgEv,_ZTv0_n16_N3ccc7CC6x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y23efgEv,_ZThn4_N3ccc7CC6x0y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y23abcEv,_ZTv0_n12_N3ccc7CC6x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y23efgEv,_ZTv0_n16_N3ccc7CC6x0y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y2E[] = {
  {&(_ZTVN3ccc7CC6x0y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y2E[];
static VTBL_ENTRY alt_thunk_names343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y23efgEv,_ZTv0_n16_N3ccc7CC6x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y23efgEv,_ZThn4_N3ccc7CC6x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y23abcEv,_ZTv0_n12_N3ccc7CC6x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y23abcEv,_ZThn4_N3ccc7CC6x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y2E = {  "_ZN3ccc7CC6x0y2E", // class name
  bases__ZN3ccc7CC6x0y2E, 2,
  &(vtc__ZN3ccc7CC6x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y2E),2, //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  DD6x0y2  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD6x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x0y23pqrEv
  ~DD6x0y2(); // tgen
  DD6x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y2E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y23efgEv");}
void  ccc::DD6x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y23abcEv");}
void  ccc::DD6x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y23pqrEv");}
ccc::DD6x0y2 ::~DD6x0y2(){ note_dtor("_ZN3ccc7DD6x0y2E", this);} // tgen
ccc::DD6x0y2 ::DD6x0y2(){ note_ctor("_ZN3ccc7DD6x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y2E, buf);
    ::ccc::DD6x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y2E);
    dp->::ccc::DD6x0y2::~DD6x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y2E(Test__ZN3ccc7DD6x0y2E, "_ZN3ccc7DD6x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y2C1Ev();
extern void _ZN3ccc7DD6x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y2E[] = {
  NSPAIR(_ZN3ccc7DD6x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y2E[];
extern void _ZN3ccc7DD6x0y23abcEv();
extern void _ZN3ccc7DD6x0y23efgEv();
extern void _ZN3ccc7DD6x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y23abcEv,_ZTv0_n12_N3ccc7DD6x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y23abcEv,_ZThn4_N3ccc7DD6x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y23efgEv,_ZTv0_n16_N3ccc7DD6x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y23efgEv,_ZThn4_N3ccc7DD6x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y23pqrEv,_ZTv0_n20_N3ccc7DD6x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y23pqrEv,_ZThn4_N3ccc7DD6x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y23abcEv,_ZTv0_n12_N3ccc7DD6x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y23efgEv,_ZTv0_n16_N3ccc7DD6x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y23pqrEv,_ZTv0_n20_N3ccc7DD6x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y2E[] = {
  {&(_ZTVN3ccc7DD6x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y2E[];
static VTBL_ENTRY alt_thunk_names344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y23pqrEv,_ZTv0_n20_N3ccc7DD6x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y23pqrEv,_ZThn4_N3ccc7DD6x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y23efgEv,_ZTv0_n16_N3ccc7DD6x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y23efgEv,_ZThn4_N3ccc7DD6x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y23abcEv,_ZTv0_n12_N3ccc7DD6x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y23abcEv,_ZThn4_N3ccc7DD6x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y2E = {  "_ZN3ccc7DD6x0y2E", // class name
  bases__ZN3ccc7DD6x0y2E, 2,
  &(vtc__ZN3ccc7DD6x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y2E),3, //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  CC6x0y3  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x0y33abcEv
  ~CC6x0y3(); // tgen
  CC6x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y3E) C1{ VBC2{ v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y33efgEv");}
void  ccc::CC6x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y33pqrEv");}
void  ccc::CC6x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y33abcEv");}
ccc::CC6x0y3 ::~CC6x0y3(){ note_dtor("_ZN3ccc7CC6x0y3E", this);} // tgen
ccc::CC6x0y3 ::CC6x0y3(){ note_ctor("_ZN3ccc7CC6x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y3E, buf);
    ::ccc::CC6x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y3E);
    dp->::ccc::CC6x0y3::~CC6x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y3E(Test__ZN3ccc7CC6x0y3E, "_ZN3ccc7CC6x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y3C1Ev();
extern void _ZN3ccc7CC6x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y3E[] = {
  NSPAIR(_ZN3ccc7CC6x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y3E[];
extern void _ZN3ccc7CC6x0y33abcEv();
extern void _ZN3ccc7CC6x0y33efgEv();
extern void _ZN3ccc7CC6x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y33abcEv,_ZTv0_n12_N3ccc7CC6x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y33abcEv,_ZThn4_N3ccc7CC6x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y33efgEv,_ZTv0_n16_N3ccc7CC6x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y33efgEv,_ZThn4_N3ccc7CC6x0y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y33abcEv,_ZTv0_n12_N3ccc7CC6x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y33efgEv,_ZTv0_n16_N3ccc7CC6x0y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y3E[] = {
  {&(_ZTVN3ccc7CC6x0y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y3E[];
static VTBL_ENTRY alt_thunk_names345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y33efgEv,_ZTv0_n16_N3ccc7CC6x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y33efgEv,_ZThn4_N3ccc7CC6x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y33abcEv,_ZTv0_n12_N3ccc7CC6x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y33abcEv,_ZThn4_N3ccc7CC6x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y3E = {  "_ZN3ccc7CC6x0y3E", // class name
  bases__ZN3ccc7CC6x0y3E, 2,
  &(vtc__ZN3ccc7CC6x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y3E),2, //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  DD6x0y3  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD6x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x0y33abcEv
  ~DD6x0y3(); // tgen
  DD6x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y3E) C1{ VBC2{ v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y33efgEv");}
void  ccc::DD6x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y33pqrEv");}
void  ccc::DD6x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y33abcEv");}
ccc::DD6x0y3 ::~DD6x0y3(){ note_dtor("_ZN3ccc7DD6x0y3E", this);} // tgen
ccc::DD6x0y3 ::DD6x0y3(){ note_ctor("_ZN3ccc7DD6x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y3E, buf);
    ::ccc::DD6x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y3E);
    dp->::ccc::DD6x0y3::~DD6x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y3E(Test__ZN3ccc7DD6x0y3E, "_ZN3ccc7DD6x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y3C1Ev();
extern void _ZN3ccc7DD6x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y3E[] = {
  NSPAIR(_ZN3ccc7DD6x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y3E[];
extern void _ZN3ccc7DD6x0y33abcEv();
extern void _ZN3ccc7DD6x0y33efgEv();
extern void _ZN3ccc7DD6x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y33abcEv,_ZTv0_n12_N3ccc7DD6x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y33abcEv,_ZThn4_N3ccc7DD6x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y33efgEv,_ZTv0_n16_N3ccc7DD6x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y33efgEv,_ZThn4_N3ccc7DD6x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y33pqrEv,_ZTv0_n20_N3ccc7DD6x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y33pqrEv,_ZThn4_N3ccc7DD6x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y33abcEv,_ZTv0_n12_N3ccc7DD6x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y33efgEv,_ZTv0_n16_N3ccc7DD6x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y33pqrEv,_ZTv0_n20_N3ccc7DD6x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y3E[] = {
  {&(_ZTVN3ccc7DD6x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y3E[];
static VTBL_ENTRY alt_thunk_names346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y33pqrEv,_ZTv0_n20_N3ccc7DD6x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y33pqrEv,_ZThn4_N3ccc7DD6x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y33efgEv,_ZTv0_n16_N3ccc7DD6x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y33efgEv,_ZThn4_N3ccc7DD6x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y33abcEv,_ZTv0_n12_N3ccc7DD6x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y33abcEv,_ZThn4_N3ccc7DD6x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y3E = {  "_ZN3ccc7DD6x0y3E", // class name
  bases__ZN3ccc7DD6x0y3E, 2,
  &(vtc__ZN3ccc7DD6x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y3E),3, //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  CC6x0y4  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC6x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x0y43efgEv
  ~CC6x0y4(); // tgen
  CC6x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y4E) C1{ VBC2{ v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y43pqrEv");}
void  ccc::CC6x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y43abcEv");}
void  ccc::CC6x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y43efgEv");}
ccc::CC6x0y4 ::~CC6x0y4(){ note_dtor("_ZN3ccc7CC6x0y4E", this);} // tgen
ccc::CC6x0y4 ::CC6x0y4(){ note_ctor("_ZN3ccc7CC6x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y4E, buf);
    ::ccc::CC6x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y4E);
    dp->::ccc::CC6x0y4::~CC6x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y4E(Test__ZN3ccc7CC6x0y4E, "_ZN3ccc7CC6x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y4C1Ev();
extern void _ZN3ccc7CC6x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y4E[] = {
  NSPAIR(_ZN3ccc7CC6x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y4E[];
extern void _ZN3ccc7CC6x0y43abcEv();
extern void _ZN3ccc7CC6x0y43efgEv();
extern void _ZN3ccc7CC6x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y43abcEv,_ZTv0_n12_N3ccc7CC6x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y43abcEv,_ZThn4_N3ccc7CC6x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y43efgEv,_ZTv0_n16_N3ccc7CC6x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y43efgEv,_ZThn4_N3ccc7CC6x0y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y43abcEv,_ZTv0_n12_N3ccc7CC6x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y43efgEv,_ZTv0_n16_N3ccc7CC6x0y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y4E[] = {
  {&(_ZTVN3ccc7CC6x0y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y4E[];
static VTBL_ENTRY alt_thunk_names347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y43efgEv,_ZTv0_n16_N3ccc7CC6x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y43efgEv,_ZThn4_N3ccc7CC6x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y43abcEv,_ZTv0_n12_N3ccc7CC6x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y43abcEv,_ZThn4_N3ccc7CC6x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y4E = {  "_ZN3ccc7CC6x0y4E", // class name
  bases__ZN3ccc7CC6x0y4E, 2,
  &(vtc__ZN3ccc7CC6x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y4E),2, //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  DD6x0y4  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD6x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x0y43efgEv
  ~DD6x0y4(); // tgen
  DD6x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y4E) C1{ VBC2{ v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y43pqrEv");}
void  ccc::DD6x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y43abcEv");}
void  ccc::DD6x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y43efgEv");}
ccc::DD6x0y4 ::~DD6x0y4(){ note_dtor("_ZN3ccc7DD6x0y4E", this);} // tgen
ccc::DD6x0y4 ::DD6x0y4(){ note_ctor("_ZN3ccc7DD6x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y4E, buf);
    ::ccc::DD6x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y4E);
    dp->::ccc::DD6x0y4::~DD6x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y4E(Test__ZN3ccc7DD6x0y4E, "_ZN3ccc7DD6x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y4C1Ev();
extern void _ZN3ccc7DD6x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y4E[] = {
  NSPAIR(_ZN3ccc7DD6x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y4E[];
extern void _ZN3ccc7DD6x0y43abcEv();
extern void _ZN3ccc7DD6x0y43efgEv();
extern void _ZN3ccc7DD6x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y43abcEv,_ZTv0_n12_N3ccc7DD6x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y43abcEv,_ZThn4_N3ccc7DD6x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y43efgEv,_ZTv0_n16_N3ccc7DD6x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y43efgEv,_ZThn4_N3ccc7DD6x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y43pqrEv,_ZTv0_n20_N3ccc7DD6x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y43pqrEv,_ZThn4_N3ccc7DD6x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y43abcEv,_ZTv0_n12_N3ccc7DD6x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y43efgEv,_ZTv0_n16_N3ccc7DD6x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y43pqrEv,_ZTv0_n20_N3ccc7DD6x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y4E[] = {
  {&(_ZTVN3ccc7DD6x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y4E[];
static VTBL_ENTRY alt_thunk_names348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y43pqrEv,_ZTv0_n20_N3ccc7DD6x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y43pqrEv,_ZThn4_N3ccc7DD6x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y43efgEv,_ZTv0_n16_N3ccc7DD6x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y43efgEv,_ZThn4_N3ccc7DD6x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y43abcEv,_ZTv0_n12_N3ccc7DD6x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y43abcEv,_ZThn4_N3ccc7DD6x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y4E = {  "_ZN3ccc7DD6x0y4E", // class name
  bases__ZN3ccc7DD6x0y4E, 2,
  &(vtc__ZN3ccc7DD6x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y4E),3, //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  CC6x0y5  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC6x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x0y53abcEv
  ~CC6x0y5(); // tgen
  CC6x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y5E) C1{ VBC2{ v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y53pqrEv");}
void  ccc::CC6x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y53efgEv");}
void  ccc::CC6x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y53abcEv");}
ccc::CC6x0y5 ::~CC6x0y5(){ note_dtor("_ZN3ccc7CC6x0y5E", this);} // tgen
ccc::CC6x0y5 ::CC6x0y5(){ note_ctor("_ZN3ccc7CC6x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y5E, buf);
    ::ccc::CC6x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y5E);
    dp->::ccc::CC6x0y5::~CC6x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y5E(Test__ZN3ccc7CC6x0y5E, "_ZN3ccc7CC6x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y5C1Ev();
extern void _ZN3ccc7CC6x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y5E[] = {
  NSPAIR(_ZN3ccc7CC6x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y5E[];
extern void _ZN3ccc7CC6x0y53abcEv();
extern void _ZN3ccc7CC6x0y53efgEv();
extern void _ZN3ccc7CC6x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y53abcEv,_ZTv0_n12_N3ccc7CC6x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y53abcEv,_ZThn4_N3ccc7CC6x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y53efgEv,_ZTv0_n16_N3ccc7CC6x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y53efgEv,_ZThn4_N3ccc7CC6x0y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y53abcEv,_ZTv0_n12_N3ccc7CC6x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y53efgEv,_ZTv0_n16_N3ccc7CC6x0y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y5E[] = {
  {&(_ZTVN3ccc7CC6x0y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y5E[];
static VTBL_ENTRY alt_thunk_names349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y53efgEv,_ZTv0_n16_N3ccc7CC6x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y53efgEv,_ZThn4_N3ccc7CC6x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y53abcEv,_ZTv0_n12_N3ccc7CC6x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y53abcEv,_ZThn4_N3ccc7CC6x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y5E = {  "_ZN3ccc7CC6x0y5E", // class name
  bases__ZN3ccc7CC6x0y5E, 2,
  &(vtc__ZN3ccc7CC6x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y5E),2, //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  DD6x0y5  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD6x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x0y53abcEv
  ~DD6x0y5(); // tgen
  DD6x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y5E) C1{ VBC2{ v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y53pqrEv");}
void  ccc::DD6x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y53efgEv");}
void  ccc::DD6x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y53abcEv");}
ccc::DD6x0y5 ::~DD6x0y5(){ note_dtor("_ZN3ccc7DD6x0y5E", this);} // tgen
ccc::DD6x0y5 ::DD6x0y5(){ note_ctor("_ZN3ccc7DD6x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y5E, buf);
    ::ccc::DD6x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y5E);
    dp->::ccc::DD6x0y5::~DD6x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y5E(Test__ZN3ccc7DD6x0y5E, "_ZN3ccc7DD6x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y5C1Ev();
extern void _ZN3ccc7DD6x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y5E[] = {
  NSPAIR(_ZN3ccc7DD6x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y5E[];
extern void _ZN3ccc7DD6x0y53abcEv();
extern void _ZN3ccc7DD6x0y53efgEv();
extern void _ZN3ccc7DD6x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y53abcEv,_ZTv0_n12_N3ccc7DD6x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y53abcEv,_ZThn4_N3ccc7DD6x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y53efgEv,_ZTv0_n16_N3ccc7DD6x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y53efgEv,_ZThn4_N3ccc7DD6x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y53pqrEv,_ZTv0_n20_N3ccc7DD6x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y53pqrEv,_ZThn4_N3ccc7DD6x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y53abcEv,_ZTv0_n12_N3ccc7DD6x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y53efgEv,_ZTv0_n16_N3ccc7DD6x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y53pqrEv,_ZTv0_n20_N3ccc7DD6x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y5E[] = {
  {&(_ZTVN3ccc7DD6x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y5E[];
static VTBL_ENTRY alt_thunk_names350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y53pqrEv,_ZTv0_n20_N3ccc7DD6x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y53pqrEv,_ZThn4_N3ccc7DD6x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y53efgEv,_ZTv0_n16_N3ccc7DD6x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y53efgEv,_ZThn4_N3ccc7DD6x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y53abcEv,_ZTv0_n12_N3ccc7DD6x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y53abcEv,_ZThn4_N3ccc7DD6x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y5E = {  "_ZN3ccc7DD6x0y5E", // class name
  bases__ZN3ccc7DD6x0y5E, 2,
  &(vtc__ZN3ccc7DD6x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y5E),3, //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  CC6x0y6  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x0y63efgEv
  ~CC6x0y6(); // tgen
  CC6x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y6E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y63abcEv");}
void  ccc::CC6x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y63efgEv");}
ccc::CC6x0y6 ::~CC6x0y6(){ note_dtor("_ZN3ccc7CC6x0y6E", this);} // tgen
ccc::CC6x0y6 ::CC6x0y6(){ note_ctor("_ZN3ccc7CC6x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y6E, buf);
    ::ccc::CC6x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y6E);
    dp->::ccc::CC6x0y6::~CC6x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y6E(Test__ZN3ccc7CC6x0y6E, "_ZN3ccc7CC6x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y6C1Ev();
extern void _ZN3ccc7CC6x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y6E[] = {
  NSPAIR(_ZN3ccc7CC6x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y6E[];
extern void _ZN3ccc7CC6x0y63abcEv();
extern void _ZN3ccc7CC6x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y63abcEv,_ZTv0_n12_N3ccc7CC6x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y63abcEv,_ZThn4_N3ccc7CC6x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y63efgEv,_ZTv0_n16_N3ccc7CC6x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y63efgEv,_ZThn4_N3ccc7CC6x0y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y63abcEv,_ZTv0_n12_N3ccc7CC6x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y63efgEv,_ZTv0_n16_N3ccc7CC6x0y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y6E[] = {
  {&(_ZTVN3ccc7CC6x0y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y6E[];
static VTBL_ENTRY alt_thunk_names351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y63efgEv,_ZTv0_n16_N3ccc7CC6x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y63efgEv,_ZThn4_N3ccc7CC6x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y63abcEv,_ZTv0_n12_N3ccc7CC6x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y63abcEv,_ZThn4_N3ccc7CC6x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y6E = {  "_ZN3ccc7CC6x0y6E", // class name
  bases__ZN3ccc7CC6x0y6E, 2,
  &(vtc__ZN3ccc7CC6x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y6E),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  DD6x0y6  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD6x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x0y63efgEv
  ~DD6x0y6(); // tgen
  DD6x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y6E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y63abcEv");}
void  ccc::DD6x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y63efgEv");}
ccc::DD6x0y6 ::~DD6x0y6(){ note_dtor("_ZN3ccc7DD6x0y6E", this);} // tgen
ccc::DD6x0y6 ::DD6x0y6(){ note_ctor("_ZN3ccc7DD6x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y6E, buf);
    ::ccc::DD6x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y6E);
    dp->::ccc::DD6x0y6::~DD6x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y6E(Test__ZN3ccc7DD6x0y6E, "_ZN3ccc7DD6x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y6C1Ev();
extern void _ZN3ccc7DD6x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y6E[] = {
  NSPAIR(_ZN3ccc7DD6x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y6E[];
extern void _ZN3ccc7DD6x0y63abcEv();
extern void _ZN3ccc7DD6x0y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y63abcEv,_ZTv0_n12_N3ccc7DD6x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y63abcEv,_ZThn4_N3ccc7DD6x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y63efgEv,_ZTv0_n16_N3ccc7DD6x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y63efgEv,_ZThn4_N3ccc7DD6x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y63abcEv,_ZTv0_n12_N3ccc7DD6x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y63efgEv,_ZTv0_n16_N3ccc7DD6x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y6E[] = {
  {&(_ZTVN3ccc7DD6x0y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x0y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x0y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y6E[];
static VTBL_ENTRY alt_thunk_names352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y63efgEv,_ZTv0_n16_N3ccc7DD6x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y63efgEv,_ZThn4_N3ccc7DD6x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y63abcEv,_ZTv0_n12_N3ccc7DD6x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y63abcEv,_ZThn4_N3ccc7DD6x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y6E = {  "_ZN3ccc7DD6x0y6E", // class name
  bases__ZN3ccc7DD6x0y6E, 2,
  &(vtc__ZN3ccc7DD6x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y6E),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  CC6x0y7  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC6x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y73pqrEv
  ~CC6x0y7(); // tgen
  CC6x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y7E) C1{ VBC2{ v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y73abcEv");}
void  ccc::CC6x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y73pqrEv");}
ccc::CC6x0y7 ::~CC6x0y7(){ note_dtor("_ZN3ccc7CC6x0y7E", this);} // tgen
ccc::CC6x0y7 ::CC6x0y7(){ note_ctor("_ZN3ccc7CC6x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y7E, buf);
    ::ccc::CC6x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y7E);
    dp->::ccc::CC6x0y7::~CC6x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y7E(Test__ZN3ccc7CC6x0y7E, "_ZN3ccc7CC6x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y7C1Ev();
extern void _ZN3ccc7CC6x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y7E[] = {
  NSPAIR(_ZN3ccc7CC6x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y7E[];
extern void _ZN3ccc7CC6x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC6x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y73abcEv,_ZTv0_n12_N3ccc7CC6x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y73abcEv,_ZThn4_N3ccc7CC6x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y73abcEv,_ZTv0_n12_N3ccc7CC6x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y7E[] = {
  {&(_ZTVN3ccc7CC6x0y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y7E[];
static VTBL_ENTRY alt_thunk_names353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y73abcEv,_ZTv0_n12_N3ccc7CC6x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y73abcEv,_ZThn4_N3ccc7CC6x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y7E = {  "_ZN3ccc7CC6x0y7E", // class name
  bases__ZN3ccc7CC6x0y7E, 2,
  &(vtc__ZN3ccc7CC6x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y7E),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  DD6x0y7  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD6x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x0y73pqrEv
  ~DD6x0y7(); // tgen
  DD6x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y7E) C1{ VBC2{ v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y73abcEv");}
void  ccc::DD6x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y73pqrEv");}
ccc::DD6x0y7 ::~DD6x0y7(){ note_dtor("_ZN3ccc7DD6x0y7E", this);} // tgen
ccc::DD6x0y7 ::DD6x0y7(){ note_ctor("_ZN3ccc7DD6x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y7E, buf);
    ::ccc::DD6x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y7E);
    dp->::ccc::DD6x0y7::~DD6x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y7E(Test__ZN3ccc7DD6x0y7E, "_ZN3ccc7DD6x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y7C1Ev();
extern void _ZN3ccc7DD6x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y7E[] = {
  NSPAIR(_ZN3ccc7DD6x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y7E[];
extern void _ZN3ccc7DD6x0y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y73abcEv,_ZTv0_n12_N3ccc7DD6x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y73abcEv,_ZThn4_N3ccc7DD6x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y73pqrEv,_ZTv0_n20_N3ccc7DD6x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y73pqrEv,_ZThn4_N3ccc7DD6x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y73abcEv,_ZTv0_n12_N3ccc7DD6x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y73pqrEv,_ZTv0_n20_N3ccc7DD6x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y7E[] = {
  {&(_ZTVN3ccc7DD6x0y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y7E[];
static VTBL_ENTRY alt_thunk_names354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y73pqrEv,_ZTv0_n20_N3ccc7DD6x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y73pqrEv,_ZThn4_N3ccc7DD6x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y73abcEv,_ZTv0_n12_N3ccc7DD6x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y73abcEv,_ZThn4_N3ccc7DD6x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y7E = {  "_ZN3ccc7DD6x0y7E", // class name
  bases__ZN3ccc7DD6x0y7E, 2,
  &(vtc__ZN3ccc7DD6x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y7E),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  CC6x0y8  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x0y83abcEv
  ~CC6x0y8(); // tgen
  CC6x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y8E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y83efgEv");}
void  ccc::CC6x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x0y83abcEv");}
ccc::CC6x0y8 ::~CC6x0y8(){ note_dtor("_ZN3ccc7CC6x0y8E", this);} // tgen
ccc::CC6x0y8 ::CC6x0y8(){ note_ctor("_ZN3ccc7CC6x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y8E, buf);
    ::ccc::CC6x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y8E);
    dp->::ccc::CC6x0y8::~CC6x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y8E(Test__ZN3ccc7CC6x0y8E, "_ZN3ccc7CC6x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y8C1Ev();
extern void _ZN3ccc7CC6x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y8E[] = {
  NSPAIR(_ZN3ccc7CC6x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y8E[];
extern void _ZN3ccc7CC6x0y83abcEv();
extern void _ZN3ccc7CC6x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x0y83abcEv,_ZTv0_n12_N3ccc7CC6x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y83abcEv,_ZThn4_N3ccc7CC6x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y83efgEv,_ZTv0_n16_N3ccc7CC6x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y83efgEv,_ZThn4_N3ccc7CC6x0y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x0y83abcEv,_ZTv0_n12_N3ccc7CC6x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y83efgEv,_ZTv0_n16_N3ccc7CC6x0y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y8E[] = {
  {&(_ZTVN3ccc7CC6x0y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y8E[];
static VTBL_ENTRY alt_thunk_names355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y83efgEv,_ZTv0_n16_N3ccc7CC6x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y83efgEv,_ZThn4_N3ccc7CC6x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x0y83abcEv,_ZTv0_n12_N3ccc7CC6x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y83abcEv,_ZThn4_N3ccc7CC6x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y8E = {  "_ZN3ccc7CC6x0y8E", // class name
  bases__ZN3ccc7CC6x0y8E, 2,
  &(vtc__ZN3ccc7CC6x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y8E),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  DD6x0y8  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD6x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x0y83abcEv
  ~DD6x0y8(); // tgen
  DD6x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y8E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y83efgEv");}
void  ccc::DD6x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x0y83abcEv");}
ccc::DD6x0y8 ::~DD6x0y8(){ note_dtor("_ZN3ccc7DD6x0y8E", this);} // tgen
ccc::DD6x0y8 ::DD6x0y8(){ note_ctor("_ZN3ccc7DD6x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y8E, buf);
    ::ccc::DD6x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y8E);
    dp->::ccc::DD6x0y8::~DD6x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y8E(Test__ZN3ccc7DD6x0y8E, "_ZN3ccc7DD6x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y8C1Ev();
extern void _ZN3ccc7DD6x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y8E[] = {
  NSPAIR(_ZN3ccc7DD6x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y8E[];
extern void _ZN3ccc7DD6x0y83abcEv();
extern void _ZN3ccc7DD6x0y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x0y83abcEv,_ZTv0_n12_N3ccc7DD6x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y83abcEv,_ZThn4_N3ccc7DD6x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y83efgEv,_ZTv0_n16_N3ccc7DD6x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y83efgEv,_ZThn4_N3ccc7DD6x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x0y83abcEv,_ZTv0_n12_N3ccc7DD6x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y83efgEv,_ZTv0_n16_N3ccc7DD6x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y8E[] = {
  {&(_ZTVN3ccc7DD6x0y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x0y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x0y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y8E[];
static VTBL_ENTRY alt_thunk_names356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y83efgEv,_ZTv0_n16_N3ccc7DD6x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y83efgEv,_ZThn4_N3ccc7DD6x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x0y83abcEv,_ZTv0_n12_N3ccc7DD6x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y83abcEv,_ZThn4_N3ccc7DD6x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y8E = {  "_ZN3ccc7DD6x0y8E", // class name
  bases__ZN3ccc7DD6x0y8E, 2,
  &(vtc__ZN3ccc7DD6x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y8E),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  CC6x0y9  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC6x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x0y93pqrEv
  ~CC6x0y9(); // tgen
  CC6x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x0y9E) C1{ VBC2{ v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x0y93efgEv");}
void  ccc::CC6x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x0y93pqrEv");}
ccc::CC6x0y9 ::~CC6x0y9(){ note_dtor("_ZN3ccc7CC6x0y9E", this);} // tgen
ccc::CC6x0y9 ::CC6x0y9(){ note_ctor("_ZN3ccc7CC6x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x0y9E, buf);
    ::ccc::CC6x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x0y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC6x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x0y9E);
    dp->::ccc::CC6x0y9::~CC6x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x0y9E(Test__ZN3ccc7CC6x0y9E, "_ZN3ccc7CC6x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x0y9C1Ev();
extern void _ZN3ccc7CC6x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x0y9E[] = {
  NSPAIR(_ZN3ccc7CC6x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC6x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC6x0y93efgEv();
extern void _ZN3ccc7CC6x0y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x0y93efgEv,_ZTv0_n16_N3ccc7CC6x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x0y93efgEv,_ZThn4_N3ccc7CC6x0y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x0y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x0y93efgEv,_ZTv0_n16_N3ccc7CC6x0y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x0y9E[] = {
  {&(_ZTVN3ccc7CC6x0y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x0y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x0y9E[];
static VTBL_ENTRY alt_thunk_names357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x0y93efgEv,_ZTv0_n16_N3ccc7CC6x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x0y93efgEv,_ZThn4_N3ccc7CC6x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x0y9E = {  "_ZN3ccc7CC6x0y9E", // class name
  bases__ZN3ccc7CC6x0y9E, 2,
  &(vtc__ZN3ccc7CC6x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x0y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x0y9E),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  DD6x0y9  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD6x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x0y93pqrEv
  ~DD6x0y9(); // tgen
  DD6x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x0y9E) C1{ VBC2{ v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x0y93efgEv");}
void  ccc::DD6x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x0y93pqrEv");}
ccc::DD6x0y9 ::~DD6x0y9(){ note_dtor("_ZN3ccc7DD6x0y9E", this);} // tgen
ccc::DD6x0y9 ::DD6x0y9(){ note_ctor("_ZN3ccc7DD6x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x0y9E, buf);
    ::ccc::DD6x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x0y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD6x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x0y9E);
    dp->::ccc::DD6x0y9::~DD6x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x0y9E(Test__ZN3ccc7DD6x0y9E, "_ZN3ccc7DD6x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x0y9C1Ev();
extern void _ZN3ccc7DD6x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x0y9E[] = {
  NSPAIR(_ZN3ccc7DD6x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD6x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x0y93efgEv();
extern void _ZN3ccc7DD6x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x0y93efgEv,_ZTv0_n16_N3ccc7DD6x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y93efgEv,_ZThn4_N3ccc7DD6x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x0y93pqrEv,_ZTv0_n20_N3ccc7DD6x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x0y93pqrEv,_ZThn4_N3ccc7DD6x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x0y93efgEv,_ZTv0_n16_N3ccc7DD6x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x0y93pqrEv,_ZTv0_n20_N3ccc7DD6x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x0y9E[] = {
  {&(_ZTVN3ccc7DD6x0y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x0y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x0y9E[];
static VTBL_ENTRY alt_thunk_names358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x0y93pqrEv,_ZTv0_n20_N3ccc7DD6x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y93pqrEv,_ZThn4_N3ccc7DD6x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x0y93efgEv,_ZTv0_n16_N3ccc7DD6x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x0y93efgEv,_ZThn4_N3ccc7DD6x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x0y9E = {  "_ZN3ccc7DD6x0y9E", // class name
  bases__ZN3ccc7DD6x0y9E, 2,
  &(vtc__ZN3ccc7DD6x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x0y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x0y9E),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  CC6x0y10  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC6x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x0y103abcEv
  ~CC6x0y10(); // tgen
  CC6x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y10E) C1{ VBC2{ v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x0y103pqrEv");}
void  ccc::CC6x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x0y103abcEv");}
ccc::CC6x0y10 ::~CC6x0y10(){ note_dtor("_ZN3ccc8CC6x0y10E", this);} // tgen
ccc::CC6x0y10 ::CC6x0y10(){ note_ctor("_ZN3ccc8CC6x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x0y10E, buf);
    ::ccc::CC6x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x0y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC6x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x0y10E);
    dp->::ccc::CC6x0y10::~CC6x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x0y10E(Test__ZN3ccc8CC6x0y10E, "_ZN3ccc8CC6x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x0y10C1Ev();
extern void _ZN3ccc8CC6x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x0y10E[] = {
  NSPAIR(_ZN3ccc8CC6x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC6x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x0y10E[];
extern void _ZN3ccc8CC6x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC6x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x0y103abcEv,_ZTv0_n12_N3ccc8CC6x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y103abcEv,_ZThn4_N3ccc8CC6x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x0y103abcEv,_ZTv0_n12_N3ccc8CC6x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x0y10E[] = {
  {&(_ZTVN3ccc8CC6x0y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x0y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x0y10E[];
static VTBL_ENTRY alt_thunk_names359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x0y103abcEv,_ZTv0_n12_N3ccc8CC6x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x0y103abcEv,_ZThn4_N3ccc8CC6x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x0y10E = {  "_ZN3ccc8CC6x0y10E", // class name
  bases__ZN3ccc8CC6x0y10E, 2,
  &(vtc__ZN3ccc8CC6x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x0y10E),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  DD6x0y10  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD6x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x0y103abcEv
  ~DD6x0y10(); // tgen
  DD6x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x0y10E) C1{ VBC2{ v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x0y103pqrEv");}
void  ccc::DD6x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x0y103abcEv");}
ccc::DD6x0y10 ::~DD6x0y10(){ note_dtor("_ZN3ccc8DD6x0y10E", this);} // tgen
ccc::DD6x0y10 ::DD6x0y10(){ note_ctor("_ZN3ccc8DD6x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x0y10E, buf);
    ::ccc::DD6x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x0y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD6x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x0y10E);
    dp->::ccc::DD6x0y10::~DD6x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x0y10E(Test__ZN3ccc8DD6x0y10E, "_ZN3ccc8DD6x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x0y10C1Ev();
extern void _ZN3ccc8DD6x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x0y10E[] = {
  NSPAIR(_ZN3ccc8DD6x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD6x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y10E[];
extern void _ZN3ccc8DD6x0y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x0y103abcEv,_ZTv0_n12_N3ccc8DD6x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y103abcEv,_ZThn4_N3ccc8DD6x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x0y103pqrEv,_ZTv0_n20_N3ccc8DD6x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y103pqrEv,_ZThn4_N3ccc8DD6x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x0y103abcEv,_ZTv0_n12_N3ccc8DD6x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x0y103pqrEv,_ZTv0_n20_N3ccc8DD6x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x0y10E[] = {
  {&(_ZTVN3ccc8DD6x0y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x0y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x0y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x0y10E[];
static VTBL_ENTRY alt_thunk_names360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x0y103pqrEv,_ZTv0_n20_N3ccc8DD6x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y103pqrEv,_ZThn4_N3ccc8DD6x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x0y103abcEv,_ZTv0_n12_N3ccc8DD6x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y103abcEv,_ZThn4_N3ccc8DD6x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x0y10E = {  "_ZN3ccc8DD6x0y10E", // class name
  bases__ZN3ccc8DD6x0y10E, 2,
  &(vtc__ZN3ccc8DD6x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x0y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x0y10E),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  CC6x0y11  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC6x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x0y113efgEv
  ~CC6x0y11(); // tgen
  CC6x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y11E) C1{ VBC2{ v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x0y113pqrEv");}
void  ccc::CC6x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x0y113efgEv");}
ccc::CC6x0y11 ::~CC6x0y11(){ note_dtor("_ZN3ccc8CC6x0y11E", this);} // tgen
ccc::CC6x0y11 ::CC6x0y11(){ note_ctor("_ZN3ccc8CC6x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x0y11E, buf);
    ::ccc::CC6x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x0y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC6x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x0y11E);
    dp->::ccc::CC6x0y11::~CC6x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x0y11E(Test__ZN3ccc8CC6x0y11E, "_ZN3ccc8CC6x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x0y11C1Ev();
extern void _ZN3ccc8CC6x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x0y11E[] = {
  NSPAIR(_ZN3ccc8CC6x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC6x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC6x0y113efgEv();
extern void _ZN3ccc8CC6x0y113pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x0y113efgEv,_ZTv0_n16_N3ccc8CC6x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y113efgEv,_ZThn4_N3ccc8CC6x0y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x0y113efgEv,_ZTv0_n16_N3ccc8CC6x0y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x0y11E[] = {
  {&(_ZTVN3ccc8CC6x0y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x0y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x0y11E[];
static VTBL_ENTRY alt_thunk_names361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x0y113efgEv,_ZTv0_n16_N3ccc8CC6x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x0y113efgEv,_ZThn4_N3ccc8CC6x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x0y11E = {  "_ZN3ccc8CC6x0y11E", // class name
  bases__ZN3ccc8CC6x0y11E, 2,
  &(vtc__ZN3ccc8CC6x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x0y11E),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  DD6x0y11  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD6x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x0y113efgEv
  ~DD6x0y11(); // tgen
  DD6x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x0y11E) C1{ VBC2{ v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x0y113pqrEv");}
void  ccc::DD6x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x0y113efgEv");}
ccc::DD6x0y11 ::~DD6x0y11(){ note_dtor("_ZN3ccc8DD6x0y11E", this);} // tgen
ccc::DD6x0y11 ::DD6x0y11(){ note_ctor("_ZN3ccc8DD6x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x0y11E, buf);
    ::ccc::DD6x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x0y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD6x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x0y11E);
    dp->::ccc::DD6x0y11::~DD6x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x0y11E(Test__ZN3ccc8DD6x0y11E, "_ZN3ccc8DD6x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x0y11C1Ev();
extern void _ZN3ccc8DD6x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x0y11E[] = {
  NSPAIR(_ZN3ccc8DD6x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD6x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x0y113efgEv();
extern void _ZN3ccc8DD6x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x0y113efgEv,_ZTv0_n16_N3ccc8DD6x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y113efgEv,_ZThn4_N3ccc8DD6x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x0y113pqrEv,_ZTv0_n20_N3ccc8DD6x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y113pqrEv,_ZThn4_N3ccc8DD6x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x0y113efgEv,_ZTv0_n16_N3ccc8DD6x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x0y113pqrEv,_ZTv0_n20_N3ccc8DD6x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x0y11E[] = {
  {&(_ZTVN3ccc8DD6x0y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x0y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x0y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x0y11E[];
static VTBL_ENTRY alt_thunk_names362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x0y113pqrEv,_ZTv0_n20_N3ccc8DD6x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y113pqrEv,_ZThn4_N3ccc8DD6x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x0y113efgEv,_ZTv0_n16_N3ccc8DD6x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y113efgEv,_ZThn4_N3ccc8DD6x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x0y11E = {  "_ZN3ccc8DD6x0y11E", // class name
  bases__ZN3ccc8DD6x0y11E, 2,
  &(vtc__ZN3ccc8DD6x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x0y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x0y11E),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  CC6x0y12  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC6x0y123abcEv
  ~CC6x0y12(); // tgen
  CC6x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x0y123abcEv");}
ccc::CC6x0y12 ::~CC6x0y12(){ note_dtor("_ZN3ccc8CC6x0y12E", this);} // tgen
ccc::CC6x0y12 ::CC6x0y12(){ note_ctor("_ZN3ccc8CC6x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x0y12E, buf);
    ::ccc::CC6x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x0y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC6x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x0y12E);
    dp->::ccc::CC6x0y12::~CC6x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x0y12E(Test__ZN3ccc8CC6x0y12E, "_ZN3ccc8CC6x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x0y12C1Ev();
extern void _ZN3ccc8CC6x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x0y12E[] = {
  NSPAIR(_ZN3ccc8CC6x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC6x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x0y12E[];
extern void _ZN3ccc8CC6x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x0y123abcEv,_ZTv0_n12_N3ccc8CC6x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y123abcEv,_ZThn4_N3ccc8CC6x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x0y123abcEv,_ZTv0_n12_N3ccc8CC6x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x0y12E[] = {
  {&(_ZTVN3ccc8CC6x0y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x0y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x0y12E[];
static VTBL_ENTRY alt_thunk_names363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x0y123abcEv,_ZTv0_n12_N3ccc8CC6x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x0y123abcEv,_ZThn4_N3ccc8CC6x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x0y12E = {  "_ZN3ccc8CC6x0y12E", // class name
  bases__ZN3ccc8CC6x0y12E, 2,
  &(vtc__ZN3ccc8CC6x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x0y12E),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  DD6x0y12  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD6x0y123abcEv
  ~DD6x0y12(); // tgen
  DD6x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x0y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x0y123abcEv");}
ccc::DD6x0y12 ::~DD6x0y12(){ note_dtor("_ZN3ccc8DD6x0y12E", this);} // tgen
ccc::DD6x0y12 ::DD6x0y12(){ note_ctor("_ZN3ccc8DD6x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x0y12E, buf);
    ::ccc::DD6x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x0y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD6x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x0y12E);
    dp->::ccc::DD6x0y12::~DD6x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x0y12E(Test__ZN3ccc8DD6x0y12E, "_ZN3ccc8DD6x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x0y12C1Ev();
extern void _ZN3ccc8DD6x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x0y12E[] = {
  NSPAIR(_ZN3ccc8DD6x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD6x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y12E[];
extern void _ZN3ccc8DD6x0y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x0y123abcEv,_ZTv0_n12_N3ccc8DD6x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y123abcEv,_ZThn4_N3ccc8DD6x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x0y123abcEv,_ZTv0_n12_N3ccc8DD6x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x0y12E[] = {
  {&(_ZTVN3ccc8DD6x0y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x0y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x0y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x0y12E[];
static VTBL_ENTRY alt_thunk_names364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x0y123abcEv,_ZTv0_n12_N3ccc8DD6x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y123abcEv,_ZThn4_N3ccc8DD6x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x0y12E = {  "_ZN3ccc8DD6x0y12E", // class name
  bases__ZN3ccc8DD6x0y12E, 2,
  &(vtc__ZN3ccc8DD6x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x0y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x0y12E),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  CC6x0y13  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC6x0y133efgEv
  ~CC6x0y13(); // tgen
  CC6x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y13E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC6x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x0y133efgEv");}
ccc::CC6x0y13 ::~CC6x0y13(){ note_dtor("_ZN3ccc8CC6x0y13E", this);} // tgen
ccc::CC6x0y13 ::CC6x0y13(){ note_ctor("_ZN3ccc8CC6x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x0y13E, buf);
    ::ccc::CC6x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x0y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC6x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x0y13E);
    dp->::ccc::CC6x0y13::~CC6x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x0y13E(Test__ZN3ccc8CC6x0y13E, "_ZN3ccc8CC6x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x0y13C1Ev();
extern void _ZN3ccc8CC6x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x0y13E[] = {
  NSPAIR(_ZN3ccc8CC6x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC6x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC6x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x0y133efgEv,_ZTv0_n16_N3ccc8CC6x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x0y133efgEv,_ZThn4_N3ccc8CC6x0y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x0y133efgEv,_ZTv0_n16_N3ccc8CC6x0y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x0y13E[] = {
  {&(_ZTVN3ccc8CC6x0y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x0y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x0y13E[];
static VTBL_ENTRY alt_thunk_names365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x0y133efgEv,_ZTv0_n16_N3ccc8CC6x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x0y133efgEv,_ZThn4_N3ccc8CC6x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x0y13E = {  "_ZN3ccc8CC6x0y13E", // class name
  bases__ZN3ccc8CC6x0y13E, 2,
  &(vtc__ZN3ccc8CC6x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x0y13E),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  DD6x0y13  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD6x0y133efgEv
  ~DD6x0y13(); // tgen
  DD6x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x0y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD6x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x0y133efgEv");}
ccc::DD6x0y13 ::~DD6x0y13(){ note_dtor("_ZN3ccc8DD6x0y13E", this);} // tgen
ccc::DD6x0y13 ::DD6x0y13(){ note_ctor("_ZN3ccc8DD6x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x0y13E, buf);
    ::ccc::DD6x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x0y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD6x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x0y13E);
    dp->::ccc::DD6x0y13::~DD6x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x0y13E(Test__ZN3ccc8DD6x0y13E, "_ZN3ccc8DD6x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x0y13C1Ev();
extern void _ZN3ccc8DD6x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x0y13E[] = {
  NSPAIR(_ZN3ccc8DD6x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD6x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x0y133efgEv,_ZTv0_n16_N3ccc8DD6x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y133efgEv,_ZThn4_N3ccc8DD6x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x0y133efgEv,_ZTv0_n16_N3ccc8DD6x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x0y13E[] = {
  {&(_ZTVN3ccc8DD6x0y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x0y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x0y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x0y13E[];
static VTBL_ENTRY alt_thunk_names366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x0y133efgEv,_ZTv0_n16_N3ccc8DD6x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y133efgEv,_ZThn4_N3ccc8DD6x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x0y13E = {  "_ZN3ccc8DD6x0y13E", // class name
  bases__ZN3ccc8DD6x0y13E, 2,
  &(vtc__ZN3ccc8DD6x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x0y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x0y13E),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  CC6x0y14  : virtual ::ccc::AA6 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC6x0y143pqrEv
  ~CC6x0y14(); // tgen
  CC6x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC6x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x0y143pqrEv");}
ccc::CC6x0y14 ::~CC6x0y14(){ note_dtor("_ZN3ccc8CC6x0y14E", this);} // tgen
ccc::CC6x0y14 ::CC6x0y14(){ note_ctor("_ZN3ccc8CC6x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x0y14E, buf);
    ::ccc::CC6x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x0y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC6x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x0y14E);
    dp->::ccc::CC6x0y14::~CC6x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x0y14E(Test__ZN3ccc8CC6x0y14E, "_ZN3ccc8CC6x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x0y14C1Ev();
extern void _ZN3ccc8CC6x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x0y14E[] = {
  NSPAIR(_ZN3ccc8CC6x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC6x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC6x0y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x0y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x0y14E[] = {
  {&(_ZTVN3ccc8CC6x0y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x0y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x0y14E[];
Class_Descriptor cd__ZN3ccc8CC6x0y14E = {  "_ZN3ccc8CC6x0y14E", // class name
  bases__ZN3ccc8CC6x0y14E, 2,
  &(vtc__ZN3ccc8CC6x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x0y14E),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  DD6x0y14  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD6x0y143pqrEv
  ~DD6x0y14(); // tgen
  DD6x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x0y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD6x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x0y143pqrEv");}
ccc::DD6x0y14 ::~DD6x0y14(){ note_dtor("_ZN3ccc8DD6x0y14E", this);} // tgen
ccc::DD6x0y14 ::DD6x0y14(){ note_ctor("_ZN3ccc8DD6x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x0y14E, buf);
    ::ccc::DD6x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x0y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD6x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x0y14E);
    dp->::ccc::DD6x0y14::~DD6x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x0y14E(Test__ZN3ccc8DD6x0y14E, "_ZN3ccc8DD6x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x0y14C1Ev();
extern void _ZN3ccc8DD6x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x0y14E[] = {
  NSPAIR(_ZN3ccc8DD6x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD6x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x0y143pqrEv,_ZTv0_n20_N3ccc8DD6x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x0y143pqrEv,_ZThn4_N3ccc8DD6x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x0y143pqrEv,_ZTv0_n20_N3ccc8DD6x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x0y14E[] = {
  {&(_ZTVN3ccc8DD6x0y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x0y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x0y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x0y14E[];
static VTBL_ENTRY alt_thunk_names367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x0y143pqrEv,_ZTv0_n20_N3ccc8DD6x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x0y143pqrEv,_ZThn4_N3ccc8DD6x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x0y14E = {  "_ZN3ccc8DD6x0y14E", // class name
  bases__ZN3ccc8DD6x0y14E, 2,
  &(vtc__ZN3ccc8DD6x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x0y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x0y14E),3, //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  CC6x0y15  : virtual ::ccc::AA6 , ::ccc::BB0 {
  ~CC6x0y15(); // tgen
  CC6x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x0y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC6x0y15 ::~CC6x0y15(){ note_dtor("_ZN3ccc8CC6x0y15E", this);} // tgen
ccc::CC6x0y15 ::CC6x0y15(){ note_ctor("_ZN3ccc8CC6x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x0y15E, buf);
    ::ccc::CC6x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x0y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC6x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x0y15E);
    dp->::ccc::CC6x0y15::~CC6x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x0y15E(Test__ZN3ccc8CC6x0y15E, "_ZN3ccc8CC6x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x0y15C1Ev();
extern void _ZN3ccc8CC6x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x0y15E[] = {
  NSPAIR(_ZN3ccc8CC6x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC6x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x0y15E[] = {
  {&(_ZTVN3ccc8CC6x0y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x0y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x0y15E[];
Class_Descriptor cd__ZN3ccc8CC6x0y15E = {  "_ZN3ccc8CC6x0y15E", // class name
  bases__ZN3ccc8CC6x0y15E, 2,
  &(vtc__ZN3ccc8CC6x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x0y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x0y15E),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  DD6x0y15  : virtual ::ccc::AA6 , virtual ::ccc::BB0 {
  ~DD6x0y15(); // tgen
  DD6x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x0y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD6x0y15 ::~DD6x0y15(){ note_dtor("_ZN3ccc8DD6x0y15E", this);} // tgen
ccc::DD6x0y15 ::DD6x0y15(){ note_ctor("_ZN3ccc8DD6x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x0y15E, buf);
    ::ccc::DD6x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x0y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD6x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x0y15E);
    dp->::ccc::DD6x0y15::~DD6x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x0y15E(Test__ZN3ccc8DD6x0y15E, "_ZN3ccc8DD6x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x0y15C1Ev();
extern void _ZN3ccc8DD6x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x0y15E[] = {
  NSPAIR(_ZN3ccc8DD6x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD6x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x0y15E[] = {
  {&(_ZTVN3ccc8DD6x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x0y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x0y15E[];
Class_Descriptor cd__ZN3ccc8DD6x0y15E = {  "_ZN3ccc8DD6x0y15E", // class name
  bases__ZN3ccc8DD6x0y15E, 2,
  &(vtc__ZN3ccc8DD6x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x0y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x0y15E),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  CC6x1y0  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y03pqrEv
  ~CC6x1y0(); // tgen
  CC6x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y0E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y03abcEv");}
void  ccc::CC6x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y03efgEv");}
void  ccc::CC6x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y03pqrEv");}
ccc::CC6x1y0 ::~CC6x1y0(){ note_dtor("_ZN3ccc7CC6x1y0E", this);} // tgen
ccc::CC6x1y0 ::CC6x1y0(){ note_ctor("_ZN3ccc7CC6x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y0E, buf);
    ::ccc::CC6x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y0E);
    dp->::ccc::CC6x1y0::~CC6x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y0E(Test__ZN3ccc7CC6x1y0E, "_ZN3ccc7CC6x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y0C1Ev();
extern void _ZN3ccc7CC6x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y0E[] = {
  NSPAIR(_ZN3ccc7CC6x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y0E[];
extern void _ZN3ccc7CC6x1y03abcEv();
extern void _ZN3ccc7CC6x1y03pqrEv();
extern void _ZN3ccc7CC6x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y03abcEv,_ZTv0_n12_N3ccc7CC6x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y03abcEv,_ZThn4_N3ccc7CC6x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y03efgEv,_ZTv0_n16_N3ccc7CC6x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y03efgEv,_ZThn4_N3ccc7CC6x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y03abcEv,_ZTv0_n12_N3ccc7CC6x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y03efgEv,_ZTv0_n16_N3ccc7CC6x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y0E[] = {
  {&(_ZTVN3ccc7CC6x1y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y0E[];
static VTBL_ENTRY alt_thunk_names368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y03efgEv,_ZTv0_n16_N3ccc7CC6x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y03efgEv,_ZThn4_N3ccc7CC6x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y03abcEv,_ZTv0_n12_N3ccc7CC6x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y03abcEv,_ZThn4_N3ccc7CC6x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y0E = {  "_ZN3ccc7CC6x1y0E", // class name
  bases__ZN3ccc7CC6x1y0E, 2,
  &(vtc__ZN3ccc7CC6x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y0E),2, //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  DD6x1y0  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD6x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x1y03pqrEv
  ~DD6x1y0(); // tgen
  DD6x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y0E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y03abcEv");}
void  ccc::DD6x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y03efgEv");}
void  ccc::DD6x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y03pqrEv");}
ccc::DD6x1y0 ::~DD6x1y0(){ note_dtor("_ZN3ccc7DD6x1y0E", this);} // tgen
ccc::DD6x1y0 ::DD6x1y0(){ note_ctor("_ZN3ccc7DD6x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y0E, buf);
    ::ccc::DD6x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y0E);
    dp->::ccc::DD6x1y0::~DD6x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y0E(Test__ZN3ccc7DD6x1y0E, "_ZN3ccc7DD6x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y0C1Ev();
extern void _ZN3ccc7DD6x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y0E[] = {
  NSPAIR(_ZN3ccc7DD6x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y0E[];
extern void _ZN3ccc7DD6x1y03abcEv();
extern void _ZN3ccc7DD6x1y03efgEv();
extern void _ZN3ccc7DD6x1y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y03abcEv,_ZTv0_n12_N3ccc7DD6x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y03abcEv,_ZThn4_N3ccc7DD6x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y03pqrEv,_ZTv0_n16_N3ccc7DD6x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y03pqrEv,_ZThn4_N3ccc7DD6x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y03efgEv,_ZTv0_n20_N3ccc7DD6x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y03efgEv,_ZThn4_N3ccc7DD6x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y03abcEv,_ZTv0_n12_N3ccc7DD6x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y03pqrEv,_ZTv0_n16_N3ccc7DD6x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y03efgEv,_ZTv0_n20_N3ccc7DD6x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y0E[] = {
  {&(_ZTVN3ccc7DD6x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y0E[];
static VTBL_ENTRY alt_thunk_names369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y03efgEv,_ZTv0_n20_N3ccc7DD6x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y03efgEv,_ZThn4_N3ccc7DD6x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y03pqrEv,_ZTv0_n16_N3ccc7DD6x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y03pqrEv,_ZThn4_N3ccc7DD6x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y03abcEv,_ZTv0_n12_N3ccc7DD6x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y03abcEv,_ZThn4_N3ccc7DD6x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y0E = {  "_ZN3ccc7DD6x1y0E", // class name
  bases__ZN3ccc7DD6x1y0E, 2,
  &(vtc__ZN3ccc7DD6x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y0E),3, //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  CC6x1y1  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x1y13efgEv
  ~CC6x1y1(); // tgen
  CC6x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y1E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y13abcEv");}
void  ccc::CC6x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y13pqrEv");}
void  ccc::CC6x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y13efgEv");}
ccc::CC6x1y1 ::~CC6x1y1(){ note_dtor("_ZN3ccc7CC6x1y1E", this);} // tgen
ccc::CC6x1y1 ::CC6x1y1(){ note_ctor("_ZN3ccc7CC6x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y1E, buf);
    ::ccc::CC6x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y1E);
    dp->::ccc::CC6x1y1::~CC6x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y1E(Test__ZN3ccc7CC6x1y1E, "_ZN3ccc7CC6x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y1C1Ev();
extern void _ZN3ccc7CC6x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y1E[] = {
  NSPAIR(_ZN3ccc7CC6x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y1E[];
extern void _ZN3ccc7CC6x1y13abcEv();
extern void _ZN3ccc7CC6x1y13pqrEv();
extern void _ZN3ccc7CC6x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y13abcEv,_ZTv0_n12_N3ccc7CC6x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y13abcEv,_ZThn4_N3ccc7CC6x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y13efgEv,_ZTv0_n16_N3ccc7CC6x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y13efgEv,_ZThn4_N3ccc7CC6x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y13abcEv,_ZTv0_n12_N3ccc7CC6x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y13efgEv,_ZTv0_n16_N3ccc7CC6x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y1E[] = {
  {&(_ZTVN3ccc7CC6x1y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y1E[];
static VTBL_ENTRY alt_thunk_names370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y13efgEv,_ZTv0_n16_N3ccc7CC6x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y13efgEv,_ZThn4_N3ccc7CC6x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y13abcEv,_ZTv0_n12_N3ccc7CC6x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y13abcEv,_ZThn4_N3ccc7CC6x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y1E = {  "_ZN3ccc7CC6x1y1E", // class name
  bases__ZN3ccc7CC6x1y1E, 2,
  &(vtc__ZN3ccc7CC6x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y1E),2, //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  DD6x1y1  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD6x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x1y13efgEv
  ~DD6x1y1(); // tgen
  DD6x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y1E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y13abcEv");}
void  ccc::DD6x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y13pqrEv");}
void  ccc::DD6x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y13efgEv");}
ccc::DD6x1y1 ::~DD6x1y1(){ note_dtor("_ZN3ccc7DD6x1y1E", this);} // tgen
ccc::DD6x1y1 ::DD6x1y1(){ note_ctor("_ZN3ccc7DD6x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y1E, buf);
    ::ccc::DD6x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y1E);
    dp->::ccc::DD6x1y1::~DD6x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y1E(Test__ZN3ccc7DD6x1y1E, "_ZN3ccc7DD6x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y1C1Ev();
extern void _ZN3ccc7DD6x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y1E[] = {
  NSPAIR(_ZN3ccc7DD6x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y1E[];
extern void _ZN3ccc7DD6x1y13abcEv();
extern void _ZN3ccc7DD6x1y13efgEv();
extern void _ZN3ccc7DD6x1y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y13abcEv,_ZTv0_n12_N3ccc7DD6x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y13abcEv,_ZThn4_N3ccc7DD6x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y13pqrEv,_ZTv0_n16_N3ccc7DD6x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y13pqrEv,_ZThn4_N3ccc7DD6x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y13efgEv,_ZTv0_n20_N3ccc7DD6x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y13efgEv,_ZThn4_N3ccc7DD6x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y13abcEv,_ZTv0_n12_N3ccc7DD6x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y13pqrEv,_ZTv0_n16_N3ccc7DD6x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y13efgEv,_ZTv0_n20_N3ccc7DD6x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y1E[] = {
  {&(_ZTVN3ccc7DD6x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y1E[];
static VTBL_ENTRY alt_thunk_names371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y13efgEv,_ZTv0_n20_N3ccc7DD6x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y13efgEv,_ZThn4_N3ccc7DD6x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y13pqrEv,_ZTv0_n16_N3ccc7DD6x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y13pqrEv,_ZThn4_N3ccc7DD6x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y13abcEv,_ZTv0_n12_N3ccc7DD6x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y13abcEv,_ZThn4_N3ccc7DD6x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y1E = {  "_ZN3ccc7DD6x1y1E", // class name
  bases__ZN3ccc7DD6x1y1E, 2,
  &(vtc__ZN3ccc7DD6x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y1E),3, //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  CC6x1y2  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y23pqrEv
  ~CC6x1y2(); // tgen
  CC6x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y2E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y23efgEv");}
void  ccc::CC6x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y23abcEv");}
void  ccc::CC6x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y23pqrEv");}
ccc::CC6x1y2 ::~CC6x1y2(){ note_dtor("_ZN3ccc7CC6x1y2E", this);} // tgen
ccc::CC6x1y2 ::CC6x1y2(){ note_ctor("_ZN3ccc7CC6x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y2E, buf);
    ::ccc::CC6x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y2E);
    dp->::ccc::CC6x1y2::~CC6x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y2E(Test__ZN3ccc7CC6x1y2E, "_ZN3ccc7CC6x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y2C1Ev();
extern void _ZN3ccc7CC6x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y2E[] = {
  NSPAIR(_ZN3ccc7CC6x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y2E[];
extern void _ZN3ccc7CC6x1y23abcEv();
extern void _ZN3ccc7CC6x1y23pqrEv();
extern void _ZN3ccc7CC6x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y23abcEv,_ZTv0_n12_N3ccc7CC6x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y23abcEv,_ZThn4_N3ccc7CC6x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y23efgEv,_ZTv0_n16_N3ccc7CC6x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y23efgEv,_ZThn4_N3ccc7CC6x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y23abcEv,_ZTv0_n12_N3ccc7CC6x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y23efgEv,_ZTv0_n16_N3ccc7CC6x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y2E[] = {
  {&(_ZTVN3ccc7CC6x1y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y2E[];
static VTBL_ENTRY alt_thunk_names372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y23efgEv,_ZTv0_n16_N3ccc7CC6x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y23efgEv,_ZThn4_N3ccc7CC6x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y23abcEv,_ZTv0_n12_N3ccc7CC6x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y23abcEv,_ZThn4_N3ccc7CC6x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y2E = {  "_ZN3ccc7CC6x1y2E", // class name
  bases__ZN3ccc7CC6x1y2E, 2,
  &(vtc__ZN3ccc7CC6x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y2E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names372,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x1y2  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD6x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x1y23pqrEv
  ~DD6x1y2(); // tgen
  DD6x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y2E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y23efgEv");}
void  ccc::DD6x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y23abcEv");}
void  ccc::DD6x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y23pqrEv");}
ccc::DD6x1y2 ::~DD6x1y2(){ note_dtor("_ZN3ccc7DD6x1y2E", this);} // tgen
ccc::DD6x1y2 ::DD6x1y2(){ note_ctor("_ZN3ccc7DD6x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y2E, buf);
    ::ccc::DD6x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y2E);
    dp->::ccc::DD6x1y2::~DD6x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y2E(Test__ZN3ccc7DD6x1y2E, "_ZN3ccc7DD6x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y2C1Ev();
extern void _ZN3ccc7DD6x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y2E[] = {
  NSPAIR(_ZN3ccc7DD6x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y2E[];
extern void _ZN3ccc7DD6x1y23abcEv();
extern void _ZN3ccc7DD6x1y23efgEv();
extern void _ZN3ccc7DD6x1y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y23abcEv,_ZTv0_n12_N3ccc7DD6x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y23abcEv,_ZThn4_N3ccc7DD6x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y23pqrEv,_ZTv0_n16_N3ccc7DD6x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y23pqrEv,_ZThn4_N3ccc7DD6x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y23efgEv,_ZTv0_n20_N3ccc7DD6x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y23efgEv,_ZThn4_N3ccc7DD6x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y23abcEv,_ZTv0_n12_N3ccc7DD6x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y23pqrEv,_ZTv0_n16_N3ccc7DD6x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y23efgEv,_ZTv0_n20_N3ccc7DD6x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y2E[] = {
  {&(_ZTVN3ccc7DD6x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y2E[];
static VTBL_ENTRY alt_thunk_names373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y23efgEv,_ZTv0_n20_N3ccc7DD6x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y23efgEv,_ZThn4_N3ccc7DD6x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y23pqrEv,_ZTv0_n16_N3ccc7DD6x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y23pqrEv,_ZThn4_N3ccc7DD6x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y23abcEv,_ZTv0_n12_N3ccc7DD6x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y23abcEv,_ZThn4_N3ccc7DD6x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y2E = {  "_ZN3ccc7DD6x1y2E", // class name
  bases__ZN3ccc7DD6x1y2E, 2,
  &(vtc__ZN3ccc7DD6x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y2E),3, //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  CC6x1y3  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x1y33abcEv
  ~CC6x1y3(); // tgen
  CC6x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y3E) C1{ VBC2{ v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y33efgEv");}
void  ccc::CC6x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y33pqrEv");}
void  ccc::CC6x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y33abcEv");}
ccc::CC6x1y3 ::~CC6x1y3(){ note_dtor("_ZN3ccc7CC6x1y3E", this);} // tgen
ccc::CC6x1y3 ::CC6x1y3(){ note_ctor("_ZN3ccc7CC6x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y3E, buf);
    ::ccc::CC6x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y3E);
    dp->::ccc::CC6x1y3::~CC6x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y3E(Test__ZN3ccc7CC6x1y3E, "_ZN3ccc7CC6x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y3C1Ev();
extern void _ZN3ccc7CC6x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y3E[] = {
  NSPAIR(_ZN3ccc7CC6x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y3E[];
extern void _ZN3ccc7CC6x1y33abcEv();
extern void _ZN3ccc7CC6x1y33pqrEv();
extern void _ZN3ccc7CC6x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y33abcEv,_ZTv0_n12_N3ccc7CC6x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y33abcEv,_ZThn4_N3ccc7CC6x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y33efgEv,_ZTv0_n16_N3ccc7CC6x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y33efgEv,_ZThn4_N3ccc7CC6x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y33abcEv,_ZTv0_n12_N3ccc7CC6x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y33efgEv,_ZTv0_n16_N3ccc7CC6x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y3E[] = {
  {&(_ZTVN3ccc7CC6x1y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y3E[];
static VTBL_ENTRY alt_thunk_names374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y33efgEv,_ZTv0_n16_N3ccc7CC6x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y33efgEv,_ZThn4_N3ccc7CC6x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y33abcEv,_ZTv0_n12_N3ccc7CC6x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y33abcEv,_ZThn4_N3ccc7CC6x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y3E = {  "_ZN3ccc7CC6x1y3E", // class name
  bases__ZN3ccc7CC6x1y3E, 2,
  &(vtc__ZN3ccc7CC6x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y3E),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  DD6x1y3  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD6x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x1y33abcEv
  ~DD6x1y3(); // tgen
  DD6x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y3E) C1{ VBC2{ v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y33efgEv");}
void  ccc::DD6x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y33pqrEv");}
void  ccc::DD6x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y33abcEv");}
ccc::DD6x1y3 ::~DD6x1y3(){ note_dtor("_ZN3ccc7DD6x1y3E", this);} // tgen
ccc::DD6x1y3 ::DD6x1y3(){ note_ctor("_ZN3ccc7DD6x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y3E, buf);
    ::ccc::DD6x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y3E);
    dp->::ccc::DD6x1y3::~DD6x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y3E(Test__ZN3ccc7DD6x1y3E, "_ZN3ccc7DD6x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y3C1Ev();
extern void _ZN3ccc7DD6x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y3E[] = {
  NSPAIR(_ZN3ccc7DD6x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y3E[];
extern void _ZN3ccc7DD6x1y33abcEv();
extern void _ZN3ccc7DD6x1y33efgEv();
extern void _ZN3ccc7DD6x1y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y33abcEv,_ZTv0_n12_N3ccc7DD6x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y33abcEv,_ZThn4_N3ccc7DD6x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y33pqrEv,_ZTv0_n16_N3ccc7DD6x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y33pqrEv,_ZThn4_N3ccc7DD6x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y33efgEv,_ZTv0_n20_N3ccc7DD6x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y33efgEv,_ZThn4_N3ccc7DD6x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y33abcEv,_ZTv0_n12_N3ccc7DD6x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y33pqrEv,_ZTv0_n16_N3ccc7DD6x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y33efgEv,_ZTv0_n20_N3ccc7DD6x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y3E[] = {
  {&(_ZTVN3ccc7DD6x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y3E[];
static VTBL_ENTRY alt_thunk_names375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y33efgEv,_ZTv0_n20_N3ccc7DD6x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y33efgEv,_ZThn4_N3ccc7DD6x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y33pqrEv,_ZTv0_n16_N3ccc7DD6x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y33pqrEv,_ZThn4_N3ccc7DD6x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y33abcEv,_ZTv0_n12_N3ccc7DD6x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y33abcEv,_ZThn4_N3ccc7DD6x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y3E = {  "_ZN3ccc7DD6x1y3E", // class name
  bases__ZN3ccc7DD6x1y3E, 2,
  &(vtc__ZN3ccc7DD6x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y3E),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  CC6x1y4  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC6x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x1y43efgEv
  ~CC6x1y4(); // tgen
  CC6x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y4E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y43pqrEv");}
void  ccc::CC6x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y43abcEv");}
void  ccc::CC6x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y43efgEv");}
ccc::CC6x1y4 ::~CC6x1y4(){ note_dtor("_ZN3ccc7CC6x1y4E", this);} // tgen
ccc::CC6x1y4 ::CC6x1y4(){ note_ctor("_ZN3ccc7CC6x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y4E, buf);
    ::ccc::CC6x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y4E);
    dp->::ccc::CC6x1y4::~CC6x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y4E(Test__ZN3ccc7CC6x1y4E, "_ZN3ccc7CC6x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y4C1Ev();
extern void _ZN3ccc7CC6x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y4E[] = {
  NSPAIR(_ZN3ccc7CC6x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y4E[];
extern void _ZN3ccc7CC6x1y43abcEv();
extern void _ZN3ccc7CC6x1y43pqrEv();
extern void _ZN3ccc7CC6x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y43abcEv,_ZTv0_n12_N3ccc7CC6x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y43abcEv,_ZThn4_N3ccc7CC6x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y43efgEv,_ZTv0_n16_N3ccc7CC6x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y43efgEv,_ZThn4_N3ccc7CC6x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y43abcEv,_ZTv0_n12_N3ccc7CC6x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y43efgEv,_ZTv0_n16_N3ccc7CC6x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y4E[] = {
  {&(_ZTVN3ccc7CC6x1y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y4E[];
static VTBL_ENTRY alt_thunk_names376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y43efgEv,_ZTv0_n16_N3ccc7CC6x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y43efgEv,_ZThn4_N3ccc7CC6x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y43abcEv,_ZTv0_n12_N3ccc7CC6x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y43abcEv,_ZThn4_N3ccc7CC6x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y4E = {  "_ZN3ccc7CC6x1y4E", // class name
  bases__ZN3ccc7CC6x1y4E, 2,
  &(vtc__ZN3ccc7CC6x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y4E),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  DD6x1y4  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD6x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x1y43efgEv
  ~DD6x1y4(); // tgen
  DD6x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y4E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y43pqrEv");}
void  ccc::DD6x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y43abcEv");}
void  ccc::DD6x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y43efgEv");}
ccc::DD6x1y4 ::~DD6x1y4(){ note_dtor("_ZN3ccc7DD6x1y4E", this);} // tgen
ccc::DD6x1y4 ::DD6x1y4(){ note_ctor("_ZN3ccc7DD6x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y4E, buf);
    ::ccc::DD6x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y4E);
    dp->::ccc::DD6x1y4::~DD6x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y4E(Test__ZN3ccc7DD6x1y4E, "_ZN3ccc7DD6x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y4C1Ev();
extern void _ZN3ccc7DD6x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y4E[] = {
  NSPAIR(_ZN3ccc7DD6x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y4E[];
extern void _ZN3ccc7DD6x1y43abcEv();
extern void _ZN3ccc7DD6x1y43efgEv();
extern void _ZN3ccc7DD6x1y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y43abcEv,_ZTv0_n12_N3ccc7DD6x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y43abcEv,_ZThn4_N3ccc7DD6x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y43pqrEv,_ZTv0_n16_N3ccc7DD6x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y43pqrEv,_ZThn4_N3ccc7DD6x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y43efgEv,_ZTv0_n20_N3ccc7DD6x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y43efgEv,_ZThn4_N3ccc7DD6x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y43abcEv,_ZTv0_n12_N3ccc7DD6x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y43pqrEv,_ZTv0_n16_N3ccc7DD6x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y43efgEv,_ZTv0_n20_N3ccc7DD6x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y4E[] = {
  {&(_ZTVN3ccc7DD6x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y4E[];
static VTBL_ENTRY alt_thunk_names377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y43efgEv,_ZTv0_n20_N3ccc7DD6x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y43efgEv,_ZThn4_N3ccc7DD6x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y43pqrEv,_ZTv0_n16_N3ccc7DD6x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y43pqrEv,_ZThn4_N3ccc7DD6x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y43abcEv,_ZTv0_n12_N3ccc7DD6x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y43abcEv,_ZThn4_N3ccc7DD6x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y4E = {  "_ZN3ccc7DD6x1y4E", // class name
  bases__ZN3ccc7DD6x1y4E, 2,
  &(vtc__ZN3ccc7DD6x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y4E),3, //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  CC6x1y5  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC6x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x1y53abcEv
  ~CC6x1y5(); // tgen
  CC6x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y5E) C1{ VBC2{ v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y53pqrEv");}
void  ccc::CC6x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y53efgEv");}
void  ccc::CC6x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y53abcEv");}
ccc::CC6x1y5 ::~CC6x1y5(){ note_dtor("_ZN3ccc7CC6x1y5E", this);} // tgen
ccc::CC6x1y5 ::CC6x1y5(){ note_ctor("_ZN3ccc7CC6x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y5E, buf);
    ::ccc::CC6x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y5E);
    dp->::ccc::CC6x1y5::~CC6x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y5E(Test__ZN3ccc7CC6x1y5E, "_ZN3ccc7CC6x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y5C1Ev();
extern void _ZN3ccc7CC6x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y5E[] = {
  NSPAIR(_ZN3ccc7CC6x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y5E[];
extern void _ZN3ccc7CC6x1y53abcEv();
extern void _ZN3ccc7CC6x1y53pqrEv();
extern void _ZN3ccc7CC6x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y53abcEv,_ZTv0_n12_N3ccc7CC6x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y53abcEv,_ZThn4_N3ccc7CC6x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y53efgEv,_ZTv0_n16_N3ccc7CC6x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y53efgEv,_ZThn4_N3ccc7CC6x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y53abcEv,_ZTv0_n12_N3ccc7CC6x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y53efgEv,_ZTv0_n16_N3ccc7CC6x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y5E[] = {
  {&(_ZTVN3ccc7CC6x1y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y5E[];
static VTBL_ENTRY alt_thunk_names378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y53efgEv,_ZTv0_n16_N3ccc7CC6x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y53efgEv,_ZThn4_N3ccc7CC6x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y53abcEv,_ZTv0_n12_N3ccc7CC6x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y53abcEv,_ZThn4_N3ccc7CC6x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y5E = {  "_ZN3ccc7CC6x1y5E", // class name
  bases__ZN3ccc7CC6x1y5E, 2,
  &(vtc__ZN3ccc7CC6x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y5E),2, //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  DD6x1y5  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD6x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x1y53abcEv
  ~DD6x1y5(); // tgen
  DD6x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y5E) C1{ VBC2{ v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y53pqrEv");}
void  ccc::DD6x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y53efgEv");}
void  ccc::DD6x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y53abcEv");}
ccc::DD6x1y5 ::~DD6x1y5(){ note_dtor("_ZN3ccc7DD6x1y5E", this);} // tgen
ccc::DD6x1y5 ::DD6x1y5(){ note_ctor("_ZN3ccc7DD6x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y5E, buf);
    ::ccc::DD6x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y5E);
    dp->::ccc::DD6x1y5::~DD6x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y5E(Test__ZN3ccc7DD6x1y5E, "_ZN3ccc7DD6x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y5C1Ev();
extern void _ZN3ccc7DD6x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y5E[] = {
  NSPAIR(_ZN3ccc7DD6x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y5E[];
extern void _ZN3ccc7DD6x1y53abcEv();
extern void _ZN3ccc7DD6x1y53efgEv();
extern void _ZN3ccc7DD6x1y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y53abcEv,_ZTv0_n12_N3ccc7DD6x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y53abcEv,_ZThn4_N3ccc7DD6x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y53pqrEv,_ZTv0_n16_N3ccc7DD6x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y53pqrEv,_ZThn4_N3ccc7DD6x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y53efgEv,_ZTv0_n20_N3ccc7DD6x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y53efgEv,_ZThn4_N3ccc7DD6x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y53abcEv,_ZTv0_n12_N3ccc7DD6x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y53pqrEv,_ZTv0_n16_N3ccc7DD6x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y53efgEv,_ZTv0_n20_N3ccc7DD6x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y5E[] = {
  {&(_ZTVN3ccc7DD6x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y5E[];
static VTBL_ENTRY alt_thunk_names379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y53efgEv,_ZTv0_n20_N3ccc7DD6x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y53efgEv,_ZThn4_N3ccc7DD6x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y53pqrEv,_ZTv0_n16_N3ccc7DD6x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y53pqrEv,_ZThn4_N3ccc7DD6x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y53abcEv,_ZTv0_n12_N3ccc7DD6x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y53abcEv,_ZThn4_N3ccc7DD6x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y5E = {  "_ZN3ccc7DD6x1y5E", // class name
  bases__ZN3ccc7DD6x1y5E, 2,
  &(vtc__ZN3ccc7DD6x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y5E),3, //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  CC6x1y6  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x1y63efgEv
  ~CC6x1y6(); // tgen
  CC6x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y6E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y63abcEv");}
void  ccc::CC6x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y63efgEv");}
ccc::CC6x1y6 ::~CC6x1y6(){ note_dtor("_ZN3ccc7CC6x1y6E", this);} // tgen
ccc::CC6x1y6 ::CC6x1y6(){ note_ctor("_ZN3ccc7CC6x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y6E, buf);
    ::ccc::CC6x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y6E);
    dp->::ccc::CC6x1y6::~CC6x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y6E(Test__ZN3ccc7CC6x1y6E, "_ZN3ccc7CC6x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y6C1Ev();
extern void _ZN3ccc7CC6x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y6E[] = {
  NSPAIR(_ZN3ccc7CC6x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y6E[];
extern void _ZN3ccc7CC6x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC6x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y63abcEv,_ZTv0_n12_N3ccc7CC6x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y63abcEv,_ZThn4_N3ccc7CC6x1y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y63efgEv,_ZTv0_n16_N3ccc7CC6x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y63efgEv,_ZThn4_N3ccc7CC6x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y63abcEv,_ZTv0_n12_N3ccc7CC6x1y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y63efgEv,_ZTv0_n16_N3ccc7CC6x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y6E[] = {
  {&(_ZTVN3ccc7CC6x1y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y6E[];
static VTBL_ENTRY alt_thunk_names380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y63efgEv,_ZTv0_n16_N3ccc7CC6x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y63efgEv,_ZThn4_N3ccc7CC6x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y63abcEv,_ZTv0_n12_N3ccc7CC6x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y63abcEv,_ZThn4_N3ccc7CC6x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y6E = {  "_ZN3ccc7CC6x1y6E", // class name
  bases__ZN3ccc7CC6x1y6E, 2,
  &(vtc__ZN3ccc7CC6x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y6E),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  DD6x1y6  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD6x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x1y63efgEv
  ~DD6x1y6(); // tgen
  DD6x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y6E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y63abcEv");}
void  ccc::DD6x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y63efgEv");}
ccc::DD6x1y6 ::~DD6x1y6(){ note_dtor("_ZN3ccc7DD6x1y6E", this);} // tgen
ccc::DD6x1y6 ::DD6x1y6(){ note_ctor("_ZN3ccc7DD6x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y6E, buf);
    ::ccc::DD6x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y6E);
    dp->::ccc::DD6x1y6::~DD6x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y6E(Test__ZN3ccc7DD6x1y6E, "_ZN3ccc7DD6x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y6C1Ev();
extern void _ZN3ccc7DD6x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y6E[] = {
  NSPAIR(_ZN3ccc7DD6x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y6E[];
extern void _ZN3ccc7DD6x1y63abcEv();
extern void _ZN3ccc7DD6x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y63abcEv,_ZTv0_n12_N3ccc7DD6x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y63abcEv,_ZThn4_N3ccc7DD6x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y63efgEv,_ZTv0_n20_N3ccc7DD6x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y63efgEv,_ZThn4_N3ccc7DD6x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y63abcEv,_ZTv0_n12_N3ccc7DD6x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y63efgEv,_ZTv0_n20_N3ccc7DD6x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y6E[] = {
  {&(_ZTVN3ccc7DD6x1y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x1y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x1y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y6E[];
static VTBL_ENTRY alt_thunk_names381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y63efgEv,_ZTv0_n20_N3ccc7DD6x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y63efgEv,_ZThn4_N3ccc7DD6x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y63abcEv,_ZTv0_n12_N3ccc7DD6x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y63abcEv,_ZThn4_N3ccc7DD6x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y6E = {  "_ZN3ccc7DD6x1y6E", // class name
  bases__ZN3ccc7DD6x1y6E, 2,
  &(vtc__ZN3ccc7DD6x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y6E),3, //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  CC6x1y7  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC6x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y73pqrEv
  ~CC6x1y7(); // tgen
  CC6x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y7E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y73abcEv");}
void  ccc::CC6x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y73pqrEv");}
ccc::CC6x1y7 ::~CC6x1y7(){ note_dtor("_ZN3ccc7CC6x1y7E", this);} // tgen
ccc::CC6x1y7 ::CC6x1y7(){ note_ctor("_ZN3ccc7CC6x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y7E, buf);
    ::ccc::CC6x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y7E);
    dp->::ccc::CC6x1y7::~CC6x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y7E(Test__ZN3ccc7CC6x1y7E, "_ZN3ccc7CC6x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y7C1Ev();
extern void _ZN3ccc7CC6x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y7E[] = {
  NSPAIR(_ZN3ccc7CC6x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y7E[];
extern void _ZN3ccc7CC6x1y73abcEv();
extern void _ZN3ccc7CC6x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y73abcEv,_ZTv0_n12_N3ccc7CC6x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y73abcEv,_ZThn4_N3ccc7CC6x1y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y73abcEv,_ZTv0_n12_N3ccc7CC6x1y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y7E[] = {
  {&(_ZTVN3ccc7CC6x1y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y7E[];
static VTBL_ENTRY alt_thunk_names382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y73abcEv,_ZTv0_n12_N3ccc7CC6x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y73abcEv,_ZThn4_N3ccc7CC6x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y7E = {  "_ZN3ccc7CC6x1y7E", // class name
  bases__ZN3ccc7CC6x1y7E, 2,
  &(vtc__ZN3ccc7CC6x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y7E),2, //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  DD6x1y7  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD6x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x1y73pqrEv
  ~DD6x1y7(); // tgen
  DD6x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y7E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y73abcEv");}
void  ccc::DD6x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y73pqrEv");}
ccc::DD6x1y7 ::~DD6x1y7(){ note_dtor("_ZN3ccc7DD6x1y7E", this);} // tgen
ccc::DD6x1y7 ::DD6x1y7(){ note_ctor("_ZN3ccc7DD6x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y7E, buf);
    ::ccc::DD6x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y7E);
    dp->::ccc::DD6x1y7::~DD6x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y7E(Test__ZN3ccc7DD6x1y7E, "_ZN3ccc7DD6x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y7C1Ev();
extern void _ZN3ccc7DD6x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y7E[] = {
  NSPAIR(_ZN3ccc7DD6x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y7E[];
extern void _ZN3ccc7DD6x1y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x1y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y73abcEv,_ZTv0_n12_N3ccc7DD6x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y73abcEv,_ZThn4_N3ccc7DD6x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y73pqrEv,_ZTv0_n16_N3ccc7DD6x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y73pqrEv,_ZThn4_N3ccc7DD6x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y73abcEv,_ZTv0_n12_N3ccc7DD6x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y73pqrEv,_ZTv0_n16_N3ccc7DD6x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y7E[] = {
  {&(_ZTVN3ccc7DD6x1y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y7E[];
static VTBL_ENTRY alt_thunk_names383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y73pqrEv,_ZTv0_n16_N3ccc7DD6x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y73pqrEv,_ZThn4_N3ccc7DD6x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y73abcEv,_ZTv0_n12_N3ccc7DD6x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y73abcEv,_ZThn4_N3ccc7DD6x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y7E = {  "_ZN3ccc7DD6x1y7E", // class name
  bases__ZN3ccc7DD6x1y7E, 2,
  &(vtc__ZN3ccc7DD6x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y7E),3, //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  CC6x1y8  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x1y83abcEv
  ~CC6x1y8(); // tgen
  CC6x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y8E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y83efgEv");}
void  ccc::CC6x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x1y83abcEv");}
ccc::CC6x1y8 ::~CC6x1y8(){ note_dtor("_ZN3ccc7CC6x1y8E", this);} // tgen
ccc::CC6x1y8 ::CC6x1y8(){ note_ctor("_ZN3ccc7CC6x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y8E, buf);
    ::ccc::CC6x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y8E);
    dp->::ccc::CC6x1y8::~CC6x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y8E(Test__ZN3ccc7CC6x1y8E, "_ZN3ccc7CC6x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y8C1Ev();
extern void _ZN3ccc7CC6x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y8E[] = {
  NSPAIR(_ZN3ccc7CC6x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y8E[];
extern void _ZN3ccc7CC6x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC6x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x1y83abcEv,_ZTv0_n12_N3ccc7CC6x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y83abcEv,_ZThn4_N3ccc7CC6x1y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y83efgEv,_ZTv0_n16_N3ccc7CC6x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y83efgEv,_ZThn4_N3ccc7CC6x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x1y83abcEv,_ZTv0_n12_N3ccc7CC6x1y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y83efgEv,_ZTv0_n16_N3ccc7CC6x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y8E[] = {
  {&(_ZTVN3ccc7CC6x1y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y8E[];
static VTBL_ENTRY alt_thunk_names384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y83efgEv,_ZTv0_n16_N3ccc7CC6x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y83efgEv,_ZThn4_N3ccc7CC6x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x1y83abcEv,_ZTv0_n12_N3ccc7CC6x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y83abcEv,_ZThn4_N3ccc7CC6x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y8E = {  "_ZN3ccc7CC6x1y8E", // class name
  bases__ZN3ccc7CC6x1y8E, 2,
  &(vtc__ZN3ccc7CC6x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y8E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names384,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x1y8  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD6x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x1y83abcEv
  ~DD6x1y8(); // tgen
  DD6x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y8E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y83efgEv");}
void  ccc::DD6x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x1y83abcEv");}
ccc::DD6x1y8 ::~DD6x1y8(){ note_dtor("_ZN3ccc7DD6x1y8E", this);} // tgen
ccc::DD6x1y8 ::DD6x1y8(){ note_ctor("_ZN3ccc7DD6x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y8E, buf);
    ::ccc::DD6x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y8E);
    dp->::ccc::DD6x1y8::~DD6x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y8E(Test__ZN3ccc7DD6x1y8E, "_ZN3ccc7DD6x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y8C1Ev();
extern void _ZN3ccc7DD6x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y8E[] = {
  NSPAIR(_ZN3ccc7DD6x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y8E[];
extern void _ZN3ccc7DD6x1y83abcEv();
extern void _ZN3ccc7DD6x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x1y83abcEv,_ZTv0_n12_N3ccc7DD6x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y83abcEv,_ZThn4_N3ccc7DD6x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y83efgEv,_ZTv0_n20_N3ccc7DD6x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y83efgEv,_ZThn4_N3ccc7DD6x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x1y83abcEv,_ZTv0_n12_N3ccc7DD6x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y83efgEv,_ZTv0_n20_N3ccc7DD6x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y8E[] = {
  {&(_ZTVN3ccc7DD6x1y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x1y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x1y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y8E[];
static VTBL_ENTRY alt_thunk_names385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y83efgEv,_ZTv0_n20_N3ccc7DD6x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y83efgEv,_ZThn4_N3ccc7DD6x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x1y83abcEv,_ZTv0_n12_N3ccc7DD6x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y83abcEv,_ZThn4_N3ccc7DD6x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y8E = {  "_ZN3ccc7DD6x1y8E", // class name
  bases__ZN3ccc7DD6x1y8E, 2,
  &(vtc__ZN3ccc7DD6x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y8E),3, //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  CC6x1y9  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC6x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x1y93pqrEv
  ~CC6x1y9(); // tgen
  CC6x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x1y9E) C1{ VBC2{ v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x1y93efgEv");}
void  ccc::CC6x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x1y93pqrEv");}
ccc::CC6x1y9 ::~CC6x1y9(){ note_dtor("_ZN3ccc7CC6x1y9E", this);} // tgen
ccc::CC6x1y9 ::CC6x1y9(){ note_ctor("_ZN3ccc7CC6x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x1y9E, buf);
    ::ccc::CC6x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x1y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC6x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x1y9E);
    dp->::ccc::CC6x1y9::~CC6x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x1y9E(Test__ZN3ccc7CC6x1y9E, "_ZN3ccc7CC6x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x1y9C1Ev();
extern void _ZN3ccc7CC6x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x1y9E[] = {
  NSPAIR(_ZN3ccc7CC6x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC6x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC6x1y93pqrEv();
extern void _ZN3ccc7CC6x1y93efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x1y93efgEv,_ZTv0_n16_N3ccc7CC6x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x1y93efgEv,_ZThn4_N3ccc7CC6x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x1y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x1y93efgEv,_ZTv0_n16_N3ccc7CC6x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x1y9E[] = {
  {&(_ZTVN3ccc7CC6x1y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x1y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x1y9E[];
static VTBL_ENTRY alt_thunk_names386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x1y93efgEv,_ZTv0_n16_N3ccc7CC6x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x1y93efgEv,_ZThn4_N3ccc7CC6x1y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x1y9E = {  "_ZN3ccc7CC6x1y9E", // class name
  bases__ZN3ccc7CC6x1y9E, 2,
  &(vtc__ZN3ccc7CC6x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x1y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x1y9E),2, //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  DD6x1y9  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD6x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x1y93pqrEv
  ~DD6x1y9(); // tgen
  DD6x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x1y9E) C1{ VBC2{ v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x1y93efgEv");}
void  ccc::DD6x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x1y93pqrEv");}
ccc::DD6x1y9 ::~DD6x1y9(){ note_dtor("_ZN3ccc7DD6x1y9E", this);} // tgen
ccc::DD6x1y9 ::DD6x1y9(){ note_ctor("_ZN3ccc7DD6x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x1y9E, buf);
    ::ccc::DD6x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x1y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD6x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x1y9E);
    dp->::ccc::DD6x1y9::~DD6x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x1y9E(Test__ZN3ccc7DD6x1y9E, "_ZN3ccc7DD6x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x1y9C1Ev();
extern void _ZN3ccc7DD6x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x1y9E[] = {
  NSPAIR(_ZN3ccc7DD6x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD6x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x1y93efgEv();
extern void _ZN3ccc7DD6x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x1y93pqrEv,_ZTv0_n16_N3ccc7DD6x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y93pqrEv,_ZThn4_N3ccc7DD6x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x1y93efgEv,_ZTv0_n20_N3ccc7DD6x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x1y93efgEv,_ZThn4_N3ccc7DD6x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x1y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x1y93pqrEv,_ZTv0_n16_N3ccc7DD6x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x1y93efgEv,_ZTv0_n20_N3ccc7DD6x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x1y9E[] = {
  {&(_ZTVN3ccc7DD6x1y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x1y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x1y9E[];
static VTBL_ENTRY alt_thunk_names387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x1y93efgEv,_ZTv0_n20_N3ccc7DD6x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y93efgEv,_ZThn4_N3ccc7DD6x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x1y93pqrEv,_ZTv0_n16_N3ccc7DD6x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x1y93pqrEv,_ZThn4_N3ccc7DD6x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x1y9E = {  "_ZN3ccc7DD6x1y9E", // class name
  bases__ZN3ccc7DD6x1y9E, 2,
  &(vtc__ZN3ccc7DD6x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x1y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x1y9E),3, //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  CC6x1y10  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC6x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x1y103abcEv
  ~CC6x1y10(); // tgen
  CC6x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y10E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x1y103pqrEv");}
void  ccc::CC6x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x1y103abcEv");}
ccc::CC6x1y10 ::~CC6x1y10(){ note_dtor("_ZN3ccc8CC6x1y10E", this);} // tgen
ccc::CC6x1y10 ::CC6x1y10(){ note_ctor("_ZN3ccc8CC6x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x1y10E, buf);
    ::ccc::CC6x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x1y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC6x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x1y10E);
    dp->::ccc::CC6x1y10::~CC6x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x1y10E(Test__ZN3ccc8CC6x1y10E, "_ZN3ccc8CC6x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x1y10C1Ev();
extern void _ZN3ccc8CC6x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x1y10E[] = {
  NSPAIR(_ZN3ccc8CC6x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC6x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x1y10E[];
extern void _ZN3ccc8CC6x1y103abcEv();
extern void _ZN3ccc8CC6x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x1y103abcEv,_ZTv0_n12_N3ccc8CC6x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y103abcEv,_ZThn4_N3ccc8CC6x1y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x1y103abcEv,_ZTv0_n12_N3ccc8CC6x1y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x1y10E[] = {
  {&(_ZTVN3ccc8CC6x1y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x1y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x1y10E[];
static VTBL_ENTRY alt_thunk_names388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x1y103abcEv,_ZTv0_n12_N3ccc8CC6x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x1y103abcEv,_ZThn4_N3ccc8CC6x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x1y10E = {  "_ZN3ccc8CC6x1y10E", // class name
  bases__ZN3ccc8CC6x1y10E, 2,
  &(vtc__ZN3ccc8CC6x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x1y10E),2, //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  DD6x1y10  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD6x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x1y103abcEv
  ~DD6x1y10(); // tgen
  DD6x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x1y10E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x1y103pqrEv");}
void  ccc::DD6x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x1y103abcEv");}
ccc::DD6x1y10 ::~DD6x1y10(){ note_dtor("_ZN3ccc8DD6x1y10E", this);} // tgen
ccc::DD6x1y10 ::DD6x1y10(){ note_ctor("_ZN3ccc8DD6x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x1y10E, buf);
    ::ccc::DD6x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x1y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD6x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x1y10E);
    dp->::ccc::DD6x1y10::~DD6x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x1y10E(Test__ZN3ccc8DD6x1y10E, "_ZN3ccc8DD6x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x1y10C1Ev();
extern void _ZN3ccc8DD6x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x1y10E[] = {
  NSPAIR(_ZN3ccc8DD6x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD6x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y10E[];
extern void _ZN3ccc8DD6x1y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x1y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x1y103abcEv,_ZTv0_n12_N3ccc8DD6x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y103abcEv,_ZThn4_N3ccc8DD6x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x1y103pqrEv,_ZTv0_n16_N3ccc8DD6x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y103pqrEv,_ZThn4_N3ccc8DD6x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x1y103abcEv,_ZTv0_n12_N3ccc8DD6x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x1y103pqrEv,_ZTv0_n16_N3ccc8DD6x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x1y10E[] = {
  {&(_ZTVN3ccc8DD6x1y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x1y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x1y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x1y10E[];
static VTBL_ENTRY alt_thunk_names389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x1y103pqrEv,_ZTv0_n16_N3ccc8DD6x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y103pqrEv,_ZThn4_N3ccc8DD6x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x1y103abcEv,_ZTv0_n12_N3ccc8DD6x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y103abcEv,_ZThn4_N3ccc8DD6x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x1y10E = {  "_ZN3ccc8DD6x1y10E", // class name
  bases__ZN3ccc8DD6x1y10E, 2,
  &(vtc__ZN3ccc8DD6x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x1y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x1y10E),3, //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  CC6x1y11  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC6x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x1y113efgEv
  ~CC6x1y11(); // tgen
  CC6x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y11E) C1{ VBC2{ v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x1y113pqrEv");}
void  ccc::CC6x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x1y113efgEv");}
ccc::CC6x1y11 ::~CC6x1y11(){ note_dtor("_ZN3ccc8CC6x1y11E", this);} // tgen
ccc::CC6x1y11 ::CC6x1y11(){ note_ctor("_ZN3ccc8CC6x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x1y11E, buf);
    ::ccc::CC6x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x1y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC6x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x1y11E);
    dp->::ccc::CC6x1y11::~CC6x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x1y11E(Test__ZN3ccc8CC6x1y11E, "_ZN3ccc8CC6x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x1y11C1Ev();
extern void _ZN3ccc8CC6x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x1y11E[] = {
  NSPAIR(_ZN3ccc8CC6x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC6x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC6x1y113pqrEv();
extern void _ZN3ccc8CC6x1y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x1y113efgEv,_ZTv0_n16_N3ccc8CC6x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y113efgEv,_ZThn4_N3ccc8CC6x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x1y113efgEv,_ZTv0_n16_N3ccc8CC6x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x1y11E[] = {
  {&(_ZTVN3ccc8CC6x1y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x1y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x1y11E[];
static VTBL_ENTRY alt_thunk_names390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x1y113efgEv,_ZTv0_n16_N3ccc8CC6x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x1y113efgEv,_ZThn4_N3ccc8CC6x1y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x1y11E = {  "_ZN3ccc8CC6x1y11E", // class name
  bases__ZN3ccc8CC6x1y11E, 2,
  &(vtc__ZN3ccc8CC6x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x1y11E),2, //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  DD6x1y11  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD6x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x1y113efgEv
  ~DD6x1y11(); // tgen
  DD6x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x1y11E) C1{ VBC2{ v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x1y113pqrEv");}
void  ccc::DD6x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x1y113efgEv");}
ccc::DD6x1y11 ::~DD6x1y11(){ note_dtor("_ZN3ccc8DD6x1y11E", this);} // tgen
ccc::DD6x1y11 ::DD6x1y11(){ note_ctor("_ZN3ccc8DD6x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x1y11E, buf);
    ::ccc::DD6x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x1y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD6x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x1y11E);
    dp->::ccc::DD6x1y11::~DD6x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x1y11E(Test__ZN3ccc8DD6x1y11E, "_ZN3ccc8DD6x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x1y11C1Ev();
extern void _ZN3ccc8DD6x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x1y11E[] = {
  NSPAIR(_ZN3ccc8DD6x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD6x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x1y113efgEv();
extern void _ZN3ccc8DD6x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x1y113pqrEv,_ZTv0_n16_N3ccc8DD6x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y113pqrEv,_ZThn4_N3ccc8DD6x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x1y113efgEv,_ZTv0_n20_N3ccc8DD6x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y113efgEv,_ZThn4_N3ccc8DD6x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x1y113pqrEv,_ZTv0_n16_N3ccc8DD6x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x1y113efgEv,_ZTv0_n20_N3ccc8DD6x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x1y11E[] = {
  {&(_ZTVN3ccc8DD6x1y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x1y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x1y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x1y11E[];
static VTBL_ENTRY alt_thunk_names391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x1y113efgEv,_ZTv0_n20_N3ccc8DD6x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y113efgEv,_ZThn4_N3ccc8DD6x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x1y113pqrEv,_ZTv0_n16_N3ccc8DD6x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y113pqrEv,_ZThn4_N3ccc8DD6x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x1y11E = {  "_ZN3ccc8DD6x1y11E", // class name
  bases__ZN3ccc8DD6x1y11E, 2,
  &(vtc__ZN3ccc8DD6x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x1y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x1y11E),3, //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  CC6x1y12  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC6x1y123abcEv
  ~CC6x1y12(); // tgen
  CC6x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x1y123abcEv");}
ccc::CC6x1y12 ::~CC6x1y12(){ note_dtor("_ZN3ccc8CC6x1y12E", this);} // tgen
ccc::CC6x1y12 ::CC6x1y12(){ note_ctor("_ZN3ccc8CC6x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x1y12E, buf);
    ::ccc::CC6x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x1y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC6x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x1y12E);
    dp->::ccc::CC6x1y12::~CC6x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x1y12E(Test__ZN3ccc8CC6x1y12E, "_ZN3ccc8CC6x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x1y12C1Ev();
extern void _ZN3ccc8CC6x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x1y12E[] = {
  NSPAIR(_ZN3ccc8CC6x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC6x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x1y12E[];
extern void _ZN3ccc8CC6x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x1y123abcEv,_ZTv0_n12_N3ccc8CC6x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y123abcEv,_ZThn4_N3ccc8CC6x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x1y123abcEv,_ZTv0_n12_N3ccc8CC6x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x1y12E[] = {
  {&(_ZTVN3ccc8CC6x1y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x1y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x1y12E[];
static VTBL_ENTRY alt_thunk_names392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x1y123abcEv,_ZTv0_n12_N3ccc8CC6x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x1y123abcEv,_ZThn4_N3ccc8CC6x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x1y12E = {  "_ZN3ccc8CC6x1y12E", // class name
  bases__ZN3ccc8CC6x1y12E, 2,
  &(vtc__ZN3ccc8CC6x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x1y12E),2, //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  DD6x1y12  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD6x1y123abcEv
  ~DD6x1y12(); // tgen
  DD6x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x1y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x1y123abcEv");}
ccc::DD6x1y12 ::~DD6x1y12(){ note_dtor("_ZN3ccc8DD6x1y12E", this);} // tgen
ccc::DD6x1y12 ::DD6x1y12(){ note_ctor("_ZN3ccc8DD6x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x1y12E, buf);
    ::ccc::DD6x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x1y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD6x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x1y12E);
    dp->::ccc::DD6x1y12::~DD6x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x1y12E(Test__ZN3ccc8DD6x1y12E, "_ZN3ccc8DD6x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x1y12C1Ev();
extern void _ZN3ccc8DD6x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x1y12E[] = {
  NSPAIR(_ZN3ccc8DD6x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD6x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y12E[];
extern void _ZN3ccc8DD6x1y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x1y123abcEv,_ZTv0_n12_N3ccc8DD6x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y123abcEv,_ZThn4_N3ccc8DD6x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x1y123abcEv,_ZTv0_n12_N3ccc8DD6x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x1y12E[] = {
  {&(_ZTVN3ccc8DD6x1y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x1y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x1y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x1y12E[];
static VTBL_ENTRY alt_thunk_names393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x1y123abcEv,_ZTv0_n12_N3ccc8DD6x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y123abcEv,_ZThn4_N3ccc8DD6x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x1y12E = {  "_ZN3ccc8DD6x1y12E", // class name
  bases__ZN3ccc8DD6x1y12E, 2,
  &(vtc__ZN3ccc8DD6x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x1y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x1y12E),3, //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  CC6x1y13  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC6x1y133efgEv
  ~CC6x1y13(); // tgen
  CC6x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y13E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC6x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x1y133efgEv");}
ccc::CC6x1y13 ::~CC6x1y13(){ note_dtor("_ZN3ccc8CC6x1y13E", this);} // tgen
ccc::CC6x1y13 ::CC6x1y13(){ note_ctor("_ZN3ccc8CC6x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x1y13E, buf);
    ::ccc::CC6x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x1y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC6x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x1y13E);
    dp->::ccc::CC6x1y13::~CC6x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x1y13E(Test__ZN3ccc8CC6x1y13E, "_ZN3ccc8CC6x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x1y13C1Ev();
extern void _ZN3ccc8CC6x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x1y13E[] = {
  NSPAIR(_ZN3ccc8CC6x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC6x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC6x1y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x1y133efgEv,_ZTv0_n16_N3ccc8CC6x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x1y133efgEv,_ZThn4_N3ccc8CC6x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x1y133efgEv,_ZTv0_n16_N3ccc8CC6x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x1y13E[] = {
  {&(_ZTVN3ccc8CC6x1y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x1y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x1y13E[];
static VTBL_ENTRY alt_thunk_names394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x1y133efgEv,_ZTv0_n16_N3ccc8CC6x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x1y133efgEv,_ZThn4_N3ccc8CC6x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x1y13E = {  "_ZN3ccc8CC6x1y13E", // class name
  bases__ZN3ccc8CC6x1y13E, 2,
  &(vtc__ZN3ccc8CC6x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x1y13E),2, //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  DD6x1y13  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD6x1y133efgEv
  ~DD6x1y13(); // tgen
  DD6x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x1y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD6x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x1y133efgEv");}
ccc::DD6x1y13 ::~DD6x1y13(){ note_dtor("_ZN3ccc8DD6x1y13E", this);} // tgen
ccc::DD6x1y13 ::DD6x1y13(){ note_ctor("_ZN3ccc8DD6x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x1y13E, buf);
    ::ccc::DD6x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x1y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD6x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x1y13E);
    dp->::ccc::DD6x1y13::~DD6x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x1y13E(Test__ZN3ccc8DD6x1y13E, "_ZN3ccc8DD6x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x1y13C1Ev();
extern void _ZN3ccc8DD6x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x1y13E[] = {
  NSPAIR(_ZN3ccc8DD6x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD6x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x1y133efgEv,_ZTv0_n20_N3ccc8DD6x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y133efgEv,_ZThn4_N3ccc8DD6x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x1y133efgEv,_ZTv0_n20_N3ccc8DD6x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x1y13E[] = {
  {&(_ZTVN3ccc8DD6x1y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x1y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x1y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x1y13E[];
static VTBL_ENTRY alt_thunk_names395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x1y133efgEv,_ZTv0_n20_N3ccc8DD6x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y133efgEv,_ZThn4_N3ccc8DD6x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x1y13E = {  "_ZN3ccc8DD6x1y13E", // class name
  bases__ZN3ccc8DD6x1y13E, 2,
  &(vtc__ZN3ccc8DD6x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x1y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x1y13E),3, //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  CC6x1y14  : virtual ::ccc::AA6 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC6x1y143pqrEv
  ~CC6x1y14(); // tgen
  CC6x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC6x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x1y143pqrEv");}
ccc::CC6x1y14 ::~CC6x1y14(){ note_dtor("_ZN3ccc8CC6x1y14E", this);} // tgen
ccc::CC6x1y14 ::CC6x1y14(){ note_ctor("_ZN3ccc8CC6x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x1y14E, buf);
    ::ccc::CC6x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x1y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC6x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x1y14E);
    dp->::ccc::CC6x1y14::~CC6x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x1y14E(Test__ZN3ccc8CC6x1y14E, "_ZN3ccc8CC6x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x1y14C1Ev();
extern void _ZN3ccc8CC6x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x1y14E[] = {
  NSPAIR(_ZN3ccc8CC6x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC6x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC6x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x1y14E[] = {
  {&(_ZTVN3ccc8CC6x1y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x1y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x1y14E[];
Class_Descriptor cd__ZN3ccc8CC6x1y14E = {  "_ZN3ccc8CC6x1y14E", // class name
  bases__ZN3ccc8CC6x1y14E, 2,
  &(vtc__ZN3ccc8CC6x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x1y14E),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  DD6x1y14  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD6x1y143pqrEv
  ~DD6x1y14(); // tgen
  DD6x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x1y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD6x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x1y143pqrEv");}
ccc::DD6x1y14 ::~DD6x1y14(){ note_dtor("_ZN3ccc8DD6x1y14E", this);} // tgen
ccc::DD6x1y14 ::DD6x1y14(){ note_ctor("_ZN3ccc8DD6x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x1y14E, buf);
    ::ccc::DD6x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x1y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD6x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x1y14E);
    dp->::ccc::DD6x1y14::~DD6x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x1y14E(Test__ZN3ccc8DD6x1y14E, "_ZN3ccc8DD6x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x1y14C1Ev();
extern void _ZN3ccc8DD6x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x1y14E[] = {
  NSPAIR(_ZN3ccc8DD6x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD6x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x1y143pqrEv,_ZTv0_n16_N3ccc8DD6x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x1y143pqrEv,_ZThn4_N3ccc8DD6x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x1y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x1y143pqrEv,_ZTv0_n16_N3ccc8DD6x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x1y14E[] = {
  {&(_ZTVN3ccc8DD6x1y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x1y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x1y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x1y14E[];
static VTBL_ENTRY alt_thunk_names396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x1y143pqrEv,_ZTv0_n16_N3ccc8DD6x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x1y143pqrEv,_ZThn4_N3ccc8DD6x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x1y14E = {  "_ZN3ccc8DD6x1y14E", // class name
  bases__ZN3ccc8DD6x1y14E, 2,
  &(vtc__ZN3ccc8DD6x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x1y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x1y14E),3, //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  CC6x1y15  : virtual ::ccc::AA6 , ::ccc::BB1 {
  ~CC6x1y15(); // tgen
  CC6x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x1y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC6x1y15 ::~CC6x1y15(){ note_dtor("_ZN3ccc8CC6x1y15E", this);} // tgen
ccc::CC6x1y15 ::CC6x1y15(){ note_ctor("_ZN3ccc8CC6x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x1y15E, buf);
    ::ccc::CC6x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x1y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC6x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x1y15E);
    dp->::ccc::CC6x1y15::~CC6x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x1y15E(Test__ZN3ccc8CC6x1y15E, "_ZN3ccc8CC6x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x1y15C1Ev();
extern void _ZN3ccc8CC6x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x1y15E[] = {
  NSPAIR(_ZN3ccc8CC6x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC6x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x1y15E[] = {
  {&(_ZTVN3ccc8CC6x1y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x1y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x1y15E[];
Class_Descriptor cd__ZN3ccc8CC6x1y15E = {  "_ZN3ccc8CC6x1y15E", // class name
  bases__ZN3ccc8CC6x1y15E, 2,
  &(vtc__ZN3ccc8CC6x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x1y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x1y15E),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  DD6x1y15  : virtual ::ccc::AA6 , virtual ::ccc::BB1 {
  ~DD6x1y15(); // tgen
  DD6x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x1y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD6x1y15 ::~DD6x1y15(){ note_dtor("_ZN3ccc8DD6x1y15E", this);} // tgen
ccc::DD6x1y15 ::DD6x1y15(){ note_ctor("_ZN3ccc8DD6x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x1y15E, buf);
    ::ccc::DD6x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x1y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD6x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x1y15E);
    dp->::ccc::DD6x1y15::~DD6x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x1y15E(Test__ZN3ccc8DD6x1y15E, "_ZN3ccc8DD6x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x1y15C1Ev();
extern void _ZN3ccc8DD6x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x1y15E[] = {
  NSPAIR(_ZN3ccc8DD6x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD6x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x1y15E[] = {
  {&(_ZTVN3ccc8DD6x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x1y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x1y15E[];
Class_Descriptor cd__ZN3ccc8DD6x1y15E = {  "_ZN3ccc8DD6x1y15E", // class name
  bases__ZN3ccc8DD6x1y15E, 2,
  &(vtc__ZN3ccc8DD6x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x1y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x1y15E),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  CC6x2y0  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y03pqrEv
  ~CC6x2y0(); // tgen
  CC6x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y0E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y03abcEv");}
void  ccc::CC6x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y03efgEv");}
void  ccc::CC6x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y03pqrEv");}
ccc::CC6x2y0 ::~CC6x2y0(){ note_dtor("_ZN3ccc7CC6x2y0E", this);} // tgen
ccc::CC6x2y0 ::CC6x2y0(){ note_ctor("_ZN3ccc7CC6x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y0E, buf);
    ::ccc::CC6x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y0E);
    dp->::ccc::CC6x2y0::~CC6x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y0E(Test__ZN3ccc7CC6x2y0E, "_ZN3ccc7CC6x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y0C1Ev();
extern void _ZN3ccc7CC6x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y0E[] = {
  NSPAIR(_ZN3ccc7CC6x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y0E[];
extern void _ZN3ccc7CC6x2y03efgEv();
extern void _ZN3ccc7CC6x2y03abcEv();
extern void _ZN3ccc7CC6x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y03abcEv,_ZTv0_n12_N3ccc7CC6x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y03abcEv,_ZThn4_N3ccc7CC6x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y03efgEv,_ZTv0_n16_N3ccc7CC6x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y03efgEv,_ZThn4_N3ccc7CC6x2y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y03abcEv,_ZTv0_n12_N3ccc7CC6x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y03efgEv,_ZTv0_n16_N3ccc7CC6x2y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y0E[] = {
  {&(_ZTVN3ccc7CC6x2y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y0E[];
static VTBL_ENTRY alt_thunk_names397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y03efgEv,_ZTv0_n16_N3ccc7CC6x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y03efgEv,_ZThn4_N3ccc7CC6x2y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y03abcEv,_ZTv0_n12_N3ccc7CC6x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y03abcEv,_ZThn4_N3ccc7CC6x2y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y0E = {  "_ZN3ccc7CC6x2y0E", // class name
  bases__ZN3ccc7CC6x2y0E, 2,
  &(vtc__ZN3ccc7CC6x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y0E),2, //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  DD6x2y0  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD6x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x2y03pqrEv
  ~DD6x2y0(); // tgen
  DD6x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y0E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y03abcEv");}
void  ccc::DD6x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y03efgEv");}
void  ccc::DD6x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y03pqrEv");}
ccc::DD6x2y0 ::~DD6x2y0(){ note_dtor("_ZN3ccc7DD6x2y0E", this);} // tgen
ccc::DD6x2y0 ::DD6x2y0(){ note_ctor("_ZN3ccc7DD6x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y0E, buf);
    ::ccc::DD6x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y0E);
    dp->::ccc::DD6x2y0::~DD6x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y0E(Test__ZN3ccc7DD6x2y0E, "_ZN3ccc7DD6x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y0C1Ev();
extern void _ZN3ccc7DD6x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y0E[] = {
  NSPAIR(_ZN3ccc7DD6x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y0E[];
extern void _ZN3ccc7DD6x2y03abcEv();
extern void _ZN3ccc7DD6x2y03efgEv();
extern void _ZN3ccc7DD6x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y03efgEv,_ZTv0_n12_N3ccc7DD6x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y03efgEv,_ZThn4_N3ccc7DD6x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y03abcEv,_ZTv0_n16_N3ccc7DD6x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y03abcEv,_ZThn4_N3ccc7DD6x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y03pqrEv,_ZTv0_n20_N3ccc7DD6x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y03pqrEv,_ZThn4_N3ccc7DD6x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y03efgEv,_ZTv0_n12_N3ccc7DD6x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y03abcEv,_ZTv0_n16_N3ccc7DD6x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y03pqrEv,_ZTv0_n20_N3ccc7DD6x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y0E[] = {
  {&(_ZTVN3ccc7DD6x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y0E[];
static VTBL_ENTRY alt_thunk_names398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y03pqrEv,_ZTv0_n20_N3ccc7DD6x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y03pqrEv,_ZThn4_N3ccc7DD6x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y03abcEv,_ZTv0_n16_N3ccc7DD6x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y03abcEv,_ZThn4_N3ccc7DD6x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y03efgEv,_ZTv0_n12_N3ccc7DD6x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y03efgEv,_ZThn4_N3ccc7DD6x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y0E = {  "_ZN3ccc7DD6x2y0E", // class name
  bases__ZN3ccc7DD6x2y0E, 2,
  &(vtc__ZN3ccc7DD6x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y0E),3, //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  CC6x2y1  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x2y13efgEv
  ~CC6x2y1(); // tgen
  CC6x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y1E) C1{ VBC2{ v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y13abcEv");}
void  ccc::CC6x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y13pqrEv");}
void  ccc::CC6x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y13efgEv");}
ccc::CC6x2y1 ::~CC6x2y1(){ note_dtor("_ZN3ccc7CC6x2y1E", this);} // tgen
ccc::CC6x2y1 ::CC6x2y1(){ note_ctor("_ZN3ccc7CC6x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y1E, buf);
    ::ccc::CC6x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y1E);
    dp->::ccc::CC6x2y1::~CC6x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y1E(Test__ZN3ccc7CC6x2y1E, "_ZN3ccc7CC6x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y1C1Ev();
extern void _ZN3ccc7CC6x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y1E[] = {
  NSPAIR(_ZN3ccc7CC6x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y1E[];
extern void _ZN3ccc7CC6x2y13efgEv();
extern void _ZN3ccc7CC6x2y13abcEv();
extern void _ZN3ccc7CC6x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y13abcEv,_ZTv0_n12_N3ccc7CC6x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y13abcEv,_ZThn4_N3ccc7CC6x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y13efgEv,_ZTv0_n16_N3ccc7CC6x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y13efgEv,_ZThn4_N3ccc7CC6x2y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y13abcEv,_ZTv0_n12_N3ccc7CC6x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y13efgEv,_ZTv0_n16_N3ccc7CC6x2y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y1E[] = {
  {&(_ZTVN3ccc7CC6x2y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y1E[];
static VTBL_ENTRY alt_thunk_names399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y13efgEv,_ZTv0_n16_N3ccc7CC6x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y13efgEv,_ZThn4_N3ccc7CC6x2y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y13abcEv,_ZTv0_n12_N3ccc7CC6x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y13abcEv,_ZThn4_N3ccc7CC6x2y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y1E = {  "_ZN3ccc7CC6x2y1E", // class name
  bases__ZN3ccc7CC6x2y1E, 2,
  &(vtc__ZN3ccc7CC6x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y1E),2, //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  DD6x2y1  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD6x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x2y13efgEv
  ~DD6x2y1(); // tgen
  DD6x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y1E) C1{ VBC2{ v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y13abcEv");}
void  ccc::DD6x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y13pqrEv");}
void  ccc::DD6x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y13efgEv");}
ccc::DD6x2y1 ::~DD6x2y1(){ note_dtor("_ZN3ccc7DD6x2y1E", this);} // tgen
ccc::DD6x2y1 ::DD6x2y1(){ note_ctor("_ZN3ccc7DD6x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y1E, buf);
    ::ccc::DD6x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y1E);
    dp->::ccc::DD6x2y1::~DD6x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y1E(Test__ZN3ccc7DD6x2y1E, "_ZN3ccc7DD6x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y1C1Ev();
extern void _ZN3ccc7DD6x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y1E[] = {
  NSPAIR(_ZN3ccc7DD6x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y1E[];
extern void _ZN3ccc7DD6x2y13abcEv();
extern void _ZN3ccc7DD6x2y13efgEv();
extern void _ZN3ccc7DD6x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y13efgEv,_ZTv0_n12_N3ccc7DD6x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y13efgEv,_ZThn4_N3ccc7DD6x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y13abcEv,_ZTv0_n16_N3ccc7DD6x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y13abcEv,_ZThn4_N3ccc7DD6x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y13pqrEv,_ZTv0_n20_N3ccc7DD6x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y13pqrEv,_ZThn4_N3ccc7DD6x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y13efgEv,_ZTv0_n12_N3ccc7DD6x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y13abcEv,_ZTv0_n16_N3ccc7DD6x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y13pqrEv,_ZTv0_n20_N3ccc7DD6x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y1E[] = {
  {&(_ZTVN3ccc7DD6x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y1E[];
static VTBL_ENTRY alt_thunk_names400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y13pqrEv,_ZTv0_n20_N3ccc7DD6x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y13pqrEv,_ZThn4_N3ccc7DD6x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y13abcEv,_ZTv0_n16_N3ccc7DD6x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y13abcEv,_ZThn4_N3ccc7DD6x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y13efgEv,_ZTv0_n12_N3ccc7DD6x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y13efgEv,_ZThn4_N3ccc7DD6x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y1E = {  "_ZN3ccc7DD6x2y1E", // class name
  bases__ZN3ccc7DD6x2y1E, 2,
  &(vtc__ZN3ccc7DD6x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y1E),3, //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  CC6x2y2  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y23pqrEv
  ~CC6x2y2(); // tgen
  CC6x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y2E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y23efgEv");}
void  ccc::CC6x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y23abcEv");}
void  ccc::CC6x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y23pqrEv");}
ccc::CC6x2y2 ::~CC6x2y2(){ note_dtor("_ZN3ccc7CC6x2y2E", this);} // tgen
ccc::CC6x2y2 ::CC6x2y2(){ note_ctor("_ZN3ccc7CC6x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y2E, buf);
    ::ccc::CC6x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y2E);
    dp->::ccc::CC6x2y2::~CC6x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y2E(Test__ZN3ccc7CC6x2y2E, "_ZN3ccc7CC6x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y2C1Ev();
extern void _ZN3ccc7CC6x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y2E[] = {
  NSPAIR(_ZN3ccc7CC6x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y2E[];
extern void _ZN3ccc7CC6x2y23efgEv();
extern void _ZN3ccc7CC6x2y23abcEv();
extern void _ZN3ccc7CC6x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y23abcEv,_ZTv0_n12_N3ccc7CC6x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y23abcEv,_ZThn4_N3ccc7CC6x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y23efgEv,_ZTv0_n16_N3ccc7CC6x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y23efgEv,_ZThn4_N3ccc7CC6x2y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y23abcEv,_ZTv0_n12_N3ccc7CC6x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y23efgEv,_ZTv0_n16_N3ccc7CC6x2y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y2E[] = {
  {&(_ZTVN3ccc7CC6x2y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y2E[];
static VTBL_ENTRY alt_thunk_names401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y23efgEv,_ZTv0_n16_N3ccc7CC6x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y23efgEv,_ZThn4_N3ccc7CC6x2y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y23abcEv,_ZTv0_n12_N3ccc7CC6x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y23abcEv,_ZThn4_N3ccc7CC6x2y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y2E = {  "_ZN3ccc7CC6x2y2E", // class name
  bases__ZN3ccc7CC6x2y2E, 2,
  &(vtc__ZN3ccc7CC6x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y2E),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  DD6x2y2  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD6x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x2y23pqrEv
  ~DD6x2y2(); // tgen
  DD6x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y2E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y23efgEv");}
void  ccc::DD6x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y23abcEv");}
void  ccc::DD6x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y23pqrEv");}
ccc::DD6x2y2 ::~DD6x2y2(){ note_dtor("_ZN3ccc7DD6x2y2E", this);} // tgen
ccc::DD6x2y2 ::DD6x2y2(){ note_ctor("_ZN3ccc7DD6x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y2E, buf);
    ::ccc::DD6x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y2E);
    dp->::ccc::DD6x2y2::~DD6x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y2E(Test__ZN3ccc7DD6x2y2E, "_ZN3ccc7DD6x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y2C1Ev();
extern void _ZN3ccc7DD6x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y2E[] = {
  NSPAIR(_ZN3ccc7DD6x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y2E[];
extern void _ZN3ccc7DD6x2y23abcEv();
extern void _ZN3ccc7DD6x2y23efgEv();
extern void _ZN3ccc7DD6x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y23efgEv,_ZTv0_n12_N3ccc7DD6x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y23efgEv,_ZThn4_N3ccc7DD6x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y23abcEv,_ZTv0_n16_N3ccc7DD6x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y23abcEv,_ZThn4_N3ccc7DD6x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y23pqrEv,_ZTv0_n20_N3ccc7DD6x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y23pqrEv,_ZThn4_N3ccc7DD6x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y23efgEv,_ZTv0_n12_N3ccc7DD6x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y23abcEv,_ZTv0_n16_N3ccc7DD6x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y23pqrEv,_ZTv0_n20_N3ccc7DD6x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y2E[] = {
  {&(_ZTVN3ccc7DD6x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y2E[];
static VTBL_ENTRY alt_thunk_names402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y23pqrEv,_ZTv0_n20_N3ccc7DD6x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y23pqrEv,_ZThn4_N3ccc7DD6x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y23abcEv,_ZTv0_n16_N3ccc7DD6x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y23abcEv,_ZThn4_N3ccc7DD6x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y23efgEv,_ZTv0_n12_N3ccc7DD6x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y23efgEv,_ZThn4_N3ccc7DD6x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y2E = {  "_ZN3ccc7DD6x2y2E", // class name
  bases__ZN3ccc7DD6x2y2E, 2,
  &(vtc__ZN3ccc7DD6x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y2E),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  CC6x2y3  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x2y33abcEv
  ~CC6x2y3(); // tgen
  CC6x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y3E) C1{ VBC2{ v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y33efgEv");}
void  ccc::CC6x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y33pqrEv");}
void  ccc::CC6x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y33abcEv");}
ccc::CC6x2y3 ::~CC6x2y3(){ note_dtor("_ZN3ccc7CC6x2y3E", this);} // tgen
ccc::CC6x2y3 ::CC6x2y3(){ note_ctor("_ZN3ccc7CC6x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y3E, buf);
    ::ccc::CC6x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y3E);
    dp->::ccc::CC6x2y3::~CC6x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y3E(Test__ZN3ccc7CC6x2y3E, "_ZN3ccc7CC6x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y3C1Ev();
extern void _ZN3ccc7CC6x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y3E[] = {
  NSPAIR(_ZN3ccc7CC6x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y3E[];
extern void _ZN3ccc7CC6x2y33efgEv();
extern void _ZN3ccc7CC6x2y33abcEv();
extern void _ZN3ccc7CC6x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y33abcEv,_ZTv0_n12_N3ccc7CC6x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y33abcEv,_ZThn4_N3ccc7CC6x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y33efgEv,_ZTv0_n16_N3ccc7CC6x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y33efgEv,_ZThn4_N3ccc7CC6x2y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y33abcEv,_ZTv0_n12_N3ccc7CC6x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y33efgEv,_ZTv0_n16_N3ccc7CC6x2y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y3E[] = {
  {&(_ZTVN3ccc7CC6x2y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y3E[];
static VTBL_ENTRY alt_thunk_names403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y33efgEv,_ZTv0_n16_N3ccc7CC6x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y33efgEv,_ZThn4_N3ccc7CC6x2y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y33abcEv,_ZTv0_n12_N3ccc7CC6x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y33abcEv,_ZThn4_N3ccc7CC6x2y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y3E = {  "_ZN3ccc7CC6x2y3E", // class name
  bases__ZN3ccc7CC6x2y3E, 2,
  &(vtc__ZN3ccc7CC6x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y3E),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  DD6x2y3  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD6x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x2y33abcEv
  ~DD6x2y3(); // tgen
  DD6x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y3E) C1{ VBC2{ v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y33efgEv");}
void  ccc::DD6x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y33pqrEv");}
void  ccc::DD6x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y33abcEv");}
ccc::DD6x2y3 ::~DD6x2y3(){ note_dtor("_ZN3ccc7DD6x2y3E", this);} // tgen
ccc::DD6x2y3 ::DD6x2y3(){ note_ctor("_ZN3ccc7DD6x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y3E, buf);
    ::ccc::DD6x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y3E);
    dp->::ccc::DD6x2y3::~DD6x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y3E(Test__ZN3ccc7DD6x2y3E, "_ZN3ccc7DD6x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y3C1Ev();
extern void _ZN3ccc7DD6x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y3E[] = {
  NSPAIR(_ZN3ccc7DD6x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y3E[];
extern void _ZN3ccc7DD6x2y33abcEv();
extern void _ZN3ccc7DD6x2y33efgEv();
extern void _ZN3ccc7DD6x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y33efgEv,_ZTv0_n12_N3ccc7DD6x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y33efgEv,_ZThn4_N3ccc7DD6x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y33abcEv,_ZTv0_n16_N3ccc7DD6x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y33abcEv,_ZThn4_N3ccc7DD6x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y33pqrEv,_ZTv0_n20_N3ccc7DD6x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y33pqrEv,_ZThn4_N3ccc7DD6x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y33efgEv,_ZTv0_n12_N3ccc7DD6x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y33abcEv,_ZTv0_n16_N3ccc7DD6x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y33pqrEv,_ZTv0_n20_N3ccc7DD6x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y3E[] = {
  {&(_ZTVN3ccc7DD6x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y3E[];
static VTBL_ENTRY alt_thunk_names404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y33pqrEv,_ZTv0_n20_N3ccc7DD6x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y33pqrEv,_ZThn4_N3ccc7DD6x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y33abcEv,_ZTv0_n16_N3ccc7DD6x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y33abcEv,_ZThn4_N3ccc7DD6x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y33efgEv,_ZTv0_n12_N3ccc7DD6x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y33efgEv,_ZThn4_N3ccc7DD6x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y3E = {  "_ZN3ccc7DD6x2y3E", // class name
  bases__ZN3ccc7DD6x2y3E, 2,
  &(vtc__ZN3ccc7DD6x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y3E),3, //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  CC6x2y4  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC6x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x2y43efgEv
  ~CC6x2y4(); // tgen
  CC6x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y4E) C1{ VBC2{ v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y43pqrEv");}
void  ccc::CC6x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y43abcEv");}
void  ccc::CC6x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y43efgEv");}
ccc::CC6x2y4 ::~CC6x2y4(){ note_dtor("_ZN3ccc7CC6x2y4E", this);} // tgen
ccc::CC6x2y4 ::CC6x2y4(){ note_ctor("_ZN3ccc7CC6x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y4E, buf);
    ::ccc::CC6x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y4E);
    dp->::ccc::CC6x2y4::~CC6x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y4E(Test__ZN3ccc7CC6x2y4E, "_ZN3ccc7CC6x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y4C1Ev();
extern void _ZN3ccc7CC6x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y4E[] = {
  NSPAIR(_ZN3ccc7CC6x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y4E[];
extern void _ZN3ccc7CC6x2y43efgEv();
extern void _ZN3ccc7CC6x2y43abcEv();
extern void _ZN3ccc7CC6x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y43abcEv,_ZTv0_n12_N3ccc7CC6x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y43abcEv,_ZThn4_N3ccc7CC6x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y43efgEv,_ZTv0_n16_N3ccc7CC6x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y43efgEv,_ZThn4_N3ccc7CC6x2y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y43abcEv,_ZTv0_n12_N3ccc7CC6x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y43efgEv,_ZTv0_n16_N3ccc7CC6x2y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y4E[] = {
  {&(_ZTVN3ccc7CC6x2y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y4E[];
static VTBL_ENTRY alt_thunk_names405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y43efgEv,_ZTv0_n16_N3ccc7CC6x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y43efgEv,_ZThn4_N3ccc7CC6x2y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y43abcEv,_ZTv0_n12_N3ccc7CC6x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y43abcEv,_ZThn4_N3ccc7CC6x2y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y4E = {  "_ZN3ccc7CC6x2y4E", // class name
  bases__ZN3ccc7CC6x2y4E, 2,
  &(vtc__ZN3ccc7CC6x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y4E),2, //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  DD6x2y4  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD6x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x2y43efgEv
  ~DD6x2y4(); // tgen
  DD6x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y4E) C1{ VBC2{ v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y43pqrEv");}
void  ccc::DD6x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y43abcEv");}
void  ccc::DD6x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y43efgEv");}
ccc::DD6x2y4 ::~DD6x2y4(){ note_dtor("_ZN3ccc7DD6x2y4E", this);} // tgen
ccc::DD6x2y4 ::DD6x2y4(){ note_ctor("_ZN3ccc7DD6x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y4E, buf);
    ::ccc::DD6x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y4E);
    dp->::ccc::DD6x2y4::~DD6x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y4E(Test__ZN3ccc7DD6x2y4E, "_ZN3ccc7DD6x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y4C1Ev();
extern void _ZN3ccc7DD6x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y4E[] = {
  NSPAIR(_ZN3ccc7DD6x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y4E[];
extern void _ZN3ccc7DD6x2y43abcEv();
extern void _ZN3ccc7DD6x2y43efgEv();
extern void _ZN3ccc7DD6x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y43efgEv,_ZTv0_n12_N3ccc7DD6x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y43efgEv,_ZThn4_N3ccc7DD6x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y43abcEv,_ZTv0_n16_N3ccc7DD6x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y43abcEv,_ZThn4_N3ccc7DD6x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y43pqrEv,_ZTv0_n20_N3ccc7DD6x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y43pqrEv,_ZThn4_N3ccc7DD6x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y43efgEv,_ZTv0_n12_N3ccc7DD6x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y43abcEv,_ZTv0_n16_N3ccc7DD6x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y43pqrEv,_ZTv0_n20_N3ccc7DD6x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y4E[] = {
  {&(_ZTVN3ccc7DD6x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y4E[];
static VTBL_ENTRY alt_thunk_names406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y43pqrEv,_ZTv0_n20_N3ccc7DD6x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y43pqrEv,_ZThn4_N3ccc7DD6x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y43abcEv,_ZTv0_n16_N3ccc7DD6x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y43abcEv,_ZThn4_N3ccc7DD6x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y43efgEv,_ZTv0_n12_N3ccc7DD6x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y43efgEv,_ZThn4_N3ccc7DD6x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y4E = {  "_ZN3ccc7DD6x2y4E", // class name
  bases__ZN3ccc7DD6x2y4E, 2,
  &(vtc__ZN3ccc7DD6x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y4E),3, //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  CC6x2y5  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC6x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x2y53abcEv
  ~CC6x2y5(); // tgen
  CC6x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y5E) C1{ VBC2{ v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y53pqrEv");}
void  ccc::CC6x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y53efgEv");}
void  ccc::CC6x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y53abcEv");}
ccc::CC6x2y5 ::~CC6x2y5(){ note_dtor("_ZN3ccc7CC6x2y5E", this);} // tgen
ccc::CC6x2y5 ::CC6x2y5(){ note_ctor("_ZN3ccc7CC6x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y5E, buf);
    ::ccc::CC6x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y5E);
    dp->::ccc::CC6x2y5::~CC6x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y5E(Test__ZN3ccc7CC6x2y5E, "_ZN3ccc7CC6x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y5C1Ev();
extern void _ZN3ccc7CC6x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y5E[] = {
  NSPAIR(_ZN3ccc7CC6x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y5E[];
extern void _ZN3ccc7CC6x2y53efgEv();
extern void _ZN3ccc7CC6x2y53abcEv();
extern void _ZN3ccc7CC6x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y53abcEv,_ZTv0_n12_N3ccc7CC6x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y53abcEv,_ZThn4_N3ccc7CC6x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y53efgEv,_ZTv0_n16_N3ccc7CC6x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y53efgEv,_ZThn4_N3ccc7CC6x2y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y53abcEv,_ZTv0_n12_N3ccc7CC6x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y53efgEv,_ZTv0_n16_N3ccc7CC6x2y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y5E[] = {
  {&(_ZTVN3ccc7CC6x2y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y5E[];
static VTBL_ENTRY alt_thunk_names407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y53efgEv,_ZTv0_n16_N3ccc7CC6x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y53efgEv,_ZThn4_N3ccc7CC6x2y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y53abcEv,_ZTv0_n12_N3ccc7CC6x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y53abcEv,_ZThn4_N3ccc7CC6x2y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y5E = {  "_ZN3ccc7CC6x2y5E", // class name
  bases__ZN3ccc7CC6x2y5E, 2,
  &(vtc__ZN3ccc7CC6x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y5E),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  DD6x2y5  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD6x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x2y53abcEv
  ~DD6x2y5(); // tgen
  DD6x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y5E) C1{ VBC2{ v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y53pqrEv");}
void  ccc::DD6x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y53efgEv");}
void  ccc::DD6x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y53abcEv");}
ccc::DD6x2y5 ::~DD6x2y5(){ note_dtor("_ZN3ccc7DD6x2y5E", this);} // tgen
ccc::DD6x2y5 ::DD6x2y5(){ note_ctor("_ZN3ccc7DD6x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y5E, buf);
    ::ccc::DD6x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y5E);
    dp->::ccc::DD6x2y5::~DD6x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y5E(Test__ZN3ccc7DD6x2y5E, "_ZN3ccc7DD6x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y5C1Ev();
extern void _ZN3ccc7DD6x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y5E[] = {
  NSPAIR(_ZN3ccc7DD6x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y5E[];
extern void _ZN3ccc7DD6x2y53abcEv();
extern void _ZN3ccc7DD6x2y53efgEv();
extern void _ZN3ccc7DD6x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y53efgEv,_ZTv0_n12_N3ccc7DD6x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y53efgEv,_ZThn4_N3ccc7DD6x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y53abcEv,_ZTv0_n16_N3ccc7DD6x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y53abcEv,_ZThn4_N3ccc7DD6x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y53pqrEv,_ZTv0_n20_N3ccc7DD6x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y53pqrEv,_ZThn4_N3ccc7DD6x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y53efgEv,_ZTv0_n12_N3ccc7DD6x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y53abcEv,_ZTv0_n16_N3ccc7DD6x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y53pqrEv,_ZTv0_n20_N3ccc7DD6x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y5E[] = {
  {&(_ZTVN3ccc7DD6x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y5E[];
static VTBL_ENTRY alt_thunk_names408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y53pqrEv,_ZTv0_n20_N3ccc7DD6x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y53pqrEv,_ZThn4_N3ccc7DD6x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y53abcEv,_ZTv0_n16_N3ccc7DD6x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y53abcEv,_ZThn4_N3ccc7DD6x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y53efgEv,_ZTv0_n12_N3ccc7DD6x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y53efgEv,_ZThn4_N3ccc7DD6x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y5E = {  "_ZN3ccc7DD6x2y5E", // class name
  bases__ZN3ccc7DD6x2y5E, 2,
  &(vtc__ZN3ccc7DD6x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y5E),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  CC6x2y6  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x2y63efgEv
  ~CC6x2y6(); // tgen
  CC6x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y6E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y63abcEv");}
void  ccc::CC6x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y63efgEv");}
ccc::CC6x2y6 ::~CC6x2y6(){ note_dtor("_ZN3ccc7CC6x2y6E", this);} // tgen
ccc::CC6x2y6 ::CC6x2y6(){ note_ctor("_ZN3ccc7CC6x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y6E, buf);
    ::ccc::CC6x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y6E);
    dp->::ccc::CC6x2y6::~CC6x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y6E(Test__ZN3ccc7CC6x2y6E, "_ZN3ccc7CC6x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y6C1Ev();
extern void _ZN3ccc7CC6x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y6E[] = {
  NSPAIR(_ZN3ccc7CC6x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y6E[];
extern void _ZN3ccc7CC6x2y63efgEv();
extern void _ZN3ccc7CC6x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y63abcEv,_ZTv0_n12_N3ccc7CC6x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y63abcEv,_ZThn4_N3ccc7CC6x2y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y63efgEv,_ZTv0_n16_N3ccc7CC6x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y63efgEv,_ZThn4_N3ccc7CC6x2y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y63abcEv,_ZTv0_n12_N3ccc7CC6x2y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y63efgEv,_ZTv0_n16_N3ccc7CC6x2y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y6E[] = {
  {&(_ZTVN3ccc7CC6x2y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y6E[];
static VTBL_ENTRY alt_thunk_names409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y63efgEv,_ZTv0_n16_N3ccc7CC6x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y63efgEv,_ZThn4_N3ccc7CC6x2y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y63abcEv,_ZTv0_n12_N3ccc7CC6x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y63abcEv,_ZThn4_N3ccc7CC6x2y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y6E = {  "_ZN3ccc7CC6x2y6E", // class name
  bases__ZN3ccc7CC6x2y6E, 2,
  &(vtc__ZN3ccc7CC6x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y6E),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  DD6x2y6  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD6x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x2y63efgEv
  ~DD6x2y6(); // tgen
  DD6x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y6E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y63abcEv");}
void  ccc::DD6x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y63efgEv");}
ccc::DD6x2y6 ::~DD6x2y6(){ note_dtor("_ZN3ccc7DD6x2y6E", this);} // tgen
ccc::DD6x2y6 ::DD6x2y6(){ note_ctor("_ZN3ccc7DD6x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y6E, buf);
    ::ccc::DD6x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y6E);
    dp->::ccc::DD6x2y6::~DD6x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y6E(Test__ZN3ccc7DD6x2y6E, "_ZN3ccc7DD6x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y6C1Ev();
extern void _ZN3ccc7DD6x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y6E[] = {
  NSPAIR(_ZN3ccc7DD6x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y6E[];
extern void _ZN3ccc7DD6x2y63abcEv();
extern void _ZN3ccc7DD6x2y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y63efgEv,_ZTv0_n12_N3ccc7DD6x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y63efgEv,_ZThn4_N3ccc7DD6x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y63abcEv,_ZTv0_n16_N3ccc7DD6x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y63abcEv,_ZThn4_N3ccc7DD6x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y63efgEv,_ZTv0_n12_N3ccc7DD6x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y63abcEv,_ZTv0_n16_N3ccc7DD6x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y6E[] = {
  {&(_ZTVN3ccc7DD6x2y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x2y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x2y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y6E[];
static VTBL_ENTRY alt_thunk_names410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y63abcEv,_ZTv0_n16_N3ccc7DD6x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y63abcEv,_ZThn4_N3ccc7DD6x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y63efgEv,_ZTv0_n12_N3ccc7DD6x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y63efgEv,_ZThn4_N3ccc7DD6x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y6E = {  "_ZN3ccc7DD6x2y6E", // class name
  bases__ZN3ccc7DD6x2y6E, 2,
  &(vtc__ZN3ccc7DD6x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y6E),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  CC6x2y7  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC6x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y73pqrEv
  ~CC6x2y7(); // tgen
  CC6x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y7E) C1{ VBC2{ v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y73abcEv");}
void  ccc::CC6x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y73pqrEv");}
ccc::CC6x2y7 ::~CC6x2y7(){ note_dtor("_ZN3ccc7CC6x2y7E", this);} // tgen
ccc::CC6x2y7 ::CC6x2y7(){ note_ctor("_ZN3ccc7CC6x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y7E, buf);
    ::ccc::CC6x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y7E);
    dp->::ccc::CC6x2y7::~CC6x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y7E(Test__ZN3ccc7CC6x2y7E, "_ZN3ccc7CC6x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y7C1Ev();
extern void _ZN3ccc7CC6x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y7E[] = {
  NSPAIR(_ZN3ccc7CC6x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC6x2y73abcEv();
extern void _ZN3ccc7CC6x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y73abcEv,_ZTv0_n12_N3ccc7CC6x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y73abcEv,_ZThn4_N3ccc7CC6x2y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y73abcEv,_ZTv0_n12_N3ccc7CC6x2y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y7E[] = {
  {&(_ZTVN3ccc7CC6x2y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y7E[];
static VTBL_ENTRY alt_thunk_names411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y73abcEv,_ZTv0_n12_N3ccc7CC6x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y73abcEv,_ZThn4_N3ccc7CC6x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y7E = {  "_ZN3ccc7CC6x2y7E", // class name
  bases__ZN3ccc7CC6x2y7E, 2,
  &(vtc__ZN3ccc7CC6x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y7E),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  DD6x2y7  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD6x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x2y73pqrEv
  ~DD6x2y7(); // tgen
  DD6x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y7E) C1{ VBC2{ v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y73abcEv");}
void  ccc::DD6x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y73pqrEv");}
ccc::DD6x2y7 ::~DD6x2y7(){ note_dtor("_ZN3ccc7DD6x2y7E", this);} // tgen
ccc::DD6x2y7 ::DD6x2y7(){ note_ctor("_ZN3ccc7DD6x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y7E, buf);
    ::ccc::DD6x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y7E);
    dp->::ccc::DD6x2y7::~DD6x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y7E(Test__ZN3ccc7DD6x2y7E, "_ZN3ccc7DD6x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y7C1Ev();
extern void _ZN3ccc7DD6x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y7E[] = {
  NSPAIR(_ZN3ccc7DD6x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y7E[];
extern void _ZN3ccc7DD6x2y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y73abcEv,_ZTv0_n16_N3ccc7DD6x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y73abcEv,_ZThn4_N3ccc7DD6x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y73pqrEv,_ZTv0_n20_N3ccc7DD6x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y73pqrEv,_ZThn4_N3ccc7DD6x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y73abcEv,_ZTv0_n16_N3ccc7DD6x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y73pqrEv,_ZTv0_n20_N3ccc7DD6x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y7E[] = {
  {&(_ZTVN3ccc7DD6x2y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y7E[];
static VTBL_ENTRY alt_thunk_names412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y73pqrEv,_ZTv0_n20_N3ccc7DD6x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y73pqrEv,_ZThn4_N3ccc7DD6x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y73abcEv,_ZTv0_n16_N3ccc7DD6x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y73abcEv,_ZThn4_N3ccc7DD6x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y7E = {  "_ZN3ccc7DD6x2y7E", // class name
  bases__ZN3ccc7DD6x2y7E, 2,
  &(vtc__ZN3ccc7DD6x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y7E),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  CC6x2y8  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x2y83abcEv
  ~CC6x2y8(); // tgen
  CC6x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y8E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y83efgEv");}
void  ccc::CC6x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x2y83abcEv");}
ccc::CC6x2y8 ::~CC6x2y8(){ note_dtor("_ZN3ccc7CC6x2y8E", this);} // tgen
ccc::CC6x2y8 ::CC6x2y8(){ note_ctor("_ZN3ccc7CC6x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y8E, buf);
    ::ccc::CC6x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y8E);
    dp->::ccc::CC6x2y8::~CC6x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y8E(Test__ZN3ccc7CC6x2y8E, "_ZN3ccc7CC6x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y8C1Ev();
extern void _ZN3ccc7CC6x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y8E[] = {
  NSPAIR(_ZN3ccc7CC6x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y8E[];
extern void _ZN3ccc7CC6x2y83efgEv();
extern void _ZN3ccc7CC6x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x2y83abcEv,_ZTv0_n12_N3ccc7CC6x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y83abcEv,_ZThn4_N3ccc7CC6x2y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y83efgEv,_ZTv0_n16_N3ccc7CC6x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y83efgEv,_ZThn4_N3ccc7CC6x2y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x2y83abcEv,_ZTv0_n12_N3ccc7CC6x2y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y83efgEv,_ZTv0_n16_N3ccc7CC6x2y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y8E[] = {
  {&(_ZTVN3ccc7CC6x2y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y8E[];
static VTBL_ENTRY alt_thunk_names413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y83efgEv,_ZTv0_n16_N3ccc7CC6x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y83efgEv,_ZThn4_N3ccc7CC6x2y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x2y83abcEv,_ZTv0_n12_N3ccc7CC6x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y83abcEv,_ZThn4_N3ccc7CC6x2y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y8E = {  "_ZN3ccc7CC6x2y8E", // class name
  bases__ZN3ccc7CC6x2y8E, 2,
  &(vtc__ZN3ccc7CC6x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y8E),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  DD6x2y8  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD6x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x2y83abcEv
  ~DD6x2y8(); // tgen
  DD6x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y8E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y83efgEv");}
void  ccc::DD6x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x2y83abcEv");}
ccc::DD6x2y8 ::~DD6x2y8(){ note_dtor("_ZN3ccc7DD6x2y8E", this);} // tgen
ccc::DD6x2y8 ::DD6x2y8(){ note_ctor("_ZN3ccc7DD6x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y8E, buf);
    ::ccc::DD6x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y8E);
    dp->::ccc::DD6x2y8::~DD6x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y8E(Test__ZN3ccc7DD6x2y8E, "_ZN3ccc7DD6x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y8C1Ev();
extern void _ZN3ccc7DD6x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y8E[] = {
  NSPAIR(_ZN3ccc7DD6x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y8E[];
extern void _ZN3ccc7DD6x2y83abcEv();
extern void _ZN3ccc7DD6x2y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y83efgEv,_ZTv0_n12_N3ccc7DD6x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y83efgEv,_ZThn4_N3ccc7DD6x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x2y83abcEv,_ZTv0_n16_N3ccc7DD6x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y83abcEv,_ZThn4_N3ccc7DD6x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y83efgEv,_ZTv0_n12_N3ccc7DD6x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x2y83abcEv,_ZTv0_n16_N3ccc7DD6x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y8E[] = {
  {&(_ZTVN3ccc7DD6x2y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x2y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x2y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y8E[];
static VTBL_ENTRY alt_thunk_names414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x2y83abcEv,_ZTv0_n16_N3ccc7DD6x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y83abcEv,_ZThn4_N3ccc7DD6x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y83efgEv,_ZTv0_n12_N3ccc7DD6x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y83efgEv,_ZThn4_N3ccc7DD6x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y8E = {  "_ZN3ccc7DD6x2y8E", // class name
  bases__ZN3ccc7DD6x2y8E, 2,
  &(vtc__ZN3ccc7DD6x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y8E),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  CC6x2y9  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC6x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x2y93pqrEv
  ~CC6x2y9(); // tgen
  CC6x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x2y9E) C1{ VBC2{ v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x2y93efgEv");}
void  ccc::CC6x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x2y93pqrEv");}
ccc::CC6x2y9 ::~CC6x2y9(){ note_dtor("_ZN3ccc7CC6x2y9E", this);} // tgen
ccc::CC6x2y9 ::CC6x2y9(){ note_ctor("_ZN3ccc7CC6x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x2y9E, buf);
    ::ccc::CC6x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x2y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC6x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x2y9E);
    dp->::ccc::CC6x2y9::~CC6x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x2y9E(Test__ZN3ccc7CC6x2y9E, "_ZN3ccc7CC6x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x2y9C1Ev();
extern void _ZN3ccc7CC6x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x2y9E[] = {
  NSPAIR(_ZN3ccc7CC6x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC6x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x2y9E[];
extern void _ZN3ccc7CC6x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC6x2y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x2y93efgEv,_ZTv0_n16_N3ccc7CC6x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x2y93efgEv,_ZThn4_N3ccc7CC6x2y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x2y93efgEv,_ZTv0_n16_N3ccc7CC6x2y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x2y9E[] = {
  {&(_ZTVN3ccc7CC6x2y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x2y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x2y9E[];
static VTBL_ENTRY alt_thunk_names415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x2y93efgEv,_ZTv0_n16_N3ccc7CC6x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x2y93efgEv,_ZThn4_N3ccc7CC6x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x2y9E = {  "_ZN3ccc7CC6x2y9E", // class name
  bases__ZN3ccc7CC6x2y9E, 2,
  &(vtc__ZN3ccc7CC6x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x2y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x2y9E),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  DD6x2y9  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD6x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x2y93pqrEv
  ~DD6x2y9(); // tgen
  DD6x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x2y9E) C1{ VBC2{ v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x2y93efgEv");}
void  ccc::DD6x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x2y93pqrEv");}
ccc::DD6x2y9 ::~DD6x2y9(){ note_dtor("_ZN3ccc7DD6x2y9E", this);} // tgen
ccc::DD6x2y9 ::DD6x2y9(){ note_ctor("_ZN3ccc7DD6x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x2y9E, buf);
    ::ccc::DD6x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x2y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD6x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x2y9E);
    dp->::ccc::DD6x2y9::~DD6x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x2y9E(Test__ZN3ccc7DD6x2y9E, "_ZN3ccc7DD6x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x2y9C1Ev();
extern void _ZN3ccc7DD6x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x2y9E[] = {
  NSPAIR(_ZN3ccc7DD6x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD6x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x2y93efgEv();
extern void _ZN3ccc7DD6x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x2y93efgEv,_ZTv0_n12_N3ccc7DD6x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y93efgEv,_ZThn4_N3ccc7DD6x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x2y93pqrEv,_ZTv0_n20_N3ccc7DD6x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x2y93pqrEv,_ZThn4_N3ccc7DD6x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x2y93efgEv,_ZTv0_n12_N3ccc7DD6x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x2y93pqrEv,_ZTv0_n20_N3ccc7DD6x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x2y9E[] = {
  {&(_ZTVN3ccc7DD6x2y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x2y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x2y9E[];
static VTBL_ENTRY alt_thunk_names416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x2y93pqrEv,_ZTv0_n20_N3ccc7DD6x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y93pqrEv,_ZThn4_N3ccc7DD6x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x2y93efgEv,_ZTv0_n12_N3ccc7DD6x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x2y93efgEv,_ZThn4_N3ccc7DD6x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x2y9E = {  "_ZN3ccc7DD6x2y9E", // class name
  bases__ZN3ccc7DD6x2y9E, 2,
  &(vtc__ZN3ccc7DD6x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x2y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x2y9E),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  CC6x2y10  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC6x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x2y103abcEv
  ~CC6x2y10(); // tgen
  CC6x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y10E) C1{ VBC2{ v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x2y103pqrEv");}
void  ccc::CC6x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x2y103abcEv");}
ccc::CC6x2y10 ::~CC6x2y10(){ note_dtor("_ZN3ccc8CC6x2y10E", this);} // tgen
ccc::CC6x2y10 ::CC6x2y10(){ note_ctor("_ZN3ccc8CC6x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x2y10E, buf);
    ::ccc::CC6x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x2y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC6x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x2y10E);
    dp->::ccc::CC6x2y10::~CC6x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x2y10E(Test__ZN3ccc8CC6x2y10E, "_ZN3ccc8CC6x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x2y10C1Ev();
extern void _ZN3ccc8CC6x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x2y10E[] = {
  NSPAIR(_ZN3ccc8CC6x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC6x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC6x2y103abcEv();
extern void _ZN3ccc8CC6x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x2y103abcEv,_ZTv0_n12_N3ccc8CC6x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y103abcEv,_ZThn4_N3ccc8CC6x2y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x2y103abcEv,_ZTv0_n12_N3ccc8CC6x2y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x2y10E[] = {
  {&(_ZTVN3ccc8CC6x2y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x2y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x2y10E[];
static VTBL_ENTRY alt_thunk_names417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x2y103abcEv,_ZTv0_n12_N3ccc8CC6x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x2y103abcEv,_ZThn4_N3ccc8CC6x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x2y10E = {  "_ZN3ccc8CC6x2y10E", // class name
  bases__ZN3ccc8CC6x2y10E, 2,
  &(vtc__ZN3ccc8CC6x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x2y10E),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  DD6x2y10  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD6x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x2y103abcEv
  ~DD6x2y10(); // tgen
  DD6x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x2y10E) C1{ VBC2{ v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x2y103pqrEv");}
void  ccc::DD6x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x2y103abcEv");}
ccc::DD6x2y10 ::~DD6x2y10(){ note_dtor("_ZN3ccc8DD6x2y10E", this);} // tgen
ccc::DD6x2y10 ::DD6x2y10(){ note_ctor("_ZN3ccc8DD6x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x2y10E, buf);
    ::ccc::DD6x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x2y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD6x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x2y10E);
    dp->::ccc::DD6x2y10::~DD6x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x2y10E(Test__ZN3ccc8DD6x2y10E, "_ZN3ccc8DD6x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x2y10C1Ev();
extern void _ZN3ccc8DD6x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x2y10E[] = {
  NSPAIR(_ZN3ccc8DD6x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD6x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y10E[];
extern void _ZN3ccc8DD6x2y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x2y103abcEv,_ZTv0_n16_N3ccc8DD6x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y103abcEv,_ZThn4_N3ccc8DD6x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x2y103pqrEv,_ZTv0_n20_N3ccc8DD6x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y103pqrEv,_ZThn4_N3ccc8DD6x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x2y103abcEv,_ZTv0_n16_N3ccc8DD6x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x2y103pqrEv,_ZTv0_n20_N3ccc8DD6x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x2y10E[] = {
  {&(_ZTVN3ccc8DD6x2y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x2y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x2y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x2y10E[];
static VTBL_ENTRY alt_thunk_names418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x2y103pqrEv,_ZTv0_n20_N3ccc8DD6x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y103pqrEv,_ZThn4_N3ccc8DD6x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x2y103abcEv,_ZTv0_n16_N3ccc8DD6x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y103abcEv,_ZThn4_N3ccc8DD6x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x2y10E = {  "_ZN3ccc8DD6x2y10E", // class name
  bases__ZN3ccc8DD6x2y10E, 2,
  &(vtc__ZN3ccc8DD6x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x2y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x2y10E),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  CC6x2y11  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC6x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x2y113efgEv
  ~CC6x2y11(); // tgen
  CC6x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y11E) C1{ VBC2{ v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x2y113pqrEv");}
void  ccc::CC6x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x2y113efgEv");}
ccc::CC6x2y11 ::~CC6x2y11(){ note_dtor("_ZN3ccc8CC6x2y11E", this);} // tgen
ccc::CC6x2y11 ::CC6x2y11(){ note_ctor("_ZN3ccc8CC6x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x2y11E, buf);
    ::ccc::CC6x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x2y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC6x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x2y11E);
    dp->::ccc::CC6x2y11::~CC6x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x2y11E(Test__ZN3ccc8CC6x2y11E, "_ZN3ccc8CC6x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x2y11C1Ev();
extern void _ZN3ccc8CC6x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x2y11E[] = {
  NSPAIR(_ZN3ccc8CC6x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC6x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x2y11E[];
extern void _ZN3ccc8CC6x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC6x2y113pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x2y113efgEv,_ZTv0_n16_N3ccc8CC6x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y113efgEv,_ZThn4_N3ccc8CC6x2y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x2y113efgEv,_ZTv0_n16_N3ccc8CC6x2y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x2y11E[] = {
  {&(_ZTVN3ccc8CC6x2y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x2y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x2y11E[];
static VTBL_ENTRY alt_thunk_names419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x2y113efgEv,_ZTv0_n16_N3ccc8CC6x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x2y113efgEv,_ZThn4_N3ccc8CC6x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x2y11E = {  "_ZN3ccc8CC6x2y11E", // class name
  bases__ZN3ccc8CC6x2y11E, 2,
  &(vtc__ZN3ccc8CC6x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x2y11E),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  DD6x2y11  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD6x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x2y113efgEv
  ~DD6x2y11(); // tgen
  DD6x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x2y11E) C1{ VBC2{ v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x2y113pqrEv");}
void  ccc::DD6x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x2y113efgEv");}
ccc::DD6x2y11 ::~DD6x2y11(){ note_dtor("_ZN3ccc8DD6x2y11E", this);} // tgen
ccc::DD6x2y11 ::DD6x2y11(){ note_ctor("_ZN3ccc8DD6x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x2y11E, buf);
    ::ccc::DD6x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x2y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD6x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x2y11E);
    dp->::ccc::DD6x2y11::~DD6x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x2y11E(Test__ZN3ccc8DD6x2y11E, "_ZN3ccc8DD6x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x2y11C1Ev();
extern void _ZN3ccc8DD6x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x2y11E[] = {
  NSPAIR(_ZN3ccc8DD6x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD6x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x2y113efgEv();
extern void _ZN3ccc8DD6x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x2y113efgEv,_ZTv0_n12_N3ccc8DD6x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y113efgEv,_ZThn4_N3ccc8DD6x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x2y113pqrEv,_ZTv0_n20_N3ccc8DD6x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y113pqrEv,_ZThn4_N3ccc8DD6x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x2y113efgEv,_ZTv0_n12_N3ccc8DD6x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x2y113pqrEv,_ZTv0_n20_N3ccc8DD6x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x2y11E[] = {
  {&(_ZTVN3ccc8DD6x2y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x2y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x2y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x2y11E[];
static VTBL_ENTRY alt_thunk_names420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x2y113pqrEv,_ZTv0_n20_N3ccc8DD6x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y113pqrEv,_ZThn4_N3ccc8DD6x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x2y113efgEv,_ZTv0_n12_N3ccc8DD6x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y113efgEv,_ZThn4_N3ccc8DD6x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x2y11E = {  "_ZN3ccc8DD6x2y11E", // class name
  bases__ZN3ccc8DD6x2y11E, 2,
  &(vtc__ZN3ccc8DD6x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x2y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x2y11E),3, //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  CC6x2y12  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC6x2y123abcEv
  ~CC6x2y12(); // tgen
  CC6x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC6x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x2y123abcEv");}
ccc::CC6x2y12 ::~CC6x2y12(){ note_dtor("_ZN3ccc8CC6x2y12E", this);} // tgen
ccc::CC6x2y12 ::CC6x2y12(){ note_ctor("_ZN3ccc8CC6x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x2y12E, buf);
    ::ccc::CC6x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x2y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC6x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x2y12E);
    dp->::ccc::CC6x2y12::~CC6x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x2y12E(Test__ZN3ccc8CC6x2y12E, "_ZN3ccc8CC6x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x2y12C1Ev();
extern void _ZN3ccc8CC6x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x2y12E[] = {
  NSPAIR(_ZN3ccc8CC6x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC6x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC6x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x2y123abcEv,_ZTv0_n12_N3ccc8CC6x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y123abcEv,_ZThn4_N3ccc8CC6x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x2y123abcEv,_ZTv0_n12_N3ccc8CC6x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x2y12E[] = {
  {&(_ZTVN3ccc8CC6x2y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x2y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x2y12E[];
static VTBL_ENTRY alt_thunk_names421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x2y123abcEv,_ZTv0_n12_N3ccc8CC6x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x2y123abcEv,_ZThn4_N3ccc8CC6x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x2y12E = {  "_ZN3ccc8CC6x2y12E", // class name
  bases__ZN3ccc8CC6x2y12E, 2,
  &(vtc__ZN3ccc8CC6x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x2y12E),2, //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  DD6x2y12  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD6x2y123abcEv
  ~DD6x2y12(); // tgen
  DD6x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x2y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD6x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x2y123abcEv");}
ccc::DD6x2y12 ::~DD6x2y12(){ note_dtor("_ZN3ccc8DD6x2y12E", this);} // tgen
ccc::DD6x2y12 ::DD6x2y12(){ note_ctor("_ZN3ccc8DD6x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x2y12E, buf);
    ::ccc::DD6x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x2y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD6x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x2y12E);
    dp->::ccc::DD6x2y12::~DD6x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x2y12E(Test__ZN3ccc8DD6x2y12E, "_ZN3ccc8DD6x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x2y12C1Ev();
extern void _ZN3ccc8DD6x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x2y12E[] = {
  NSPAIR(_ZN3ccc8DD6x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD6x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y12E[];
extern void _ZN3ccc8DD6x2y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x2y123abcEv,_ZTv0_n16_N3ccc8DD6x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y123abcEv,_ZThn4_N3ccc8DD6x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x2y123abcEv,_ZTv0_n16_N3ccc8DD6x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x2y12E[] = {
  {&(_ZTVN3ccc8DD6x2y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x2y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x2y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x2y12E[];
static VTBL_ENTRY alt_thunk_names422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x2y123abcEv,_ZTv0_n16_N3ccc8DD6x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y123abcEv,_ZThn4_N3ccc8DD6x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x2y12E = {  "_ZN3ccc8DD6x2y12E", // class name
  bases__ZN3ccc8DD6x2y12E, 2,
  &(vtc__ZN3ccc8DD6x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x2y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x2y12E),3, //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  CC6x2y13  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC6x2y133efgEv
  ~CC6x2y13(); // tgen
  CC6x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y13E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x2y133efgEv");}
ccc::CC6x2y13 ::~CC6x2y13(){ note_dtor("_ZN3ccc8CC6x2y13E", this);} // tgen
ccc::CC6x2y13 ::CC6x2y13(){ note_ctor("_ZN3ccc8CC6x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x2y13E, buf);
    ::ccc::CC6x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x2y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC6x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x2y13E);
    dp->::ccc::CC6x2y13::~CC6x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x2y13E(Test__ZN3ccc8CC6x2y13E, "_ZN3ccc8CC6x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x2y13C1Ev();
extern void _ZN3ccc8CC6x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x2y13E[] = {
  NSPAIR(_ZN3ccc8CC6x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC6x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x2y13E[];
extern void _ZN3ccc8CC6x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x2y133efgEv,_ZTv0_n16_N3ccc8CC6x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x2y133efgEv,_ZThn4_N3ccc8CC6x2y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x2y133efgEv,_ZTv0_n16_N3ccc8CC6x2y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x2y13E[] = {
  {&(_ZTVN3ccc8CC6x2y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x2y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x2y13E[];
static VTBL_ENTRY alt_thunk_names423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x2y133efgEv,_ZTv0_n16_N3ccc8CC6x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x2y133efgEv,_ZThn4_N3ccc8CC6x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x2y13E = {  "_ZN3ccc8CC6x2y13E", // class name
  bases__ZN3ccc8CC6x2y13E, 2,
  &(vtc__ZN3ccc8CC6x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x2y13E),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  DD6x2y13  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD6x2y133efgEv
  ~DD6x2y13(); // tgen
  DD6x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x2y13E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x2y133efgEv");}
ccc::DD6x2y13 ::~DD6x2y13(){ note_dtor("_ZN3ccc8DD6x2y13E", this);} // tgen
ccc::DD6x2y13 ::DD6x2y13(){ note_ctor("_ZN3ccc8DD6x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x2y13E, buf);
    ::ccc::DD6x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x2y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD6x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x2y13E);
    dp->::ccc::DD6x2y13::~DD6x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x2y13E(Test__ZN3ccc8DD6x2y13E, "_ZN3ccc8DD6x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x2y13C1Ev();
extern void _ZN3ccc8DD6x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x2y13E[] = {
  NSPAIR(_ZN3ccc8DD6x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD6x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x2y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x2y133efgEv,_ZTv0_n12_N3ccc8DD6x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y133efgEv,_ZThn4_N3ccc8DD6x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x2y133efgEv,_ZTv0_n12_N3ccc8DD6x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x2y13E[] = {
  {&(_ZTVN3ccc8DD6x2y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x2y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x2y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x2y13E[];
static VTBL_ENTRY alt_thunk_names424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x2y133efgEv,_ZTv0_n12_N3ccc8DD6x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y133efgEv,_ZThn4_N3ccc8DD6x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x2y13E = {  "_ZN3ccc8DD6x2y13E", // class name
  bases__ZN3ccc8DD6x2y13E, 2,
  &(vtc__ZN3ccc8DD6x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x2y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x2y13E),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  CC6x2y14  : virtual ::ccc::AA6 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC6x2y143pqrEv
  ~CC6x2y14(); // tgen
  CC6x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC6x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x2y143pqrEv");}
ccc::CC6x2y14 ::~CC6x2y14(){ note_dtor("_ZN3ccc8CC6x2y14E", this);} // tgen
ccc::CC6x2y14 ::CC6x2y14(){ note_ctor("_ZN3ccc8CC6x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x2y14E, buf);
    ::ccc::CC6x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x2y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC6x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x2y14E);
    dp->::ccc::CC6x2y14::~CC6x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x2y14E(Test__ZN3ccc8CC6x2y14E, "_ZN3ccc8CC6x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x2y14C1Ev();
extern void _ZN3ccc8CC6x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x2y14E[] = {
  NSPAIR(_ZN3ccc8CC6x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC6x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC6x2y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x2y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x2y14E[] = {
  {&(_ZTVN3ccc8CC6x2y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x2y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x2y14E[];
Class_Descriptor cd__ZN3ccc8CC6x2y14E = {  "_ZN3ccc8CC6x2y14E", // class name
  bases__ZN3ccc8CC6x2y14E, 2,
  &(vtc__ZN3ccc8CC6x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x2y14E),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  DD6x2y14  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD6x2y143pqrEv
  ~DD6x2y14(); // tgen
  DD6x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x2y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD6x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x2y143pqrEv");}
ccc::DD6x2y14 ::~DD6x2y14(){ note_dtor("_ZN3ccc8DD6x2y14E", this);} // tgen
ccc::DD6x2y14 ::DD6x2y14(){ note_ctor("_ZN3ccc8DD6x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x2y14E, buf);
    ::ccc::DD6x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x2y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD6x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x2y14E);
    dp->::ccc::DD6x2y14::~DD6x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x2y14E(Test__ZN3ccc8DD6x2y14E, "_ZN3ccc8DD6x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x2y14C1Ev();
extern void _ZN3ccc8DD6x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x2y14E[] = {
  NSPAIR(_ZN3ccc8DD6x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD6x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x2y143pqrEv,_ZTv0_n20_N3ccc8DD6x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x2y143pqrEv,_ZThn4_N3ccc8DD6x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x2y143pqrEv,_ZTv0_n20_N3ccc8DD6x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x2y14E[] = {
  {&(_ZTVN3ccc8DD6x2y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x2y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x2y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x2y14E[];
static VTBL_ENTRY alt_thunk_names425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x2y143pqrEv,_ZTv0_n20_N3ccc8DD6x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x2y143pqrEv,_ZThn4_N3ccc8DD6x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x2y14E = {  "_ZN3ccc8DD6x2y14E", // class name
  bases__ZN3ccc8DD6x2y14E, 2,
  &(vtc__ZN3ccc8DD6x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x2y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x2y14E),3, //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  CC6x2y15  : virtual ::ccc::AA6 , ::ccc::BB2 {
  ~CC6x2y15(); // tgen
  CC6x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x2y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC6x2y15 ::~CC6x2y15(){ note_dtor("_ZN3ccc8CC6x2y15E", this);} // tgen
ccc::CC6x2y15 ::CC6x2y15(){ note_ctor("_ZN3ccc8CC6x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x2y15E, buf);
    ::ccc::CC6x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x2y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC6x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x2y15E);
    dp->::ccc::CC6x2y15::~CC6x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x2y15E(Test__ZN3ccc8CC6x2y15E, "_ZN3ccc8CC6x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x2y15C1Ev();
extern void _ZN3ccc8CC6x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x2y15E[] = {
  NSPAIR(_ZN3ccc8CC6x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC6x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x2y15E[] = {
  {&(_ZTVN3ccc8CC6x2y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x2y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x2y15E[];
Class_Descriptor cd__ZN3ccc8CC6x2y15E = {  "_ZN3ccc8CC6x2y15E", // class name
  bases__ZN3ccc8CC6x2y15E, 2,
  &(vtc__ZN3ccc8CC6x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x2y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x2y15E),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  DD6x2y15  : virtual ::ccc::AA6 , virtual ::ccc::BB2 {
  ~DD6x2y15(); // tgen
  DD6x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x2y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD6x2y15 ::~DD6x2y15(){ note_dtor("_ZN3ccc8DD6x2y15E", this);} // tgen
ccc::DD6x2y15 ::DD6x2y15(){ note_ctor("_ZN3ccc8DD6x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x2y15E, buf);
    ::ccc::DD6x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x2y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD6x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x2y15E);
    dp->::ccc::DD6x2y15::~DD6x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x2y15E(Test__ZN3ccc8DD6x2y15E, "_ZN3ccc8DD6x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x2y15C1Ev();
extern void _ZN3ccc8DD6x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x2y15E[] = {
  NSPAIR(_ZN3ccc8DD6x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD6x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x2y15E[] = {
  {&(_ZTVN3ccc8DD6x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x2y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x2y15E[];
Class_Descriptor cd__ZN3ccc8DD6x2y15E = {  "_ZN3ccc8DD6x2y15E", // class name
  bases__ZN3ccc8DD6x2y15E, 2,
  &(vtc__ZN3ccc8DD6x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x2y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x2y15E),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  CC6x3y0  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y03pqrEv
  ~CC6x3y0(); // tgen
  CC6x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y0E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y03abcEv");}
void  ccc::CC6x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y03efgEv");}
void  ccc::CC6x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y03pqrEv");}
ccc::CC6x3y0 ::~CC6x3y0(){ note_dtor("_ZN3ccc7CC6x3y0E", this);} // tgen
ccc::CC6x3y0 ::CC6x3y0(){ note_ctor("_ZN3ccc7CC6x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y0E, buf);
    ::ccc::CC6x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y0E);
    dp->::ccc::CC6x3y0::~CC6x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y0E(Test__ZN3ccc7CC6x3y0E, "_ZN3ccc7CC6x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y0C1Ev();
extern void _ZN3ccc7CC6x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y0E[] = {
  NSPAIR(_ZN3ccc7CC6x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y0E[];
extern void _ZN3ccc7CC6x3y03efgEv();
extern void _ZN3ccc7CC6x3y03pqrEv();
extern void _ZN3ccc7CC6x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y03abcEv,_ZTv0_n12_N3ccc7CC6x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y03abcEv,_ZThn4_N3ccc7CC6x3y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y03efgEv,_ZTv0_n16_N3ccc7CC6x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y03efgEv,_ZThn4_N3ccc7CC6x3y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y03abcEv,_ZTv0_n12_N3ccc7CC6x3y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y03efgEv,_ZTv0_n16_N3ccc7CC6x3y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y0E[] = {
  {&(_ZTVN3ccc7CC6x3y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y0E[];
static VTBL_ENTRY alt_thunk_names426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y03efgEv,_ZTv0_n16_N3ccc7CC6x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y03efgEv,_ZThn4_N3ccc7CC6x3y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y03abcEv,_ZTv0_n12_N3ccc7CC6x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y03abcEv,_ZThn4_N3ccc7CC6x3y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y0E = {  "_ZN3ccc7CC6x3y0E", // class name
  bases__ZN3ccc7CC6x3y0E, 2,
  &(vtc__ZN3ccc7CC6x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y0E),2, //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  DD6x3y0  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD6x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x3y03pqrEv
  ~DD6x3y0(); // tgen
  DD6x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y0E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y03abcEv");}
void  ccc::DD6x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y03efgEv");}
void  ccc::DD6x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y03pqrEv");}
ccc::DD6x3y0 ::~DD6x3y0(){ note_dtor("_ZN3ccc7DD6x3y0E", this);} // tgen
ccc::DD6x3y0 ::DD6x3y0(){ note_ctor("_ZN3ccc7DD6x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y0E, buf);
    ::ccc::DD6x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y0E);
    dp->::ccc::DD6x3y0::~DD6x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y0E(Test__ZN3ccc7DD6x3y0E, "_ZN3ccc7DD6x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y0C1Ev();
extern void _ZN3ccc7DD6x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y0E[] = {
  NSPAIR(_ZN3ccc7DD6x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y0E[];
extern void _ZN3ccc7DD6x3y03abcEv();
extern void _ZN3ccc7DD6x3y03efgEv();
extern void _ZN3ccc7DD6x3y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y03efgEv,_ZTv0_n12_N3ccc7DD6x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y03efgEv,_ZThn4_N3ccc7DD6x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y03pqrEv,_ZTv0_n16_N3ccc7DD6x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y03pqrEv,_ZThn4_N3ccc7DD6x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y03abcEv,_ZTv0_n20_N3ccc7DD6x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y03abcEv,_ZThn4_N3ccc7DD6x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y03efgEv,_ZTv0_n12_N3ccc7DD6x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y03pqrEv,_ZTv0_n16_N3ccc7DD6x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y03abcEv,_ZTv0_n20_N3ccc7DD6x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y0E[] = {
  {&(_ZTVN3ccc7DD6x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y0E[];
static VTBL_ENTRY alt_thunk_names427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y03abcEv,_ZTv0_n20_N3ccc7DD6x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y03abcEv,_ZThn4_N3ccc7DD6x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y03pqrEv,_ZTv0_n16_N3ccc7DD6x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y03pqrEv,_ZThn4_N3ccc7DD6x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y03efgEv,_ZTv0_n12_N3ccc7DD6x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y03efgEv,_ZThn4_N3ccc7DD6x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y0E = {  "_ZN3ccc7DD6x3y0E", // class name
  bases__ZN3ccc7DD6x3y0E, 2,
  &(vtc__ZN3ccc7DD6x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y0E),3, //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  CC6x3y1  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x3y13efgEv
  ~CC6x3y1(); // tgen
  CC6x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y1E) C1{ VBC2{ v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y13abcEv");}
void  ccc::CC6x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y13pqrEv");}
void  ccc::CC6x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y13efgEv");}
ccc::CC6x3y1 ::~CC6x3y1(){ note_dtor("_ZN3ccc7CC6x3y1E", this);} // tgen
ccc::CC6x3y1 ::CC6x3y1(){ note_ctor("_ZN3ccc7CC6x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y1E, buf);
    ::ccc::CC6x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y1E);
    dp->::ccc::CC6x3y1::~CC6x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y1E(Test__ZN3ccc7CC6x3y1E, "_ZN3ccc7CC6x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y1C1Ev();
extern void _ZN3ccc7CC6x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y1E[] = {
  NSPAIR(_ZN3ccc7CC6x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y1E[];
extern void _ZN3ccc7CC6x3y13efgEv();
extern void _ZN3ccc7CC6x3y13pqrEv();
extern void _ZN3ccc7CC6x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y13abcEv,_ZTv0_n12_N3ccc7CC6x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y13abcEv,_ZThn4_N3ccc7CC6x3y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y13efgEv,_ZTv0_n16_N3ccc7CC6x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y13efgEv,_ZThn4_N3ccc7CC6x3y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y13abcEv,_ZTv0_n12_N3ccc7CC6x3y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y13efgEv,_ZTv0_n16_N3ccc7CC6x3y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y1E[] = {
  {&(_ZTVN3ccc7CC6x3y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y1E[];
static VTBL_ENTRY alt_thunk_names428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y13efgEv,_ZTv0_n16_N3ccc7CC6x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y13efgEv,_ZThn4_N3ccc7CC6x3y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y13abcEv,_ZTv0_n12_N3ccc7CC6x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y13abcEv,_ZThn4_N3ccc7CC6x3y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y1E = {  "_ZN3ccc7CC6x3y1E", // class name
  bases__ZN3ccc7CC6x3y1E, 2,
  &(vtc__ZN3ccc7CC6x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y1E),2, //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  DD6x3y1  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD6x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x3y13efgEv
  ~DD6x3y1(); // tgen
  DD6x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y1E) C1{ VBC2{ v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y13abcEv");}
void  ccc::DD6x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y13pqrEv");}
void  ccc::DD6x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y13efgEv");}
ccc::DD6x3y1 ::~DD6x3y1(){ note_dtor("_ZN3ccc7DD6x3y1E", this);} // tgen
ccc::DD6x3y1 ::DD6x3y1(){ note_ctor("_ZN3ccc7DD6x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y1E, buf);
    ::ccc::DD6x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y1E);
    dp->::ccc::DD6x3y1::~DD6x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y1E(Test__ZN3ccc7DD6x3y1E, "_ZN3ccc7DD6x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y1C1Ev();
extern void _ZN3ccc7DD6x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y1E[] = {
  NSPAIR(_ZN3ccc7DD6x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y1E[];
extern void _ZN3ccc7DD6x3y13abcEv();
extern void _ZN3ccc7DD6x3y13efgEv();
extern void _ZN3ccc7DD6x3y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y13efgEv,_ZTv0_n12_N3ccc7DD6x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y13efgEv,_ZThn4_N3ccc7DD6x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y13pqrEv,_ZTv0_n16_N3ccc7DD6x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y13pqrEv,_ZThn4_N3ccc7DD6x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y13abcEv,_ZTv0_n20_N3ccc7DD6x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y13abcEv,_ZThn4_N3ccc7DD6x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y13efgEv,_ZTv0_n12_N3ccc7DD6x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y13pqrEv,_ZTv0_n16_N3ccc7DD6x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y13abcEv,_ZTv0_n20_N3ccc7DD6x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y1E[] = {
  {&(_ZTVN3ccc7DD6x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y1E[];
static VTBL_ENTRY alt_thunk_names429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y13abcEv,_ZTv0_n20_N3ccc7DD6x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y13abcEv,_ZThn4_N3ccc7DD6x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y13pqrEv,_ZTv0_n16_N3ccc7DD6x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y13pqrEv,_ZThn4_N3ccc7DD6x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y13efgEv,_ZTv0_n12_N3ccc7DD6x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y13efgEv,_ZThn4_N3ccc7DD6x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y1E = {  "_ZN3ccc7DD6x3y1E", // class name
  bases__ZN3ccc7DD6x3y1E, 2,
  &(vtc__ZN3ccc7DD6x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y1E),3, //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  CC6x3y2  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y23pqrEv
  ~CC6x3y2(); // tgen
  CC6x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y2E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y23efgEv");}
void  ccc::CC6x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y23abcEv");}
void  ccc::CC6x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y23pqrEv");}
ccc::CC6x3y2 ::~CC6x3y2(){ note_dtor("_ZN3ccc7CC6x3y2E", this);} // tgen
ccc::CC6x3y2 ::CC6x3y2(){ note_ctor("_ZN3ccc7CC6x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y2E, buf);
    ::ccc::CC6x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y2E);
    dp->::ccc::CC6x3y2::~CC6x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y2E(Test__ZN3ccc7CC6x3y2E, "_ZN3ccc7CC6x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y2C1Ev();
extern void _ZN3ccc7CC6x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y2E[] = {
  NSPAIR(_ZN3ccc7CC6x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y2E[];
extern void _ZN3ccc7CC6x3y23efgEv();
extern void _ZN3ccc7CC6x3y23pqrEv();
extern void _ZN3ccc7CC6x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y23abcEv,_ZTv0_n12_N3ccc7CC6x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y23abcEv,_ZThn4_N3ccc7CC6x3y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y23efgEv,_ZTv0_n16_N3ccc7CC6x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y23efgEv,_ZThn4_N3ccc7CC6x3y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y23abcEv,_ZTv0_n12_N3ccc7CC6x3y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y23efgEv,_ZTv0_n16_N3ccc7CC6x3y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y2E[] = {
  {&(_ZTVN3ccc7CC6x3y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y2E[];
static VTBL_ENTRY alt_thunk_names430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y23efgEv,_ZTv0_n16_N3ccc7CC6x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y23efgEv,_ZThn4_N3ccc7CC6x3y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y23abcEv,_ZTv0_n12_N3ccc7CC6x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y23abcEv,_ZThn4_N3ccc7CC6x3y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y2E = {  "_ZN3ccc7CC6x3y2E", // class name
  bases__ZN3ccc7CC6x3y2E, 2,
  &(vtc__ZN3ccc7CC6x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y2E),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  DD6x3y2  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD6x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x3y23pqrEv
  ~DD6x3y2(); // tgen
  DD6x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y2E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y23efgEv");}
void  ccc::DD6x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y23abcEv");}
void  ccc::DD6x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y23pqrEv");}
ccc::DD6x3y2 ::~DD6x3y2(){ note_dtor("_ZN3ccc7DD6x3y2E", this);} // tgen
ccc::DD6x3y2 ::DD6x3y2(){ note_ctor("_ZN3ccc7DD6x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y2E, buf);
    ::ccc::DD6x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y2E);
    dp->::ccc::DD6x3y2::~DD6x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y2E(Test__ZN3ccc7DD6x3y2E, "_ZN3ccc7DD6x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y2C1Ev();
extern void _ZN3ccc7DD6x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y2E[] = {
  NSPAIR(_ZN3ccc7DD6x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y2E[];
extern void _ZN3ccc7DD6x3y23abcEv();
extern void _ZN3ccc7DD6x3y23efgEv();
extern void _ZN3ccc7DD6x3y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y23efgEv,_ZTv0_n12_N3ccc7DD6x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y23efgEv,_ZThn4_N3ccc7DD6x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y23pqrEv,_ZTv0_n16_N3ccc7DD6x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y23pqrEv,_ZThn4_N3ccc7DD6x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y23abcEv,_ZTv0_n20_N3ccc7DD6x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y23abcEv,_ZThn4_N3ccc7DD6x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y23efgEv,_ZTv0_n12_N3ccc7DD6x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y23pqrEv,_ZTv0_n16_N3ccc7DD6x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y23abcEv,_ZTv0_n20_N3ccc7DD6x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y2E[] = {
  {&(_ZTVN3ccc7DD6x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y2E[];
static VTBL_ENTRY alt_thunk_names431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y23abcEv,_ZTv0_n20_N3ccc7DD6x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y23abcEv,_ZThn4_N3ccc7DD6x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y23pqrEv,_ZTv0_n16_N3ccc7DD6x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y23pqrEv,_ZThn4_N3ccc7DD6x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y23efgEv,_ZTv0_n12_N3ccc7DD6x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y23efgEv,_ZThn4_N3ccc7DD6x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y2E = {  "_ZN3ccc7DD6x3y2E", // class name
  bases__ZN3ccc7DD6x3y2E, 2,
  &(vtc__ZN3ccc7DD6x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y2E),3, //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  CC6x3y3  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x3y33abcEv
  ~CC6x3y3(); // tgen
  CC6x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y3E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y33efgEv");}
void  ccc::CC6x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y33pqrEv");}
void  ccc::CC6x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y33abcEv");}
ccc::CC6x3y3 ::~CC6x3y3(){ note_dtor("_ZN3ccc7CC6x3y3E", this);} // tgen
ccc::CC6x3y3 ::CC6x3y3(){ note_ctor("_ZN3ccc7CC6x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y3E, buf);
    ::ccc::CC6x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y3E);
    dp->::ccc::CC6x3y3::~CC6x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y3E(Test__ZN3ccc7CC6x3y3E, "_ZN3ccc7CC6x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y3C1Ev();
extern void _ZN3ccc7CC6x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y3E[] = {
  NSPAIR(_ZN3ccc7CC6x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y3E[];
extern void _ZN3ccc7CC6x3y33efgEv();
extern void _ZN3ccc7CC6x3y33pqrEv();
extern void _ZN3ccc7CC6x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y33abcEv,_ZTv0_n12_N3ccc7CC6x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y33abcEv,_ZThn4_N3ccc7CC6x3y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y33efgEv,_ZTv0_n16_N3ccc7CC6x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y33efgEv,_ZThn4_N3ccc7CC6x3y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y33abcEv,_ZTv0_n12_N3ccc7CC6x3y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y33efgEv,_ZTv0_n16_N3ccc7CC6x3y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y3E[] = {
  {&(_ZTVN3ccc7CC6x3y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y3E[];
static VTBL_ENTRY alt_thunk_names432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y33efgEv,_ZTv0_n16_N3ccc7CC6x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y33efgEv,_ZThn4_N3ccc7CC6x3y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y33abcEv,_ZTv0_n12_N3ccc7CC6x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y33abcEv,_ZThn4_N3ccc7CC6x3y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y3E = {  "_ZN3ccc7CC6x3y3E", // class name
  bases__ZN3ccc7CC6x3y3E, 2,
  &(vtc__ZN3ccc7CC6x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y3E),2, //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  DD6x3y3  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD6x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x3y33abcEv
  ~DD6x3y3(); // tgen
  DD6x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y3E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y33efgEv");}
void  ccc::DD6x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y33pqrEv");}
void  ccc::DD6x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y33abcEv");}
ccc::DD6x3y3 ::~DD6x3y3(){ note_dtor("_ZN3ccc7DD6x3y3E", this);} // tgen
ccc::DD6x3y3 ::DD6x3y3(){ note_ctor("_ZN3ccc7DD6x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y3E, buf);
    ::ccc::DD6x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y3E);
    dp->::ccc::DD6x3y3::~DD6x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y3E(Test__ZN3ccc7DD6x3y3E, "_ZN3ccc7DD6x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y3C1Ev();
extern void _ZN3ccc7DD6x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y3E[] = {
  NSPAIR(_ZN3ccc7DD6x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y3E[];
extern void _ZN3ccc7DD6x3y33abcEv();
extern void _ZN3ccc7DD6x3y33efgEv();
extern void _ZN3ccc7DD6x3y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y33efgEv,_ZTv0_n12_N3ccc7DD6x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y33efgEv,_ZThn4_N3ccc7DD6x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y33pqrEv,_ZTv0_n16_N3ccc7DD6x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y33pqrEv,_ZThn4_N3ccc7DD6x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y33abcEv,_ZTv0_n20_N3ccc7DD6x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y33abcEv,_ZThn4_N3ccc7DD6x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y33efgEv,_ZTv0_n12_N3ccc7DD6x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y33pqrEv,_ZTv0_n16_N3ccc7DD6x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y33abcEv,_ZTv0_n20_N3ccc7DD6x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y3E[] = {
  {&(_ZTVN3ccc7DD6x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y3E[];
static VTBL_ENTRY alt_thunk_names433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y33abcEv,_ZTv0_n20_N3ccc7DD6x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y33abcEv,_ZThn4_N3ccc7DD6x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y33pqrEv,_ZTv0_n16_N3ccc7DD6x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y33pqrEv,_ZThn4_N3ccc7DD6x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y33efgEv,_ZTv0_n12_N3ccc7DD6x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y33efgEv,_ZThn4_N3ccc7DD6x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y3E = {  "_ZN3ccc7DD6x3y3E", // class name
  bases__ZN3ccc7DD6x3y3E, 2,
  &(vtc__ZN3ccc7DD6x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y3E),3, //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  CC6x3y4  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC6x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x3y43efgEv
  ~CC6x3y4(); // tgen
  CC6x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y4E) C1{ VBC2{ v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y43pqrEv");}
void  ccc::CC6x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y43abcEv");}
void  ccc::CC6x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y43efgEv");}
ccc::CC6x3y4 ::~CC6x3y4(){ note_dtor("_ZN3ccc7CC6x3y4E", this);} // tgen
ccc::CC6x3y4 ::CC6x3y4(){ note_ctor("_ZN3ccc7CC6x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y4E, buf);
    ::ccc::CC6x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y4E);
    dp->::ccc::CC6x3y4::~CC6x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y4E(Test__ZN3ccc7CC6x3y4E, "_ZN3ccc7CC6x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y4C1Ev();
extern void _ZN3ccc7CC6x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y4E[] = {
  NSPAIR(_ZN3ccc7CC6x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y4E[];
extern void _ZN3ccc7CC6x3y43efgEv();
extern void _ZN3ccc7CC6x3y43pqrEv();
extern void _ZN3ccc7CC6x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y43abcEv,_ZTv0_n12_N3ccc7CC6x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y43abcEv,_ZThn4_N3ccc7CC6x3y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y43efgEv,_ZTv0_n16_N3ccc7CC6x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y43efgEv,_ZThn4_N3ccc7CC6x3y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y43abcEv,_ZTv0_n12_N3ccc7CC6x3y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y43efgEv,_ZTv0_n16_N3ccc7CC6x3y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y4E[] = {
  {&(_ZTVN3ccc7CC6x3y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y4E[];
static VTBL_ENTRY alt_thunk_names434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y43efgEv,_ZTv0_n16_N3ccc7CC6x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y43efgEv,_ZThn4_N3ccc7CC6x3y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y43abcEv,_ZTv0_n12_N3ccc7CC6x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y43abcEv,_ZThn4_N3ccc7CC6x3y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y4E = {  "_ZN3ccc7CC6x3y4E", // class name
  bases__ZN3ccc7CC6x3y4E, 2,
  &(vtc__ZN3ccc7CC6x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y4E),2, //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  DD6x3y4  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD6x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x3y43efgEv
  ~DD6x3y4(); // tgen
  DD6x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y4E) C1{ VBC2{ v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y43pqrEv");}
void  ccc::DD6x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y43abcEv");}
void  ccc::DD6x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y43efgEv");}
ccc::DD6x3y4 ::~DD6x3y4(){ note_dtor("_ZN3ccc7DD6x3y4E", this);} // tgen
ccc::DD6x3y4 ::DD6x3y4(){ note_ctor("_ZN3ccc7DD6x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y4E, buf);
    ::ccc::DD6x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y4E);
    dp->::ccc::DD6x3y4::~DD6x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y4E(Test__ZN3ccc7DD6x3y4E, "_ZN3ccc7DD6x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y4C1Ev();
extern void _ZN3ccc7DD6x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y4E[] = {
  NSPAIR(_ZN3ccc7DD6x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y4E[];
extern void _ZN3ccc7DD6x3y43abcEv();
extern void _ZN3ccc7DD6x3y43efgEv();
extern void _ZN3ccc7DD6x3y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y43efgEv,_ZTv0_n12_N3ccc7DD6x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y43efgEv,_ZThn4_N3ccc7DD6x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y43pqrEv,_ZTv0_n16_N3ccc7DD6x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y43pqrEv,_ZThn4_N3ccc7DD6x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y43abcEv,_ZTv0_n20_N3ccc7DD6x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y43abcEv,_ZThn4_N3ccc7DD6x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y43efgEv,_ZTv0_n12_N3ccc7DD6x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y43pqrEv,_ZTv0_n16_N3ccc7DD6x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y43abcEv,_ZTv0_n20_N3ccc7DD6x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y4E[] = {
  {&(_ZTVN3ccc7DD6x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y4E[];
static VTBL_ENTRY alt_thunk_names435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y43abcEv,_ZTv0_n20_N3ccc7DD6x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y43abcEv,_ZThn4_N3ccc7DD6x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y43pqrEv,_ZTv0_n16_N3ccc7DD6x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y43pqrEv,_ZThn4_N3ccc7DD6x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y43efgEv,_ZTv0_n12_N3ccc7DD6x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y43efgEv,_ZThn4_N3ccc7DD6x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y4E = {  "_ZN3ccc7DD6x3y4E", // class name
  bases__ZN3ccc7DD6x3y4E, 2,
  &(vtc__ZN3ccc7DD6x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y4E),3, //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  CC6x3y5  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC6x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x3y53abcEv
  ~CC6x3y5(); // tgen
  CC6x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y5E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y53pqrEv");}
void  ccc::CC6x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y53efgEv");}
void  ccc::CC6x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y53abcEv");}
ccc::CC6x3y5 ::~CC6x3y5(){ note_dtor("_ZN3ccc7CC6x3y5E", this);} // tgen
ccc::CC6x3y5 ::CC6x3y5(){ note_ctor("_ZN3ccc7CC6x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y5E, buf);
    ::ccc::CC6x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y5E);
    dp->::ccc::CC6x3y5::~CC6x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y5E(Test__ZN3ccc7CC6x3y5E, "_ZN3ccc7CC6x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y5C1Ev();
extern void _ZN3ccc7CC6x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y5E[] = {
  NSPAIR(_ZN3ccc7CC6x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y5E[];
extern void _ZN3ccc7CC6x3y53efgEv();
extern void _ZN3ccc7CC6x3y53pqrEv();
extern void _ZN3ccc7CC6x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y53abcEv,_ZTv0_n12_N3ccc7CC6x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y53abcEv,_ZThn4_N3ccc7CC6x3y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y53efgEv,_ZTv0_n16_N3ccc7CC6x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y53efgEv,_ZThn4_N3ccc7CC6x3y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y53abcEv,_ZTv0_n12_N3ccc7CC6x3y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y53efgEv,_ZTv0_n16_N3ccc7CC6x3y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y5E[] = {
  {&(_ZTVN3ccc7CC6x3y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y5E[];
static VTBL_ENTRY alt_thunk_names436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y53efgEv,_ZTv0_n16_N3ccc7CC6x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y53efgEv,_ZThn4_N3ccc7CC6x3y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y53abcEv,_ZTv0_n12_N3ccc7CC6x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y53abcEv,_ZThn4_N3ccc7CC6x3y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y5E = {  "_ZN3ccc7CC6x3y5E", // class name
  bases__ZN3ccc7CC6x3y5E, 2,
  &(vtc__ZN3ccc7CC6x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y5E),2, //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  DD6x3y5  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD6x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x3y53abcEv
  ~DD6x3y5(); // tgen
  DD6x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y5E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y53pqrEv");}
void  ccc::DD6x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y53efgEv");}
void  ccc::DD6x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y53abcEv");}
ccc::DD6x3y5 ::~DD6x3y5(){ note_dtor("_ZN3ccc7DD6x3y5E", this);} // tgen
ccc::DD6x3y5 ::DD6x3y5(){ note_ctor("_ZN3ccc7DD6x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y5E, buf);
    ::ccc::DD6x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y5E);
    dp->::ccc::DD6x3y5::~DD6x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y5E(Test__ZN3ccc7DD6x3y5E, "_ZN3ccc7DD6x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y5C1Ev();
extern void _ZN3ccc7DD6x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y5E[] = {
  NSPAIR(_ZN3ccc7DD6x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y5E[];
extern void _ZN3ccc7DD6x3y53abcEv();
extern void _ZN3ccc7DD6x3y53efgEv();
extern void _ZN3ccc7DD6x3y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y53efgEv,_ZTv0_n12_N3ccc7DD6x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y53efgEv,_ZThn4_N3ccc7DD6x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y53pqrEv,_ZTv0_n16_N3ccc7DD6x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y53pqrEv,_ZThn4_N3ccc7DD6x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y53abcEv,_ZTv0_n20_N3ccc7DD6x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y53abcEv,_ZThn4_N3ccc7DD6x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y53efgEv,_ZTv0_n12_N3ccc7DD6x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y53pqrEv,_ZTv0_n16_N3ccc7DD6x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y53abcEv,_ZTv0_n20_N3ccc7DD6x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y5E[] = {
  {&(_ZTVN3ccc7DD6x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y5E[];
static VTBL_ENTRY alt_thunk_names437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y53abcEv,_ZTv0_n20_N3ccc7DD6x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y53abcEv,_ZThn4_N3ccc7DD6x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y53pqrEv,_ZTv0_n16_N3ccc7DD6x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y53pqrEv,_ZThn4_N3ccc7DD6x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y53efgEv,_ZTv0_n12_N3ccc7DD6x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y53efgEv,_ZThn4_N3ccc7DD6x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y5E = {  "_ZN3ccc7DD6x3y5E", // class name
  bases__ZN3ccc7DD6x3y5E, 2,
  &(vtc__ZN3ccc7DD6x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y5E),3, //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  CC6x3y6  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x3y63efgEv
  ~CC6x3y6(); // tgen
  CC6x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y6E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y63abcEv");}
void  ccc::CC6x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y63efgEv");}
ccc::CC6x3y6 ::~CC6x3y6(){ note_dtor("_ZN3ccc7CC6x3y6E", this);} // tgen
ccc::CC6x3y6 ::CC6x3y6(){ note_ctor("_ZN3ccc7CC6x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y6E, buf);
    ::ccc::CC6x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y6E);
    dp->::ccc::CC6x3y6::~CC6x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y6E(Test__ZN3ccc7CC6x3y6E, "_ZN3ccc7CC6x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y6C1Ev();
extern void _ZN3ccc7CC6x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y6E[] = {
  NSPAIR(_ZN3ccc7CC6x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y6E[];
extern void _ZN3ccc7CC6x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC6x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y63abcEv,_ZTv0_n12_N3ccc7CC6x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y63abcEv,_ZThn4_N3ccc7CC6x3y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y63efgEv,_ZTv0_n16_N3ccc7CC6x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y63efgEv,_ZThn4_N3ccc7CC6x3y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y63abcEv,_ZTv0_n12_N3ccc7CC6x3y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y63efgEv,_ZTv0_n16_N3ccc7CC6x3y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y6E[] = {
  {&(_ZTVN3ccc7CC6x3y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y6E[];
static VTBL_ENTRY alt_thunk_names438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y63efgEv,_ZTv0_n16_N3ccc7CC6x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y63efgEv,_ZThn4_N3ccc7CC6x3y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y63abcEv,_ZTv0_n12_N3ccc7CC6x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y63abcEv,_ZThn4_N3ccc7CC6x3y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y6E = {  "_ZN3ccc7CC6x3y6E", // class name
  bases__ZN3ccc7CC6x3y6E, 2,
  &(vtc__ZN3ccc7CC6x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y6E),2, //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  DD6x3y6  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD6x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x3y63efgEv
  ~DD6x3y6(); // tgen
  DD6x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y6E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y63abcEv");}
void  ccc::DD6x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y63efgEv");}
ccc::DD6x3y6 ::~DD6x3y6(){ note_dtor("_ZN3ccc7DD6x3y6E", this);} // tgen
ccc::DD6x3y6 ::DD6x3y6(){ note_ctor("_ZN3ccc7DD6x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y6E, buf);
    ::ccc::DD6x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y6E);
    dp->::ccc::DD6x3y6::~DD6x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y6E(Test__ZN3ccc7DD6x3y6E, "_ZN3ccc7DD6x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y6C1Ev();
extern void _ZN3ccc7DD6x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y6E[] = {
  NSPAIR(_ZN3ccc7DD6x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y6E[];
extern void _ZN3ccc7DD6x3y63abcEv();
extern void _ZN3ccc7DD6x3y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y63efgEv,_ZTv0_n12_N3ccc7DD6x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y63efgEv,_ZThn4_N3ccc7DD6x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y63abcEv,_ZTv0_n20_N3ccc7DD6x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y63abcEv,_ZThn4_N3ccc7DD6x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y63efgEv,_ZTv0_n12_N3ccc7DD6x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y63abcEv,_ZTv0_n20_N3ccc7DD6x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y6E[] = {
  {&(_ZTVN3ccc7DD6x3y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x3y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x3y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y6E[];
static VTBL_ENTRY alt_thunk_names439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y63abcEv,_ZTv0_n20_N3ccc7DD6x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y63abcEv,_ZThn4_N3ccc7DD6x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y63efgEv,_ZTv0_n12_N3ccc7DD6x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y63efgEv,_ZThn4_N3ccc7DD6x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y6E = {  "_ZN3ccc7DD6x3y6E", // class name
  bases__ZN3ccc7DD6x3y6E, 2,
  &(vtc__ZN3ccc7DD6x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y6E),3, //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  CC6x3y7  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC6x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y73pqrEv
  ~CC6x3y7(); // tgen
  CC6x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y7E) C1{ VBC2{ v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y73abcEv");}
void  ccc::CC6x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y73pqrEv");}
ccc::CC6x3y7 ::~CC6x3y7(){ note_dtor("_ZN3ccc7CC6x3y7E", this);} // tgen
ccc::CC6x3y7 ::CC6x3y7(){ note_ctor("_ZN3ccc7CC6x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y7E, buf);
    ::ccc::CC6x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y7E);
    dp->::ccc::CC6x3y7::~CC6x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y7E(Test__ZN3ccc7CC6x3y7E, "_ZN3ccc7CC6x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y7C1Ev();
extern void _ZN3ccc7CC6x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y7E[] = {
  NSPAIR(_ZN3ccc7CC6x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC6x3y73pqrEv();
extern void _ZN3ccc7CC6x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y73abcEv,_ZTv0_n12_N3ccc7CC6x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y73abcEv,_ZThn4_N3ccc7CC6x3y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y73abcEv,_ZTv0_n12_N3ccc7CC6x3y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y7E[] = {
  {&(_ZTVN3ccc7CC6x3y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y7E[];
static VTBL_ENTRY alt_thunk_names440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y73abcEv,_ZTv0_n12_N3ccc7CC6x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y73abcEv,_ZThn4_N3ccc7CC6x3y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y7E = {  "_ZN3ccc7CC6x3y7E", // class name
  bases__ZN3ccc7CC6x3y7E, 2,
  &(vtc__ZN3ccc7CC6x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y7E),2, //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  DD6x3y7  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD6x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x3y73pqrEv
  ~DD6x3y7(); // tgen
  DD6x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y7E) C1{ VBC2{ v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y73abcEv");}
void  ccc::DD6x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y73pqrEv");}
ccc::DD6x3y7 ::~DD6x3y7(){ note_dtor("_ZN3ccc7DD6x3y7E", this);} // tgen
ccc::DD6x3y7 ::DD6x3y7(){ note_ctor("_ZN3ccc7DD6x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y7E, buf);
    ::ccc::DD6x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y7E);
    dp->::ccc::DD6x3y7::~DD6x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y7E(Test__ZN3ccc7DD6x3y7E, "_ZN3ccc7DD6x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y7C1Ev();
extern void _ZN3ccc7DD6x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y7E[] = {
  NSPAIR(_ZN3ccc7DD6x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y7E[];
extern void _ZN3ccc7DD6x3y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y73pqrEv,_ZTv0_n16_N3ccc7DD6x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y73pqrEv,_ZThn4_N3ccc7DD6x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y73abcEv,_ZTv0_n20_N3ccc7DD6x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y73abcEv,_ZThn4_N3ccc7DD6x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y73pqrEv,_ZTv0_n16_N3ccc7DD6x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y73abcEv,_ZTv0_n20_N3ccc7DD6x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y7E[] = {
  {&(_ZTVN3ccc7DD6x3y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y7E[];
static VTBL_ENTRY alt_thunk_names441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y73abcEv,_ZTv0_n20_N3ccc7DD6x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y73abcEv,_ZThn4_N3ccc7DD6x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y73pqrEv,_ZTv0_n16_N3ccc7DD6x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y73pqrEv,_ZThn4_N3ccc7DD6x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y7E = {  "_ZN3ccc7DD6x3y7E", // class name
  bases__ZN3ccc7DD6x3y7E, 2,
  &(vtc__ZN3ccc7DD6x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y7E),3, //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  CC6x3y8  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x3y83abcEv
  ~CC6x3y8(); // tgen
  CC6x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y8E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y83efgEv");}
void  ccc::CC6x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x3y83abcEv");}
ccc::CC6x3y8 ::~CC6x3y8(){ note_dtor("_ZN3ccc7CC6x3y8E", this);} // tgen
ccc::CC6x3y8 ::CC6x3y8(){ note_ctor("_ZN3ccc7CC6x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y8E, buf);
    ::ccc::CC6x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y8E);
    dp->::ccc::CC6x3y8::~CC6x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y8E(Test__ZN3ccc7CC6x3y8E, "_ZN3ccc7CC6x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y8C1Ev();
extern void _ZN3ccc7CC6x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y8E[] = {
  NSPAIR(_ZN3ccc7CC6x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y8E[];
extern void _ZN3ccc7CC6x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC6x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x3y83abcEv,_ZTv0_n12_N3ccc7CC6x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y83abcEv,_ZThn4_N3ccc7CC6x3y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y83efgEv,_ZTv0_n16_N3ccc7CC6x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y83efgEv,_ZThn4_N3ccc7CC6x3y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x3y83abcEv,_ZTv0_n12_N3ccc7CC6x3y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y83efgEv,_ZTv0_n16_N3ccc7CC6x3y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y8E[] = {
  {&(_ZTVN3ccc7CC6x3y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y8E[];
static VTBL_ENTRY alt_thunk_names442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y83efgEv,_ZTv0_n16_N3ccc7CC6x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y83efgEv,_ZThn4_N3ccc7CC6x3y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x3y83abcEv,_ZTv0_n12_N3ccc7CC6x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y83abcEv,_ZThn4_N3ccc7CC6x3y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y8E = {  "_ZN3ccc7CC6x3y8E", // class name
  bases__ZN3ccc7CC6x3y8E, 2,
  &(vtc__ZN3ccc7CC6x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y8E),2, //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  DD6x3y8  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD6x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x3y83abcEv
  ~DD6x3y8(); // tgen
  DD6x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y8E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y83efgEv");}
void  ccc::DD6x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x3y83abcEv");}
ccc::DD6x3y8 ::~DD6x3y8(){ note_dtor("_ZN3ccc7DD6x3y8E", this);} // tgen
ccc::DD6x3y8 ::DD6x3y8(){ note_ctor("_ZN3ccc7DD6x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y8E, buf);
    ::ccc::DD6x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y8E);
    dp->::ccc::DD6x3y8::~DD6x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y8E(Test__ZN3ccc7DD6x3y8E, "_ZN3ccc7DD6x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y8C1Ev();
extern void _ZN3ccc7DD6x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y8E[] = {
  NSPAIR(_ZN3ccc7DD6x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y8E[];
extern void _ZN3ccc7DD6x3y83abcEv();
extern void _ZN3ccc7DD6x3y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y83efgEv,_ZTv0_n12_N3ccc7DD6x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y83efgEv,_ZThn4_N3ccc7DD6x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x3y83abcEv,_ZTv0_n20_N3ccc7DD6x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y83abcEv,_ZThn4_N3ccc7DD6x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y83efgEv,_ZTv0_n12_N3ccc7DD6x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x3y83abcEv,_ZTv0_n20_N3ccc7DD6x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y8E[] = {
  {&(_ZTVN3ccc7DD6x3y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x3y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x3y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y8E[];
static VTBL_ENTRY alt_thunk_names443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x3y83abcEv,_ZTv0_n20_N3ccc7DD6x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y83abcEv,_ZThn4_N3ccc7DD6x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y83efgEv,_ZTv0_n12_N3ccc7DD6x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y83efgEv,_ZThn4_N3ccc7DD6x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y8E = {  "_ZN3ccc7DD6x3y8E", // class name
  bases__ZN3ccc7DD6x3y8E, 2,
  &(vtc__ZN3ccc7DD6x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y8E),3, //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  CC6x3y9  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC6x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x3y93pqrEv
  ~CC6x3y9(); // tgen
  CC6x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x3y9E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x3y93efgEv");}
void  ccc::CC6x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x3y93pqrEv");}
ccc::CC6x3y9 ::~CC6x3y9(){ note_dtor("_ZN3ccc7CC6x3y9E", this);} // tgen
ccc::CC6x3y9 ::CC6x3y9(){ note_ctor("_ZN3ccc7CC6x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x3y9E, buf);
    ::ccc::CC6x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x3y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC6x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x3y9E);
    dp->::ccc::CC6x3y9::~CC6x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x3y9E(Test__ZN3ccc7CC6x3y9E, "_ZN3ccc7CC6x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x3y9C1Ev();
extern void _ZN3ccc7CC6x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x3y9E[] = {
  NSPAIR(_ZN3ccc7CC6x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC6x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x3y9E[];
extern void _ZN3ccc7CC6x3y93efgEv();
extern void _ZN3ccc7CC6x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x3y93efgEv,_ZTv0_n16_N3ccc7CC6x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x3y93efgEv,_ZThn4_N3ccc7CC6x3y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x3y93efgEv,_ZTv0_n16_N3ccc7CC6x3y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x3y9E[] = {
  {&(_ZTVN3ccc7CC6x3y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x3y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x3y9E[];
static VTBL_ENTRY alt_thunk_names444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x3y93efgEv,_ZTv0_n16_N3ccc7CC6x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x3y93efgEv,_ZThn4_N3ccc7CC6x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x3y9E = {  "_ZN3ccc7CC6x3y9E", // class name
  bases__ZN3ccc7CC6x3y9E, 2,
  &(vtc__ZN3ccc7CC6x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x3y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x3y9E),2, //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  DD6x3y9  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD6x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x3y93pqrEv
  ~DD6x3y9(); // tgen
  DD6x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x3y9E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x3y93efgEv");}
void  ccc::DD6x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x3y93pqrEv");}
ccc::DD6x3y9 ::~DD6x3y9(){ note_dtor("_ZN3ccc7DD6x3y9E", this);} // tgen
ccc::DD6x3y9 ::DD6x3y9(){ note_ctor("_ZN3ccc7DD6x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x3y9E, buf);
    ::ccc::DD6x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x3y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD6x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x3y9E);
    dp->::ccc::DD6x3y9::~DD6x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x3y9E(Test__ZN3ccc7DD6x3y9E, "_ZN3ccc7DD6x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x3y9C1Ev();
extern void _ZN3ccc7DD6x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x3y9E[] = {
  NSPAIR(_ZN3ccc7DD6x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD6x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x3y93efgEv();
extern void _ZN3ccc7DD6x3y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x3y93efgEv,_ZTv0_n12_N3ccc7DD6x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y93efgEv,_ZThn4_N3ccc7DD6x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x3y93pqrEv,_ZTv0_n16_N3ccc7DD6x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x3y93pqrEv,_ZThn4_N3ccc7DD6x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x3y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x3y93efgEv,_ZTv0_n12_N3ccc7DD6x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x3y93pqrEv,_ZTv0_n16_N3ccc7DD6x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x3y9E[] = {
  {&(_ZTVN3ccc7DD6x3y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x3y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x3y9E[];
static VTBL_ENTRY alt_thunk_names445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x3y93pqrEv,_ZTv0_n16_N3ccc7DD6x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y93pqrEv,_ZThn4_N3ccc7DD6x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x3y93efgEv,_ZTv0_n12_N3ccc7DD6x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x3y93efgEv,_ZThn4_N3ccc7DD6x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x3y9E = {  "_ZN3ccc7DD6x3y9E", // class name
  bases__ZN3ccc7DD6x3y9E, 2,
  &(vtc__ZN3ccc7DD6x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x3y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x3y9E),3, //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  CC6x3y10  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC6x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x3y103abcEv
  ~CC6x3y10(); // tgen
  CC6x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y10E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x3y103pqrEv");}
void  ccc::CC6x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x3y103abcEv");}
ccc::CC6x3y10 ::~CC6x3y10(){ note_dtor("_ZN3ccc8CC6x3y10E", this);} // tgen
ccc::CC6x3y10 ::CC6x3y10(){ note_ctor("_ZN3ccc8CC6x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x3y10E, buf);
    ::ccc::CC6x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x3y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC6x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x3y10E);
    dp->::ccc::CC6x3y10::~CC6x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x3y10E(Test__ZN3ccc8CC6x3y10E, "_ZN3ccc8CC6x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x3y10C1Ev();
extern void _ZN3ccc8CC6x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x3y10E[] = {
  NSPAIR(_ZN3ccc8CC6x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC6x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC6x3y103pqrEv();
extern void _ZN3ccc8CC6x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x3y103abcEv,_ZTv0_n12_N3ccc8CC6x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y103abcEv,_ZThn4_N3ccc8CC6x3y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x3y103abcEv,_ZTv0_n12_N3ccc8CC6x3y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x3y10E[] = {
  {&(_ZTVN3ccc8CC6x3y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x3y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x3y10E[];
static VTBL_ENTRY alt_thunk_names446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x3y103abcEv,_ZTv0_n12_N3ccc8CC6x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x3y103abcEv,_ZThn4_N3ccc8CC6x3y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x3y10E = {  "_ZN3ccc8CC6x3y10E", // class name
  bases__ZN3ccc8CC6x3y10E, 2,
  &(vtc__ZN3ccc8CC6x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x3y10E),2, //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  DD6x3y10  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD6x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x3y103abcEv
  ~DD6x3y10(); // tgen
  DD6x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x3y10E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x3y103pqrEv");}
void  ccc::DD6x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x3y103abcEv");}
ccc::DD6x3y10 ::~DD6x3y10(){ note_dtor("_ZN3ccc8DD6x3y10E", this);} // tgen
ccc::DD6x3y10 ::DD6x3y10(){ note_ctor("_ZN3ccc8DD6x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x3y10E, buf);
    ::ccc::DD6x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x3y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD6x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x3y10E);
    dp->::ccc::DD6x3y10::~DD6x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x3y10E(Test__ZN3ccc8DD6x3y10E, "_ZN3ccc8DD6x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x3y10C1Ev();
extern void _ZN3ccc8DD6x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x3y10E[] = {
  NSPAIR(_ZN3ccc8DD6x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD6x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y10E[];
extern void _ZN3ccc8DD6x3y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x3y103pqrEv,_ZTv0_n16_N3ccc8DD6x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y103pqrEv,_ZThn4_N3ccc8DD6x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x3y103abcEv,_ZTv0_n20_N3ccc8DD6x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y103abcEv,_ZThn4_N3ccc8DD6x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x3y103pqrEv,_ZTv0_n16_N3ccc8DD6x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x3y103abcEv,_ZTv0_n20_N3ccc8DD6x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x3y10E[] = {
  {&(_ZTVN3ccc8DD6x3y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x3y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x3y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x3y10E[];
static VTBL_ENTRY alt_thunk_names447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x3y103abcEv,_ZTv0_n20_N3ccc8DD6x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y103abcEv,_ZThn4_N3ccc8DD6x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x3y103pqrEv,_ZTv0_n16_N3ccc8DD6x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y103pqrEv,_ZThn4_N3ccc8DD6x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x3y10E = {  "_ZN3ccc8DD6x3y10E", // class name
  bases__ZN3ccc8DD6x3y10E, 2,
  &(vtc__ZN3ccc8DD6x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x3y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x3y10E),3, //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  CC6x3y11  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC6x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x3y113efgEv
  ~CC6x3y11(); // tgen
  CC6x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y11E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x3y113pqrEv");}
void  ccc::CC6x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x3y113efgEv");}
ccc::CC6x3y11 ::~CC6x3y11(){ note_dtor("_ZN3ccc8CC6x3y11E", this);} // tgen
ccc::CC6x3y11 ::CC6x3y11(){ note_ctor("_ZN3ccc8CC6x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x3y11E, buf);
    ::ccc::CC6x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x3y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC6x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x3y11E);
    dp->::ccc::CC6x3y11::~CC6x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x3y11E(Test__ZN3ccc8CC6x3y11E, "_ZN3ccc8CC6x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x3y11C1Ev();
extern void _ZN3ccc8CC6x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x3y11E[] = {
  NSPAIR(_ZN3ccc8CC6x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC6x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x3y11E[];
extern void _ZN3ccc8CC6x3y113efgEv();
extern void _ZN3ccc8CC6x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x3y113efgEv,_ZTv0_n16_N3ccc8CC6x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y113efgEv,_ZThn4_N3ccc8CC6x3y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x3y113efgEv,_ZTv0_n16_N3ccc8CC6x3y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x3y11E[] = {
  {&(_ZTVN3ccc8CC6x3y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x3y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x3y11E[];
static VTBL_ENTRY alt_thunk_names448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x3y113efgEv,_ZTv0_n16_N3ccc8CC6x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x3y113efgEv,_ZThn4_N3ccc8CC6x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x3y11E = {  "_ZN3ccc8CC6x3y11E", // class name
  bases__ZN3ccc8CC6x3y11E, 2,
  &(vtc__ZN3ccc8CC6x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x3y11E),2, //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  DD6x3y11  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD6x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x3y113efgEv
  ~DD6x3y11(); // tgen
  DD6x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x3y11E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x3y113pqrEv");}
void  ccc::DD6x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x3y113efgEv");}
ccc::DD6x3y11 ::~DD6x3y11(){ note_dtor("_ZN3ccc8DD6x3y11E", this);} // tgen
ccc::DD6x3y11 ::DD6x3y11(){ note_ctor("_ZN3ccc8DD6x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x3y11E, buf);
    ::ccc::DD6x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x3y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD6x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x3y11E);
    dp->::ccc::DD6x3y11::~DD6x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x3y11E(Test__ZN3ccc8DD6x3y11E, "_ZN3ccc8DD6x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x3y11C1Ev();
extern void _ZN3ccc8DD6x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x3y11E[] = {
  NSPAIR(_ZN3ccc8DD6x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD6x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x3y113efgEv();
extern void _ZN3ccc8DD6x3y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x3y113efgEv,_ZTv0_n12_N3ccc8DD6x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y113efgEv,_ZThn4_N3ccc8DD6x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x3y113pqrEv,_ZTv0_n16_N3ccc8DD6x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y113pqrEv,_ZThn4_N3ccc8DD6x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x3y113efgEv,_ZTv0_n12_N3ccc8DD6x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x3y113pqrEv,_ZTv0_n16_N3ccc8DD6x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x3y11E[] = {
  {&(_ZTVN3ccc8DD6x3y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x3y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x3y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x3y11E[];
static VTBL_ENTRY alt_thunk_names449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x3y113pqrEv,_ZTv0_n16_N3ccc8DD6x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y113pqrEv,_ZThn4_N3ccc8DD6x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x3y113efgEv,_ZTv0_n12_N3ccc8DD6x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y113efgEv,_ZThn4_N3ccc8DD6x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x3y11E = {  "_ZN3ccc8DD6x3y11E", // class name
  bases__ZN3ccc8DD6x3y11E, 2,
  &(vtc__ZN3ccc8DD6x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x3y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x3y11E),3, //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  CC6x3y12  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC6x3y123abcEv
  ~CC6x3y12(); // tgen
  CC6x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC6x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x3y123abcEv");}
ccc::CC6x3y12 ::~CC6x3y12(){ note_dtor("_ZN3ccc8CC6x3y12E", this);} // tgen
ccc::CC6x3y12 ::CC6x3y12(){ note_ctor("_ZN3ccc8CC6x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x3y12E, buf);
    ::ccc::CC6x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x3y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC6x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x3y12E);
    dp->::ccc::CC6x3y12::~CC6x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x3y12E(Test__ZN3ccc8CC6x3y12E, "_ZN3ccc8CC6x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x3y12C1Ev();
extern void _ZN3ccc8CC6x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x3y12E[] = {
  NSPAIR(_ZN3ccc8CC6x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC6x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC6x3y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x3y123abcEv,_ZTv0_n12_N3ccc8CC6x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y123abcEv,_ZThn4_N3ccc8CC6x3y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x3y123abcEv,_ZTv0_n12_N3ccc8CC6x3y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x3y12E[] = {
  {&(_ZTVN3ccc8CC6x3y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x3y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x3y12E[];
static VTBL_ENTRY alt_thunk_names450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x3y123abcEv,_ZTv0_n12_N3ccc8CC6x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x3y123abcEv,_ZThn4_N3ccc8CC6x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x3y12E = {  "_ZN3ccc8CC6x3y12E", // class name
  bases__ZN3ccc8CC6x3y12E, 2,
  &(vtc__ZN3ccc8CC6x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x3y12E),2, //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  DD6x3y12  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD6x3y123abcEv
  ~DD6x3y12(); // tgen
  DD6x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x3y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD6x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x3y123abcEv");}
ccc::DD6x3y12 ::~DD6x3y12(){ note_dtor("_ZN3ccc8DD6x3y12E", this);} // tgen
ccc::DD6x3y12 ::DD6x3y12(){ note_ctor("_ZN3ccc8DD6x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x3y12E, buf);
    ::ccc::DD6x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x3y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD6x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x3y12E);
    dp->::ccc::DD6x3y12::~DD6x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x3y12E(Test__ZN3ccc8DD6x3y12E, "_ZN3ccc8DD6x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x3y12C1Ev();
extern void _ZN3ccc8DD6x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x3y12E[] = {
  NSPAIR(_ZN3ccc8DD6x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD6x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y12E[];
extern void _ZN3ccc8DD6x3y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x3y123abcEv,_ZTv0_n20_N3ccc8DD6x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y123abcEv,_ZThn4_N3ccc8DD6x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x3y123abcEv,_ZTv0_n20_N3ccc8DD6x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x3y12E[] = {
  {&(_ZTVN3ccc8DD6x3y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x3y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x3y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x3y12E[];
static VTBL_ENTRY alt_thunk_names451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x3y123abcEv,_ZTv0_n20_N3ccc8DD6x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y123abcEv,_ZThn4_N3ccc8DD6x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x3y12E = {  "_ZN3ccc8DD6x3y12E", // class name
  bases__ZN3ccc8DD6x3y12E, 2,
  &(vtc__ZN3ccc8DD6x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x3y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x3y12E),3, //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  CC6x3y13  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC6x3y133efgEv
  ~CC6x3y13(); // tgen
  CC6x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y13E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x3y133efgEv");}
ccc::CC6x3y13 ::~CC6x3y13(){ note_dtor("_ZN3ccc8CC6x3y13E", this);} // tgen
ccc::CC6x3y13 ::CC6x3y13(){ note_ctor("_ZN3ccc8CC6x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x3y13E, buf);
    ::ccc::CC6x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x3y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC6x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x3y13E);
    dp->::ccc::CC6x3y13::~CC6x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x3y13E(Test__ZN3ccc8CC6x3y13E, "_ZN3ccc8CC6x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x3y13C1Ev();
extern void _ZN3ccc8CC6x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x3y13E[] = {
  NSPAIR(_ZN3ccc8CC6x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC6x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x3y13E[];
extern void _ZN3ccc8CC6x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x3y133efgEv,_ZTv0_n16_N3ccc8CC6x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x3y133efgEv,_ZThn4_N3ccc8CC6x3y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x3y133efgEv,_ZTv0_n16_N3ccc8CC6x3y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x3y13E[] = {
  {&(_ZTVN3ccc8CC6x3y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x3y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x3y13E[];
static VTBL_ENTRY alt_thunk_names452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x3y133efgEv,_ZTv0_n16_N3ccc8CC6x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x3y133efgEv,_ZThn4_N3ccc8CC6x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x3y13E = {  "_ZN3ccc8CC6x3y13E", // class name
  bases__ZN3ccc8CC6x3y13E, 2,
  &(vtc__ZN3ccc8CC6x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x3y13E),2, //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  DD6x3y13  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD6x3y133efgEv
  ~DD6x3y13(); // tgen
  DD6x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x3y13E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x3y133efgEv");}
ccc::DD6x3y13 ::~DD6x3y13(){ note_dtor("_ZN3ccc8DD6x3y13E", this);} // tgen
ccc::DD6x3y13 ::DD6x3y13(){ note_ctor("_ZN3ccc8DD6x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x3y13E, buf);
    ::ccc::DD6x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x3y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD6x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x3y13E);
    dp->::ccc::DD6x3y13::~DD6x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x3y13E(Test__ZN3ccc8DD6x3y13E, "_ZN3ccc8DD6x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x3y13C1Ev();
extern void _ZN3ccc8DD6x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x3y13E[] = {
  NSPAIR(_ZN3ccc8DD6x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD6x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x3y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x3y133efgEv,_ZTv0_n12_N3ccc8DD6x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y133efgEv,_ZThn4_N3ccc8DD6x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x3y133efgEv,_ZTv0_n12_N3ccc8DD6x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x3y13E[] = {
  {&(_ZTVN3ccc8DD6x3y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x3y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x3y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x3y13E[];
static VTBL_ENTRY alt_thunk_names453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x3y133efgEv,_ZTv0_n12_N3ccc8DD6x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y133efgEv,_ZThn4_N3ccc8DD6x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x3y13E = {  "_ZN3ccc8DD6x3y13E", // class name
  bases__ZN3ccc8DD6x3y13E, 2,
  &(vtc__ZN3ccc8DD6x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x3y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x3y13E),3, //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  CC6x3y14  : virtual ::ccc::AA6 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC6x3y143pqrEv
  ~CC6x3y14(); // tgen
  CC6x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC6x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x3y143pqrEv");}
ccc::CC6x3y14 ::~CC6x3y14(){ note_dtor("_ZN3ccc8CC6x3y14E", this);} // tgen
ccc::CC6x3y14 ::CC6x3y14(){ note_ctor("_ZN3ccc8CC6x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x3y14E, buf);
    ::ccc::CC6x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x3y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC6x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x3y14E);
    dp->::ccc::CC6x3y14::~CC6x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x3y14E(Test__ZN3ccc8CC6x3y14E, "_ZN3ccc8CC6x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x3y14C1Ev();
extern void _ZN3ccc8CC6x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x3y14E[] = {
  NSPAIR(_ZN3ccc8CC6x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC6x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC6x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x3y14E[] = {
  {&(_ZTVN3ccc8CC6x3y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x3y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x3y14E[];
Class_Descriptor cd__ZN3ccc8CC6x3y14E = {  "_ZN3ccc8CC6x3y14E", // class name
  bases__ZN3ccc8CC6x3y14E, 2,
  &(vtc__ZN3ccc8CC6x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x3y14E),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  DD6x3y14  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD6x3y143pqrEv
  ~DD6x3y14(); // tgen
  DD6x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x3y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD6x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x3y143pqrEv");}
ccc::DD6x3y14 ::~DD6x3y14(){ note_dtor("_ZN3ccc8DD6x3y14E", this);} // tgen
ccc::DD6x3y14 ::DD6x3y14(){ note_ctor("_ZN3ccc8DD6x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x3y14E, buf);
    ::ccc::DD6x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x3y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD6x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x3y14E);
    dp->::ccc::DD6x3y14::~DD6x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x3y14E(Test__ZN3ccc8DD6x3y14E, "_ZN3ccc8DD6x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x3y14C1Ev();
extern void _ZN3ccc8DD6x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x3y14E[] = {
  NSPAIR(_ZN3ccc8DD6x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD6x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x3y143pqrEv,_ZTv0_n16_N3ccc8DD6x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x3y143pqrEv,_ZThn4_N3ccc8DD6x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x3y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x3y143pqrEv,_ZTv0_n16_N3ccc8DD6x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x3y14E[] = {
  {&(_ZTVN3ccc8DD6x3y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x3y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x3y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x3y14E[];
static VTBL_ENTRY alt_thunk_names454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x3y143pqrEv,_ZTv0_n16_N3ccc8DD6x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x3y143pqrEv,_ZThn4_N3ccc8DD6x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x3y14E = {  "_ZN3ccc8DD6x3y14E", // class name
  bases__ZN3ccc8DD6x3y14E, 2,
  &(vtc__ZN3ccc8DD6x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x3y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x3y14E),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  CC6x3y15  : virtual ::ccc::AA6 , ::ccc::BB3 {
  ~CC6x3y15(); // tgen
  CC6x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x3y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC6x3y15 ::~CC6x3y15(){ note_dtor("_ZN3ccc8CC6x3y15E", this);} // tgen
ccc::CC6x3y15 ::CC6x3y15(){ note_ctor("_ZN3ccc8CC6x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x3y15E, buf);
    ::ccc::CC6x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x3y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC6x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x3y15E);
    dp->::ccc::CC6x3y15::~CC6x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x3y15E(Test__ZN3ccc8CC6x3y15E, "_ZN3ccc8CC6x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x3y15C1Ev();
extern void _ZN3ccc8CC6x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x3y15E[] = {
  NSPAIR(_ZN3ccc8CC6x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC6x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x3y15E[] = {
  {&(_ZTVN3ccc8CC6x3y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x3y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x3y15E[];
Class_Descriptor cd__ZN3ccc8CC6x3y15E = {  "_ZN3ccc8CC6x3y15E", // class name
  bases__ZN3ccc8CC6x3y15E, 2,
  &(vtc__ZN3ccc8CC6x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x3y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x3y15E),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  DD6x3y15  : virtual ::ccc::AA6 , virtual ::ccc::BB3 {
  ~DD6x3y15(); // tgen
  DD6x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x3y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD6x3y15 ::~DD6x3y15(){ note_dtor("_ZN3ccc8DD6x3y15E", this);} // tgen
ccc::DD6x3y15 ::DD6x3y15(){ note_ctor("_ZN3ccc8DD6x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x3y15E, buf);
    ::ccc::DD6x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x3y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD6x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x3y15E);
    dp->::ccc::DD6x3y15::~DD6x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x3y15E(Test__ZN3ccc8DD6x3y15E, "_ZN3ccc8DD6x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x3y15C1Ev();
extern void _ZN3ccc8DD6x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x3y15E[] = {
  NSPAIR(_ZN3ccc8DD6x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD6x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x3y15E[] = {
  {&(_ZTVN3ccc8DD6x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x3y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x3y15E[];
Class_Descriptor cd__ZN3ccc8DD6x3y15E = {  "_ZN3ccc8DD6x3y15E", // class name
  bases__ZN3ccc8DD6x3y15E, 2,
  &(vtc__ZN3ccc8DD6x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x3y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x3y15E),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  CC6x4y0  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y03pqrEv
  ~CC6x4y0(); // tgen
  CC6x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y0E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y03abcEv");}
void  ccc::CC6x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y03efgEv");}
void  ccc::CC6x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y03pqrEv");}
ccc::CC6x4y0 ::~CC6x4y0(){ note_dtor("_ZN3ccc7CC6x4y0E", this);} // tgen
ccc::CC6x4y0 ::CC6x4y0(){ note_ctor("_ZN3ccc7CC6x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y0E, buf);
    ::ccc::CC6x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y0E);
    dp->::ccc::CC6x4y0::~CC6x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y0E(Test__ZN3ccc7CC6x4y0E, "_ZN3ccc7CC6x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y0C1Ev();
extern void _ZN3ccc7CC6x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y0E[] = {
  NSPAIR(_ZN3ccc7CC6x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y0E[];
extern void _ZN3ccc7CC6x4y03pqrEv();
extern void _ZN3ccc7CC6x4y03abcEv();
extern void _ZN3ccc7CC6x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y03abcEv,_ZTv0_n12_N3ccc7CC6x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y03abcEv,_ZThn4_N3ccc7CC6x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y03efgEv,_ZTv0_n16_N3ccc7CC6x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y03efgEv,_ZThn4_N3ccc7CC6x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y03abcEv,_ZTv0_n12_N3ccc7CC6x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y03efgEv,_ZTv0_n16_N3ccc7CC6x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y0E[] = {
  {&(_ZTVN3ccc7CC6x4y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y0E[];
static VTBL_ENTRY alt_thunk_names455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y03efgEv,_ZTv0_n16_N3ccc7CC6x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y03efgEv,_ZThn4_N3ccc7CC6x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y03abcEv,_ZTv0_n12_N3ccc7CC6x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y03abcEv,_ZThn4_N3ccc7CC6x4y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y0E = {  "_ZN3ccc7CC6x4y0E", // class name
  bases__ZN3ccc7CC6x4y0E, 2,
  &(vtc__ZN3ccc7CC6x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y0E),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  DD6x4y0  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD6x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x4y03pqrEv
  ~DD6x4y0(); // tgen
  DD6x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y0E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y03abcEv");}
void  ccc::DD6x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y03efgEv");}
void  ccc::DD6x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y03pqrEv");}
ccc::DD6x4y0 ::~DD6x4y0(){ note_dtor("_ZN3ccc7DD6x4y0E", this);} // tgen
ccc::DD6x4y0 ::DD6x4y0(){ note_ctor("_ZN3ccc7DD6x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y0E, buf);
    ::ccc::DD6x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y0E);
    dp->::ccc::DD6x4y0::~DD6x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y0E(Test__ZN3ccc7DD6x4y0E, "_ZN3ccc7DD6x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y0C1Ev();
extern void _ZN3ccc7DD6x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y0E[] = {
  NSPAIR(_ZN3ccc7DD6x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y0E[];
extern void _ZN3ccc7DD6x4y03abcEv();
extern void _ZN3ccc7DD6x4y03efgEv();
extern void _ZN3ccc7DD6x4y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y03pqrEv,_ZTv0_n12_N3ccc7DD6x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y03pqrEv,_ZThn4_N3ccc7DD6x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y03abcEv,_ZTv0_n16_N3ccc7DD6x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y03abcEv,_ZThn4_N3ccc7DD6x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y03efgEv,_ZTv0_n20_N3ccc7DD6x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y03efgEv,_ZThn4_N3ccc7DD6x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y03pqrEv,_ZTv0_n12_N3ccc7DD6x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y03abcEv,_ZTv0_n16_N3ccc7DD6x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y03efgEv,_ZTv0_n20_N3ccc7DD6x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y0E[] = {
  {&(_ZTVN3ccc7DD6x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y0E[];
static VTBL_ENTRY alt_thunk_names456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y03efgEv,_ZTv0_n20_N3ccc7DD6x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y03efgEv,_ZThn4_N3ccc7DD6x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y03abcEv,_ZTv0_n16_N3ccc7DD6x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y03abcEv,_ZThn4_N3ccc7DD6x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y03pqrEv,_ZTv0_n12_N3ccc7DD6x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y03pqrEv,_ZThn4_N3ccc7DD6x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y0E = {  "_ZN3ccc7DD6x4y0E", // class name
  bases__ZN3ccc7DD6x4y0E, 2,
  &(vtc__ZN3ccc7DD6x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y0E),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  CC6x4y1  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x4y13efgEv
  ~CC6x4y1(); // tgen
  CC6x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y1E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y13abcEv");}
void  ccc::CC6x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y13pqrEv");}
void  ccc::CC6x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y13efgEv");}
ccc::CC6x4y1 ::~CC6x4y1(){ note_dtor("_ZN3ccc7CC6x4y1E", this);} // tgen
ccc::CC6x4y1 ::CC6x4y1(){ note_ctor("_ZN3ccc7CC6x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y1E, buf);
    ::ccc::CC6x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y1E);
    dp->::ccc::CC6x4y1::~CC6x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y1E(Test__ZN3ccc7CC6x4y1E, "_ZN3ccc7CC6x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y1C1Ev();
extern void _ZN3ccc7CC6x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y1E[] = {
  NSPAIR(_ZN3ccc7CC6x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y1E[];
extern void _ZN3ccc7CC6x4y13pqrEv();
extern void _ZN3ccc7CC6x4y13abcEv();
extern void _ZN3ccc7CC6x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y13abcEv,_ZTv0_n12_N3ccc7CC6x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y13abcEv,_ZThn4_N3ccc7CC6x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y13efgEv,_ZTv0_n16_N3ccc7CC6x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y13efgEv,_ZThn4_N3ccc7CC6x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y13abcEv,_ZTv0_n12_N3ccc7CC6x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y13efgEv,_ZTv0_n16_N3ccc7CC6x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y1E[] = {
  {&(_ZTVN3ccc7CC6x4y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y1E[];
static VTBL_ENTRY alt_thunk_names457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y13efgEv,_ZTv0_n16_N3ccc7CC6x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y13efgEv,_ZThn4_N3ccc7CC6x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y13abcEv,_ZTv0_n12_N3ccc7CC6x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y13abcEv,_ZThn4_N3ccc7CC6x4y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y1E = {  "_ZN3ccc7CC6x4y1E", // class name
  bases__ZN3ccc7CC6x4y1E, 2,
  &(vtc__ZN3ccc7CC6x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y1E),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  DD6x4y1  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD6x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x4y13efgEv
  ~DD6x4y1(); // tgen
  DD6x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y1E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y13abcEv");}
void  ccc::DD6x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y13pqrEv");}
void  ccc::DD6x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y13efgEv");}
ccc::DD6x4y1 ::~DD6x4y1(){ note_dtor("_ZN3ccc7DD6x4y1E", this);} // tgen
ccc::DD6x4y1 ::DD6x4y1(){ note_ctor("_ZN3ccc7DD6x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y1E, buf);
    ::ccc::DD6x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y1E);
    dp->::ccc::DD6x4y1::~DD6x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y1E(Test__ZN3ccc7DD6x4y1E, "_ZN3ccc7DD6x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y1C1Ev();
extern void _ZN3ccc7DD6x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y1E[] = {
  NSPAIR(_ZN3ccc7DD6x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y1E[];
extern void _ZN3ccc7DD6x4y13abcEv();
extern void _ZN3ccc7DD6x4y13efgEv();
extern void _ZN3ccc7DD6x4y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y13pqrEv,_ZTv0_n12_N3ccc7DD6x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y13pqrEv,_ZThn4_N3ccc7DD6x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y13abcEv,_ZTv0_n16_N3ccc7DD6x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y13abcEv,_ZThn4_N3ccc7DD6x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y13efgEv,_ZTv0_n20_N3ccc7DD6x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y13efgEv,_ZThn4_N3ccc7DD6x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y13pqrEv,_ZTv0_n12_N3ccc7DD6x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y13abcEv,_ZTv0_n16_N3ccc7DD6x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y13efgEv,_ZTv0_n20_N3ccc7DD6x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y1E[] = {
  {&(_ZTVN3ccc7DD6x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y1E[];
static VTBL_ENTRY alt_thunk_names458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y13efgEv,_ZTv0_n20_N3ccc7DD6x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y13efgEv,_ZThn4_N3ccc7DD6x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y13abcEv,_ZTv0_n16_N3ccc7DD6x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y13abcEv,_ZThn4_N3ccc7DD6x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y13pqrEv,_ZTv0_n12_N3ccc7DD6x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y13pqrEv,_ZThn4_N3ccc7DD6x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y1E = {  "_ZN3ccc7DD6x4y1E", // class name
  bases__ZN3ccc7DD6x4y1E, 2,
  &(vtc__ZN3ccc7DD6x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y1E),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  CC6x4y2  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y23pqrEv
  ~CC6x4y2(); // tgen
  CC6x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y2E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y23efgEv");}
void  ccc::CC6x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y23abcEv");}
void  ccc::CC6x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y23pqrEv");}
ccc::CC6x4y2 ::~CC6x4y2(){ note_dtor("_ZN3ccc7CC6x4y2E", this);} // tgen
ccc::CC6x4y2 ::CC6x4y2(){ note_ctor("_ZN3ccc7CC6x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y2E, buf);
    ::ccc::CC6x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y2E);
    dp->::ccc::CC6x4y2::~CC6x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y2E(Test__ZN3ccc7CC6x4y2E, "_ZN3ccc7CC6x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y2C1Ev();
extern void _ZN3ccc7CC6x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y2E[] = {
  NSPAIR(_ZN3ccc7CC6x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y2E[];
extern void _ZN3ccc7CC6x4y23pqrEv();
extern void _ZN3ccc7CC6x4y23abcEv();
extern void _ZN3ccc7CC6x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y23abcEv,_ZTv0_n12_N3ccc7CC6x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y23abcEv,_ZThn4_N3ccc7CC6x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y23efgEv,_ZTv0_n16_N3ccc7CC6x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y23efgEv,_ZThn4_N3ccc7CC6x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y23abcEv,_ZTv0_n12_N3ccc7CC6x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y23efgEv,_ZTv0_n16_N3ccc7CC6x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y2E[] = {
  {&(_ZTVN3ccc7CC6x4y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y2E[];
static VTBL_ENTRY alt_thunk_names459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y23efgEv,_ZTv0_n16_N3ccc7CC6x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y23efgEv,_ZThn4_N3ccc7CC6x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y23abcEv,_ZTv0_n12_N3ccc7CC6x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y23abcEv,_ZThn4_N3ccc7CC6x4y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y2E = {  "_ZN3ccc7CC6x4y2E", // class name
  bases__ZN3ccc7CC6x4y2E, 2,
  &(vtc__ZN3ccc7CC6x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y2E),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  DD6x4y2  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD6x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x4y23pqrEv
  ~DD6x4y2(); // tgen
  DD6x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y2E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y23efgEv");}
void  ccc::DD6x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y23abcEv");}
void  ccc::DD6x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y23pqrEv");}
ccc::DD6x4y2 ::~DD6x4y2(){ note_dtor("_ZN3ccc7DD6x4y2E", this);} // tgen
ccc::DD6x4y2 ::DD6x4y2(){ note_ctor("_ZN3ccc7DD6x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y2E, buf);
    ::ccc::DD6x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y2E);
    dp->::ccc::DD6x4y2::~DD6x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y2E(Test__ZN3ccc7DD6x4y2E, "_ZN3ccc7DD6x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y2C1Ev();
extern void _ZN3ccc7DD6x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y2E[] = {
  NSPAIR(_ZN3ccc7DD6x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y2E[];
extern void _ZN3ccc7DD6x4y23abcEv();
extern void _ZN3ccc7DD6x4y23efgEv();
extern void _ZN3ccc7DD6x4y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y23pqrEv,_ZTv0_n12_N3ccc7DD6x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y23pqrEv,_ZThn4_N3ccc7DD6x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y23abcEv,_ZTv0_n16_N3ccc7DD6x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y23abcEv,_ZThn4_N3ccc7DD6x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y23efgEv,_ZTv0_n20_N3ccc7DD6x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y23efgEv,_ZThn4_N3ccc7DD6x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y23pqrEv,_ZTv0_n12_N3ccc7DD6x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y23abcEv,_ZTv0_n16_N3ccc7DD6x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y23efgEv,_ZTv0_n20_N3ccc7DD6x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y2E[] = {
  {&(_ZTVN3ccc7DD6x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y2E[];
static VTBL_ENTRY alt_thunk_names460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y23efgEv,_ZTv0_n20_N3ccc7DD6x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y23efgEv,_ZThn4_N3ccc7DD6x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y23abcEv,_ZTv0_n16_N3ccc7DD6x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y23abcEv,_ZThn4_N3ccc7DD6x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y23pqrEv,_ZTv0_n12_N3ccc7DD6x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y23pqrEv,_ZThn4_N3ccc7DD6x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y2E = {  "_ZN3ccc7DD6x4y2E", // class name
  bases__ZN3ccc7DD6x4y2E, 2,
  &(vtc__ZN3ccc7DD6x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y2E),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  CC6x4y3  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x4y33abcEv
  ~CC6x4y3(); // tgen
  CC6x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y3E) C1{ VBC2{ v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y33efgEv");}
void  ccc::CC6x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y33pqrEv");}
void  ccc::CC6x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y33abcEv");}
ccc::CC6x4y3 ::~CC6x4y3(){ note_dtor("_ZN3ccc7CC6x4y3E", this);} // tgen
ccc::CC6x4y3 ::CC6x4y3(){ note_ctor("_ZN3ccc7CC6x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y3E, buf);
    ::ccc::CC6x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y3E);
    dp->::ccc::CC6x4y3::~CC6x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y3E(Test__ZN3ccc7CC6x4y3E, "_ZN3ccc7CC6x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y3C1Ev();
extern void _ZN3ccc7CC6x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y3E[] = {
  NSPAIR(_ZN3ccc7CC6x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y3E[];
extern void _ZN3ccc7CC6x4y33pqrEv();
extern void _ZN3ccc7CC6x4y33abcEv();
extern void _ZN3ccc7CC6x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y33abcEv,_ZTv0_n12_N3ccc7CC6x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y33abcEv,_ZThn4_N3ccc7CC6x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y33efgEv,_ZTv0_n16_N3ccc7CC6x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y33efgEv,_ZThn4_N3ccc7CC6x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y33abcEv,_ZTv0_n12_N3ccc7CC6x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y33efgEv,_ZTv0_n16_N3ccc7CC6x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y3E[] = {
  {&(_ZTVN3ccc7CC6x4y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y3E[];
static VTBL_ENTRY alt_thunk_names461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y33efgEv,_ZTv0_n16_N3ccc7CC6x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y33efgEv,_ZThn4_N3ccc7CC6x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y33abcEv,_ZTv0_n12_N3ccc7CC6x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y33abcEv,_ZThn4_N3ccc7CC6x4y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y3E = {  "_ZN3ccc7CC6x4y3E", // class name
  bases__ZN3ccc7CC6x4y3E, 2,
  &(vtc__ZN3ccc7CC6x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y3E),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  DD6x4y3  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD6x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x4y33abcEv
  ~DD6x4y3(); // tgen
  DD6x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y3E) C1{ VBC2{ v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y33efgEv");}
void  ccc::DD6x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y33pqrEv");}
void  ccc::DD6x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y33abcEv");}
ccc::DD6x4y3 ::~DD6x4y3(){ note_dtor("_ZN3ccc7DD6x4y3E", this);} // tgen
ccc::DD6x4y3 ::DD6x4y3(){ note_ctor("_ZN3ccc7DD6x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y3E, buf);
    ::ccc::DD6x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y3E);
    dp->::ccc::DD6x4y3::~DD6x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y3E(Test__ZN3ccc7DD6x4y3E, "_ZN3ccc7DD6x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y3C1Ev();
extern void _ZN3ccc7DD6x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y3E[] = {
  NSPAIR(_ZN3ccc7DD6x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y3E[];
extern void _ZN3ccc7DD6x4y33abcEv();
extern void _ZN3ccc7DD6x4y33efgEv();
extern void _ZN3ccc7DD6x4y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y33pqrEv,_ZTv0_n12_N3ccc7DD6x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y33pqrEv,_ZThn4_N3ccc7DD6x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y33abcEv,_ZTv0_n16_N3ccc7DD6x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y33abcEv,_ZThn4_N3ccc7DD6x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y33efgEv,_ZTv0_n20_N3ccc7DD6x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y33efgEv,_ZThn4_N3ccc7DD6x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y33pqrEv,_ZTv0_n12_N3ccc7DD6x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y33abcEv,_ZTv0_n16_N3ccc7DD6x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y33efgEv,_ZTv0_n20_N3ccc7DD6x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y3E[] = {
  {&(_ZTVN3ccc7DD6x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y3E[];
static VTBL_ENTRY alt_thunk_names462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y33efgEv,_ZTv0_n20_N3ccc7DD6x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y33efgEv,_ZThn4_N3ccc7DD6x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y33abcEv,_ZTv0_n16_N3ccc7DD6x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y33abcEv,_ZThn4_N3ccc7DD6x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y33pqrEv,_ZTv0_n12_N3ccc7DD6x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y33pqrEv,_ZThn4_N3ccc7DD6x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y3E = {  "_ZN3ccc7DD6x4y3E", // class name
  bases__ZN3ccc7DD6x4y3E, 2,
  &(vtc__ZN3ccc7DD6x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y3E),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  CC6x4y4  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC6x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x4y43efgEv
  ~CC6x4y4(); // tgen
  CC6x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y4E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y43pqrEv");}
void  ccc::CC6x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y43abcEv");}
void  ccc::CC6x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y43efgEv");}
ccc::CC6x4y4 ::~CC6x4y4(){ note_dtor("_ZN3ccc7CC6x4y4E", this);} // tgen
ccc::CC6x4y4 ::CC6x4y4(){ note_ctor("_ZN3ccc7CC6x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y4E, buf);
    ::ccc::CC6x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y4E);
    dp->::ccc::CC6x4y4::~CC6x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y4E(Test__ZN3ccc7CC6x4y4E, "_ZN3ccc7CC6x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y4C1Ev();
extern void _ZN3ccc7CC6x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y4E[] = {
  NSPAIR(_ZN3ccc7CC6x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y4E[];
extern void _ZN3ccc7CC6x4y43pqrEv();
extern void _ZN3ccc7CC6x4y43abcEv();
extern void _ZN3ccc7CC6x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y43abcEv,_ZTv0_n12_N3ccc7CC6x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y43abcEv,_ZThn4_N3ccc7CC6x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y43efgEv,_ZTv0_n16_N3ccc7CC6x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y43efgEv,_ZThn4_N3ccc7CC6x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y43abcEv,_ZTv0_n12_N3ccc7CC6x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y43efgEv,_ZTv0_n16_N3ccc7CC6x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y4E[] = {
  {&(_ZTVN3ccc7CC6x4y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y4E[];
static VTBL_ENTRY alt_thunk_names463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y43efgEv,_ZTv0_n16_N3ccc7CC6x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y43efgEv,_ZThn4_N3ccc7CC6x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y43abcEv,_ZTv0_n12_N3ccc7CC6x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y43abcEv,_ZThn4_N3ccc7CC6x4y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y4E = {  "_ZN3ccc7CC6x4y4E", // class name
  bases__ZN3ccc7CC6x4y4E, 2,
  &(vtc__ZN3ccc7CC6x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y4E),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  DD6x4y4  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD6x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x4y43efgEv
  ~DD6x4y4(); // tgen
  DD6x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y4E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y43pqrEv");}
void  ccc::DD6x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y43abcEv");}
void  ccc::DD6x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y43efgEv");}
ccc::DD6x4y4 ::~DD6x4y4(){ note_dtor("_ZN3ccc7DD6x4y4E", this);} // tgen
ccc::DD6x4y4 ::DD6x4y4(){ note_ctor("_ZN3ccc7DD6x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y4E, buf);
    ::ccc::DD6x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y4E);
    dp->::ccc::DD6x4y4::~DD6x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y4E(Test__ZN3ccc7DD6x4y4E, "_ZN3ccc7DD6x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y4C1Ev();
extern void _ZN3ccc7DD6x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y4E[] = {
  NSPAIR(_ZN3ccc7DD6x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y4E[];
extern void _ZN3ccc7DD6x4y43abcEv();
extern void _ZN3ccc7DD6x4y43efgEv();
extern void _ZN3ccc7DD6x4y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y43pqrEv,_ZTv0_n12_N3ccc7DD6x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y43pqrEv,_ZThn4_N3ccc7DD6x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y43abcEv,_ZTv0_n16_N3ccc7DD6x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y43abcEv,_ZThn4_N3ccc7DD6x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y43efgEv,_ZTv0_n20_N3ccc7DD6x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y43efgEv,_ZThn4_N3ccc7DD6x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y43pqrEv,_ZTv0_n12_N3ccc7DD6x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y43abcEv,_ZTv0_n16_N3ccc7DD6x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y43efgEv,_ZTv0_n20_N3ccc7DD6x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y4E[] = {
  {&(_ZTVN3ccc7DD6x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y4E[];
static VTBL_ENTRY alt_thunk_names464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y43efgEv,_ZTv0_n20_N3ccc7DD6x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y43efgEv,_ZThn4_N3ccc7DD6x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y43abcEv,_ZTv0_n16_N3ccc7DD6x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y43abcEv,_ZThn4_N3ccc7DD6x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y43pqrEv,_ZTv0_n12_N3ccc7DD6x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y43pqrEv,_ZThn4_N3ccc7DD6x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y4E = {  "_ZN3ccc7DD6x4y4E", // class name
  bases__ZN3ccc7DD6x4y4E, 2,
  &(vtc__ZN3ccc7DD6x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y4E),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  CC6x4y5  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC6x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x4y53abcEv
  ~CC6x4y5(); // tgen
  CC6x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y5E) C1{ VBC2{ v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y53pqrEv");}
void  ccc::CC6x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y53efgEv");}
void  ccc::CC6x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y53abcEv");}
ccc::CC6x4y5 ::~CC6x4y5(){ note_dtor("_ZN3ccc7CC6x4y5E", this);} // tgen
ccc::CC6x4y5 ::CC6x4y5(){ note_ctor("_ZN3ccc7CC6x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y5E, buf);
    ::ccc::CC6x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y5E);
    dp->::ccc::CC6x4y5::~CC6x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y5E(Test__ZN3ccc7CC6x4y5E, "_ZN3ccc7CC6x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y5C1Ev();
extern void _ZN3ccc7CC6x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y5E[] = {
  NSPAIR(_ZN3ccc7CC6x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y5E[];
extern void _ZN3ccc7CC6x4y53pqrEv();
extern void _ZN3ccc7CC6x4y53abcEv();
extern void _ZN3ccc7CC6x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y53abcEv,_ZTv0_n12_N3ccc7CC6x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y53abcEv,_ZThn4_N3ccc7CC6x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y53efgEv,_ZTv0_n16_N3ccc7CC6x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y53efgEv,_ZThn4_N3ccc7CC6x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y53abcEv,_ZTv0_n12_N3ccc7CC6x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y53efgEv,_ZTv0_n16_N3ccc7CC6x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y5E[] = {
  {&(_ZTVN3ccc7CC6x4y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y5E[];
static VTBL_ENTRY alt_thunk_names465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y53efgEv,_ZTv0_n16_N3ccc7CC6x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y53efgEv,_ZThn4_N3ccc7CC6x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y53abcEv,_ZTv0_n12_N3ccc7CC6x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y53abcEv,_ZThn4_N3ccc7CC6x4y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y5E = {  "_ZN3ccc7CC6x4y5E", // class name
  bases__ZN3ccc7CC6x4y5E, 2,
  &(vtc__ZN3ccc7CC6x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y5E),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  DD6x4y5  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD6x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x4y53abcEv
  ~DD6x4y5(); // tgen
  DD6x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y5E) C1{ VBC2{ v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y53pqrEv");}
void  ccc::DD6x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y53efgEv");}
void  ccc::DD6x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y53abcEv");}
ccc::DD6x4y5 ::~DD6x4y5(){ note_dtor("_ZN3ccc7DD6x4y5E", this);} // tgen
ccc::DD6x4y5 ::DD6x4y5(){ note_ctor("_ZN3ccc7DD6x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y5E, buf);
    ::ccc::DD6x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y5E);
    dp->::ccc::DD6x4y5::~DD6x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y5E(Test__ZN3ccc7DD6x4y5E, "_ZN3ccc7DD6x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y5C1Ev();
extern void _ZN3ccc7DD6x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y5E[] = {
  NSPAIR(_ZN3ccc7DD6x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y5E[];
extern void _ZN3ccc7DD6x4y53abcEv();
extern void _ZN3ccc7DD6x4y53efgEv();
extern void _ZN3ccc7DD6x4y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y53pqrEv,_ZTv0_n12_N3ccc7DD6x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y53pqrEv,_ZThn4_N3ccc7DD6x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y53abcEv,_ZTv0_n16_N3ccc7DD6x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y53abcEv,_ZThn4_N3ccc7DD6x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y53efgEv,_ZTv0_n20_N3ccc7DD6x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y53efgEv,_ZThn4_N3ccc7DD6x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y53pqrEv,_ZTv0_n12_N3ccc7DD6x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y53abcEv,_ZTv0_n16_N3ccc7DD6x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y53efgEv,_ZTv0_n20_N3ccc7DD6x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y5E[] = {
  {&(_ZTVN3ccc7DD6x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y5E[];
static VTBL_ENTRY alt_thunk_names466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y53efgEv,_ZTv0_n20_N3ccc7DD6x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y53efgEv,_ZThn4_N3ccc7DD6x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y53abcEv,_ZTv0_n16_N3ccc7DD6x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y53abcEv,_ZThn4_N3ccc7DD6x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y53pqrEv,_ZTv0_n12_N3ccc7DD6x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y53pqrEv,_ZThn4_N3ccc7DD6x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y5E = {  "_ZN3ccc7DD6x4y5E", // class name
  bases__ZN3ccc7DD6x4y5E, 2,
  &(vtc__ZN3ccc7DD6x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y5E),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  CC6x4y6  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x4y63efgEv
  ~CC6x4y6(); // tgen
  CC6x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y6E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y63abcEv");}
void  ccc::CC6x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y63efgEv");}
ccc::CC6x4y6 ::~CC6x4y6(){ note_dtor("_ZN3ccc7CC6x4y6E", this);} // tgen
ccc::CC6x4y6 ::CC6x4y6(){ note_ctor("_ZN3ccc7CC6x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y6E, buf);
    ::ccc::CC6x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y6E);
    dp->::ccc::CC6x4y6::~CC6x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y6E(Test__ZN3ccc7CC6x4y6E, "_ZN3ccc7CC6x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y6C1Ev();
extern void _ZN3ccc7CC6x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y6E[] = {
  NSPAIR(_ZN3ccc7CC6x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC6x4y63abcEv();
extern void _ZN3ccc7CC6x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y63abcEv,_ZTv0_n12_N3ccc7CC6x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y63abcEv,_ZThn4_N3ccc7CC6x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y63efgEv,_ZTv0_n16_N3ccc7CC6x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y63efgEv,_ZThn4_N3ccc7CC6x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y63abcEv,_ZTv0_n12_N3ccc7CC6x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y63efgEv,_ZTv0_n16_N3ccc7CC6x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y6E[] = {
  {&(_ZTVN3ccc7CC6x4y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y6E[];
static VTBL_ENTRY alt_thunk_names467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y63efgEv,_ZTv0_n16_N3ccc7CC6x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y63efgEv,_ZThn4_N3ccc7CC6x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y63abcEv,_ZTv0_n12_N3ccc7CC6x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y63abcEv,_ZThn4_N3ccc7CC6x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y6E = {  "_ZN3ccc7CC6x4y6E", // class name
  bases__ZN3ccc7CC6x4y6E, 2,
  &(vtc__ZN3ccc7CC6x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y6E),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  DD6x4y6  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD6x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x4y63efgEv
  ~DD6x4y6(); // tgen
  DD6x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y6E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y63abcEv");}
void  ccc::DD6x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y63efgEv");}
ccc::DD6x4y6 ::~DD6x4y6(){ note_dtor("_ZN3ccc7DD6x4y6E", this);} // tgen
ccc::DD6x4y6 ::DD6x4y6(){ note_ctor("_ZN3ccc7DD6x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y6E, buf);
    ::ccc::DD6x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y6E);
    dp->::ccc::DD6x4y6::~DD6x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y6E(Test__ZN3ccc7DD6x4y6E, "_ZN3ccc7DD6x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y6C1Ev();
extern void _ZN3ccc7DD6x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y6E[] = {
  NSPAIR(_ZN3ccc7DD6x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y6E[];
extern void _ZN3ccc7DD6x4y63abcEv();
extern void _ZN3ccc7DD6x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y63abcEv,_ZTv0_n16_N3ccc7DD6x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y63abcEv,_ZThn4_N3ccc7DD6x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y63efgEv,_ZTv0_n20_N3ccc7DD6x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y63efgEv,_ZThn4_N3ccc7DD6x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y63abcEv,_ZTv0_n16_N3ccc7DD6x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y63efgEv,_ZTv0_n20_N3ccc7DD6x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y6E[] = {
  {&(_ZTVN3ccc7DD6x4y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x4y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x4y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y6E[];
static VTBL_ENTRY alt_thunk_names468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y63efgEv,_ZTv0_n20_N3ccc7DD6x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y63efgEv,_ZThn4_N3ccc7DD6x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y63abcEv,_ZTv0_n16_N3ccc7DD6x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y63abcEv,_ZThn4_N3ccc7DD6x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y6E = {  "_ZN3ccc7DD6x4y6E", // class name
  bases__ZN3ccc7DD6x4y6E, 2,
  &(vtc__ZN3ccc7DD6x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y6E),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  CC6x4y7  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC6x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y73pqrEv
  ~CC6x4y7(); // tgen
  CC6x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y7E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y73abcEv");}
void  ccc::CC6x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y73pqrEv");}
ccc::CC6x4y7 ::~CC6x4y7(){ note_dtor("_ZN3ccc7CC6x4y7E", this);} // tgen
ccc::CC6x4y7 ::CC6x4y7(){ note_ctor("_ZN3ccc7CC6x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y7E, buf);
    ::ccc::CC6x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y7E);
    dp->::ccc::CC6x4y7::~CC6x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y7E(Test__ZN3ccc7CC6x4y7E, "_ZN3ccc7CC6x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y7C1Ev();
extern void _ZN3ccc7CC6x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y7E[] = {
  NSPAIR(_ZN3ccc7CC6x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y7E[];
extern void _ZN3ccc7CC6x4y73pqrEv();
extern void _ZN3ccc7CC6x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y73abcEv,_ZTv0_n12_N3ccc7CC6x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y73abcEv,_ZThn4_N3ccc7CC6x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y73abcEv,_ZTv0_n12_N3ccc7CC6x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y7E[] = {
  {&(_ZTVN3ccc7CC6x4y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y7E[];
static VTBL_ENTRY alt_thunk_names469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y73abcEv,_ZTv0_n12_N3ccc7CC6x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y73abcEv,_ZThn4_N3ccc7CC6x4y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y7E = {  "_ZN3ccc7CC6x4y7E", // class name
  bases__ZN3ccc7CC6x4y7E, 2,
  &(vtc__ZN3ccc7CC6x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y7E),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  DD6x4y7  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD6x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x4y73pqrEv
  ~DD6x4y7(); // tgen
  DD6x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y7E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y73abcEv");}
void  ccc::DD6x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y73pqrEv");}
ccc::DD6x4y7 ::~DD6x4y7(){ note_dtor("_ZN3ccc7DD6x4y7E", this);} // tgen
ccc::DD6x4y7 ::DD6x4y7(){ note_ctor("_ZN3ccc7DD6x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y7E, buf);
    ::ccc::DD6x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y7E);
    dp->::ccc::DD6x4y7::~DD6x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y7E(Test__ZN3ccc7DD6x4y7E, "_ZN3ccc7DD6x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y7C1Ev();
extern void _ZN3ccc7DD6x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y7E[] = {
  NSPAIR(_ZN3ccc7DD6x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y7E[];
extern void _ZN3ccc7DD6x4y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x4y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y73pqrEv,_ZTv0_n12_N3ccc7DD6x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y73pqrEv,_ZThn4_N3ccc7DD6x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y73abcEv,_ZTv0_n16_N3ccc7DD6x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y73abcEv,_ZThn4_N3ccc7DD6x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y73pqrEv,_ZTv0_n12_N3ccc7DD6x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y73abcEv,_ZTv0_n16_N3ccc7DD6x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y7E[] = {
  {&(_ZTVN3ccc7DD6x4y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y7E[];
static VTBL_ENTRY alt_thunk_names470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y73abcEv,_ZTv0_n16_N3ccc7DD6x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y73abcEv,_ZThn4_N3ccc7DD6x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y73pqrEv,_ZTv0_n12_N3ccc7DD6x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y73pqrEv,_ZThn4_N3ccc7DD6x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y7E = {  "_ZN3ccc7DD6x4y7E", // class name
  bases__ZN3ccc7DD6x4y7E, 2,
  &(vtc__ZN3ccc7DD6x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y7E),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  CC6x4y8  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x4y83abcEv
  ~CC6x4y8(); // tgen
  CC6x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y8E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y83efgEv");}
void  ccc::CC6x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x4y83abcEv");}
ccc::CC6x4y8 ::~CC6x4y8(){ note_dtor("_ZN3ccc7CC6x4y8E", this);} // tgen
ccc::CC6x4y8 ::CC6x4y8(){ note_ctor("_ZN3ccc7CC6x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y8E, buf);
    ::ccc::CC6x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y8E);
    dp->::ccc::CC6x4y8::~CC6x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y8E(Test__ZN3ccc7CC6x4y8E, "_ZN3ccc7CC6x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y8C1Ev();
extern void _ZN3ccc7CC6x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y8E[] = {
  NSPAIR(_ZN3ccc7CC6x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC6x4y83abcEv();
extern void _ZN3ccc7CC6x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x4y83abcEv,_ZTv0_n12_N3ccc7CC6x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y83abcEv,_ZThn4_N3ccc7CC6x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y83efgEv,_ZTv0_n16_N3ccc7CC6x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y83efgEv,_ZThn4_N3ccc7CC6x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x4y83abcEv,_ZTv0_n12_N3ccc7CC6x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y83efgEv,_ZTv0_n16_N3ccc7CC6x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y8E[] = {
  {&(_ZTVN3ccc7CC6x4y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y8E[];
static VTBL_ENTRY alt_thunk_names471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y83efgEv,_ZTv0_n16_N3ccc7CC6x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y83efgEv,_ZThn4_N3ccc7CC6x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x4y83abcEv,_ZTv0_n12_N3ccc7CC6x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y83abcEv,_ZThn4_N3ccc7CC6x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y8E = {  "_ZN3ccc7CC6x4y8E", // class name
  bases__ZN3ccc7CC6x4y8E, 2,
  &(vtc__ZN3ccc7CC6x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y8E),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  DD6x4y8  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD6x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x4y83abcEv
  ~DD6x4y8(); // tgen
  DD6x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y8E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y83efgEv");}
void  ccc::DD6x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x4y83abcEv");}
ccc::DD6x4y8 ::~DD6x4y8(){ note_dtor("_ZN3ccc7DD6x4y8E", this);} // tgen
ccc::DD6x4y8 ::DD6x4y8(){ note_ctor("_ZN3ccc7DD6x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y8E, buf);
    ::ccc::DD6x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y8E);
    dp->::ccc::DD6x4y8::~DD6x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y8E(Test__ZN3ccc7DD6x4y8E, "_ZN3ccc7DD6x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y8C1Ev();
extern void _ZN3ccc7DD6x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y8E[] = {
  NSPAIR(_ZN3ccc7DD6x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y8E[];
extern void _ZN3ccc7DD6x4y83abcEv();
extern void _ZN3ccc7DD6x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x4y83abcEv,_ZTv0_n16_N3ccc7DD6x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y83abcEv,_ZThn4_N3ccc7DD6x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y83efgEv,_ZTv0_n20_N3ccc7DD6x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y83efgEv,_ZThn4_N3ccc7DD6x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x4y83abcEv,_ZTv0_n16_N3ccc7DD6x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y83efgEv,_ZTv0_n20_N3ccc7DD6x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y8E[] = {
  {&(_ZTVN3ccc7DD6x4y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x4y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x4y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y8E[];
static VTBL_ENTRY alt_thunk_names472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y83efgEv,_ZTv0_n20_N3ccc7DD6x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y83efgEv,_ZThn4_N3ccc7DD6x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x4y83abcEv,_ZTv0_n16_N3ccc7DD6x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y83abcEv,_ZThn4_N3ccc7DD6x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y8E = {  "_ZN3ccc7DD6x4y8E", // class name
  bases__ZN3ccc7DD6x4y8E, 2,
  &(vtc__ZN3ccc7DD6x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y8E),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  CC6x4y9  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC6x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x4y93pqrEv
  ~CC6x4y9(); // tgen
  CC6x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x4y9E) C1{ VBC2{ v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x4y93efgEv");}
void  ccc::CC6x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x4y93pqrEv");}
ccc::CC6x4y9 ::~CC6x4y9(){ note_dtor("_ZN3ccc7CC6x4y9E", this);} // tgen
ccc::CC6x4y9 ::CC6x4y9(){ note_ctor("_ZN3ccc7CC6x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x4y9E, buf);
    ::ccc::CC6x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x4y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC6x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x4y9E);
    dp->::ccc::CC6x4y9::~CC6x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x4y9E(Test__ZN3ccc7CC6x4y9E, "_ZN3ccc7CC6x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x4y9C1Ev();
extern void _ZN3ccc7CC6x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x4y9E[] = {
  NSPAIR(_ZN3ccc7CC6x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC6x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x4y9E[];
extern void _ZN3ccc7CC6x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC6x4y93efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x4y93efgEv,_ZTv0_n16_N3ccc7CC6x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x4y93efgEv,_ZThn4_N3ccc7CC6x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x4y93efgEv,_ZTv0_n16_N3ccc7CC6x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x4y9E[] = {
  {&(_ZTVN3ccc7CC6x4y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x4y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x4y9E[];
static VTBL_ENTRY alt_thunk_names473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x4y93efgEv,_ZTv0_n16_N3ccc7CC6x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x4y93efgEv,_ZThn4_N3ccc7CC6x4y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x4y9E = {  "_ZN3ccc7CC6x4y9E", // class name
  bases__ZN3ccc7CC6x4y9E, 2,
  &(vtc__ZN3ccc7CC6x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x4y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x4y9E),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  DD6x4y9  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD6x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x4y93pqrEv
  ~DD6x4y9(); // tgen
  DD6x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x4y9E) C1{ VBC2{ v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x4y93efgEv");}
void  ccc::DD6x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x4y93pqrEv");}
ccc::DD6x4y9 ::~DD6x4y9(){ note_dtor("_ZN3ccc7DD6x4y9E", this);} // tgen
ccc::DD6x4y9 ::DD6x4y9(){ note_ctor("_ZN3ccc7DD6x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x4y9E, buf);
    ::ccc::DD6x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x4y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD6x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x4y9E);
    dp->::ccc::DD6x4y9::~DD6x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x4y9E(Test__ZN3ccc7DD6x4y9E, "_ZN3ccc7DD6x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x4y9C1Ev();
extern void _ZN3ccc7DD6x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x4y9E[] = {
  NSPAIR(_ZN3ccc7DD6x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD6x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x4y93efgEv();
extern void _ZN3ccc7DD6x4y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x4y93pqrEv,_ZTv0_n12_N3ccc7DD6x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y93pqrEv,_ZThn4_N3ccc7DD6x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x4y93efgEv,_ZTv0_n20_N3ccc7DD6x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x4y93efgEv,_ZThn4_N3ccc7DD6x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x4y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x4y93pqrEv,_ZTv0_n12_N3ccc7DD6x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x4y93efgEv,_ZTv0_n20_N3ccc7DD6x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x4y9E[] = {
  {&(_ZTVN3ccc7DD6x4y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x4y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x4y9E[];
static VTBL_ENTRY alt_thunk_names474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x4y93efgEv,_ZTv0_n20_N3ccc7DD6x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y93efgEv,_ZThn4_N3ccc7DD6x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x4y93pqrEv,_ZTv0_n12_N3ccc7DD6x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x4y93pqrEv,_ZThn4_N3ccc7DD6x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x4y9E = {  "_ZN3ccc7DD6x4y9E", // class name
  bases__ZN3ccc7DD6x4y9E, 2,
  &(vtc__ZN3ccc7DD6x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x4y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x4y9E),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  CC6x4y10  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC6x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x4y103abcEv
  ~CC6x4y10(); // tgen
  CC6x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y10E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x4y103pqrEv");}
void  ccc::CC6x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x4y103abcEv");}
ccc::CC6x4y10 ::~CC6x4y10(){ note_dtor("_ZN3ccc8CC6x4y10E", this);} // tgen
ccc::CC6x4y10 ::CC6x4y10(){ note_ctor("_ZN3ccc8CC6x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x4y10E, buf);
    ::ccc::CC6x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x4y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC6x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x4y10E);
    dp->::ccc::CC6x4y10::~CC6x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x4y10E(Test__ZN3ccc8CC6x4y10E, "_ZN3ccc8CC6x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x4y10C1Ev();
extern void _ZN3ccc8CC6x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x4y10E[] = {
  NSPAIR(_ZN3ccc8CC6x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC6x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x4y10E[];
extern void _ZN3ccc8CC6x4y103pqrEv();
extern void _ZN3ccc8CC6x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x4y103abcEv,_ZTv0_n12_N3ccc8CC6x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y103abcEv,_ZThn4_N3ccc8CC6x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x4y103abcEv,_ZTv0_n12_N3ccc8CC6x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x4y10E[] = {
  {&(_ZTVN3ccc8CC6x4y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x4y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x4y10E[];
static VTBL_ENTRY alt_thunk_names475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x4y103abcEv,_ZTv0_n12_N3ccc8CC6x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x4y103abcEv,_ZThn4_N3ccc8CC6x4y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x4y10E = {  "_ZN3ccc8CC6x4y10E", // class name
  bases__ZN3ccc8CC6x4y10E, 2,
  &(vtc__ZN3ccc8CC6x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x4y10E),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  DD6x4y10  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD6x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x4y103abcEv
  ~DD6x4y10(); // tgen
  DD6x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x4y10E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x4y103pqrEv");}
void  ccc::DD6x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x4y103abcEv");}
ccc::DD6x4y10 ::~DD6x4y10(){ note_dtor("_ZN3ccc8DD6x4y10E", this);} // tgen
ccc::DD6x4y10 ::DD6x4y10(){ note_ctor("_ZN3ccc8DD6x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x4y10E, buf);
    ::ccc::DD6x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x4y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD6x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x4y10E);
    dp->::ccc::DD6x4y10::~DD6x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x4y10E(Test__ZN3ccc8DD6x4y10E, "_ZN3ccc8DD6x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x4y10C1Ev();
extern void _ZN3ccc8DD6x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x4y10E[] = {
  NSPAIR(_ZN3ccc8DD6x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD6x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y10E[];
extern void _ZN3ccc8DD6x4y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x4y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x4y103pqrEv,_ZTv0_n12_N3ccc8DD6x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y103pqrEv,_ZThn4_N3ccc8DD6x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x4y103abcEv,_ZTv0_n16_N3ccc8DD6x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y103abcEv,_ZThn4_N3ccc8DD6x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x4y103pqrEv,_ZTv0_n12_N3ccc8DD6x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x4y103abcEv,_ZTv0_n16_N3ccc8DD6x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x4y10E[] = {
  {&(_ZTVN3ccc8DD6x4y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x4y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x4y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x4y10E[];
static VTBL_ENTRY alt_thunk_names476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x4y103abcEv,_ZTv0_n16_N3ccc8DD6x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y103abcEv,_ZThn4_N3ccc8DD6x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x4y103pqrEv,_ZTv0_n12_N3ccc8DD6x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y103pqrEv,_ZThn4_N3ccc8DD6x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x4y10E = {  "_ZN3ccc8DD6x4y10E", // class name
  bases__ZN3ccc8DD6x4y10E, 2,
  &(vtc__ZN3ccc8DD6x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x4y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x4y10E),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  CC6x4y11  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC6x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x4y113efgEv
  ~CC6x4y11(); // tgen
  CC6x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y11E) C1{ VBC2{ v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x4y113pqrEv");}
void  ccc::CC6x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x4y113efgEv");}
ccc::CC6x4y11 ::~CC6x4y11(){ note_dtor("_ZN3ccc8CC6x4y11E", this);} // tgen
ccc::CC6x4y11 ::CC6x4y11(){ note_ctor("_ZN3ccc8CC6x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x4y11E, buf);
    ::ccc::CC6x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x4y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC6x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x4y11E);
    dp->::ccc::CC6x4y11::~CC6x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x4y11E(Test__ZN3ccc8CC6x4y11E, "_ZN3ccc8CC6x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x4y11C1Ev();
extern void _ZN3ccc8CC6x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x4y11E[] = {
  NSPAIR(_ZN3ccc8CC6x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC6x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x4y11E[];
extern void _ZN3ccc8CC6x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC6x4y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x4y113efgEv,_ZTv0_n16_N3ccc8CC6x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y113efgEv,_ZThn4_N3ccc8CC6x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x4y113efgEv,_ZTv0_n16_N3ccc8CC6x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x4y11E[] = {
  {&(_ZTVN3ccc8CC6x4y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x4y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x4y11E[];
static VTBL_ENTRY alt_thunk_names477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x4y113efgEv,_ZTv0_n16_N3ccc8CC6x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x4y113efgEv,_ZThn4_N3ccc8CC6x4y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x4y11E = {  "_ZN3ccc8CC6x4y11E", // class name
  bases__ZN3ccc8CC6x4y11E, 2,
  &(vtc__ZN3ccc8CC6x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x4y11E),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  DD6x4y11  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD6x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x4y113efgEv
  ~DD6x4y11(); // tgen
  DD6x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x4y11E) C1{ VBC2{ v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x4y113pqrEv");}
void  ccc::DD6x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x4y113efgEv");}
ccc::DD6x4y11 ::~DD6x4y11(){ note_dtor("_ZN3ccc8DD6x4y11E", this);} // tgen
ccc::DD6x4y11 ::DD6x4y11(){ note_ctor("_ZN3ccc8DD6x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x4y11E, buf);
    ::ccc::DD6x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x4y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD6x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x4y11E);
    dp->::ccc::DD6x4y11::~DD6x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x4y11E(Test__ZN3ccc8DD6x4y11E, "_ZN3ccc8DD6x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x4y11C1Ev();
extern void _ZN3ccc8DD6x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x4y11E[] = {
  NSPAIR(_ZN3ccc8DD6x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD6x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x4y113efgEv();
extern void _ZN3ccc8DD6x4y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x4y113pqrEv,_ZTv0_n12_N3ccc8DD6x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y113pqrEv,_ZThn4_N3ccc8DD6x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x4y113efgEv,_ZTv0_n20_N3ccc8DD6x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y113efgEv,_ZThn4_N3ccc8DD6x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x4y113pqrEv,_ZTv0_n12_N3ccc8DD6x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x4y113efgEv,_ZTv0_n20_N3ccc8DD6x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x4y11E[] = {
  {&(_ZTVN3ccc8DD6x4y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x4y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x4y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x4y11E[];
static VTBL_ENTRY alt_thunk_names478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x4y113efgEv,_ZTv0_n20_N3ccc8DD6x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y113efgEv,_ZThn4_N3ccc8DD6x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x4y113pqrEv,_ZTv0_n12_N3ccc8DD6x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y113pqrEv,_ZThn4_N3ccc8DD6x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x4y11E = {  "_ZN3ccc8DD6x4y11E", // class name
  bases__ZN3ccc8DD6x4y11E, 2,
  &(vtc__ZN3ccc8DD6x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x4y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x4y11E),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  CC6x4y12  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC6x4y123abcEv
  ~CC6x4y12(); // tgen
  CC6x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC6x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x4y123abcEv");}
ccc::CC6x4y12 ::~CC6x4y12(){ note_dtor("_ZN3ccc8CC6x4y12E", this);} // tgen
ccc::CC6x4y12 ::CC6x4y12(){ note_ctor("_ZN3ccc8CC6x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x4y12E, buf);
    ::ccc::CC6x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x4y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC6x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x4y12E);
    dp->::ccc::CC6x4y12::~CC6x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x4y12E(Test__ZN3ccc8CC6x4y12E, "_ZN3ccc8CC6x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x4y12C1Ev();
extern void _ZN3ccc8CC6x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x4y12E[] = {
  NSPAIR(_ZN3ccc8CC6x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC6x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC6x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x4y123abcEv,_ZTv0_n12_N3ccc8CC6x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y123abcEv,_ZThn4_N3ccc8CC6x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x4y123abcEv,_ZTv0_n12_N3ccc8CC6x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x4y12E[] = {
  {&(_ZTVN3ccc8CC6x4y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x4y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x4y12E[];
static VTBL_ENTRY alt_thunk_names479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x4y123abcEv,_ZTv0_n12_N3ccc8CC6x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x4y123abcEv,_ZThn4_N3ccc8CC6x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x4y12E = {  "_ZN3ccc8CC6x4y12E", // class name
  bases__ZN3ccc8CC6x4y12E, 2,
  &(vtc__ZN3ccc8CC6x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x4y12E),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  DD6x4y12  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD6x4y123abcEv
  ~DD6x4y12(); // tgen
  DD6x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x4y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD6x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x4y123abcEv");}
ccc::DD6x4y12 ::~DD6x4y12(){ note_dtor("_ZN3ccc8DD6x4y12E", this);} // tgen
ccc::DD6x4y12 ::DD6x4y12(){ note_ctor("_ZN3ccc8DD6x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x4y12E, buf);
    ::ccc::DD6x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x4y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD6x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x4y12E);
    dp->::ccc::DD6x4y12::~DD6x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x4y12E(Test__ZN3ccc8DD6x4y12E, "_ZN3ccc8DD6x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x4y12C1Ev();
extern void _ZN3ccc8DD6x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x4y12E[] = {
  NSPAIR(_ZN3ccc8DD6x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD6x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y12E[];
extern void _ZN3ccc8DD6x4y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x4y123abcEv,_ZTv0_n16_N3ccc8DD6x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y123abcEv,_ZThn4_N3ccc8DD6x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x4y123abcEv,_ZTv0_n16_N3ccc8DD6x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x4y12E[] = {
  {&(_ZTVN3ccc8DD6x4y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x4y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x4y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x4y12E[];
static VTBL_ENTRY alt_thunk_names480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x4y123abcEv,_ZTv0_n16_N3ccc8DD6x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y123abcEv,_ZThn4_N3ccc8DD6x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x4y12E = {  "_ZN3ccc8DD6x4y12E", // class name
  bases__ZN3ccc8DD6x4y12E, 2,
  &(vtc__ZN3ccc8DD6x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x4y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x4y12E),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  CC6x4y13  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC6x4y133efgEv
  ~CC6x4y13(); // tgen
  CC6x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y13E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC6x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x4y133efgEv");}
ccc::CC6x4y13 ::~CC6x4y13(){ note_dtor("_ZN3ccc8CC6x4y13E", this);} // tgen
ccc::CC6x4y13 ::CC6x4y13(){ note_ctor("_ZN3ccc8CC6x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x4y13E, buf);
    ::ccc::CC6x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x4y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC6x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x4y13E);
    dp->::ccc::CC6x4y13::~CC6x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x4y13E(Test__ZN3ccc8CC6x4y13E, "_ZN3ccc8CC6x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x4y13C1Ev();
extern void _ZN3ccc8CC6x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x4y13E[] = {
  NSPAIR(_ZN3ccc8CC6x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC6x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC6x4y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x4y133efgEv,_ZTv0_n16_N3ccc8CC6x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x4y133efgEv,_ZThn4_N3ccc8CC6x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x4y133efgEv,_ZTv0_n16_N3ccc8CC6x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x4y13E[] = {
  {&(_ZTVN3ccc8CC6x4y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x4y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x4y13E[];
static VTBL_ENTRY alt_thunk_names481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x4y133efgEv,_ZTv0_n16_N3ccc8CC6x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x4y133efgEv,_ZThn4_N3ccc8CC6x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x4y13E = {  "_ZN3ccc8CC6x4y13E", // class name
  bases__ZN3ccc8CC6x4y13E, 2,
  &(vtc__ZN3ccc8CC6x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x4y13E),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  DD6x4y13  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD6x4y133efgEv
  ~DD6x4y13(); // tgen
  DD6x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x4y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD6x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x4y133efgEv");}
ccc::DD6x4y13 ::~DD6x4y13(){ note_dtor("_ZN3ccc8DD6x4y13E", this);} // tgen
ccc::DD6x4y13 ::DD6x4y13(){ note_ctor("_ZN3ccc8DD6x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x4y13E, buf);
    ::ccc::DD6x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x4y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD6x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x4y13E);
    dp->::ccc::DD6x4y13::~DD6x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x4y13E(Test__ZN3ccc8DD6x4y13E, "_ZN3ccc8DD6x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x4y13C1Ev();
extern void _ZN3ccc8DD6x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x4y13E[] = {
  NSPAIR(_ZN3ccc8DD6x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD6x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x4y133efgEv,_ZTv0_n20_N3ccc8DD6x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y133efgEv,_ZThn4_N3ccc8DD6x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x4y133efgEv,_ZTv0_n20_N3ccc8DD6x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x4y13E[] = {
  {&(_ZTVN3ccc8DD6x4y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x4y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x4y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x4y13E[];
static VTBL_ENTRY alt_thunk_names482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x4y133efgEv,_ZTv0_n20_N3ccc8DD6x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y133efgEv,_ZThn4_N3ccc8DD6x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x4y13E = {  "_ZN3ccc8DD6x4y13E", // class name
  bases__ZN3ccc8DD6x4y13E, 2,
  &(vtc__ZN3ccc8DD6x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x4y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x4y13E),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  CC6x4y14  : virtual ::ccc::AA6 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC6x4y143pqrEv
  ~CC6x4y14(); // tgen
  CC6x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC6x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x4y143pqrEv");}
ccc::CC6x4y14 ::~CC6x4y14(){ note_dtor("_ZN3ccc8CC6x4y14E", this);} // tgen
ccc::CC6x4y14 ::CC6x4y14(){ note_ctor("_ZN3ccc8CC6x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x4y14E, buf);
    ::ccc::CC6x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x4y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC6x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x4y14E);
    dp->::ccc::CC6x4y14::~CC6x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x4y14E(Test__ZN3ccc8CC6x4y14E, "_ZN3ccc8CC6x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x4y14C1Ev();
extern void _ZN3ccc8CC6x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x4y14E[] = {
  NSPAIR(_ZN3ccc8CC6x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC6x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x4y14E[];
extern void _ZN3ccc8CC6x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x4y14E[] = {
  {&(_ZTVN3ccc8CC6x4y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x4y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x4y14E[];
Class_Descriptor cd__ZN3ccc8CC6x4y14E = {  "_ZN3ccc8CC6x4y14E", // class name
  bases__ZN3ccc8CC6x4y14E, 2,
  &(vtc__ZN3ccc8CC6x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x4y14E),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  DD6x4y14  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD6x4y143pqrEv
  ~DD6x4y14(); // tgen
  DD6x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x4y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD6x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x4y143pqrEv");}
ccc::DD6x4y14 ::~DD6x4y14(){ note_dtor("_ZN3ccc8DD6x4y14E", this);} // tgen
ccc::DD6x4y14 ::DD6x4y14(){ note_ctor("_ZN3ccc8DD6x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x4y14E, buf);
    ::ccc::DD6x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x4y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD6x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x4y14E);
    dp->::ccc::DD6x4y14::~DD6x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x4y14E(Test__ZN3ccc8DD6x4y14E, "_ZN3ccc8DD6x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x4y14C1Ev();
extern void _ZN3ccc8DD6x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x4y14E[] = {
  NSPAIR(_ZN3ccc8DD6x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD6x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x4y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x4y143pqrEv,_ZTv0_n12_N3ccc8DD6x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x4y143pqrEv,_ZThn4_N3ccc8DD6x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x4y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x4y143pqrEv,_ZTv0_n12_N3ccc8DD6x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x4y14E[] = {
  {&(_ZTVN3ccc8DD6x4y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x4y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x4y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x4y14E[];
static VTBL_ENTRY alt_thunk_names483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x4y143pqrEv,_ZTv0_n12_N3ccc8DD6x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x4y143pqrEv,_ZThn4_N3ccc8DD6x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x4y14E = {  "_ZN3ccc8DD6x4y14E", // class name
  bases__ZN3ccc8DD6x4y14E, 2,
  &(vtc__ZN3ccc8DD6x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x4y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x4y14E),3, //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  CC6x4y15  : virtual ::ccc::AA6 , ::ccc::BB4 {
  ~CC6x4y15(); // tgen
  CC6x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x4y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC6x4y15 ::~CC6x4y15(){ note_dtor("_ZN3ccc8CC6x4y15E", this);} // tgen
ccc::CC6x4y15 ::CC6x4y15(){ note_ctor("_ZN3ccc8CC6x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x4y15E, buf);
    ::ccc::CC6x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x4y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC6x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x4y15E);
    dp->::ccc::CC6x4y15::~CC6x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x4y15E(Test__ZN3ccc8CC6x4y15E, "_ZN3ccc8CC6x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x4y15C1Ev();
extern void _ZN3ccc8CC6x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x4y15E[] = {
  NSPAIR(_ZN3ccc8CC6x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC6x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x4y15E[] = {
  {&(_ZTVN3ccc8CC6x4y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x4y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x4y15E[];
Class_Descriptor cd__ZN3ccc8CC6x4y15E = {  "_ZN3ccc8CC6x4y15E", // class name
  bases__ZN3ccc8CC6x4y15E, 2,
  &(vtc__ZN3ccc8CC6x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x4y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x4y15E),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  DD6x4y15  : virtual ::ccc::AA6 , virtual ::ccc::BB4 {
  ~DD6x4y15(); // tgen
  DD6x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x4y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD6x4y15 ::~DD6x4y15(){ note_dtor("_ZN3ccc8DD6x4y15E", this);} // tgen
ccc::DD6x4y15 ::DD6x4y15(){ note_ctor("_ZN3ccc8DD6x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x4y15E, buf);
    ::ccc::DD6x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x4y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD6x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x4y15E);
    dp->::ccc::DD6x4y15::~DD6x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x4y15E(Test__ZN3ccc8DD6x4y15E, "_ZN3ccc8DD6x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x4y15C1Ev();
extern void _ZN3ccc8DD6x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x4y15E[] = {
  NSPAIR(_ZN3ccc8DD6x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD6x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x4y15E[] = {
  {&(_ZTVN3ccc8DD6x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x4y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x4y15E[];
Class_Descriptor cd__ZN3ccc8DD6x4y15E = {  "_ZN3ccc8DD6x4y15E", // class name
  bases__ZN3ccc8DD6x4y15E, 2,
  &(vtc__ZN3ccc8DD6x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x4y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x4y15E),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  CC6x5y0  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y03pqrEv
  ~CC6x5y0(); // tgen
  CC6x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y0E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y03abcEv");}
void  ccc::CC6x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y03efgEv");}
void  ccc::CC6x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y03pqrEv");}
ccc::CC6x5y0 ::~CC6x5y0(){ note_dtor("_ZN3ccc7CC6x5y0E", this);} // tgen
ccc::CC6x5y0 ::CC6x5y0(){ note_ctor("_ZN3ccc7CC6x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y0E, buf);
    ::ccc::CC6x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y0E);
    dp->::ccc::CC6x5y0::~CC6x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y0E(Test__ZN3ccc7CC6x5y0E, "_ZN3ccc7CC6x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y0C1Ev();
extern void _ZN3ccc7CC6x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y0E[] = {
  NSPAIR(_ZN3ccc7CC6x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y0E[];
extern void _ZN3ccc7CC6x5y03pqrEv();
extern void _ZN3ccc7CC6x5y03efgEv();
extern void _ZN3ccc7CC6x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y03abcEv,_ZTv0_n12_N3ccc7CC6x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y03abcEv,_ZThn4_N3ccc7CC6x5y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y03efgEv,_ZTv0_n16_N3ccc7CC6x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y03efgEv,_ZThn4_N3ccc7CC6x5y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y03abcEv,_ZTv0_n12_N3ccc7CC6x5y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y03efgEv,_ZTv0_n16_N3ccc7CC6x5y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y0E[] = {
  {&(_ZTVN3ccc7CC6x5y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y0E[];
static VTBL_ENTRY alt_thunk_names484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y03efgEv,_ZTv0_n16_N3ccc7CC6x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y03efgEv,_ZThn4_N3ccc7CC6x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y03abcEv,_ZTv0_n12_N3ccc7CC6x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y03abcEv,_ZThn4_N3ccc7CC6x5y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y0E = {  "_ZN3ccc7CC6x5y0E", // class name
  bases__ZN3ccc7CC6x5y0E, 2,
  &(vtc__ZN3ccc7CC6x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y0E),2, //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  DD6x5y0  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD6x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x5y03pqrEv
  ~DD6x5y0(); // tgen
  DD6x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y0E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y03abcEv");}
void  ccc::DD6x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y03efgEv");}
void  ccc::DD6x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y03pqrEv");}
ccc::DD6x5y0 ::~DD6x5y0(){ note_dtor("_ZN3ccc7DD6x5y0E", this);} // tgen
ccc::DD6x5y0 ::DD6x5y0(){ note_ctor("_ZN3ccc7DD6x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y0E, buf);
    ::ccc::DD6x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y0E);
    dp->::ccc::DD6x5y0::~DD6x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y0E(Test__ZN3ccc7DD6x5y0E, "_ZN3ccc7DD6x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y0C1Ev();
extern void _ZN3ccc7DD6x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y0E[] = {
  NSPAIR(_ZN3ccc7DD6x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y0E[];
extern void _ZN3ccc7DD6x5y03abcEv();
extern void _ZN3ccc7DD6x5y03efgEv();
extern void _ZN3ccc7DD6x5y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y03pqrEv,_ZTv0_n12_N3ccc7DD6x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y03pqrEv,_ZThn4_N3ccc7DD6x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y03efgEv,_ZTv0_n16_N3ccc7DD6x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y03efgEv,_ZThn4_N3ccc7DD6x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y03abcEv,_ZTv0_n20_N3ccc7DD6x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y03abcEv,_ZThn4_N3ccc7DD6x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y03pqrEv,_ZTv0_n12_N3ccc7DD6x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y03efgEv,_ZTv0_n16_N3ccc7DD6x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y03abcEv,_ZTv0_n20_N3ccc7DD6x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y0E[] = {
  {&(_ZTVN3ccc7DD6x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y0E[];
static VTBL_ENTRY alt_thunk_names485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y03abcEv,_ZTv0_n20_N3ccc7DD6x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y03abcEv,_ZThn4_N3ccc7DD6x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y03efgEv,_ZTv0_n16_N3ccc7DD6x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y03efgEv,_ZThn4_N3ccc7DD6x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y03pqrEv,_ZTv0_n12_N3ccc7DD6x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y03pqrEv,_ZThn4_N3ccc7DD6x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y0E = {  "_ZN3ccc7DD6x5y0E", // class name
  bases__ZN3ccc7DD6x5y0E, 2,
  &(vtc__ZN3ccc7DD6x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y0E),3, //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  CC6x5y1  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x5y13efgEv
  ~CC6x5y1(); // tgen
  CC6x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y1E) C1{ VBC2{ v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y13abcEv");}
void  ccc::CC6x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y13pqrEv");}
void  ccc::CC6x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y13efgEv");}
ccc::CC6x5y1 ::~CC6x5y1(){ note_dtor("_ZN3ccc7CC6x5y1E", this);} // tgen
ccc::CC6x5y1 ::CC6x5y1(){ note_ctor("_ZN3ccc7CC6x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y1E, buf);
    ::ccc::CC6x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y1E);
    dp->::ccc::CC6x5y1::~CC6x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y1E(Test__ZN3ccc7CC6x5y1E, "_ZN3ccc7CC6x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y1C1Ev();
extern void _ZN3ccc7CC6x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y1E[] = {
  NSPAIR(_ZN3ccc7CC6x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y1E[];
extern void _ZN3ccc7CC6x5y13pqrEv();
extern void _ZN3ccc7CC6x5y13efgEv();
extern void _ZN3ccc7CC6x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y13abcEv,_ZTv0_n12_N3ccc7CC6x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y13abcEv,_ZThn4_N3ccc7CC6x5y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y13efgEv,_ZTv0_n16_N3ccc7CC6x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y13efgEv,_ZThn4_N3ccc7CC6x5y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y13abcEv,_ZTv0_n12_N3ccc7CC6x5y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y13efgEv,_ZTv0_n16_N3ccc7CC6x5y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y1E[] = {
  {&(_ZTVN3ccc7CC6x5y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y1E[];
static VTBL_ENTRY alt_thunk_names486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y13efgEv,_ZTv0_n16_N3ccc7CC6x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y13efgEv,_ZThn4_N3ccc7CC6x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y13abcEv,_ZTv0_n12_N3ccc7CC6x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y13abcEv,_ZThn4_N3ccc7CC6x5y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y1E = {  "_ZN3ccc7CC6x5y1E", // class name
  bases__ZN3ccc7CC6x5y1E, 2,
  &(vtc__ZN3ccc7CC6x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y1E),2, //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  DD6x5y1  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD6x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x5y13efgEv
  ~DD6x5y1(); // tgen
  DD6x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y1E) C1{ VBC2{ v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y13abcEv");}
void  ccc::DD6x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y13pqrEv");}
void  ccc::DD6x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y13efgEv");}
ccc::DD6x5y1 ::~DD6x5y1(){ note_dtor("_ZN3ccc7DD6x5y1E", this);} // tgen
ccc::DD6x5y1 ::DD6x5y1(){ note_ctor("_ZN3ccc7DD6x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y1E, buf);
    ::ccc::DD6x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y1E);
    dp->::ccc::DD6x5y1::~DD6x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y1E(Test__ZN3ccc7DD6x5y1E, "_ZN3ccc7DD6x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y1C1Ev();
extern void _ZN3ccc7DD6x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y1E[] = {
  NSPAIR(_ZN3ccc7DD6x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y1E[];
extern void _ZN3ccc7DD6x5y13abcEv();
extern void _ZN3ccc7DD6x5y13efgEv();
extern void _ZN3ccc7DD6x5y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y13pqrEv,_ZTv0_n12_N3ccc7DD6x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y13pqrEv,_ZThn4_N3ccc7DD6x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y13efgEv,_ZTv0_n16_N3ccc7DD6x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y13efgEv,_ZThn4_N3ccc7DD6x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y13abcEv,_ZTv0_n20_N3ccc7DD6x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y13abcEv,_ZThn4_N3ccc7DD6x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y13pqrEv,_ZTv0_n12_N3ccc7DD6x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y13efgEv,_ZTv0_n16_N3ccc7DD6x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y13abcEv,_ZTv0_n20_N3ccc7DD6x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y1E[] = {
  {&(_ZTVN3ccc7DD6x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y1E[];
static VTBL_ENTRY alt_thunk_names487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y13abcEv,_ZTv0_n20_N3ccc7DD6x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y13abcEv,_ZThn4_N3ccc7DD6x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y13efgEv,_ZTv0_n16_N3ccc7DD6x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y13efgEv,_ZThn4_N3ccc7DD6x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y13pqrEv,_ZTv0_n12_N3ccc7DD6x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y13pqrEv,_ZThn4_N3ccc7DD6x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y1E = {  "_ZN3ccc7DD6x5y1E", // class name
  bases__ZN3ccc7DD6x5y1E, 2,
  &(vtc__ZN3ccc7DD6x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y1E),3, //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  CC6x5y2  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y23pqrEv
  ~CC6x5y2(); // tgen
  CC6x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y2E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y23efgEv");}
void  ccc::CC6x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y23abcEv");}
void  ccc::CC6x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y23pqrEv");}
ccc::CC6x5y2 ::~CC6x5y2(){ note_dtor("_ZN3ccc7CC6x5y2E", this);} // tgen
ccc::CC6x5y2 ::CC6x5y2(){ note_ctor("_ZN3ccc7CC6x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y2E, buf);
    ::ccc::CC6x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y2E);
    dp->::ccc::CC6x5y2::~CC6x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y2E(Test__ZN3ccc7CC6x5y2E, "_ZN3ccc7CC6x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y2C1Ev();
extern void _ZN3ccc7CC6x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y2E[] = {
  NSPAIR(_ZN3ccc7CC6x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y2E[];
extern void _ZN3ccc7CC6x5y23pqrEv();
extern void _ZN3ccc7CC6x5y23efgEv();
extern void _ZN3ccc7CC6x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y23abcEv,_ZTv0_n12_N3ccc7CC6x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y23abcEv,_ZThn4_N3ccc7CC6x5y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y23efgEv,_ZTv0_n16_N3ccc7CC6x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y23efgEv,_ZThn4_N3ccc7CC6x5y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y23abcEv,_ZTv0_n12_N3ccc7CC6x5y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y23efgEv,_ZTv0_n16_N3ccc7CC6x5y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y2E[] = {
  {&(_ZTVN3ccc7CC6x5y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y2E[];
static VTBL_ENTRY alt_thunk_names488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y23efgEv,_ZTv0_n16_N3ccc7CC6x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y23efgEv,_ZThn4_N3ccc7CC6x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y23abcEv,_ZTv0_n12_N3ccc7CC6x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y23abcEv,_ZThn4_N3ccc7CC6x5y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y2E = {  "_ZN3ccc7CC6x5y2E", // class name
  bases__ZN3ccc7CC6x5y2E, 2,
  &(vtc__ZN3ccc7CC6x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y2E),2, //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  DD6x5y2  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD6x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x5y23pqrEv
  ~DD6x5y2(); // tgen
  DD6x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y2E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y23efgEv");}
void  ccc::DD6x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y23abcEv");}
void  ccc::DD6x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y23pqrEv");}
ccc::DD6x5y2 ::~DD6x5y2(){ note_dtor("_ZN3ccc7DD6x5y2E", this);} // tgen
ccc::DD6x5y2 ::DD6x5y2(){ note_ctor("_ZN3ccc7DD6x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y2E, buf);
    ::ccc::DD6x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y2E);
    dp->::ccc::DD6x5y2::~DD6x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y2E(Test__ZN3ccc7DD6x5y2E, "_ZN3ccc7DD6x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y2C1Ev();
extern void _ZN3ccc7DD6x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y2E[] = {
  NSPAIR(_ZN3ccc7DD6x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y2E[];
extern void _ZN3ccc7DD6x5y23abcEv();
extern void _ZN3ccc7DD6x5y23efgEv();
extern void _ZN3ccc7DD6x5y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y23pqrEv,_ZTv0_n12_N3ccc7DD6x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y23pqrEv,_ZThn4_N3ccc7DD6x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y23efgEv,_ZTv0_n16_N3ccc7DD6x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y23efgEv,_ZThn4_N3ccc7DD6x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y23abcEv,_ZTv0_n20_N3ccc7DD6x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y23abcEv,_ZThn4_N3ccc7DD6x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y23pqrEv,_ZTv0_n12_N3ccc7DD6x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y23efgEv,_ZTv0_n16_N3ccc7DD6x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y23abcEv,_ZTv0_n20_N3ccc7DD6x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y2E[] = {
  {&(_ZTVN3ccc7DD6x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y2E[];
static VTBL_ENTRY alt_thunk_names489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y23abcEv,_ZTv0_n20_N3ccc7DD6x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y23abcEv,_ZThn4_N3ccc7DD6x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y23efgEv,_ZTv0_n16_N3ccc7DD6x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y23efgEv,_ZThn4_N3ccc7DD6x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y23pqrEv,_ZTv0_n12_N3ccc7DD6x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y23pqrEv,_ZThn4_N3ccc7DD6x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y2E = {  "_ZN3ccc7DD6x5y2E", // class name
  bases__ZN3ccc7DD6x5y2E, 2,
  &(vtc__ZN3ccc7DD6x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y2E),3, //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  CC6x5y3  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x5y33abcEv
  ~CC6x5y3(); // tgen
  CC6x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y3E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y33efgEv");}
void  ccc::CC6x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y33pqrEv");}
void  ccc::CC6x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y33abcEv");}
ccc::CC6x5y3 ::~CC6x5y3(){ note_dtor("_ZN3ccc7CC6x5y3E", this);} // tgen
ccc::CC6x5y3 ::CC6x5y3(){ note_ctor("_ZN3ccc7CC6x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y3E, buf);
    ::ccc::CC6x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y3E);
    dp->::ccc::CC6x5y3::~CC6x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y3E(Test__ZN3ccc7CC6x5y3E, "_ZN3ccc7CC6x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y3C1Ev();
extern void _ZN3ccc7CC6x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y3E[] = {
  NSPAIR(_ZN3ccc7CC6x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y3E[];
extern void _ZN3ccc7CC6x5y33pqrEv();
extern void _ZN3ccc7CC6x5y33efgEv();
extern void _ZN3ccc7CC6x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y33abcEv,_ZTv0_n12_N3ccc7CC6x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y33abcEv,_ZThn4_N3ccc7CC6x5y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y33efgEv,_ZTv0_n16_N3ccc7CC6x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y33efgEv,_ZThn4_N3ccc7CC6x5y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y33abcEv,_ZTv0_n12_N3ccc7CC6x5y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y33efgEv,_ZTv0_n16_N3ccc7CC6x5y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y3E[] = {
  {&(_ZTVN3ccc7CC6x5y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y3E[];
static VTBL_ENTRY alt_thunk_names490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y33efgEv,_ZTv0_n16_N3ccc7CC6x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y33efgEv,_ZThn4_N3ccc7CC6x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y33abcEv,_ZTv0_n12_N3ccc7CC6x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y33abcEv,_ZThn4_N3ccc7CC6x5y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y3E = {  "_ZN3ccc7CC6x5y3E", // class name
  bases__ZN3ccc7CC6x5y3E, 2,
  &(vtc__ZN3ccc7CC6x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y3E),2, //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  DD6x5y3  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD6x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x5y33abcEv
  ~DD6x5y3(); // tgen
  DD6x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y3E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y33efgEv");}
void  ccc::DD6x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y33pqrEv");}
void  ccc::DD6x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y33abcEv");}
ccc::DD6x5y3 ::~DD6x5y3(){ note_dtor("_ZN3ccc7DD6x5y3E", this);} // tgen
ccc::DD6x5y3 ::DD6x5y3(){ note_ctor("_ZN3ccc7DD6x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y3E, buf);
    ::ccc::DD6x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y3E);
    dp->::ccc::DD6x5y3::~DD6x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y3E(Test__ZN3ccc7DD6x5y3E, "_ZN3ccc7DD6x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y3C1Ev();
extern void _ZN3ccc7DD6x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y3E[] = {
  NSPAIR(_ZN3ccc7DD6x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y3E[];
extern void _ZN3ccc7DD6x5y33abcEv();
extern void _ZN3ccc7DD6x5y33efgEv();
extern void _ZN3ccc7DD6x5y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y33pqrEv,_ZTv0_n12_N3ccc7DD6x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y33pqrEv,_ZThn4_N3ccc7DD6x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y33efgEv,_ZTv0_n16_N3ccc7DD6x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y33efgEv,_ZThn4_N3ccc7DD6x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y33abcEv,_ZTv0_n20_N3ccc7DD6x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y33abcEv,_ZThn4_N3ccc7DD6x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y33pqrEv,_ZTv0_n12_N3ccc7DD6x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y33efgEv,_ZTv0_n16_N3ccc7DD6x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y33abcEv,_ZTv0_n20_N3ccc7DD6x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y3E[] = {
  {&(_ZTVN3ccc7DD6x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y3E[];
static VTBL_ENTRY alt_thunk_names491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y33abcEv,_ZTv0_n20_N3ccc7DD6x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y33abcEv,_ZThn4_N3ccc7DD6x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y33efgEv,_ZTv0_n16_N3ccc7DD6x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y33efgEv,_ZThn4_N3ccc7DD6x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y33pqrEv,_ZTv0_n12_N3ccc7DD6x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y33pqrEv,_ZThn4_N3ccc7DD6x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y3E = {  "_ZN3ccc7DD6x5y3E", // class name
  bases__ZN3ccc7DD6x5y3E, 2,
  &(vtc__ZN3ccc7DD6x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y3E),3, //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  CC6x5y4  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC6x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x5y43efgEv
  ~CC6x5y4(); // tgen
  CC6x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y4E) C1{ VBC2{ v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y43pqrEv");}
void  ccc::CC6x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y43abcEv");}
void  ccc::CC6x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y43efgEv");}
ccc::CC6x5y4 ::~CC6x5y4(){ note_dtor("_ZN3ccc7CC6x5y4E", this);} // tgen
ccc::CC6x5y4 ::CC6x5y4(){ note_ctor("_ZN3ccc7CC6x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y4E, buf);
    ::ccc::CC6x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y4E);
    dp->::ccc::CC6x5y4::~CC6x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y4E(Test__ZN3ccc7CC6x5y4E, "_ZN3ccc7CC6x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y4C1Ev();
extern void _ZN3ccc7CC6x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y4E[] = {
  NSPAIR(_ZN3ccc7CC6x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y4E[];
extern void _ZN3ccc7CC6x5y43pqrEv();
extern void _ZN3ccc7CC6x5y43efgEv();
extern void _ZN3ccc7CC6x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y43abcEv,_ZTv0_n12_N3ccc7CC6x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y43abcEv,_ZThn4_N3ccc7CC6x5y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y43efgEv,_ZTv0_n16_N3ccc7CC6x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y43efgEv,_ZThn4_N3ccc7CC6x5y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y43abcEv,_ZTv0_n12_N3ccc7CC6x5y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y43efgEv,_ZTv0_n16_N3ccc7CC6x5y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y4E[] = {
  {&(_ZTVN3ccc7CC6x5y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y4E[];
static VTBL_ENTRY alt_thunk_names492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y43efgEv,_ZTv0_n16_N3ccc7CC6x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y43efgEv,_ZThn4_N3ccc7CC6x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y43abcEv,_ZTv0_n12_N3ccc7CC6x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y43abcEv,_ZThn4_N3ccc7CC6x5y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y4E = {  "_ZN3ccc7CC6x5y4E", // class name
  bases__ZN3ccc7CC6x5y4E, 2,
  &(vtc__ZN3ccc7CC6x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y4E),2, //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  DD6x5y4  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD6x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x5y43efgEv
  ~DD6x5y4(); // tgen
  DD6x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y4E) C1{ VBC2{ v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y43pqrEv");}
void  ccc::DD6x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y43abcEv");}
void  ccc::DD6x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y43efgEv");}
ccc::DD6x5y4 ::~DD6x5y4(){ note_dtor("_ZN3ccc7DD6x5y4E", this);} // tgen
ccc::DD6x5y4 ::DD6x5y4(){ note_ctor("_ZN3ccc7DD6x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y4E, buf);
    ::ccc::DD6x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y4E);
    dp->::ccc::DD6x5y4::~DD6x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y4E(Test__ZN3ccc7DD6x5y4E, "_ZN3ccc7DD6x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y4C1Ev();
extern void _ZN3ccc7DD6x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y4E[] = {
  NSPAIR(_ZN3ccc7DD6x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y4E[];
extern void _ZN3ccc7DD6x5y43abcEv();
extern void _ZN3ccc7DD6x5y43efgEv();
extern void _ZN3ccc7DD6x5y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y43pqrEv,_ZTv0_n12_N3ccc7DD6x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y43pqrEv,_ZThn4_N3ccc7DD6x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y43efgEv,_ZTv0_n16_N3ccc7DD6x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y43efgEv,_ZThn4_N3ccc7DD6x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y43abcEv,_ZTv0_n20_N3ccc7DD6x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y43abcEv,_ZThn4_N3ccc7DD6x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y43pqrEv,_ZTv0_n12_N3ccc7DD6x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y43efgEv,_ZTv0_n16_N3ccc7DD6x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y43abcEv,_ZTv0_n20_N3ccc7DD6x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y4E[] = {
  {&(_ZTVN3ccc7DD6x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y4E[];
static VTBL_ENTRY alt_thunk_names493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y43abcEv,_ZTv0_n20_N3ccc7DD6x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y43abcEv,_ZThn4_N3ccc7DD6x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y43efgEv,_ZTv0_n16_N3ccc7DD6x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y43efgEv,_ZThn4_N3ccc7DD6x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y43pqrEv,_ZTv0_n12_N3ccc7DD6x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y43pqrEv,_ZThn4_N3ccc7DD6x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y4E = {  "_ZN3ccc7DD6x5y4E", // class name
  bases__ZN3ccc7DD6x5y4E, 2,
  &(vtc__ZN3ccc7DD6x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y4E),3, //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  CC6x5y5  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC6x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x5y53abcEv
  ~CC6x5y5(); // tgen
  CC6x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y5E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y53pqrEv");}
void  ccc::CC6x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y53efgEv");}
void  ccc::CC6x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y53abcEv");}
ccc::CC6x5y5 ::~CC6x5y5(){ note_dtor("_ZN3ccc7CC6x5y5E", this);} // tgen
ccc::CC6x5y5 ::CC6x5y5(){ note_ctor("_ZN3ccc7CC6x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y5E, buf);
    ::ccc::CC6x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y5E);
    dp->::ccc::CC6x5y5::~CC6x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y5E(Test__ZN3ccc7CC6x5y5E, "_ZN3ccc7CC6x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y5C1Ev();
extern void _ZN3ccc7CC6x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y5E[] = {
  NSPAIR(_ZN3ccc7CC6x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y5E[];
extern void _ZN3ccc7CC6x5y53pqrEv();
extern void _ZN3ccc7CC6x5y53efgEv();
extern void _ZN3ccc7CC6x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y53abcEv,_ZTv0_n12_N3ccc7CC6x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y53abcEv,_ZThn4_N3ccc7CC6x5y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y53efgEv,_ZTv0_n16_N3ccc7CC6x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y53efgEv,_ZThn4_N3ccc7CC6x5y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y53abcEv,_ZTv0_n12_N3ccc7CC6x5y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y53efgEv,_ZTv0_n16_N3ccc7CC6x5y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y5E[] = {
  {&(_ZTVN3ccc7CC6x5y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y5E[];
static VTBL_ENTRY alt_thunk_names494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y53efgEv,_ZTv0_n16_N3ccc7CC6x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y53efgEv,_ZThn4_N3ccc7CC6x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y53abcEv,_ZTv0_n12_N3ccc7CC6x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y53abcEv,_ZThn4_N3ccc7CC6x5y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y5E = {  "_ZN3ccc7CC6x5y5E", // class name
  bases__ZN3ccc7CC6x5y5E, 2,
  &(vtc__ZN3ccc7CC6x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y5E),2, //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  DD6x5y5  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD6x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x5y53abcEv
  ~DD6x5y5(); // tgen
  DD6x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y5E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y53pqrEv");}
void  ccc::DD6x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y53efgEv");}
void  ccc::DD6x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y53abcEv");}
ccc::DD6x5y5 ::~DD6x5y5(){ note_dtor("_ZN3ccc7DD6x5y5E", this);} // tgen
ccc::DD6x5y5 ::DD6x5y5(){ note_ctor("_ZN3ccc7DD6x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y5E, buf);
    ::ccc::DD6x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y5E);
    dp->::ccc::DD6x5y5::~DD6x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y5E(Test__ZN3ccc7DD6x5y5E, "_ZN3ccc7DD6x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y5C1Ev();
extern void _ZN3ccc7DD6x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y5E[] = {
  NSPAIR(_ZN3ccc7DD6x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y5E[];
extern void _ZN3ccc7DD6x5y53abcEv();
extern void _ZN3ccc7DD6x5y53efgEv();
extern void _ZN3ccc7DD6x5y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y53pqrEv,_ZTv0_n12_N3ccc7DD6x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y53pqrEv,_ZThn4_N3ccc7DD6x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y53efgEv,_ZTv0_n16_N3ccc7DD6x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y53efgEv,_ZThn4_N3ccc7DD6x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y53abcEv,_ZTv0_n20_N3ccc7DD6x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y53abcEv,_ZThn4_N3ccc7DD6x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y53pqrEv,_ZTv0_n12_N3ccc7DD6x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y53efgEv,_ZTv0_n16_N3ccc7DD6x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y53abcEv,_ZTv0_n20_N3ccc7DD6x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y5E[] = {
  {&(_ZTVN3ccc7DD6x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y5E[];
static VTBL_ENTRY alt_thunk_names495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y53abcEv,_ZTv0_n20_N3ccc7DD6x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y53abcEv,_ZThn4_N3ccc7DD6x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y53efgEv,_ZTv0_n16_N3ccc7DD6x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y53efgEv,_ZThn4_N3ccc7DD6x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y53pqrEv,_ZTv0_n12_N3ccc7DD6x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y53pqrEv,_ZThn4_N3ccc7DD6x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y5E = {  "_ZN3ccc7DD6x5y5E", // class name
  bases__ZN3ccc7DD6x5y5E, 2,
  &(vtc__ZN3ccc7DD6x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y5E),3, //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  CC6x5y6  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x5y63efgEv
  ~CC6x5y6(); // tgen
  CC6x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y6E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y63abcEv");}
void  ccc::CC6x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y63efgEv");}
ccc::CC6x5y6 ::~CC6x5y6(){ note_dtor("_ZN3ccc7CC6x5y6E", this);} // tgen
ccc::CC6x5y6 ::CC6x5y6(){ note_ctor("_ZN3ccc7CC6x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y6E, buf);
    ::ccc::CC6x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y6E);
    dp->::ccc::CC6x5y6::~CC6x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y6E(Test__ZN3ccc7CC6x5y6E, "_ZN3ccc7CC6x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y6C1Ev();
extern void _ZN3ccc7CC6x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y6E[] = {
  NSPAIR(_ZN3ccc7CC6x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC6x5y63efgEv();
extern void _ZN3ccc7CC6x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y63abcEv,_ZTv0_n12_N3ccc7CC6x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y63abcEv,_ZThn4_N3ccc7CC6x5y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y63efgEv,_ZTv0_n16_N3ccc7CC6x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y63efgEv,_ZThn4_N3ccc7CC6x5y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y63abcEv,_ZTv0_n12_N3ccc7CC6x5y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y63efgEv,_ZTv0_n16_N3ccc7CC6x5y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y6E[] = {
  {&(_ZTVN3ccc7CC6x5y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y6E[];
static VTBL_ENTRY alt_thunk_names496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y63efgEv,_ZTv0_n16_N3ccc7CC6x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y63efgEv,_ZThn4_N3ccc7CC6x5y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y63abcEv,_ZTv0_n12_N3ccc7CC6x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y63abcEv,_ZThn4_N3ccc7CC6x5y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y6E = {  "_ZN3ccc7CC6x5y6E", // class name
  bases__ZN3ccc7CC6x5y6E, 2,
  &(vtc__ZN3ccc7CC6x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y6E),2, //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  DD6x5y6  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD6x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x5y63efgEv
  ~DD6x5y6(); // tgen
  DD6x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y6E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y63abcEv");}
void  ccc::DD6x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y63efgEv");}
ccc::DD6x5y6 ::~DD6x5y6(){ note_dtor("_ZN3ccc7DD6x5y6E", this);} // tgen
ccc::DD6x5y6 ::DD6x5y6(){ note_ctor("_ZN3ccc7DD6x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y6E, buf);
    ::ccc::DD6x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y6E);
    dp->::ccc::DD6x5y6::~DD6x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y6E(Test__ZN3ccc7DD6x5y6E, "_ZN3ccc7DD6x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y6C1Ev();
extern void _ZN3ccc7DD6x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y6E[] = {
  NSPAIR(_ZN3ccc7DD6x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y6E[];
extern void _ZN3ccc7DD6x5y63abcEv();
extern void _ZN3ccc7DD6x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y63efgEv,_ZTv0_n16_N3ccc7DD6x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y63efgEv,_ZThn4_N3ccc7DD6x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y63abcEv,_ZTv0_n20_N3ccc7DD6x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y63abcEv,_ZThn4_N3ccc7DD6x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y63efgEv,_ZTv0_n16_N3ccc7DD6x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y63abcEv,_ZTv0_n20_N3ccc7DD6x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y6E[] = {
  {&(_ZTVN3ccc7DD6x5y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x5y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x5y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y6E[];
static VTBL_ENTRY alt_thunk_names497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y63abcEv,_ZTv0_n20_N3ccc7DD6x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y63abcEv,_ZThn4_N3ccc7DD6x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y63efgEv,_ZTv0_n16_N3ccc7DD6x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y63efgEv,_ZThn4_N3ccc7DD6x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y6E = {  "_ZN3ccc7DD6x5y6E", // class name
  bases__ZN3ccc7DD6x5y6E, 2,
  &(vtc__ZN3ccc7DD6x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y6E),3, //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  CC6x5y7  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC6x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y73pqrEv
  ~CC6x5y7(); // tgen
  CC6x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y7E) C1{ VBC2{ v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y73abcEv");}
void  ccc::CC6x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y73pqrEv");}
ccc::CC6x5y7 ::~CC6x5y7(){ note_dtor("_ZN3ccc7CC6x5y7E", this);} // tgen
ccc::CC6x5y7 ::CC6x5y7(){ note_ctor("_ZN3ccc7CC6x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y7E, buf);
    ::ccc::CC6x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y7E);
    dp->::ccc::CC6x5y7::~CC6x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y7E(Test__ZN3ccc7CC6x5y7E, "_ZN3ccc7CC6x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y7C1Ev();
extern void _ZN3ccc7CC6x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y7E[] = {
  NSPAIR(_ZN3ccc7CC6x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y7E[];
extern void _ZN3ccc7CC6x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC6x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y73abcEv,_ZTv0_n12_N3ccc7CC6x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y73abcEv,_ZThn4_N3ccc7CC6x5y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y73abcEv,_ZTv0_n12_N3ccc7CC6x5y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y7E[] = {
  {&(_ZTVN3ccc7CC6x5y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y7E[];
static VTBL_ENTRY alt_thunk_names498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y73abcEv,_ZTv0_n12_N3ccc7CC6x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y73abcEv,_ZThn4_N3ccc7CC6x5y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y7E = {  "_ZN3ccc7CC6x5y7E", // class name
  bases__ZN3ccc7CC6x5y7E, 2,
  &(vtc__ZN3ccc7CC6x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y7E),2, //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  DD6x5y7  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD6x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x5y73pqrEv
  ~DD6x5y7(); // tgen
  DD6x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y7E) C1{ VBC2{ v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y73abcEv");}
void  ccc::DD6x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y73pqrEv");}
ccc::DD6x5y7 ::~DD6x5y7(){ note_dtor("_ZN3ccc7DD6x5y7E", this);} // tgen
ccc::DD6x5y7 ::DD6x5y7(){ note_ctor("_ZN3ccc7DD6x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y7E, buf);
    ::ccc::DD6x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y7E);
    dp->::ccc::DD6x5y7::~DD6x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y7E(Test__ZN3ccc7DD6x5y7E, "_ZN3ccc7DD6x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y7C1Ev();
extern void _ZN3ccc7DD6x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y7E[] = {
  NSPAIR(_ZN3ccc7DD6x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y7E[];
extern void _ZN3ccc7DD6x5y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x5y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y73pqrEv,_ZTv0_n12_N3ccc7DD6x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y73pqrEv,_ZThn4_N3ccc7DD6x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y73abcEv,_ZTv0_n20_N3ccc7DD6x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y73abcEv,_ZThn4_N3ccc7DD6x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y73pqrEv,_ZTv0_n12_N3ccc7DD6x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y73abcEv,_ZTv0_n20_N3ccc7DD6x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y7E[] = {
  {&(_ZTVN3ccc7DD6x5y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y7E[];
static VTBL_ENTRY alt_thunk_names499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y73abcEv,_ZTv0_n20_N3ccc7DD6x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y73abcEv,_ZThn4_N3ccc7DD6x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y73pqrEv,_ZTv0_n12_N3ccc7DD6x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y73pqrEv,_ZThn4_N3ccc7DD6x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y7E = {  "_ZN3ccc7DD6x5y7E", // class name
  bases__ZN3ccc7DD6x5y7E, 2,
  &(vtc__ZN3ccc7DD6x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y7E),3, //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  CC6x5y8  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x5y83abcEv
  ~CC6x5y8(); // tgen
  CC6x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y8E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y83efgEv");}
void  ccc::CC6x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x5y83abcEv");}
ccc::CC6x5y8 ::~CC6x5y8(){ note_dtor("_ZN3ccc7CC6x5y8E", this);} // tgen
ccc::CC6x5y8 ::CC6x5y8(){ note_ctor("_ZN3ccc7CC6x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y8E, buf);
    ::ccc::CC6x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y8E);
    dp->::ccc::CC6x5y8::~CC6x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y8E(Test__ZN3ccc7CC6x5y8E, "_ZN3ccc7CC6x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y8C1Ev();
extern void _ZN3ccc7CC6x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y8E[] = {
  NSPAIR(_ZN3ccc7CC6x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC6x5y83efgEv();
extern void _ZN3ccc7CC6x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x5y83abcEv,_ZTv0_n12_N3ccc7CC6x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y83abcEv,_ZThn4_N3ccc7CC6x5y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y83efgEv,_ZTv0_n16_N3ccc7CC6x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y83efgEv,_ZThn4_N3ccc7CC6x5y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x5y83abcEv,_ZTv0_n12_N3ccc7CC6x5y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y83efgEv,_ZTv0_n16_N3ccc7CC6x5y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y8E[] = {
  {&(_ZTVN3ccc7CC6x5y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y8E[];
static VTBL_ENTRY alt_thunk_names500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y83efgEv,_ZTv0_n16_N3ccc7CC6x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y83efgEv,_ZThn4_N3ccc7CC6x5y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x5y83abcEv,_ZTv0_n12_N3ccc7CC6x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y83abcEv,_ZThn4_N3ccc7CC6x5y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y8E = {  "_ZN3ccc7CC6x5y8E", // class name
  bases__ZN3ccc7CC6x5y8E, 2,
  &(vtc__ZN3ccc7CC6x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y8E),2, //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  DD6x5y8  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD6x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x5y83abcEv
  ~DD6x5y8(); // tgen
  DD6x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y8E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y83efgEv");}
void  ccc::DD6x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x5y83abcEv");}
ccc::DD6x5y8 ::~DD6x5y8(){ note_dtor("_ZN3ccc7DD6x5y8E", this);} // tgen
ccc::DD6x5y8 ::DD6x5y8(){ note_ctor("_ZN3ccc7DD6x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y8E, buf);
    ::ccc::DD6x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y8E);
    dp->::ccc::DD6x5y8::~DD6x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y8E(Test__ZN3ccc7DD6x5y8E, "_ZN3ccc7DD6x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y8C1Ev();
extern void _ZN3ccc7DD6x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y8E[] = {
  NSPAIR(_ZN3ccc7DD6x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y8E[];
extern void _ZN3ccc7DD6x5y83abcEv();
extern void _ZN3ccc7DD6x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y83efgEv,_ZTv0_n16_N3ccc7DD6x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y83efgEv,_ZThn4_N3ccc7DD6x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD6x5y83abcEv,_ZTv0_n20_N3ccc7DD6x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y83abcEv,_ZThn4_N3ccc7DD6x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y83efgEv,_ZTv0_n16_N3ccc7DD6x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD6x5y83abcEv,_ZTv0_n20_N3ccc7DD6x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y8E[] = {
  {&(_ZTVN3ccc7DD6x5y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x5y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD6x5y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y8E[];
static VTBL_ENTRY alt_thunk_names501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD6x5y83abcEv,_ZTv0_n20_N3ccc7DD6x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y83abcEv,_ZThn4_N3ccc7DD6x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y83efgEv,_ZTv0_n16_N3ccc7DD6x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y83efgEv,_ZThn4_N3ccc7DD6x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y8E = {  "_ZN3ccc7DD6x5y8E", // class name
  bases__ZN3ccc7DD6x5y8E, 2,
  &(vtc__ZN3ccc7DD6x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y8E),3, //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  CC6x5y9  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC6x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x5y93pqrEv
  ~CC6x5y9(); // tgen
  CC6x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x5y9E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x5y93efgEv");}
void  ccc::CC6x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x5y93pqrEv");}
ccc::CC6x5y9 ::~CC6x5y9(){ note_dtor("_ZN3ccc7CC6x5y9E", this);} // tgen
ccc::CC6x5y9 ::CC6x5y9(){ note_ctor("_ZN3ccc7CC6x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x5y9E, buf);
    ::ccc::CC6x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x5y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC6x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x5y9E);
    dp->::ccc::CC6x5y9::~CC6x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x5y9E(Test__ZN3ccc7CC6x5y9E, "_ZN3ccc7CC6x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x5y9C1Ev();
extern void _ZN3ccc7CC6x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x5y9E[] = {
  NSPAIR(_ZN3ccc7CC6x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC6x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x5y9E[];
extern void _ZN3ccc7CC6x5y93pqrEv();
extern void _ZN3ccc7CC6x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x5y93efgEv,_ZTv0_n16_N3ccc7CC6x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x5y93efgEv,_ZThn4_N3ccc7CC6x5y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x5y93efgEv,_ZTv0_n16_N3ccc7CC6x5y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x5y9E[] = {
  {&(_ZTVN3ccc7CC6x5y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x5y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x5y9E[];
static VTBL_ENTRY alt_thunk_names502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x5y93efgEv,_ZTv0_n16_N3ccc7CC6x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x5y93efgEv,_ZThn4_N3ccc7CC6x5y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x5y9E = {  "_ZN3ccc7CC6x5y9E", // class name
  bases__ZN3ccc7CC6x5y9E, 2,
  &(vtc__ZN3ccc7CC6x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x5y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x5y9E),2, //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  DD6x5y9  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD6x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x5y93pqrEv
  ~DD6x5y9(); // tgen
  DD6x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x5y9E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x5y93efgEv");}
void  ccc::DD6x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x5y93pqrEv");}
ccc::DD6x5y9 ::~DD6x5y9(){ note_dtor("_ZN3ccc7DD6x5y9E", this);} // tgen
ccc::DD6x5y9 ::DD6x5y9(){ note_ctor("_ZN3ccc7DD6x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x5y9E, buf);
    ::ccc::DD6x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x5y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD6x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x5y9E);
    dp->::ccc::DD6x5y9::~DD6x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x5y9E(Test__ZN3ccc7DD6x5y9E, "_ZN3ccc7DD6x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x5y9C1Ev();
extern void _ZN3ccc7DD6x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x5y9E[] = {
  NSPAIR(_ZN3ccc7DD6x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD6x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x5y93efgEv();
extern void _ZN3ccc7DD6x5y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x5y93pqrEv,_ZTv0_n12_N3ccc7DD6x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y93pqrEv,_ZThn4_N3ccc7DD6x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x5y93efgEv,_ZTv0_n16_N3ccc7DD6x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x5y93efgEv,_ZThn4_N3ccc7DD6x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x5y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x5y93pqrEv,_ZTv0_n12_N3ccc7DD6x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x5y93efgEv,_ZTv0_n16_N3ccc7DD6x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x5y9E[] = {
  {&(_ZTVN3ccc7DD6x5y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD6x5y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x5y9E[];
static VTBL_ENTRY alt_thunk_names503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x5y93efgEv,_ZTv0_n16_N3ccc7DD6x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y93efgEv,_ZThn4_N3ccc7DD6x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x5y93pqrEv,_ZTv0_n12_N3ccc7DD6x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x5y93pqrEv,_ZThn4_N3ccc7DD6x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x5y9E = {  "_ZN3ccc7DD6x5y9E", // class name
  bases__ZN3ccc7DD6x5y9E, 2,
  &(vtc__ZN3ccc7DD6x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x5y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x5y9E),3, //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  CC6x5y10  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC6x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x5y103abcEv
  ~CC6x5y10(); // tgen
  CC6x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y10E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x5y103pqrEv");}
void  ccc::CC6x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x5y103abcEv");}
ccc::CC6x5y10 ::~CC6x5y10(){ note_dtor("_ZN3ccc8CC6x5y10E", this);} // tgen
ccc::CC6x5y10 ::CC6x5y10(){ note_ctor("_ZN3ccc8CC6x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x5y10E, buf);
    ::ccc::CC6x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x5y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC6x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x5y10E);
    dp->::ccc::CC6x5y10::~CC6x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x5y10E(Test__ZN3ccc8CC6x5y10E, "_ZN3ccc8CC6x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x5y10C1Ev();
extern void _ZN3ccc8CC6x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x5y10E[] = {
  NSPAIR(_ZN3ccc8CC6x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC6x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x5y10E[];
extern void _ZN3ccc8CC6x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC6x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x5y103abcEv,_ZTv0_n12_N3ccc8CC6x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y103abcEv,_ZThn4_N3ccc8CC6x5y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x5y103abcEv,_ZTv0_n12_N3ccc8CC6x5y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x5y10E[] = {
  {&(_ZTVN3ccc8CC6x5y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x5y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x5y10E[];
static VTBL_ENTRY alt_thunk_names504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x5y103abcEv,_ZTv0_n12_N3ccc8CC6x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x5y103abcEv,_ZThn4_N3ccc8CC6x5y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x5y10E = {  "_ZN3ccc8CC6x5y10E", // class name
  bases__ZN3ccc8CC6x5y10E, 2,
  &(vtc__ZN3ccc8CC6x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x5y10E),2, //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  DD6x5y10  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD6x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x5y103abcEv
  ~DD6x5y10(); // tgen
  DD6x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x5y10E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x5y103pqrEv");}
void  ccc::DD6x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x5y103abcEv");}
ccc::DD6x5y10 ::~DD6x5y10(){ note_dtor("_ZN3ccc8DD6x5y10E", this);} // tgen
ccc::DD6x5y10 ::DD6x5y10(){ note_ctor("_ZN3ccc8DD6x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x5y10E, buf);
    ::ccc::DD6x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x5y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD6x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x5y10E);
    dp->::ccc::DD6x5y10::~DD6x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x5y10E(Test__ZN3ccc8DD6x5y10E, "_ZN3ccc8DD6x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x5y10C1Ev();
extern void _ZN3ccc8DD6x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x5y10E[] = {
  NSPAIR(_ZN3ccc8DD6x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD6x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y10E[];
extern void _ZN3ccc8DD6x5y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x5y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x5y103pqrEv,_ZTv0_n12_N3ccc8DD6x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y103pqrEv,_ZThn4_N3ccc8DD6x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x5y103abcEv,_ZTv0_n20_N3ccc8DD6x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y103abcEv,_ZThn4_N3ccc8DD6x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x5y103pqrEv,_ZTv0_n12_N3ccc8DD6x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x5y103abcEv,_ZTv0_n20_N3ccc8DD6x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x5y10E[] = {
  {&(_ZTVN3ccc8DD6x5y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x5y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x5y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x5y10E[];
static VTBL_ENTRY alt_thunk_names505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x5y103abcEv,_ZTv0_n20_N3ccc8DD6x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y103abcEv,_ZThn4_N3ccc8DD6x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x5y103pqrEv,_ZTv0_n12_N3ccc8DD6x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y103pqrEv,_ZThn4_N3ccc8DD6x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x5y10E = {  "_ZN3ccc8DD6x5y10E", // class name
  bases__ZN3ccc8DD6x5y10E, 2,
  &(vtc__ZN3ccc8DD6x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x5y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x5y10E),3, //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  CC6x5y11  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC6x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x5y113efgEv
  ~CC6x5y11(); // tgen
  CC6x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y11E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x5y113pqrEv");}
void  ccc::CC6x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x5y113efgEv");}
ccc::CC6x5y11 ::~CC6x5y11(){ note_dtor("_ZN3ccc8CC6x5y11E", this);} // tgen
ccc::CC6x5y11 ::CC6x5y11(){ note_ctor("_ZN3ccc8CC6x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x5y11E, buf);
    ::ccc::CC6x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x5y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC6x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x5y11E);
    dp->::ccc::CC6x5y11::~CC6x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x5y11E(Test__ZN3ccc8CC6x5y11E, "_ZN3ccc8CC6x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x5y11C1Ev();
extern void _ZN3ccc8CC6x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x5y11E[] = {
  NSPAIR(_ZN3ccc8CC6x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC6x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x5y11E[];
extern void _ZN3ccc8CC6x5y113pqrEv();
extern void _ZN3ccc8CC6x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x5y113efgEv,_ZTv0_n16_N3ccc8CC6x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y113efgEv,_ZThn4_N3ccc8CC6x5y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x5y113efgEv,_ZTv0_n16_N3ccc8CC6x5y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x5y11E[] = {
  {&(_ZTVN3ccc8CC6x5y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x5y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x5y11E[];
static VTBL_ENTRY alt_thunk_names506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x5y113efgEv,_ZTv0_n16_N3ccc8CC6x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x5y113efgEv,_ZThn4_N3ccc8CC6x5y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x5y11E = {  "_ZN3ccc8CC6x5y11E", // class name
  bases__ZN3ccc8CC6x5y11E, 2,
  &(vtc__ZN3ccc8CC6x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x5y11E),2, //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  DD6x5y11  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD6x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x5y113efgEv
  ~DD6x5y11(); // tgen
  DD6x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x5y11E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x5y113pqrEv");}
void  ccc::DD6x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x5y113efgEv");}
ccc::DD6x5y11 ::~DD6x5y11(){ note_dtor("_ZN3ccc8DD6x5y11E", this);} // tgen
ccc::DD6x5y11 ::DD6x5y11(){ note_ctor("_ZN3ccc8DD6x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x5y11E, buf);
    ::ccc::DD6x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x5y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD6x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x5y11E);
    dp->::ccc::DD6x5y11::~DD6x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x5y11E(Test__ZN3ccc8DD6x5y11E, "_ZN3ccc8DD6x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x5y11C1Ev();
extern void _ZN3ccc8DD6x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x5y11E[] = {
  NSPAIR(_ZN3ccc8DD6x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD6x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x5y113efgEv();
extern void _ZN3ccc8DD6x5y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x5y113pqrEv,_ZTv0_n12_N3ccc8DD6x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y113pqrEv,_ZThn4_N3ccc8DD6x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x5y113efgEv,_ZTv0_n16_N3ccc8DD6x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y113efgEv,_ZThn4_N3ccc8DD6x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x5y113pqrEv,_ZTv0_n12_N3ccc8DD6x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x5y113efgEv,_ZTv0_n16_N3ccc8DD6x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x5y11E[] = {
  {&(_ZTVN3ccc8DD6x5y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x5y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x5y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x5y11E[];
static VTBL_ENTRY alt_thunk_names507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x5y113efgEv,_ZTv0_n16_N3ccc8DD6x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y113efgEv,_ZThn4_N3ccc8DD6x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x5y113pqrEv,_ZTv0_n12_N3ccc8DD6x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y113pqrEv,_ZThn4_N3ccc8DD6x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x5y11E = {  "_ZN3ccc8DD6x5y11E", // class name
  bases__ZN3ccc8DD6x5y11E, 2,
  &(vtc__ZN3ccc8DD6x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x5y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x5y11E),3, //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  CC6x5y12  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC6x5y123abcEv
  ~CC6x5y12(); // tgen
  CC6x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC6x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x5y123abcEv");}
ccc::CC6x5y12 ::~CC6x5y12(){ note_dtor("_ZN3ccc8CC6x5y12E", this);} // tgen
ccc::CC6x5y12 ::CC6x5y12(){ note_ctor("_ZN3ccc8CC6x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x5y12E, buf);
    ::ccc::CC6x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x5y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC6x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x5y12E);
    dp->::ccc::CC6x5y12::~CC6x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x5y12E(Test__ZN3ccc8CC6x5y12E, "_ZN3ccc8CC6x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x5y12C1Ev();
extern void _ZN3ccc8CC6x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x5y12E[] = {
  NSPAIR(_ZN3ccc8CC6x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC6x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC6x5y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x5y123abcEv,_ZTv0_n12_N3ccc8CC6x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y123abcEv,_ZThn4_N3ccc8CC6x5y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x5y123abcEv,_ZTv0_n12_N3ccc8CC6x5y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x5y12E[] = {
  {&(_ZTVN3ccc8CC6x5y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x5y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x5y12E[];
static VTBL_ENTRY alt_thunk_names508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x5y123abcEv,_ZTv0_n12_N3ccc8CC6x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x5y123abcEv,_ZThn4_N3ccc8CC6x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x5y12E = {  "_ZN3ccc8CC6x5y12E", // class name
  bases__ZN3ccc8CC6x5y12E, 2,
  &(vtc__ZN3ccc8CC6x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x5y12E),2, //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  DD6x5y12  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD6x5y123abcEv
  ~DD6x5y12(); // tgen
  DD6x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x5y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD6x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x5y123abcEv");}
ccc::DD6x5y12 ::~DD6x5y12(){ note_dtor("_ZN3ccc8DD6x5y12E", this);} // tgen
ccc::DD6x5y12 ::DD6x5y12(){ note_ctor("_ZN3ccc8DD6x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x5y12E, buf);
    ::ccc::DD6x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x5y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD6x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x5y12E);
    dp->::ccc::DD6x5y12::~DD6x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x5y12E(Test__ZN3ccc8DD6x5y12E, "_ZN3ccc8DD6x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x5y12C1Ev();
extern void _ZN3ccc8DD6x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x5y12E[] = {
  NSPAIR(_ZN3ccc8DD6x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD6x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y12E[];
extern void _ZN3ccc8DD6x5y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD6x5y123abcEv,_ZTv0_n20_N3ccc8DD6x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y123abcEv,_ZThn4_N3ccc8DD6x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD6x5y123abcEv,_ZTv0_n20_N3ccc8DD6x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x5y12E[] = {
  {&(_ZTVN3ccc8DD6x5y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x5y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x5y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x5y12E[];
static VTBL_ENTRY alt_thunk_names509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD6x5y123abcEv,_ZTv0_n20_N3ccc8DD6x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y123abcEv,_ZThn4_N3ccc8DD6x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x5y12E = {  "_ZN3ccc8DD6x5y12E", // class name
  bases__ZN3ccc8DD6x5y12E, 2,
  &(vtc__ZN3ccc8DD6x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x5y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x5y12E),3, //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  CC6x5y13  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC6x5y133efgEv
  ~CC6x5y13(); // tgen
  CC6x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y13E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC6x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x5y133efgEv");}
ccc::CC6x5y13 ::~CC6x5y13(){ note_dtor("_ZN3ccc8CC6x5y13E", this);} // tgen
ccc::CC6x5y13 ::CC6x5y13(){ note_ctor("_ZN3ccc8CC6x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x5y13E, buf);
    ::ccc::CC6x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x5y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC6x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x5y13E);
    dp->::ccc::CC6x5y13::~CC6x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x5y13E(Test__ZN3ccc8CC6x5y13E, "_ZN3ccc8CC6x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x5y13C1Ev();
extern void _ZN3ccc8CC6x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x5y13E[] = {
  NSPAIR(_ZN3ccc8CC6x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC6x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC6x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x5y133efgEv,_ZTv0_n16_N3ccc8CC6x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x5y133efgEv,_ZThn4_N3ccc8CC6x5y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x5y133efgEv,_ZTv0_n16_N3ccc8CC6x5y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x5y13E[] = {
  {&(_ZTVN3ccc8CC6x5y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x5y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x5y13E[];
static VTBL_ENTRY alt_thunk_names510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x5y133efgEv,_ZTv0_n16_N3ccc8CC6x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x5y133efgEv,_ZThn4_N3ccc8CC6x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x5y13E = {  "_ZN3ccc8CC6x5y13E", // class name
  bases__ZN3ccc8CC6x5y13E, 2,
  &(vtc__ZN3ccc8CC6x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x5y13E),2, //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  DD6x5y13  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD6x5y133efgEv
  ~DD6x5y13(); // tgen
  DD6x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x5y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD6x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x5y133efgEv");}
ccc::DD6x5y13 ::~DD6x5y13(){ note_dtor("_ZN3ccc8DD6x5y13E", this);} // tgen
ccc::DD6x5y13 ::DD6x5y13(){ note_ctor("_ZN3ccc8DD6x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x5y13E, buf);
    ::ccc::DD6x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x5y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD6x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x5y13E);
    dp->::ccc::DD6x5y13::~DD6x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x5y13E(Test__ZN3ccc8DD6x5y13E, "_ZN3ccc8DD6x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x5y13C1Ev();
extern void _ZN3ccc8DD6x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x5y13E[] = {
  NSPAIR(_ZN3ccc8DD6x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD6x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x5y133efgEv,_ZTv0_n16_N3ccc8DD6x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y133efgEv,_ZThn4_N3ccc8DD6x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x5y133efgEv,_ZTv0_n16_N3ccc8DD6x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x5y13E[] = {
  {&(_ZTVN3ccc8DD6x5y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x5y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x5y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x5y13E[];
static VTBL_ENTRY alt_thunk_names511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x5y133efgEv,_ZTv0_n16_N3ccc8DD6x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y133efgEv,_ZThn4_N3ccc8DD6x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x5y13E = {  "_ZN3ccc8DD6x5y13E", // class name
  bases__ZN3ccc8DD6x5y13E, 2,
  &(vtc__ZN3ccc8DD6x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x5y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x5y13E),3, //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  CC6x5y14  : virtual ::ccc::AA6 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC6x5y143pqrEv
  ~CC6x5y14(); // tgen
  CC6x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC6x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x5y143pqrEv");}
ccc::CC6x5y14 ::~CC6x5y14(){ note_dtor("_ZN3ccc8CC6x5y14E", this);} // tgen
ccc::CC6x5y14 ::CC6x5y14(){ note_ctor("_ZN3ccc8CC6x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x5y14E, buf);
    ::ccc::CC6x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x5y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC6x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x5y14E);
    dp->::ccc::CC6x5y14::~CC6x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x5y14E(Test__ZN3ccc8CC6x5y14E, "_ZN3ccc8CC6x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x5y14C1Ev();
extern void _ZN3ccc8CC6x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x5y14E[] = {
  NSPAIR(_ZN3ccc8CC6x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC6x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x5y14E[];
extern void _ZN3ccc8CC6x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x5y14E[] = {
  {&(_ZTVN3ccc8CC6x5y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x5y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x5y14E[];
Class_Descriptor cd__ZN3ccc8CC6x5y14E = {  "_ZN3ccc8CC6x5y14E", // class name
  bases__ZN3ccc8CC6x5y14E, 2,
  &(vtc__ZN3ccc8CC6x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x5y14E),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  DD6x5y14  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD6x5y143pqrEv
  ~DD6x5y14(); // tgen
  DD6x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x5y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD6x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x5y143pqrEv");}
ccc::DD6x5y14 ::~DD6x5y14(){ note_dtor("_ZN3ccc8DD6x5y14E", this);} // tgen
ccc::DD6x5y14 ::DD6x5y14(){ note_ctor("_ZN3ccc8DD6x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x5y14E, buf);
    ::ccc::DD6x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x5y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD6x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x5y14E);
    dp->::ccc::DD6x5y14::~DD6x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x5y14E(Test__ZN3ccc8DD6x5y14E, "_ZN3ccc8DD6x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x5y14C1Ev();
extern void _ZN3ccc8DD6x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x5y14E[] = {
  NSPAIR(_ZN3ccc8DD6x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD6x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x5y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x5y143pqrEv,_ZTv0_n12_N3ccc8DD6x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x5y143pqrEv,_ZThn4_N3ccc8DD6x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x5y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x5y143pqrEv,_ZTv0_n12_N3ccc8DD6x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x5y14E[] = {
  {&(_ZTVN3ccc8DD6x5y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x5y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD6x5y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x5y14E[];
static VTBL_ENTRY alt_thunk_names512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x5y143pqrEv,_ZTv0_n12_N3ccc8DD6x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x5y143pqrEv,_ZThn4_N3ccc8DD6x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x5y14E = {  "_ZN3ccc8DD6x5y14E", // class name
  bases__ZN3ccc8DD6x5y14E, 2,
  &(vtc__ZN3ccc8DD6x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x5y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x5y14E),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  CC6x5y15  : virtual ::ccc::AA6 , ::ccc::BB5 {
  ~CC6x5y15(); // tgen
  CC6x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x5y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC6x5y15 ::~CC6x5y15(){ note_dtor("_ZN3ccc8CC6x5y15E", this);} // tgen
ccc::CC6x5y15 ::CC6x5y15(){ note_ctor("_ZN3ccc8CC6x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x5y15E, buf);
    ::ccc::CC6x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x5y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC6x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x5y15E);
    dp->::ccc::CC6x5y15::~CC6x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x5y15E(Test__ZN3ccc8CC6x5y15E, "_ZN3ccc8CC6x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x5y15C1Ev();
extern void _ZN3ccc8CC6x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x5y15E[] = {
  NSPAIR(_ZN3ccc8CC6x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC6x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x5y15E[] = {
  {&(_ZTVN3ccc8CC6x5y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x5y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x5y15E[];
Class_Descriptor cd__ZN3ccc8CC6x5y15E = {  "_ZN3ccc8CC6x5y15E", // class name
  bases__ZN3ccc8CC6x5y15E, 2,
  &(vtc__ZN3ccc8CC6x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x5y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x5y15E),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  DD6x5y15  : virtual ::ccc::AA6 , virtual ::ccc::BB5 {
  ~DD6x5y15(); // tgen
  DD6x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x5y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD6x5y15 ::~DD6x5y15(){ note_dtor("_ZN3ccc8DD6x5y15E", this);} // tgen
ccc::DD6x5y15 ::DD6x5y15(){ note_ctor("_ZN3ccc8DD6x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x5y15E, buf);
    ::ccc::DD6x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x5y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD6x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x5y15E);
    dp->::ccc::DD6x5y15::~DD6x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x5y15E(Test__ZN3ccc8DD6x5y15E, "_ZN3ccc8DD6x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x5y15C1Ev();
extern void _ZN3ccc8DD6x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x5y15E[] = {
  NSPAIR(_ZN3ccc8DD6x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD6x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x5y15E[] = {
  {&(_ZTVN3ccc8DD6x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD6x5y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x5y15E[];
Class_Descriptor cd__ZN3ccc8DD6x5y15E = {  "_ZN3ccc8DD6x5y15E", // class name
  bases__ZN3ccc8DD6x5y15E, 2,
  &(vtc__ZN3ccc8DD6x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x5y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x5y15E),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  CC6x6y0  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y03pqrEv
  ~CC6x6y0(); // tgen
  CC6x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y0E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y03abcEv");}
void  ccc::CC6x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y03efgEv");}
void  ccc::CC6x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y03pqrEv");}
ccc::CC6x6y0 ::~CC6x6y0(){ note_dtor("_ZN3ccc7CC6x6y0E", this);} // tgen
ccc::CC6x6y0 ::CC6x6y0(){ note_ctor("_ZN3ccc7CC6x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y0E, buf);
    ::ccc::CC6x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y0E);
    dp->::ccc::CC6x6y0::~CC6x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y0E(Test__ZN3ccc7CC6x6y0E, "_ZN3ccc7CC6x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y0C1Ev();
extern void _ZN3ccc7CC6x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y0E[] = {
  NSPAIR(_ZN3ccc7CC6x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y0E[];
extern void _ZN3ccc7CC6x6y03abcEv();
extern void _ZN3ccc7CC6x6y03efgEv();
extern void _ZN3ccc7CC6x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y03abcEv,_ZTv0_n12_N3ccc7CC6x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y03abcEv,_ZThn4_N3ccc7CC6x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y03efgEv,_ZTv0_n16_N3ccc7CC6x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y03efgEv,_ZThn4_N3ccc7CC6x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y03abcEv,_ZTv0_n12_N3ccc7CC6x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y03efgEv,_ZTv0_n16_N3ccc7CC6x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y0E[] = {
  {&(_ZTVN3ccc7CC6x6y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y0E[];
static VTBL_ENTRY alt_thunk_names513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y03efgEv,_ZTv0_n16_N3ccc7CC6x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y03efgEv,_ZThn4_N3ccc7CC6x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y03abcEv,_ZTv0_n12_N3ccc7CC6x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y03abcEv,_ZThn4_N3ccc7CC6x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y0E = {  "_ZN3ccc7CC6x6y0E", // class name
  bases__ZN3ccc7CC6x6y0E, 2,
  &(vtc__ZN3ccc7CC6x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y0E),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  DD6x6y0  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD6x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x6y03pqrEv
  ~DD6x6y0(); // tgen
  DD6x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y0E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y03abcEv");}
void  ccc::DD6x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y03efgEv");}
void  ccc::DD6x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y03pqrEv");}
ccc::DD6x6y0 ::~DD6x6y0(){ note_dtor("_ZN3ccc7DD6x6y0E", this);} // tgen
ccc::DD6x6y0 ::DD6x6y0(){ note_ctor("_ZN3ccc7DD6x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y0E, buf);
    ::ccc::DD6x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y0E);
    dp->::ccc::DD6x6y0::~DD6x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y0E(Test__ZN3ccc7DD6x6y0E, "_ZN3ccc7DD6x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y0C1Ev();
extern void _ZN3ccc7DD6x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y0E[] = {
  NSPAIR(_ZN3ccc7DD6x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y0E[];
extern void _ZN3ccc7DD6x6y03abcEv();
extern void _ZN3ccc7DD6x6y03efgEv();
extern void _ZN3ccc7DD6x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y03abcEv,_ZTv0_n12_N3ccc7DD6x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y03abcEv,_ZThn4_N3ccc7DD6x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y03efgEv,_ZTv0_n16_N3ccc7DD6x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y03efgEv,_ZThn4_N3ccc7DD6x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y03abcEv,_ZTv0_n12_N3ccc7DD6x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y03efgEv,_ZTv0_n16_N3ccc7DD6x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y0E[] = {
  {&(_ZTVN3ccc7DD6x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y0E[];
static VTBL_ENTRY alt_thunk_names514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y03efgEv,_ZTv0_n16_N3ccc7DD6x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y03efgEv,_ZThn4_N3ccc7DD6x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y03abcEv,_ZTv0_n12_N3ccc7DD6x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y03abcEv,_ZThn4_N3ccc7DD6x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y0E = {  "_ZN3ccc7DD6x6y0E", // class name
  bases__ZN3ccc7DD6x6y0E, 2,
  &(vtc__ZN3ccc7DD6x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y0E),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  CC6x6y1  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x6y13efgEv
  ~CC6x6y1(); // tgen
  CC6x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y1E) C1{ VBC2{ v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y13abcEv");}
void  ccc::CC6x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y13pqrEv");}
void  ccc::CC6x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y13efgEv");}
ccc::CC6x6y1 ::~CC6x6y1(){ note_dtor("_ZN3ccc7CC6x6y1E", this);} // tgen
ccc::CC6x6y1 ::CC6x6y1(){ note_ctor("_ZN3ccc7CC6x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y1E, buf);
    ::ccc::CC6x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y1E);
    dp->::ccc::CC6x6y1::~CC6x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y1E(Test__ZN3ccc7CC6x6y1E, "_ZN3ccc7CC6x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y1C1Ev();
extern void _ZN3ccc7CC6x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y1E[] = {
  NSPAIR(_ZN3ccc7CC6x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y1E[];
extern void _ZN3ccc7CC6x6y13abcEv();
extern void _ZN3ccc7CC6x6y13efgEv();
extern void _ZN3ccc7CC6x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y13abcEv,_ZTv0_n12_N3ccc7CC6x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y13abcEv,_ZThn4_N3ccc7CC6x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y13efgEv,_ZTv0_n16_N3ccc7CC6x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y13efgEv,_ZThn4_N3ccc7CC6x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y13abcEv,_ZTv0_n12_N3ccc7CC6x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y13efgEv,_ZTv0_n16_N3ccc7CC6x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y1E[] = {
  {&(_ZTVN3ccc7CC6x6y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y1E[];
static VTBL_ENTRY alt_thunk_names515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y13efgEv,_ZTv0_n16_N3ccc7CC6x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y13efgEv,_ZThn4_N3ccc7CC6x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y13abcEv,_ZTv0_n12_N3ccc7CC6x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y13abcEv,_ZThn4_N3ccc7CC6x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y1E = {  "_ZN3ccc7CC6x6y1E", // class name
  bases__ZN3ccc7CC6x6y1E, 2,
  &(vtc__ZN3ccc7CC6x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y1E),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  DD6x6y1  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD6x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x6y13efgEv
  ~DD6x6y1(); // tgen
  DD6x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y1E) C1{ VBC2{ v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y13abcEv");}
void  ccc::DD6x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y13pqrEv");}
void  ccc::DD6x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y13efgEv");}
ccc::DD6x6y1 ::~DD6x6y1(){ note_dtor("_ZN3ccc7DD6x6y1E", this);} // tgen
ccc::DD6x6y1 ::DD6x6y1(){ note_ctor("_ZN3ccc7DD6x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y1E, buf);
    ::ccc::DD6x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y1E);
    dp->::ccc::DD6x6y1::~DD6x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y1E(Test__ZN3ccc7DD6x6y1E, "_ZN3ccc7DD6x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y1C1Ev();
extern void _ZN3ccc7DD6x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y1E[] = {
  NSPAIR(_ZN3ccc7DD6x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y1E[];
extern void _ZN3ccc7DD6x6y13abcEv();
extern void _ZN3ccc7DD6x6y13efgEv();
extern void _ZN3ccc7DD6x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y13abcEv,_ZTv0_n12_N3ccc7DD6x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y13abcEv,_ZThn4_N3ccc7DD6x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y13efgEv,_ZTv0_n16_N3ccc7DD6x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y13efgEv,_ZThn4_N3ccc7DD6x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y13abcEv,_ZTv0_n12_N3ccc7DD6x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y13efgEv,_ZTv0_n16_N3ccc7DD6x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y1E[] = {
  {&(_ZTVN3ccc7DD6x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y1E[];
static VTBL_ENTRY alt_thunk_names516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y13efgEv,_ZTv0_n16_N3ccc7DD6x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y13efgEv,_ZThn4_N3ccc7DD6x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y13abcEv,_ZTv0_n12_N3ccc7DD6x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y13abcEv,_ZThn4_N3ccc7DD6x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y1E = {  "_ZN3ccc7DD6x6y1E", // class name
  bases__ZN3ccc7DD6x6y1E, 2,
  &(vtc__ZN3ccc7DD6x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y1E),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  CC6x6y2  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y23pqrEv
  ~CC6x6y2(); // tgen
  CC6x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y2E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y23efgEv");}
void  ccc::CC6x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y23abcEv");}
void  ccc::CC6x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y23pqrEv");}
ccc::CC6x6y2 ::~CC6x6y2(){ note_dtor("_ZN3ccc7CC6x6y2E", this);} // tgen
ccc::CC6x6y2 ::CC6x6y2(){ note_ctor("_ZN3ccc7CC6x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y2E, buf);
    ::ccc::CC6x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y2E);
    dp->::ccc::CC6x6y2::~CC6x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y2E(Test__ZN3ccc7CC6x6y2E, "_ZN3ccc7CC6x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y2C1Ev();
extern void _ZN3ccc7CC6x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y2E[] = {
  NSPAIR(_ZN3ccc7CC6x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y2E[];
extern void _ZN3ccc7CC6x6y23abcEv();
extern void _ZN3ccc7CC6x6y23efgEv();
extern void _ZN3ccc7CC6x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y23abcEv,_ZTv0_n12_N3ccc7CC6x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y23abcEv,_ZThn4_N3ccc7CC6x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y23efgEv,_ZTv0_n16_N3ccc7CC6x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y23efgEv,_ZThn4_N3ccc7CC6x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y23abcEv,_ZTv0_n12_N3ccc7CC6x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y23efgEv,_ZTv0_n16_N3ccc7CC6x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y2E[] = {
  {&(_ZTVN3ccc7CC6x6y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y2E[];
static VTBL_ENTRY alt_thunk_names517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y23efgEv,_ZTv0_n16_N3ccc7CC6x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y23efgEv,_ZThn4_N3ccc7CC6x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y23abcEv,_ZTv0_n12_N3ccc7CC6x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y23abcEv,_ZThn4_N3ccc7CC6x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y2E = {  "_ZN3ccc7CC6x6y2E", // class name
  bases__ZN3ccc7CC6x6y2E, 2,
  &(vtc__ZN3ccc7CC6x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y2E),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  DD6x6y2  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD6x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x6y23pqrEv
  ~DD6x6y2(); // tgen
  DD6x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y2E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y23efgEv");}
void  ccc::DD6x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y23abcEv");}
void  ccc::DD6x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y23pqrEv");}
ccc::DD6x6y2 ::~DD6x6y2(){ note_dtor("_ZN3ccc7DD6x6y2E", this);} // tgen
ccc::DD6x6y2 ::DD6x6y2(){ note_ctor("_ZN3ccc7DD6x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y2E, buf);
    ::ccc::DD6x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y2E);
    dp->::ccc::DD6x6y2::~DD6x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y2E(Test__ZN3ccc7DD6x6y2E, "_ZN3ccc7DD6x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y2C1Ev();
extern void _ZN3ccc7DD6x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y2E[] = {
  NSPAIR(_ZN3ccc7DD6x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y2E[];
extern void _ZN3ccc7DD6x6y23abcEv();
extern void _ZN3ccc7DD6x6y23efgEv();
extern void _ZN3ccc7DD6x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y23abcEv,_ZTv0_n12_N3ccc7DD6x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y23abcEv,_ZThn4_N3ccc7DD6x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y23efgEv,_ZTv0_n16_N3ccc7DD6x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y23efgEv,_ZThn4_N3ccc7DD6x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y23abcEv,_ZTv0_n12_N3ccc7DD6x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y23efgEv,_ZTv0_n16_N3ccc7DD6x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y2E[] = {
  {&(_ZTVN3ccc7DD6x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y2E[];
static VTBL_ENTRY alt_thunk_names518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y23efgEv,_ZTv0_n16_N3ccc7DD6x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y23efgEv,_ZThn4_N3ccc7DD6x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y23abcEv,_ZTv0_n12_N3ccc7DD6x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y23abcEv,_ZThn4_N3ccc7DD6x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y2E = {  "_ZN3ccc7DD6x6y2E", // class name
  bases__ZN3ccc7DD6x6y2E, 2,
  &(vtc__ZN3ccc7DD6x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y2E),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  CC6x6y3  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x6y33abcEv
  ~CC6x6y3(); // tgen
  CC6x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y3E) C1{ VBC2{ v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y33efgEv");}
void  ccc::CC6x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y33pqrEv");}
void  ccc::CC6x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y33abcEv");}
ccc::CC6x6y3 ::~CC6x6y3(){ note_dtor("_ZN3ccc7CC6x6y3E", this);} // tgen
ccc::CC6x6y3 ::CC6x6y3(){ note_ctor("_ZN3ccc7CC6x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y3E, buf);
    ::ccc::CC6x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y3E);
    dp->::ccc::CC6x6y3::~CC6x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y3E(Test__ZN3ccc7CC6x6y3E, "_ZN3ccc7CC6x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y3C1Ev();
extern void _ZN3ccc7CC6x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y3E[] = {
  NSPAIR(_ZN3ccc7CC6x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y3E[];
extern void _ZN3ccc7CC6x6y33abcEv();
extern void _ZN3ccc7CC6x6y33efgEv();
extern void _ZN3ccc7CC6x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y33abcEv,_ZTv0_n12_N3ccc7CC6x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y33abcEv,_ZThn4_N3ccc7CC6x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y33efgEv,_ZTv0_n16_N3ccc7CC6x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y33efgEv,_ZThn4_N3ccc7CC6x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y33abcEv,_ZTv0_n12_N3ccc7CC6x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y33efgEv,_ZTv0_n16_N3ccc7CC6x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y3E[] = {
  {&(_ZTVN3ccc7CC6x6y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y3E[];
static VTBL_ENTRY alt_thunk_names519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y33efgEv,_ZTv0_n16_N3ccc7CC6x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y33efgEv,_ZThn4_N3ccc7CC6x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y33abcEv,_ZTv0_n12_N3ccc7CC6x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y33abcEv,_ZThn4_N3ccc7CC6x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y3E = {  "_ZN3ccc7CC6x6y3E", // class name
  bases__ZN3ccc7CC6x6y3E, 2,
  &(vtc__ZN3ccc7CC6x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y3E),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  DD6x6y3  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD6x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x6y33abcEv
  ~DD6x6y3(); // tgen
  DD6x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y3E) C1{ VBC2{ v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y33efgEv");}
void  ccc::DD6x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y33pqrEv");}
void  ccc::DD6x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y33abcEv");}
ccc::DD6x6y3 ::~DD6x6y3(){ note_dtor("_ZN3ccc7DD6x6y3E", this);} // tgen
ccc::DD6x6y3 ::DD6x6y3(){ note_ctor("_ZN3ccc7DD6x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y3E, buf);
    ::ccc::DD6x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y3E);
    dp->::ccc::DD6x6y3::~DD6x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y3E(Test__ZN3ccc7DD6x6y3E, "_ZN3ccc7DD6x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y3C1Ev();
extern void _ZN3ccc7DD6x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y3E[] = {
  NSPAIR(_ZN3ccc7DD6x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y3E[];
extern void _ZN3ccc7DD6x6y33abcEv();
extern void _ZN3ccc7DD6x6y33efgEv();
extern void _ZN3ccc7DD6x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y33abcEv,_ZTv0_n12_N3ccc7DD6x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y33abcEv,_ZThn4_N3ccc7DD6x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y33efgEv,_ZTv0_n16_N3ccc7DD6x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y33efgEv,_ZThn4_N3ccc7DD6x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y33abcEv,_ZTv0_n12_N3ccc7DD6x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y33efgEv,_ZTv0_n16_N3ccc7DD6x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y3E[] = {
  {&(_ZTVN3ccc7DD6x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y3E[];
static VTBL_ENTRY alt_thunk_names520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y33efgEv,_ZTv0_n16_N3ccc7DD6x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y33efgEv,_ZThn4_N3ccc7DD6x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y33abcEv,_ZTv0_n12_N3ccc7DD6x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y33abcEv,_ZThn4_N3ccc7DD6x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y3E = {  "_ZN3ccc7DD6x6y3E", // class name
  bases__ZN3ccc7DD6x6y3E, 2,
  &(vtc__ZN3ccc7DD6x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y3E),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  CC6x6y4  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC6x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x6y43efgEv
  ~CC6x6y4(); // tgen
  CC6x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y4E) C1{ VBC2{ v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y43pqrEv");}
void  ccc::CC6x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y43abcEv");}
void  ccc::CC6x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y43efgEv");}
ccc::CC6x6y4 ::~CC6x6y4(){ note_dtor("_ZN3ccc7CC6x6y4E", this);} // tgen
ccc::CC6x6y4 ::CC6x6y4(){ note_ctor("_ZN3ccc7CC6x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y4E, buf);
    ::ccc::CC6x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y4E);
    dp->::ccc::CC6x6y4::~CC6x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y4E(Test__ZN3ccc7CC6x6y4E, "_ZN3ccc7CC6x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y4C1Ev();
extern void _ZN3ccc7CC6x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y4E[] = {
  NSPAIR(_ZN3ccc7CC6x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y4E[];
extern void _ZN3ccc7CC6x6y43abcEv();
extern void _ZN3ccc7CC6x6y43efgEv();
extern void _ZN3ccc7CC6x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y43abcEv,_ZTv0_n12_N3ccc7CC6x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y43abcEv,_ZThn4_N3ccc7CC6x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y43efgEv,_ZTv0_n16_N3ccc7CC6x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y43efgEv,_ZThn4_N3ccc7CC6x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y43abcEv,_ZTv0_n12_N3ccc7CC6x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y43efgEv,_ZTv0_n16_N3ccc7CC6x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y4E[] = {
  {&(_ZTVN3ccc7CC6x6y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y4E[];
static VTBL_ENTRY alt_thunk_names521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y43efgEv,_ZTv0_n16_N3ccc7CC6x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y43efgEv,_ZThn4_N3ccc7CC6x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y43abcEv,_ZTv0_n12_N3ccc7CC6x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y43abcEv,_ZThn4_N3ccc7CC6x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y4E = {  "_ZN3ccc7CC6x6y4E", // class name
  bases__ZN3ccc7CC6x6y4E, 2,
  &(vtc__ZN3ccc7CC6x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y4E),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  DD6x6y4  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD6x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x6y43efgEv
  ~DD6x6y4(); // tgen
  DD6x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y4E) C1{ VBC2{ v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y43pqrEv");}
void  ccc::DD6x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y43abcEv");}
void  ccc::DD6x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y43efgEv");}
ccc::DD6x6y4 ::~DD6x6y4(){ note_dtor("_ZN3ccc7DD6x6y4E", this);} // tgen
ccc::DD6x6y4 ::DD6x6y4(){ note_ctor("_ZN3ccc7DD6x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y4E, buf);
    ::ccc::DD6x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y4E);
    dp->::ccc::DD6x6y4::~DD6x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y4E(Test__ZN3ccc7DD6x6y4E, "_ZN3ccc7DD6x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y4C1Ev();
extern void _ZN3ccc7DD6x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y4E[] = {
  NSPAIR(_ZN3ccc7DD6x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y4E[];
extern void _ZN3ccc7DD6x6y43abcEv();
extern void _ZN3ccc7DD6x6y43efgEv();
extern void _ZN3ccc7DD6x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y43abcEv,_ZTv0_n12_N3ccc7DD6x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y43abcEv,_ZThn4_N3ccc7DD6x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y43efgEv,_ZTv0_n16_N3ccc7DD6x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y43efgEv,_ZThn4_N3ccc7DD6x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y43abcEv,_ZTv0_n12_N3ccc7DD6x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y43efgEv,_ZTv0_n16_N3ccc7DD6x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y4E[] = {
  {&(_ZTVN3ccc7DD6x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y4E[];
static VTBL_ENTRY alt_thunk_names522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y43efgEv,_ZTv0_n16_N3ccc7DD6x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y43efgEv,_ZThn4_N3ccc7DD6x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y43abcEv,_ZTv0_n12_N3ccc7DD6x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y43abcEv,_ZThn4_N3ccc7DD6x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y4E = {  "_ZN3ccc7DD6x6y4E", // class name
  bases__ZN3ccc7DD6x6y4E, 2,
  &(vtc__ZN3ccc7DD6x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y4E),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  CC6x6y5  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC6x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x6y53abcEv
  ~CC6x6y5(); // tgen
  CC6x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y5E) C1{ VBC2{ v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y53pqrEv");}
void  ccc::CC6x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y53efgEv");}
void  ccc::CC6x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y53abcEv");}
ccc::CC6x6y5 ::~CC6x6y5(){ note_dtor("_ZN3ccc7CC6x6y5E", this);} // tgen
ccc::CC6x6y5 ::CC6x6y5(){ note_ctor("_ZN3ccc7CC6x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y5E, buf);
    ::ccc::CC6x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y5E);
    dp->::ccc::CC6x6y5::~CC6x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y5E(Test__ZN3ccc7CC6x6y5E, "_ZN3ccc7CC6x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y5C1Ev();
extern void _ZN3ccc7CC6x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y5E[] = {
  NSPAIR(_ZN3ccc7CC6x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y5E[];
extern void _ZN3ccc7CC6x6y53abcEv();
extern void _ZN3ccc7CC6x6y53efgEv();
extern void _ZN3ccc7CC6x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y53abcEv,_ZTv0_n12_N3ccc7CC6x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y53abcEv,_ZThn4_N3ccc7CC6x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y53efgEv,_ZTv0_n16_N3ccc7CC6x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y53efgEv,_ZThn4_N3ccc7CC6x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y53abcEv,_ZTv0_n12_N3ccc7CC6x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y53efgEv,_ZTv0_n16_N3ccc7CC6x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y5E[] = {
  {&(_ZTVN3ccc7CC6x6y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y5E[];
static VTBL_ENTRY alt_thunk_names523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y53efgEv,_ZTv0_n16_N3ccc7CC6x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y53efgEv,_ZThn4_N3ccc7CC6x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y53abcEv,_ZTv0_n12_N3ccc7CC6x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y53abcEv,_ZThn4_N3ccc7CC6x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y5E = {  "_ZN3ccc7CC6x6y5E", // class name
  bases__ZN3ccc7CC6x6y5E, 2,
  &(vtc__ZN3ccc7CC6x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y5E),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  DD6x6y5  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD6x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x6y53abcEv
  ~DD6x6y5(); // tgen
  DD6x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y5E) C1{ VBC2{ v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y53pqrEv");}
void  ccc::DD6x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y53efgEv");}
void  ccc::DD6x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y53abcEv");}
ccc::DD6x6y5 ::~DD6x6y5(){ note_dtor("_ZN3ccc7DD6x6y5E", this);} // tgen
ccc::DD6x6y5 ::DD6x6y5(){ note_ctor("_ZN3ccc7DD6x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y5E, buf);
    ::ccc::DD6x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y5E);
    dp->::ccc::DD6x6y5::~DD6x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y5E(Test__ZN3ccc7DD6x6y5E, "_ZN3ccc7DD6x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y5C1Ev();
extern void _ZN3ccc7DD6x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y5E[] = {
  NSPAIR(_ZN3ccc7DD6x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y5E[];
extern void _ZN3ccc7DD6x6y53abcEv();
extern void _ZN3ccc7DD6x6y53efgEv();
extern void _ZN3ccc7DD6x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y53abcEv,_ZTv0_n12_N3ccc7DD6x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y53abcEv,_ZThn4_N3ccc7DD6x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y53efgEv,_ZTv0_n16_N3ccc7DD6x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y53efgEv,_ZThn4_N3ccc7DD6x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y53abcEv,_ZTv0_n12_N3ccc7DD6x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y53efgEv,_ZTv0_n16_N3ccc7DD6x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y5E[] = {
  {&(_ZTVN3ccc7DD6x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y5E[];
static VTBL_ENTRY alt_thunk_names524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y53efgEv,_ZTv0_n16_N3ccc7DD6x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y53efgEv,_ZThn4_N3ccc7DD6x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y53abcEv,_ZTv0_n12_N3ccc7DD6x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y53abcEv,_ZThn4_N3ccc7DD6x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y5E = {  "_ZN3ccc7DD6x6y5E", // class name
  bases__ZN3ccc7DD6x6y5E, 2,
  &(vtc__ZN3ccc7DD6x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y5E),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  CC6x6y6  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x6y63efgEv
  ~CC6x6y6(); // tgen
  CC6x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y6E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y63abcEv");}
void  ccc::CC6x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y63efgEv");}
ccc::CC6x6y6 ::~CC6x6y6(){ note_dtor("_ZN3ccc7CC6x6y6E", this);} // tgen
ccc::CC6x6y6 ::CC6x6y6(){ note_ctor("_ZN3ccc7CC6x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y6E, buf);
    ::ccc::CC6x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y6E);
    dp->::ccc::CC6x6y6::~CC6x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y6E(Test__ZN3ccc7CC6x6y6E, "_ZN3ccc7CC6x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y6C1Ev();
extern void _ZN3ccc7CC6x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y6E[] = {
  NSPAIR(_ZN3ccc7CC6x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y6E[];
extern void _ZN3ccc7CC6x6y63abcEv();
extern void _ZN3ccc7CC6x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y63abcEv,_ZTv0_n12_N3ccc7CC6x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y63abcEv,_ZThn4_N3ccc7CC6x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y63efgEv,_ZTv0_n16_N3ccc7CC6x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y63efgEv,_ZThn4_N3ccc7CC6x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y63abcEv,_ZTv0_n12_N3ccc7CC6x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y63efgEv,_ZTv0_n16_N3ccc7CC6x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y6E[] = {
  {&(_ZTVN3ccc7CC6x6y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC6x6y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y6E[];
static VTBL_ENTRY alt_thunk_names525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y63efgEv,_ZTv0_n16_N3ccc7CC6x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y63efgEv,_ZThn4_N3ccc7CC6x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y63abcEv,_ZTv0_n12_N3ccc7CC6x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y63abcEv,_ZThn4_N3ccc7CC6x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y6E = {  "_ZN3ccc7CC6x6y6E", // class name
  bases__ZN3ccc7CC6x6y6E, 2,
  &(vtc__ZN3ccc7CC6x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y6E),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  DD6x6y6  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD6x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x6y63efgEv
  ~DD6x6y6(); // tgen
  DD6x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y6E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y63abcEv");}
void  ccc::DD6x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y63efgEv");}
ccc::DD6x6y6 ::~DD6x6y6(){ note_dtor("_ZN3ccc7DD6x6y6E", this);} // tgen
ccc::DD6x6y6 ::DD6x6y6(){ note_ctor("_ZN3ccc7DD6x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y6E, buf);
    ::ccc::DD6x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y6E);
    dp->::ccc::DD6x6y6::~DD6x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y6E(Test__ZN3ccc7DD6x6y6E, "_ZN3ccc7DD6x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y6C1Ev();
extern void _ZN3ccc7DD6x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y6E[] = {
  NSPAIR(_ZN3ccc7DD6x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y6E[];
extern void _ZN3ccc7DD6x6y63abcEv();
extern void _ZN3ccc7DD6x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y63abcEv,_ZTv0_n12_N3ccc7DD6x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y63abcEv,_ZThn4_N3ccc7DD6x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y63efgEv,_ZTv0_n16_N3ccc7DD6x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y63efgEv,_ZThn4_N3ccc7DD6x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y63abcEv,_ZTv0_n12_N3ccc7DD6x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y63efgEv,_ZTv0_n16_N3ccc7DD6x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y6E[] = {
  {&(_ZTVN3ccc7DD6x6y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x6y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x6y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y6E[];
static VTBL_ENTRY alt_thunk_names526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y63efgEv,_ZTv0_n16_N3ccc7DD6x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y63efgEv,_ZThn4_N3ccc7DD6x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y63abcEv,_ZTv0_n12_N3ccc7DD6x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y63abcEv,_ZThn4_N3ccc7DD6x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y6E = {  "_ZN3ccc7DD6x6y6E", // class name
  bases__ZN3ccc7DD6x6y6E, 2,
  &(vtc__ZN3ccc7DD6x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y6E),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  CC6x6y7  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC6x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y73pqrEv
  ~CC6x6y7(); // tgen
  CC6x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y7E) C1{ VBC2{ v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y73abcEv");}
void  ccc::CC6x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y73pqrEv");}
ccc::CC6x6y7 ::~CC6x6y7(){ note_dtor("_ZN3ccc7CC6x6y7E", this);} // tgen
ccc::CC6x6y7 ::CC6x6y7(){ note_ctor("_ZN3ccc7CC6x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y7E, buf);
    ::ccc::CC6x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y7E);
    dp->::ccc::CC6x6y7::~CC6x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y7E(Test__ZN3ccc7CC6x6y7E, "_ZN3ccc7CC6x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y7C1Ev();
extern void _ZN3ccc7CC6x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y7E[] = {
  NSPAIR(_ZN3ccc7CC6x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y7E[];
extern void _ZN3ccc7CC6x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC6x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y73abcEv,_ZTv0_n12_N3ccc7CC6x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y73abcEv,_ZThn4_N3ccc7CC6x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y73abcEv,_ZTv0_n12_N3ccc7CC6x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y7E[] = {
  {&(_ZTVN3ccc7CC6x6y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y7E[];
static VTBL_ENTRY alt_thunk_names527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y73abcEv,_ZTv0_n12_N3ccc7CC6x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y73abcEv,_ZThn4_N3ccc7CC6x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y7E = {  "_ZN3ccc7CC6x6y7E", // class name
  bases__ZN3ccc7CC6x6y7E, 2,
  &(vtc__ZN3ccc7CC6x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y7E),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  DD6x6y7  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD6x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x6y73pqrEv
  ~DD6x6y7(); // tgen
  DD6x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y7E) C1{ VBC2{ v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y73abcEv");}
void  ccc::DD6x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y73pqrEv");}
ccc::DD6x6y7 ::~DD6x6y7(){ note_dtor("_ZN3ccc7DD6x6y7E", this);} // tgen
ccc::DD6x6y7 ::DD6x6y7(){ note_ctor("_ZN3ccc7DD6x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y7E, buf);
    ::ccc::DD6x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y7E);
    dp->::ccc::DD6x6y7::~DD6x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y7E(Test__ZN3ccc7DD6x6y7E, "_ZN3ccc7DD6x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y7C1Ev();
extern void _ZN3ccc7DD6x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y7E[] = {
  NSPAIR(_ZN3ccc7DD6x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y7E[];
extern void _ZN3ccc7DD6x6y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y73abcEv,_ZTv0_n12_N3ccc7DD6x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y73abcEv,_ZThn4_N3ccc7DD6x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y73abcEv,_ZTv0_n12_N3ccc7DD6x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y7E[] = {
  {&(_ZTVN3ccc7DD6x6y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y7E[];
static VTBL_ENTRY alt_thunk_names528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y73abcEv,_ZTv0_n12_N3ccc7DD6x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y73abcEv,_ZThn4_N3ccc7DD6x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y7E = {  "_ZN3ccc7DD6x6y7E", // class name
  bases__ZN3ccc7DD6x6y7E, 2,
  &(vtc__ZN3ccc7DD6x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y7E),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  CC6x6y8  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x6y83abcEv
  ~CC6x6y8(); // tgen
  CC6x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y8E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y83efgEv");}
void  ccc::CC6x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x6y83abcEv");}
ccc::CC6x6y8 ::~CC6x6y8(){ note_dtor("_ZN3ccc7CC6x6y8E", this);} // tgen
ccc::CC6x6y8 ::CC6x6y8(){ note_ctor("_ZN3ccc7CC6x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y8E, buf);
    ::ccc::CC6x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y8E);
    dp->::ccc::CC6x6y8::~CC6x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y8E(Test__ZN3ccc7CC6x6y8E, "_ZN3ccc7CC6x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y8C1Ev();
extern void _ZN3ccc7CC6x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y8E[] = {
  NSPAIR(_ZN3ccc7CC6x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y8E[];
extern void _ZN3ccc7CC6x6y83abcEv();
extern void _ZN3ccc7CC6x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x6y83abcEv,_ZTv0_n12_N3ccc7CC6x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y83abcEv,_ZThn4_N3ccc7CC6x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y83efgEv,_ZTv0_n16_N3ccc7CC6x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y83efgEv,_ZThn4_N3ccc7CC6x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x6y83abcEv,_ZTv0_n12_N3ccc7CC6x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y83efgEv,_ZTv0_n16_N3ccc7CC6x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y8E[] = {
  {&(_ZTVN3ccc7CC6x6y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC6x6y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y8E[];
static VTBL_ENTRY alt_thunk_names529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y83efgEv,_ZTv0_n16_N3ccc7CC6x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y83efgEv,_ZThn4_N3ccc7CC6x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x6y83abcEv,_ZTv0_n12_N3ccc7CC6x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y83abcEv,_ZThn4_N3ccc7CC6x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y8E = {  "_ZN3ccc7CC6x6y8E", // class name
  bases__ZN3ccc7CC6x6y8E, 2,
  &(vtc__ZN3ccc7CC6x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y8E),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  DD6x6y8  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD6x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x6y83abcEv
  ~DD6x6y8(); // tgen
  DD6x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y8E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y83efgEv");}
void  ccc::DD6x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x6y83abcEv");}
ccc::DD6x6y8 ::~DD6x6y8(){ note_dtor("_ZN3ccc7DD6x6y8E", this);} // tgen
ccc::DD6x6y8 ::DD6x6y8(){ note_ctor("_ZN3ccc7DD6x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y8E, buf);
    ::ccc::DD6x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y8E);
    dp->::ccc::DD6x6y8::~DD6x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y8E(Test__ZN3ccc7DD6x6y8E, "_ZN3ccc7DD6x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y8C1Ev();
extern void _ZN3ccc7DD6x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y8E[] = {
  NSPAIR(_ZN3ccc7DD6x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y8E[];
extern void _ZN3ccc7DD6x6y83abcEv();
extern void _ZN3ccc7DD6x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x6y83abcEv,_ZTv0_n12_N3ccc7DD6x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y83abcEv,_ZThn4_N3ccc7DD6x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y83efgEv,_ZTv0_n16_N3ccc7DD6x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y83efgEv,_ZThn4_N3ccc7DD6x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x6y83abcEv,_ZTv0_n12_N3ccc7DD6x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y83efgEv,_ZTv0_n16_N3ccc7DD6x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y8E[] = {
  {&(_ZTVN3ccc7DD6x6y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x6y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x6y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y8E[];
static VTBL_ENTRY alt_thunk_names530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y83efgEv,_ZTv0_n16_N3ccc7DD6x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y83efgEv,_ZThn4_N3ccc7DD6x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x6y83abcEv,_ZTv0_n12_N3ccc7DD6x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y83abcEv,_ZThn4_N3ccc7DD6x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y8E = {  "_ZN3ccc7DD6x6y8E", // class name
  bases__ZN3ccc7DD6x6y8E, 2,
  &(vtc__ZN3ccc7DD6x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y8E),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  CC6x6y9  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC6x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x6y93pqrEv
  ~CC6x6y9(); // tgen
  CC6x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x6y9E) C1{ VBC2{ v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x6y93efgEv");}
void  ccc::CC6x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x6y93pqrEv");}
ccc::CC6x6y9 ::~CC6x6y9(){ note_dtor("_ZN3ccc7CC6x6y9E", this);} // tgen
ccc::CC6x6y9 ::CC6x6y9(){ note_ctor("_ZN3ccc7CC6x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x6y9E, buf);
    ::ccc::CC6x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x6y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC6x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x6y9E);
    dp->::ccc::CC6x6y9::~CC6x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x6y9E(Test__ZN3ccc7CC6x6y9E, "_ZN3ccc7CC6x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x6y9C1Ev();
extern void _ZN3ccc7CC6x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x6y9E[] = {
  NSPAIR(_ZN3ccc7CC6x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC6x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC6x6y93efgEv();
extern void _ZN3ccc7CC6x6y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x6y93efgEv,_ZTv0_n16_N3ccc7CC6x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x6y93efgEv,_ZThn4_N3ccc7CC6x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x6y93efgEv,_ZTv0_n16_N3ccc7CC6x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x6y9E[] = {
  {&(_ZTVN3ccc7CC6x6y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x6y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x6y9E[];
static VTBL_ENTRY alt_thunk_names531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x6y93efgEv,_ZTv0_n16_N3ccc7CC6x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x6y93efgEv,_ZThn4_N3ccc7CC6x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x6y9E = {  "_ZN3ccc7CC6x6y9E", // class name
  bases__ZN3ccc7CC6x6y9E, 2,
  &(vtc__ZN3ccc7CC6x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x6y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x6y9E),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  DD6x6y9  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD6x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x6y93pqrEv
  ~DD6x6y9(); // tgen
  DD6x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x6y9E) C1{ VBC2{ v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x6y93efgEv");}
void  ccc::DD6x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x6y93pqrEv");}
ccc::DD6x6y9 ::~DD6x6y9(){ note_dtor("_ZN3ccc7DD6x6y9E", this);} // tgen
ccc::DD6x6y9 ::DD6x6y9(){ note_ctor("_ZN3ccc7DD6x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x6y9E, buf);
    ::ccc::DD6x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x6y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD6x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x6y9E);
    dp->::ccc::DD6x6y9::~DD6x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x6y9E(Test__ZN3ccc7DD6x6y9E, "_ZN3ccc7DD6x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x6y9C1Ev();
extern void _ZN3ccc7DD6x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x6y9E[] = {
  NSPAIR(_ZN3ccc7DD6x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD6x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x6y93efgEv();
extern void _ZN3ccc7DD6x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x6y93efgEv,_ZTv0_n16_N3ccc7DD6x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x6y93efgEv,_ZThn4_N3ccc7DD6x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x6y93efgEv,_ZTv0_n16_N3ccc7DD6x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x6y9E[] = {
  {&(_ZTVN3ccc7DD6x6y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x6y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x6y9E[];
static VTBL_ENTRY alt_thunk_names532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x6y93efgEv,_ZTv0_n16_N3ccc7DD6x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x6y93efgEv,_ZThn4_N3ccc7DD6x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x6y9E = {  "_ZN3ccc7DD6x6y9E", // class name
  bases__ZN3ccc7DD6x6y9E, 2,
  &(vtc__ZN3ccc7DD6x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x6y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x6y9E),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  CC6x6y10  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC6x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x6y103abcEv
  ~CC6x6y10(); // tgen
  CC6x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y10E) C1{ VBC2{ v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x6y103pqrEv");}
void  ccc::CC6x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x6y103abcEv");}
ccc::CC6x6y10 ::~CC6x6y10(){ note_dtor("_ZN3ccc8CC6x6y10E", this);} // tgen
ccc::CC6x6y10 ::CC6x6y10(){ note_ctor("_ZN3ccc8CC6x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x6y10E, buf);
    ::ccc::CC6x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x6y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC6x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x6y10E);
    dp->::ccc::CC6x6y10::~CC6x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x6y10E(Test__ZN3ccc8CC6x6y10E, "_ZN3ccc8CC6x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x6y10C1Ev();
extern void _ZN3ccc8CC6x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x6y10E[] = {
  NSPAIR(_ZN3ccc8CC6x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC6x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x6y10E[];
extern void _ZN3ccc8CC6x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC6x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x6y103abcEv,_ZTv0_n12_N3ccc8CC6x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y103abcEv,_ZThn4_N3ccc8CC6x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x6y103abcEv,_ZTv0_n12_N3ccc8CC6x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x6y10E[] = {
  {&(_ZTVN3ccc8CC6x6y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x6y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x6y10E[];
static VTBL_ENTRY alt_thunk_names533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x6y103abcEv,_ZTv0_n12_N3ccc8CC6x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x6y103abcEv,_ZThn4_N3ccc8CC6x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x6y10E = {  "_ZN3ccc8CC6x6y10E", // class name
  bases__ZN3ccc8CC6x6y10E, 2,
  &(vtc__ZN3ccc8CC6x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x6y10E),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  DD6x6y10  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD6x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x6y103abcEv
  ~DD6x6y10(); // tgen
  DD6x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x6y10E) C1{ VBC2{ v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x6y103pqrEv");}
void  ccc::DD6x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x6y103abcEv");}
ccc::DD6x6y10 ::~DD6x6y10(){ note_dtor("_ZN3ccc8DD6x6y10E", this);} // tgen
ccc::DD6x6y10 ::DD6x6y10(){ note_ctor("_ZN3ccc8DD6x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x6y10E, buf);
    ::ccc::DD6x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x6y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD6x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x6y10E);
    dp->::ccc::DD6x6y10::~DD6x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x6y10E(Test__ZN3ccc8DD6x6y10E, "_ZN3ccc8DD6x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x6y10C1Ev();
extern void _ZN3ccc8DD6x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x6y10E[] = {
  NSPAIR(_ZN3ccc8DD6x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD6x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y10E[];
extern void _ZN3ccc8DD6x6y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x6y103abcEv,_ZTv0_n12_N3ccc8DD6x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x6y103abcEv,_ZThn4_N3ccc8DD6x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x6y103abcEv,_ZTv0_n12_N3ccc8DD6x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x6y10E[] = {
  {&(_ZTVN3ccc8DD6x6y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x6y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x6y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x6y10E[];
static VTBL_ENTRY alt_thunk_names534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x6y103abcEv,_ZTv0_n12_N3ccc8DD6x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x6y103abcEv,_ZThn4_N3ccc8DD6x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x6y10E = {  "_ZN3ccc8DD6x6y10E", // class name
  bases__ZN3ccc8DD6x6y10E, 2,
  &(vtc__ZN3ccc8DD6x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x6y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x6y10E),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  CC6x6y11  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC6x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x6y113efgEv
  ~CC6x6y11(); // tgen
  CC6x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y11E) C1{ VBC2{ v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x6y113pqrEv");}
void  ccc::CC6x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x6y113efgEv");}
ccc::CC6x6y11 ::~CC6x6y11(){ note_dtor("_ZN3ccc8CC6x6y11E", this);} // tgen
ccc::CC6x6y11 ::CC6x6y11(){ note_ctor("_ZN3ccc8CC6x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x6y11E, buf);
    ::ccc::CC6x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x6y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC6x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x6y11E);
    dp->::ccc::CC6x6y11::~CC6x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x6y11E(Test__ZN3ccc8CC6x6y11E, "_ZN3ccc8CC6x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x6y11C1Ev();
extern void _ZN3ccc8CC6x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x6y11E[] = {
  NSPAIR(_ZN3ccc8CC6x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC6x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC6x6y113efgEv();
extern void _ZN3ccc8CC6x6y113pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x6y113efgEv,_ZTv0_n16_N3ccc8CC6x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y113efgEv,_ZThn4_N3ccc8CC6x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x6y113efgEv,_ZTv0_n16_N3ccc8CC6x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x6y11E[] = {
  {&(_ZTVN3ccc8CC6x6y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x6y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x6y11E[];
static VTBL_ENTRY alt_thunk_names535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x6y113efgEv,_ZTv0_n16_N3ccc8CC6x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x6y113efgEv,_ZThn4_N3ccc8CC6x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x6y11E = {  "_ZN3ccc8CC6x6y11E", // class name
  bases__ZN3ccc8CC6x6y11E, 2,
  &(vtc__ZN3ccc8CC6x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x6y11E),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  DD6x6y11  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD6x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x6y113efgEv
  ~DD6x6y11(); // tgen
  DD6x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x6y11E) C1{ VBC2{ v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x6y113pqrEv");}
void  ccc::DD6x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x6y113efgEv");}
ccc::DD6x6y11 ::~DD6x6y11(){ note_dtor("_ZN3ccc8DD6x6y11E", this);} // tgen
ccc::DD6x6y11 ::DD6x6y11(){ note_ctor("_ZN3ccc8DD6x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x6y11E, buf);
    ::ccc::DD6x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x6y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD6x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x6y11E);
    dp->::ccc::DD6x6y11::~DD6x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x6y11E(Test__ZN3ccc8DD6x6y11E, "_ZN3ccc8DD6x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x6y11C1Ev();
extern void _ZN3ccc8DD6x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x6y11E[] = {
  NSPAIR(_ZN3ccc8DD6x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD6x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x6y113efgEv();
extern void _ZN3ccc8DD6x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x6y113efgEv,_ZTv0_n16_N3ccc8DD6x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x6y113efgEv,_ZThn4_N3ccc8DD6x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x6y113efgEv,_ZTv0_n16_N3ccc8DD6x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x6y11E[] = {
  {&(_ZTVN3ccc8DD6x6y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x6y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x6y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x6y11E[];
static VTBL_ENTRY alt_thunk_names536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x6y113efgEv,_ZTv0_n16_N3ccc8DD6x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x6y113efgEv,_ZThn4_N3ccc8DD6x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x6y11E = {  "_ZN3ccc8DD6x6y11E", // class name
  bases__ZN3ccc8DD6x6y11E, 2,
  &(vtc__ZN3ccc8DD6x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x6y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x6y11E),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  CC6x6y12  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC6x6y123abcEv
  ~CC6x6y12(); // tgen
  CC6x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC6x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x6y123abcEv");}
ccc::CC6x6y12 ::~CC6x6y12(){ note_dtor("_ZN3ccc8CC6x6y12E", this);} // tgen
ccc::CC6x6y12 ::CC6x6y12(){ note_ctor("_ZN3ccc8CC6x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x6y12E, buf);
    ::ccc::CC6x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x6y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC6x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x6y12E);
    dp->::ccc::CC6x6y12::~CC6x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x6y12E(Test__ZN3ccc8CC6x6y12E, "_ZN3ccc8CC6x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x6y12C1Ev();
extern void _ZN3ccc8CC6x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x6y12E[] = {
  NSPAIR(_ZN3ccc8CC6x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC6x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x6y12E[];
extern void _ZN3ccc8CC6x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x6y123abcEv,_ZTv0_n12_N3ccc8CC6x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y123abcEv,_ZThn4_N3ccc8CC6x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x6y123abcEv,_ZTv0_n12_N3ccc8CC6x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x6y12E[] = {
  {&(_ZTVN3ccc8CC6x6y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x6y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x6y12E[];
static VTBL_ENTRY alt_thunk_names537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x6y123abcEv,_ZTv0_n12_N3ccc8CC6x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x6y123abcEv,_ZThn4_N3ccc8CC6x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x6y12E = {  "_ZN3ccc8CC6x6y12E", // class name
  bases__ZN3ccc8CC6x6y12E, 2,
  &(vtc__ZN3ccc8CC6x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x6y12E),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  DD6x6y12  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD6x6y123abcEv
  ~DD6x6y12(); // tgen
  DD6x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x6y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD6x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x6y123abcEv");}
ccc::DD6x6y12 ::~DD6x6y12(){ note_dtor("_ZN3ccc8DD6x6y12E", this);} // tgen
ccc::DD6x6y12 ::DD6x6y12(){ note_ctor("_ZN3ccc8DD6x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x6y12E, buf);
    ::ccc::DD6x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x6y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD6x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x6y12E);
    dp->::ccc::DD6x6y12::~DD6x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x6y12E(Test__ZN3ccc8DD6x6y12E, "_ZN3ccc8DD6x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x6y12C1Ev();
extern void _ZN3ccc8DD6x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x6y12E[] = {
  NSPAIR(_ZN3ccc8DD6x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD6x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y12E[];
extern void _ZN3ccc8DD6x6y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x6y123abcEv,_ZTv0_n12_N3ccc8DD6x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x6y123abcEv,_ZThn4_N3ccc8DD6x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x6y123abcEv,_ZTv0_n12_N3ccc8DD6x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x6y12E[] = {
  {&(_ZTVN3ccc8DD6x6y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x6y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x6y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x6y12E[];
static VTBL_ENTRY alt_thunk_names538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x6y123abcEv,_ZTv0_n12_N3ccc8DD6x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x6y123abcEv,_ZThn4_N3ccc8DD6x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x6y12E = {  "_ZN3ccc8DD6x6y12E", // class name
  bases__ZN3ccc8DD6x6y12E, 2,
  &(vtc__ZN3ccc8DD6x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x6y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x6y12E),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  CC6x6y13  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC6x6y133efgEv
  ~CC6x6y13(); // tgen
  CC6x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y13E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC6x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x6y133efgEv");}
ccc::CC6x6y13 ::~CC6x6y13(){ note_dtor("_ZN3ccc8CC6x6y13E", this);} // tgen
ccc::CC6x6y13 ::CC6x6y13(){ note_ctor("_ZN3ccc8CC6x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x6y13E, buf);
    ::ccc::CC6x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x6y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC6x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x6y13E);
    dp->::ccc::CC6x6y13::~CC6x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x6y13E(Test__ZN3ccc8CC6x6y13E, "_ZN3ccc8CC6x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x6y13C1Ev();
extern void _ZN3ccc8CC6x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x6y13E[] = {
  NSPAIR(_ZN3ccc8CC6x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC6x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC6x6y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x6y133efgEv,_ZTv0_n16_N3ccc8CC6x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x6y133efgEv,_ZThn4_N3ccc8CC6x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x6y133efgEv,_ZTv0_n16_N3ccc8CC6x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x6y13E[] = {
  {&(_ZTVN3ccc8CC6x6y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x6y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x6y13E[];
static VTBL_ENTRY alt_thunk_names539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x6y133efgEv,_ZTv0_n16_N3ccc8CC6x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x6y133efgEv,_ZThn4_N3ccc8CC6x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x6y13E = {  "_ZN3ccc8CC6x6y13E", // class name
  bases__ZN3ccc8CC6x6y13E, 2,
  &(vtc__ZN3ccc8CC6x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x6y13E),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  DD6x6y13  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD6x6y133efgEv
  ~DD6x6y13(); // tgen
  DD6x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x6y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD6x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x6y133efgEv");}
ccc::DD6x6y13 ::~DD6x6y13(){ note_dtor("_ZN3ccc8DD6x6y13E", this);} // tgen
ccc::DD6x6y13 ::DD6x6y13(){ note_ctor("_ZN3ccc8DD6x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x6y13E, buf);
    ::ccc::DD6x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x6y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD6x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x6y13E);
    dp->::ccc::DD6x6y13::~DD6x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x6y13E(Test__ZN3ccc8DD6x6y13E, "_ZN3ccc8DD6x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x6y13C1Ev();
extern void _ZN3ccc8DD6x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x6y13E[] = {
  NSPAIR(_ZN3ccc8DD6x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD6x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x6y133efgEv,_ZTv0_n16_N3ccc8DD6x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x6y133efgEv,_ZThn4_N3ccc8DD6x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x6y133efgEv,_ZTv0_n16_N3ccc8DD6x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x6y13E[] = {
  {&(_ZTVN3ccc8DD6x6y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x6y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x6y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x6y13E[];
static VTBL_ENTRY alt_thunk_names540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x6y133efgEv,_ZTv0_n16_N3ccc8DD6x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x6y133efgEv,_ZThn4_N3ccc8DD6x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x6y13E = {  "_ZN3ccc8DD6x6y13E", // class name
  bases__ZN3ccc8DD6x6y13E, 2,
  &(vtc__ZN3ccc8DD6x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x6y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x6y13E),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  CC6x6y14  : virtual ::ccc::AA6 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC6x6y143pqrEv
  ~CC6x6y14(); // tgen
  CC6x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC6x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x6y143pqrEv");}
ccc::CC6x6y14 ::~CC6x6y14(){ note_dtor("_ZN3ccc8CC6x6y14E", this);} // tgen
ccc::CC6x6y14 ::CC6x6y14(){ note_ctor("_ZN3ccc8CC6x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x6y14E, buf);
    ::ccc::CC6x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x6y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC6x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x6y14E);
    dp->::ccc::CC6x6y14::~CC6x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x6y14E(Test__ZN3ccc8CC6x6y14E, "_ZN3ccc8CC6x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x6y14C1Ev();
extern void _ZN3ccc8CC6x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x6y14E[] = {
  NSPAIR(_ZN3ccc8CC6x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC6x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC6x6y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x6y14E[] = {
  {&(_ZTVN3ccc8CC6x6y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x6y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x6y14E[];
Class_Descriptor cd__ZN3ccc8CC6x6y14E = {  "_ZN3ccc8CC6x6y14E", // class name
  bases__ZN3ccc8CC6x6y14E, 2,
  &(vtc__ZN3ccc8CC6x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x6y14E),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  DD6x6y14  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD6x6y143pqrEv
  ~DD6x6y14(); // tgen
  DD6x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x6y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD6x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x6y143pqrEv");}
ccc::DD6x6y14 ::~DD6x6y14(){ note_dtor("_ZN3ccc8DD6x6y14E", this);} // tgen
ccc::DD6x6y14 ::DD6x6y14(){ note_ctor("_ZN3ccc8DD6x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x6y14E, buf);
    ::ccc::DD6x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x6y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD6x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x6y14E);
    dp->::ccc::DD6x6y14::~DD6x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x6y14E(Test__ZN3ccc8DD6x6y14E, "_ZN3ccc8DD6x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x6y14C1Ev();
extern void _ZN3ccc8DD6x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x6y14E[] = {
  NSPAIR(_ZN3ccc8DD6x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD6x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x6y14E[] = {
  {&(_ZTVN3ccc8DD6x6y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x6y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x6y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x6y14E[];
Class_Descriptor cd__ZN3ccc8DD6x6y14E = {  "_ZN3ccc8DD6x6y14E", // class name
  bases__ZN3ccc8DD6x6y14E, 2,
  &(vtc__ZN3ccc8DD6x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x6y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x6y14E),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  CC6x6y15  : virtual ::ccc::AA6 , ::ccc::BB6 {
  ~CC6x6y15(); // tgen
  CC6x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x6y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC6x6y15 ::~CC6x6y15(){ note_dtor("_ZN3ccc8CC6x6y15E", this);} // tgen
ccc::CC6x6y15 ::CC6x6y15(){ note_ctor("_ZN3ccc8CC6x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x6y15E, buf);
    ::ccc::CC6x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x6y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC6x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x6y15E);
    dp->::ccc::CC6x6y15::~CC6x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x6y15E(Test__ZN3ccc8CC6x6y15E, "_ZN3ccc8CC6x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x6y15C1Ev();
extern void _ZN3ccc8CC6x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x6y15E[] = {
  NSPAIR(_ZN3ccc8CC6x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC6x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x6y15E[] = {
  {&(_ZTVN3ccc8CC6x6y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x6y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x6y15E[];
Class_Descriptor cd__ZN3ccc8CC6x6y15E = {  "_ZN3ccc8CC6x6y15E", // class name
  bases__ZN3ccc8CC6x6y15E, 2,
  &(vtc__ZN3ccc8CC6x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x6y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x6y15E),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  DD6x6y15  : virtual ::ccc::AA6 , virtual ::ccc::BB6 {
  ~DD6x6y15(); // tgen
  DD6x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x6y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD6x6y15 ::~DD6x6y15(){ note_dtor("_ZN3ccc8DD6x6y15E", this);} // tgen
ccc::DD6x6y15 ::DD6x6y15(){ note_ctor("_ZN3ccc8DD6x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x6y15E, buf);
    ::ccc::DD6x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x6y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD6x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x6y15E);
    dp->::ccc::DD6x6y15::~DD6x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x6y15E(Test__ZN3ccc8DD6x6y15E, "_ZN3ccc8DD6x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x6y15C1Ev();
extern void _ZN3ccc8DD6x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x6y15E[] = {
  NSPAIR(_ZN3ccc8DD6x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD6x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x6y15E[] = {
  {&(_ZTVN3ccc8DD6x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x6y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x6y15E[];
Class_Descriptor cd__ZN3ccc8DD6x6y15E = {  "_ZN3ccc8DD6x6y15E", // class name
  bases__ZN3ccc8DD6x6y15E, 2,
  &(vtc__ZN3ccc8DD6x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x6y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x6y15E),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  CC6x7y0  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y03pqrEv
  ~CC6x7y0(); // tgen
  CC6x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y0E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y03abcEv");}
void  ccc::CC6x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y03efgEv");}
void  ccc::CC6x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y03pqrEv");}
ccc::CC6x7y0 ::~CC6x7y0(){ note_dtor("_ZN3ccc7CC6x7y0E", this);} // tgen
ccc::CC6x7y0 ::CC6x7y0(){ note_ctor("_ZN3ccc7CC6x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y0E, buf);
    ::ccc::CC6x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y0E);
    dp->::ccc::CC6x7y0::~CC6x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y0E(Test__ZN3ccc7CC6x7y0E, "_ZN3ccc7CC6x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y0C1Ev();
extern void _ZN3ccc7CC6x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y0E[] = {
  NSPAIR(_ZN3ccc7CC6x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y0E[];
extern void _ZN3ccc7CC6x7y03abcEv();
extern void _ZN3ccc7CC6x7y03pqrEv();
extern void _ZN3ccc7CC6x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y03abcEv,_ZTv0_n12_N3ccc7CC6x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y03abcEv,_ZThn4_N3ccc7CC6x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y03efgEv,_ZTv0_n16_N3ccc7CC6x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y03efgEv,_ZThn4_N3ccc7CC6x7y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y03abcEv,_ZTv0_n12_N3ccc7CC6x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y03efgEv,_ZTv0_n16_N3ccc7CC6x7y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y0E[] = {
  {&(_ZTVN3ccc7CC6x7y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y0E[];
static VTBL_ENTRY alt_thunk_names541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y03efgEv,_ZTv0_n16_N3ccc7CC6x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y03efgEv,_ZThn4_N3ccc7CC6x7y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y03abcEv,_ZTv0_n12_N3ccc7CC6x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y03abcEv,_ZThn4_N3ccc7CC6x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y0E = {  "_ZN3ccc7CC6x7y0E", // class name
  bases__ZN3ccc7CC6x7y0E, 2,
  &(vtc__ZN3ccc7CC6x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y0E),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  DD6x7y0  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD6x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x7y03pqrEv
  ~DD6x7y0(); // tgen
  DD6x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y0E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y03abcEv");}
void  ccc::DD6x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y03efgEv");}
void  ccc::DD6x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y03pqrEv");}
ccc::DD6x7y0 ::~DD6x7y0(){ note_dtor("_ZN3ccc7DD6x7y0E", this);} // tgen
ccc::DD6x7y0 ::DD6x7y0(){ note_ctor("_ZN3ccc7DD6x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y0E, buf);
    ::ccc::DD6x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y0E);
    dp->::ccc::DD6x7y0::~DD6x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y0E(Test__ZN3ccc7DD6x7y0E, "_ZN3ccc7DD6x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y0C1Ev();
extern void _ZN3ccc7DD6x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y0E[] = {
  NSPAIR(_ZN3ccc7DD6x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y0E[];
extern void _ZN3ccc7DD6x7y03abcEv();
extern void _ZN3ccc7DD6x7y03efgEv();
extern void _ZN3ccc7DD6x7y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y03abcEv,_ZTv0_n12_N3ccc7DD6x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y03abcEv,_ZThn4_N3ccc7DD6x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y03pqrEv,_ZTv0_n16_N3ccc7DD6x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y03pqrEv,_ZThn4_N3ccc7DD6x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y03abcEv,_ZTv0_n12_N3ccc7DD6x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y03pqrEv,_ZTv0_n16_N3ccc7DD6x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y0E[] = {
  {&(_ZTVN3ccc7DD6x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y0E[];
static VTBL_ENTRY alt_thunk_names542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y03pqrEv,_ZTv0_n16_N3ccc7DD6x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y03pqrEv,_ZThn4_N3ccc7DD6x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y03abcEv,_ZTv0_n12_N3ccc7DD6x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y03abcEv,_ZThn4_N3ccc7DD6x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y0E = {  "_ZN3ccc7DD6x7y0E", // class name
  bases__ZN3ccc7DD6x7y0E, 2,
  &(vtc__ZN3ccc7DD6x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y0E),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  CC6x7y1  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x7y13efgEv
  ~CC6x7y1(); // tgen
  CC6x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y1E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y13abcEv");}
void  ccc::CC6x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y13pqrEv");}
void  ccc::CC6x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y13efgEv");}
ccc::CC6x7y1 ::~CC6x7y1(){ note_dtor("_ZN3ccc7CC6x7y1E", this);} // tgen
ccc::CC6x7y1 ::CC6x7y1(){ note_ctor("_ZN3ccc7CC6x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y1E, buf);
    ::ccc::CC6x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y1E);
    dp->::ccc::CC6x7y1::~CC6x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y1E(Test__ZN3ccc7CC6x7y1E, "_ZN3ccc7CC6x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y1C1Ev();
extern void _ZN3ccc7CC6x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y1E[] = {
  NSPAIR(_ZN3ccc7CC6x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y1E[];
extern void _ZN3ccc7CC6x7y13abcEv();
extern void _ZN3ccc7CC6x7y13pqrEv();
extern void _ZN3ccc7CC6x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y13abcEv,_ZTv0_n12_N3ccc7CC6x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y13abcEv,_ZThn4_N3ccc7CC6x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y13efgEv,_ZTv0_n16_N3ccc7CC6x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y13efgEv,_ZThn4_N3ccc7CC6x7y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y13abcEv,_ZTv0_n12_N3ccc7CC6x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y13efgEv,_ZTv0_n16_N3ccc7CC6x7y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y1E[] = {
  {&(_ZTVN3ccc7CC6x7y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y1E[];
static VTBL_ENTRY alt_thunk_names543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y13efgEv,_ZTv0_n16_N3ccc7CC6x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y13efgEv,_ZThn4_N3ccc7CC6x7y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y13abcEv,_ZTv0_n12_N3ccc7CC6x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y13abcEv,_ZThn4_N3ccc7CC6x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y1E = {  "_ZN3ccc7CC6x7y1E", // class name
  bases__ZN3ccc7CC6x7y1E, 2,
  &(vtc__ZN3ccc7CC6x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y1E),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  DD6x7y1  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD6x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x7y13efgEv
  ~DD6x7y1(); // tgen
  DD6x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y1E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y13abcEv");}
void  ccc::DD6x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y13pqrEv");}
void  ccc::DD6x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y13efgEv");}
ccc::DD6x7y1 ::~DD6x7y1(){ note_dtor("_ZN3ccc7DD6x7y1E", this);} // tgen
ccc::DD6x7y1 ::DD6x7y1(){ note_ctor("_ZN3ccc7DD6x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y1E, buf);
    ::ccc::DD6x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y1E);
    dp->::ccc::DD6x7y1::~DD6x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y1E(Test__ZN3ccc7DD6x7y1E, "_ZN3ccc7DD6x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y1C1Ev();
extern void _ZN3ccc7DD6x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y1E[] = {
  NSPAIR(_ZN3ccc7DD6x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y1E[];
extern void _ZN3ccc7DD6x7y13abcEv();
extern void _ZN3ccc7DD6x7y13efgEv();
extern void _ZN3ccc7DD6x7y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y13abcEv,_ZTv0_n12_N3ccc7DD6x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y13abcEv,_ZThn4_N3ccc7DD6x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y13pqrEv,_ZTv0_n16_N3ccc7DD6x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y13pqrEv,_ZThn4_N3ccc7DD6x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y13abcEv,_ZTv0_n12_N3ccc7DD6x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y13pqrEv,_ZTv0_n16_N3ccc7DD6x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y1E[] = {
  {&(_ZTVN3ccc7DD6x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y1E[];
static VTBL_ENTRY alt_thunk_names544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y13pqrEv,_ZTv0_n16_N3ccc7DD6x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y13pqrEv,_ZThn4_N3ccc7DD6x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y13abcEv,_ZTv0_n12_N3ccc7DD6x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y13abcEv,_ZThn4_N3ccc7DD6x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y1E = {  "_ZN3ccc7DD6x7y1E", // class name
  bases__ZN3ccc7DD6x7y1E, 2,
  &(vtc__ZN3ccc7DD6x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y1E),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  CC6x7y2  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y23pqrEv
  ~CC6x7y2(); // tgen
  CC6x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y2E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y23efgEv");}
void  ccc::CC6x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y23abcEv");}
void  ccc::CC6x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y23pqrEv");}
ccc::CC6x7y2 ::~CC6x7y2(){ note_dtor("_ZN3ccc7CC6x7y2E", this);} // tgen
ccc::CC6x7y2 ::CC6x7y2(){ note_ctor("_ZN3ccc7CC6x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y2E, buf);
    ::ccc::CC6x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y2E);
    dp->::ccc::CC6x7y2::~CC6x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y2E(Test__ZN3ccc7CC6x7y2E, "_ZN3ccc7CC6x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y2C1Ev();
extern void _ZN3ccc7CC6x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y2E[] = {
  NSPAIR(_ZN3ccc7CC6x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y2E[];
extern void _ZN3ccc7CC6x7y23abcEv();
extern void _ZN3ccc7CC6x7y23pqrEv();
extern void _ZN3ccc7CC6x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y23abcEv,_ZTv0_n12_N3ccc7CC6x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y23abcEv,_ZThn4_N3ccc7CC6x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y23efgEv,_ZTv0_n16_N3ccc7CC6x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y23efgEv,_ZThn4_N3ccc7CC6x7y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y23abcEv,_ZTv0_n12_N3ccc7CC6x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y23efgEv,_ZTv0_n16_N3ccc7CC6x7y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y2E[] = {
  {&(_ZTVN3ccc7CC6x7y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y2E[];
static VTBL_ENTRY alt_thunk_names545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y23efgEv,_ZTv0_n16_N3ccc7CC6x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y23efgEv,_ZThn4_N3ccc7CC6x7y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y23abcEv,_ZTv0_n12_N3ccc7CC6x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y23abcEv,_ZThn4_N3ccc7CC6x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y2E = {  "_ZN3ccc7CC6x7y2E", // class name
  bases__ZN3ccc7CC6x7y2E, 2,
  &(vtc__ZN3ccc7CC6x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y2E),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  DD6x7y2  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD6x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x7y23pqrEv
  ~DD6x7y2(); // tgen
  DD6x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y2E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y23efgEv");}
void  ccc::DD6x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y23abcEv");}
void  ccc::DD6x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y23pqrEv");}
ccc::DD6x7y2 ::~DD6x7y2(){ note_dtor("_ZN3ccc7DD6x7y2E", this);} // tgen
ccc::DD6x7y2 ::DD6x7y2(){ note_ctor("_ZN3ccc7DD6x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y2E, buf);
    ::ccc::DD6x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y2E);
    dp->::ccc::DD6x7y2::~DD6x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y2E(Test__ZN3ccc7DD6x7y2E, "_ZN3ccc7DD6x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y2C1Ev();
extern void _ZN3ccc7DD6x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y2E[] = {
  NSPAIR(_ZN3ccc7DD6x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y2E[];
extern void _ZN3ccc7DD6x7y23abcEv();
extern void _ZN3ccc7DD6x7y23efgEv();
extern void _ZN3ccc7DD6x7y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y23abcEv,_ZTv0_n12_N3ccc7DD6x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y23abcEv,_ZThn4_N3ccc7DD6x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y23pqrEv,_ZTv0_n16_N3ccc7DD6x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y23pqrEv,_ZThn4_N3ccc7DD6x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y23abcEv,_ZTv0_n12_N3ccc7DD6x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y23pqrEv,_ZTv0_n16_N3ccc7DD6x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y2E[] = {
  {&(_ZTVN3ccc7DD6x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y2E[];
static VTBL_ENTRY alt_thunk_names546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y23pqrEv,_ZTv0_n16_N3ccc7DD6x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y23pqrEv,_ZThn4_N3ccc7DD6x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y23abcEv,_ZTv0_n12_N3ccc7DD6x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y23abcEv,_ZThn4_N3ccc7DD6x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y2E = {  "_ZN3ccc7DD6x7y2E", // class name
  bases__ZN3ccc7DD6x7y2E, 2,
  &(vtc__ZN3ccc7DD6x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y2E),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  CC6x7y3  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x7y33abcEv
  ~CC6x7y3(); // tgen
  CC6x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y3E) C1{ VBC2{ v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y33efgEv");}
void  ccc::CC6x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y33pqrEv");}
void  ccc::CC6x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y33abcEv");}
ccc::CC6x7y3 ::~CC6x7y3(){ note_dtor("_ZN3ccc7CC6x7y3E", this);} // tgen
ccc::CC6x7y3 ::CC6x7y3(){ note_ctor("_ZN3ccc7CC6x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y3E, buf);
    ::ccc::CC6x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y3E);
    dp->::ccc::CC6x7y3::~CC6x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y3E(Test__ZN3ccc7CC6x7y3E, "_ZN3ccc7CC6x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y3C1Ev();
extern void _ZN3ccc7CC6x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y3E[] = {
  NSPAIR(_ZN3ccc7CC6x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y3E[];
extern void _ZN3ccc7CC6x7y33abcEv();
extern void _ZN3ccc7CC6x7y33pqrEv();
extern void _ZN3ccc7CC6x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y33abcEv,_ZTv0_n12_N3ccc7CC6x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y33abcEv,_ZThn4_N3ccc7CC6x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y33efgEv,_ZTv0_n16_N3ccc7CC6x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y33efgEv,_ZThn4_N3ccc7CC6x7y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y33abcEv,_ZTv0_n12_N3ccc7CC6x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y33efgEv,_ZTv0_n16_N3ccc7CC6x7y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y3E[] = {
  {&(_ZTVN3ccc7CC6x7y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y3E[];
static VTBL_ENTRY alt_thunk_names547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y33efgEv,_ZTv0_n16_N3ccc7CC6x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y33efgEv,_ZThn4_N3ccc7CC6x7y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y33abcEv,_ZTv0_n12_N3ccc7CC6x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y33abcEv,_ZThn4_N3ccc7CC6x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y3E = {  "_ZN3ccc7CC6x7y3E", // class name
  bases__ZN3ccc7CC6x7y3E, 2,
  &(vtc__ZN3ccc7CC6x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y3E),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  DD6x7y3  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD6x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x7y33abcEv
  ~DD6x7y3(); // tgen
  DD6x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y3E) C1{ VBC2{ v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y33efgEv");}
void  ccc::DD6x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y33pqrEv");}
void  ccc::DD6x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y33abcEv");}
ccc::DD6x7y3 ::~DD6x7y3(){ note_dtor("_ZN3ccc7DD6x7y3E", this);} // tgen
ccc::DD6x7y3 ::DD6x7y3(){ note_ctor("_ZN3ccc7DD6x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y3E, buf);
    ::ccc::DD6x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y3E);
    dp->::ccc::DD6x7y3::~DD6x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y3E(Test__ZN3ccc7DD6x7y3E, "_ZN3ccc7DD6x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y3C1Ev();
extern void _ZN3ccc7DD6x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y3E[] = {
  NSPAIR(_ZN3ccc7DD6x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y3E[];
extern void _ZN3ccc7DD6x7y33abcEv();
extern void _ZN3ccc7DD6x7y33efgEv();
extern void _ZN3ccc7DD6x7y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y33abcEv,_ZTv0_n12_N3ccc7DD6x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y33abcEv,_ZThn4_N3ccc7DD6x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y33pqrEv,_ZTv0_n16_N3ccc7DD6x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y33pqrEv,_ZThn4_N3ccc7DD6x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y33abcEv,_ZTv0_n12_N3ccc7DD6x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y33pqrEv,_ZTv0_n16_N3ccc7DD6x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y3E[] = {
  {&(_ZTVN3ccc7DD6x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y3E[];
static VTBL_ENTRY alt_thunk_names548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y33pqrEv,_ZTv0_n16_N3ccc7DD6x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y33pqrEv,_ZThn4_N3ccc7DD6x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y33abcEv,_ZTv0_n12_N3ccc7DD6x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y33abcEv,_ZThn4_N3ccc7DD6x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y3E = {  "_ZN3ccc7DD6x7y3E", // class name
  bases__ZN3ccc7DD6x7y3E, 2,
  &(vtc__ZN3ccc7DD6x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y3E),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  CC6x7y4  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC6x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x7y43efgEv
  ~CC6x7y4(); // tgen
  CC6x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y4E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y43pqrEv");}
void  ccc::CC6x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y43abcEv");}
void  ccc::CC6x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y43efgEv");}
ccc::CC6x7y4 ::~CC6x7y4(){ note_dtor("_ZN3ccc7CC6x7y4E", this);} // tgen
ccc::CC6x7y4 ::CC6x7y4(){ note_ctor("_ZN3ccc7CC6x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y4E, buf);
    ::ccc::CC6x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y4E);
    dp->::ccc::CC6x7y4::~CC6x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y4E(Test__ZN3ccc7CC6x7y4E, "_ZN3ccc7CC6x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y4C1Ev();
extern void _ZN3ccc7CC6x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y4E[] = {
  NSPAIR(_ZN3ccc7CC6x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y4E[];
extern void _ZN3ccc7CC6x7y43abcEv();
extern void _ZN3ccc7CC6x7y43pqrEv();
extern void _ZN3ccc7CC6x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y43abcEv,_ZTv0_n12_N3ccc7CC6x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y43abcEv,_ZThn4_N3ccc7CC6x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y43efgEv,_ZTv0_n16_N3ccc7CC6x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y43efgEv,_ZThn4_N3ccc7CC6x7y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y43abcEv,_ZTv0_n12_N3ccc7CC6x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y43efgEv,_ZTv0_n16_N3ccc7CC6x7y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y4E[] = {
  {&(_ZTVN3ccc7CC6x7y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y4E[];
static VTBL_ENTRY alt_thunk_names549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y43efgEv,_ZTv0_n16_N3ccc7CC6x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y43efgEv,_ZThn4_N3ccc7CC6x7y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y43abcEv,_ZTv0_n12_N3ccc7CC6x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y43abcEv,_ZThn4_N3ccc7CC6x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y4E = {  "_ZN3ccc7CC6x7y4E", // class name
  bases__ZN3ccc7CC6x7y4E, 2,
  &(vtc__ZN3ccc7CC6x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y4E),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  DD6x7y4  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD6x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x7y43efgEv
  ~DD6x7y4(); // tgen
  DD6x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y4E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y43pqrEv");}
void  ccc::DD6x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y43abcEv");}
void  ccc::DD6x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y43efgEv");}
ccc::DD6x7y4 ::~DD6x7y4(){ note_dtor("_ZN3ccc7DD6x7y4E", this);} // tgen
ccc::DD6x7y4 ::DD6x7y4(){ note_ctor("_ZN3ccc7DD6x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y4E, buf);
    ::ccc::DD6x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y4E);
    dp->::ccc::DD6x7y4::~DD6x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y4E(Test__ZN3ccc7DD6x7y4E, "_ZN3ccc7DD6x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y4C1Ev();
extern void _ZN3ccc7DD6x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y4E[] = {
  NSPAIR(_ZN3ccc7DD6x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y4E[];
extern void _ZN3ccc7DD6x7y43abcEv();
extern void _ZN3ccc7DD6x7y43efgEv();
extern void _ZN3ccc7DD6x7y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y43abcEv,_ZTv0_n12_N3ccc7DD6x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y43abcEv,_ZThn4_N3ccc7DD6x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y43pqrEv,_ZTv0_n16_N3ccc7DD6x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y43pqrEv,_ZThn4_N3ccc7DD6x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y43abcEv,_ZTv0_n12_N3ccc7DD6x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y43pqrEv,_ZTv0_n16_N3ccc7DD6x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y4E[] = {
  {&(_ZTVN3ccc7DD6x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y4E[];
static VTBL_ENTRY alt_thunk_names550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y43pqrEv,_ZTv0_n16_N3ccc7DD6x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y43pqrEv,_ZThn4_N3ccc7DD6x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y43abcEv,_ZTv0_n12_N3ccc7DD6x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y43abcEv,_ZThn4_N3ccc7DD6x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y4E = {  "_ZN3ccc7DD6x7y4E", // class name
  bases__ZN3ccc7DD6x7y4E, 2,
  &(vtc__ZN3ccc7DD6x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y4E),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  CC6x7y5  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC6x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x7y53abcEv
  ~CC6x7y5(); // tgen
  CC6x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y5E) C1{ VBC2{ v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y53pqrEv");}
void  ccc::CC6x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y53efgEv");}
void  ccc::CC6x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y53abcEv");}
ccc::CC6x7y5 ::~CC6x7y5(){ note_dtor("_ZN3ccc7CC6x7y5E", this);} // tgen
ccc::CC6x7y5 ::CC6x7y5(){ note_ctor("_ZN3ccc7CC6x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y5E, buf);
    ::ccc::CC6x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y5E);
    dp->::ccc::CC6x7y5::~CC6x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y5E(Test__ZN3ccc7CC6x7y5E, "_ZN3ccc7CC6x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y5C1Ev();
extern void _ZN3ccc7CC6x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y5E[] = {
  NSPAIR(_ZN3ccc7CC6x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y5E[];
extern void _ZN3ccc7CC6x7y53abcEv();
extern void _ZN3ccc7CC6x7y53pqrEv();
extern void _ZN3ccc7CC6x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y53abcEv,_ZTv0_n12_N3ccc7CC6x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y53abcEv,_ZThn4_N3ccc7CC6x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y53efgEv,_ZTv0_n16_N3ccc7CC6x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y53efgEv,_ZThn4_N3ccc7CC6x7y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y53abcEv,_ZTv0_n12_N3ccc7CC6x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y53efgEv,_ZTv0_n16_N3ccc7CC6x7y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y5E[] = {
  {&(_ZTVN3ccc7CC6x7y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y5E[];
static VTBL_ENTRY alt_thunk_names551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y53efgEv,_ZTv0_n16_N3ccc7CC6x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y53efgEv,_ZThn4_N3ccc7CC6x7y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y53abcEv,_ZTv0_n12_N3ccc7CC6x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y53abcEv,_ZThn4_N3ccc7CC6x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y5E = {  "_ZN3ccc7CC6x7y5E", // class name
  bases__ZN3ccc7CC6x7y5E, 2,
  &(vtc__ZN3ccc7CC6x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y5E),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  DD6x7y5  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD6x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x7y53abcEv
  ~DD6x7y5(); // tgen
  DD6x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y5E) C1{ VBC2{ v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y53pqrEv");}
void  ccc::DD6x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y53efgEv");}
void  ccc::DD6x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y53abcEv");}
ccc::DD6x7y5 ::~DD6x7y5(){ note_dtor("_ZN3ccc7DD6x7y5E", this);} // tgen
ccc::DD6x7y5 ::DD6x7y5(){ note_ctor("_ZN3ccc7DD6x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y5E, buf);
    ::ccc::DD6x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y5E);
    dp->::ccc::DD6x7y5::~DD6x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y5E(Test__ZN3ccc7DD6x7y5E, "_ZN3ccc7DD6x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y5C1Ev();
extern void _ZN3ccc7DD6x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y5E[] = {
  NSPAIR(_ZN3ccc7DD6x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y5E[];
extern void _ZN3ccc7DD6x7y53abcEv();
extern void _ZN3ccc7DD6x7y53efgEv();
extern void _ZN3ccc7DD6x7y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y53abcEv,_ZTv0_n12_N3ccc7DD6x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y53abcEv,_ZThn4_N3ccc7DD6x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y53pqrEv,_ZTv0_n16_N3ccc7DD6x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y53pqrEv,_ZThn4_N3ccc7DD6x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y53abcEv,_ZTv0_n12_N3ccc7DD6x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y53pqrEv,_ZTv0_n16_N3ccc7DD6x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y5E[] = {
  {&(_ZTVN3ccc7DD6x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y5E[];
static VTBL_ENTRY alt_thunk_names552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y53pqrEv,_ZTv0_n16_N3ccc7DD6x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y53pqrEv,_ZThn4_N3ccc7DD6x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y53abcEv,_ZTv0_n12_N3ccc7DD6x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y53abcEv,_ZThn4_N3ccc7DD6x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y5E = {  "_ZN3ccc7DD6x7y5E", // class name
  bases__ZN3ccc7DD6x7y5E, 2,
  &(vtc__ZN3ccc7DD6x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y5E),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  CC6x7y6  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x7y63efgEv
  ~CC6x7y6(); // tgen
  CC6x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y6E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y63abcEv");}
void  ccc::CC6x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y63efgEv");}
ccc::CC6x7y6 ::~CC6x7y6(){ note_dtor("_ZN3ccc7CC6x7y6E", this);} // tgen
ccc::CC6x7y6 ::CC6x7y6(){ note_ctor("_ZN3ccc7CC6x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y6E, buf);
    ::ccc::CC6x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y6E);
    dp->::ccc::CC6x7y6::~CC6x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y6E(Test__ZN3ccc7CC6x7y6E, "_ZN3ccc7CC6x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y6C1Ev();
extern void _ZN3ccc7CC6x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y6E[] = {
  NSPAIR(_ZN3ccc7CC6x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y6E[];
extern void _ZN3ccc7CC6x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC6x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y63abcEv,_ZTv0_n12_N3ccc7CC6x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y63abcEv,_ZThn4_N3ccc7CC6x7y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y63efgEv,_ZTv0_n16_N3ccc7CC6x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y63efgEv,_ZThn4_N3ccc7CC6x7y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y63abcEv,_ZTv0_n12_N3ccc7CC6x7y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y63efgEv,_ZTv0_n16_N3ccc7CC6x7y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y6E[] = {
  {&(_ZTVN3ccc7CC6x7y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y6E[];
static VTBL_ENTRY alt_thunk_names553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y63efgEv,_ZTv0_n16_N3ccc7CC6x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y63efgEv,_ZThn4_N3ccc7CC6x7y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y63abcEv,_ZTv0_n12_N3ccc7CC6x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y63abcEv,_ZThn4_N3ccc7CC6x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y6E = {  "_ZN3ccc7CC6x7y6E", // class name
  bases__ZN3ccc7CC6x7y6E, 2,
  &(vtc__ZN3ccc7CC6x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y6E),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  DD6x7y6  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD6x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x7y63efgEv
  ~DD6x7y6(); // tgen
  DD6x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y6E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y63abcEv");}
void  ccc::DD6x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y63efgEv");}
ccc::DD6x7y6 ::~DD6x7y6(){ note_dtor("_ZN3ccc7DD6x7y6E", this);} // tgen
ccc::DD6x7y6 ::DD6x7y6(){ note_ctor("_ZN3ccc7DD6x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y6E, buf);
    ::ccc::DD6x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y6E);
    dp->::ccc::DD6x7y6::~DD6x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y6E(Test__ZN3ccc7DD6x7y6E, "_ZN3ccc7DD6x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y6C1Ev();
extern void _ZN3ccc7DD6x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y6E[] = {
  NSPAIR(_ZN3ccc7DD6x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y6E[];
extern void _ZN3ccc7DD6x7y63abcEv();
extern void _ZN3ccc7DD6x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y63abcEv,_ZTv0_n12_N3ccc7DD6x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y63abcEv,_ZThn4_N3ccc7DD6x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y63abcEv,_ZTv0_n12_N3ccc7DD6x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y6E[] = {
  {&(_ZTVN3ccc7DD6x7y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x7y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x7y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y6E[];
static VTBL_ENTRY alt_thunk_names554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y63abcEv,_ZTv0_n12_N3ccc7DD6x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y63abcEv,_ZThn4_N3ccc7DD6x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y6E = {  "_ZN3ccc7DD6x7y6E", // class name
  bases__ZN3ccc7DD6x7y6E, 2,
  &(vtc__ZN3ccc7DD6x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y6E),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  CC6x7y7  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC6x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y73pqrEv
  ~CC6x7y7(); // tgen
  CC6x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y7E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y73abcEv");}
void  ccc::CC6x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y73pqrEv");}
ccc::CC6x7y7 ::~CC6x7y7(){ note_dtor("_ZN3ccc7CC6x7y7E", this);} // tgen
ccc::CC6x7y7 ::CC6x7y7(){ note_ctor("_ZN3ccc7CC6x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y7E, buf);
    ::ccc::CC6x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y7E);
    dp->::ccc::CC6x7y7::~CC6x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y7E(Test__ZN3ccc7CC6x7y7E, "_ZN3ccc7CC6x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y7C1Ev();
extern void _ZN3ccc7CC6x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y7E[] = {
  NSPAIR(_ZN3ccc7CC6x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y7E[];
extern void _ZN3ccc7CC6x7y73abcEv();
extern void _ZN3ccc7CC6x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y73abcEv,_ZTv0_n12_N3ccc7CC6x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y73abcEv,_ZThn4_N3ccc7CC6x7y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y73abcEv,_ZTv0_n12_N3ccc7CC6x7y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y7E[] = {
  {&(_ZTVN3ccc7CC6x7y7E[3]),  3,11},
  {&(_ZTVN3ccc7CC6x7y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y7E[];
static VTBL_ENTRY alt_thunk_names555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y73abcEv,_ZTv0_n12_N3ccc7CC6x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y73abcEv,_ZThn4_N3ccc7CC6x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y7E = {  "_ZN3ccc7CC6x7y7E", // class name
  bases__ZN3ccc7CC6x7y7E, 2,
  &(vtc__ZN3ccc7CC6x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y7E),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  DD6x7y7  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD6x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x7y73pqrEv
  ~DD6x7y7(); // tgen
  DD6x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y7E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y73abcEv");}
void  ccc::DD6x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y73pqrEv");}
ccc::DD6x7y7 ::~DD6x7y7(){ note_dtor("_ZN3ccc7DD6x7y7E", this);} // tgen
ccc::DD6x7y7 ::DD6x7y7(){ note_ctor("_ZN3ccc7DD6x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y7E, buf);
    ::ccc::DD6x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y7E);
    dp->::ccc::DD6x7y7::~DD6x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y7E(Test__ZN3ccc7DD6x7y7E, "_ZN3ccc7DD6x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y7C1Ev();
extern void _ZN3ccc7DD6x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y7E[] = {
  NSPAIR(_ZN3ccc7DD6x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y7E[];
extern void _ZN3ccc7DD6x7y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y73abcEv,_ZTv0_n12_N3ccc7DD6x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y73abcEv,_ZThn4_N3ccc7DD6x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y73pqrEv,_ZTv0_n16_N3ccc7DD6x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y73pqrEv,_ZThn4_N3ccc7DD6x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y73abcEv,_ZTv0_n12_N3ccc7DD6x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y73pqrEv,_ZTv0_n16_N3ccc7DD6x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y7E[] = {
  {&(_ZTVN3ccc7DD6x7y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y7E[];
static VTBL_ENTRY alt_thunk_names556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y73pqrEv,_ZTv0_n16_N3ccc7DD6x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y73pqrEv,_ZThn4_N3ccc7DD6x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y73abcEv,_ZTv0_n12_N3ccc7DD6x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y73abcEv,_ZThn4_N3ccc7DD6x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y7E = {  "_ZN3ccc7DD6x7y7E", // class name
  bases__ZN3ccc7DD6x7y7E, 2,
  &(vtc__ZN3ccc7DD6x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y7E),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  CC6x7y8  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x7y83abcEv
  ~CC6x7y8(); // tgen
  CC6x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y8E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y83efgEv");}
void  ccc::CC6x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x7y83abcEv");}
ccc::CC6x7y8 ::~CC6x7y8(){ note_dtor("_ZN3ccc7CC6x7y8E", this);} // tgen
ccc::CC6x7y8 ::CC6x7y8(){ note_ctor("_ZN3ccc7CC6x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y8E, buf);
    ::ccc::CC6x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y8E);
    dp->::ccc::CC6x7y8::~CC6x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y8E(Test__ZN3ccc7CC6x7y8E, "_ZN3ccc7CC6x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y8C1Ev();
extern void _ZN3ccc7CC6x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y8E[] = {
  NSPAIR(_ZN3ccc7CC6x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y8E[];
extern void _ZN3ccc7CC6x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC6x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x7y83abcEv,_ZTv0_n12_N3ccc7CC6x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y83abcEv,_ZThn4_N3ccc7CC6x7y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y83efgEv,_ZTv0_n16_N3ccc7CC6x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y83efgEv,_ZThn4_N3ccc7CC6x7y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x7y83abcEv,_ZTv0_n12_N3ccc7CC6x7y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y83efgEv,_ZTv0_n16_N3ccc7CC6x7y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y8E[] = {
  {&(_ZTVN3ccc7CC6x7y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y8E[];
static VTBL_ENTRY alt_thunk_names557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y83efgEv,_ZTv0_n16_N3ccc7CC6x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y83efgEv,_ZThn4_N3ccc7CC6x7y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x7y83abcEv,_ZTv0_n12_N3ccc7CC6x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y83abcEv,_ZThn4_N3ccc7CC6x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y8E = {  "_ZN3ccc7CC6x7y8E", // class name
  bases__ZN3ccc7CC6x7y8E, 2,
  &(vtc__ZN3ccc7CC6x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y8E),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  DD6x7y8  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD6x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x7y83abcEv
  ~DD6x7y8(); // tgen
  DD6x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y8E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y83efgEv");}
void  ccc::DD6x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x7y83abcEv");}
ccc::DD6x7y8 ::~DD6x7y8(){ note_dtor("_ZN3ccc7DD6x7y8E", this);} // tgen
ccc::DD6x7y8 ::DD6x7y8(){ note_ctor("_ZN3ccc7DD6x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y8E, buf);
    ::ccc::DD6x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y8E);
    dp->::ccc::DD6x7y8::~DD6x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y8E(Test__ZN3ccc7DD6x7y8E, "_ZN3ccc7DD6x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y8C1Ev();
extern void _ZN3ccc7DD6x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y8E[] = {
  NSPAIR(_ZN3ccc7DD6x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y8E[];
extern void _ZN3ccc7DD6x7y83abcEv();
extern void _ZN3ccc7DD6x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x7y83abcEv,_ZTv0_n12_N3ccc7DD6x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y83abcEv,_ZThn4_N3ccc7DD6x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x7y83abcEv,_ZTv0_n12_N3ccc7DD6x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y8E[] = {
  {&(_ZTVN3ccc7DD6x7y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x7y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x7y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y8E[];
static VTBL_ENTRY alt_thunk_names558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x7y83abcEv,_ZTv0_n12_N3ccc7DD6x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y83abcEv,_ZThn4_N3ccc7DD6x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y8E = {  "_ZN3ccc7DD6x7y8E", // class name
  bases__ZN3ccc7DD6x7y8E, 2,
  &(vtc__ZN3ccc7DD6x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y8E),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  CC6x7y9  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC6x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x7y93pqrEv
  ~CC6x7y9(); // tgen
  CC6x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x7y9E) C1{ VBC2{ v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x7y93efgEv");}
void  ccc::CC6x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x7y93pqrEv");}
ccc::CC6x7y9 ::~CC6x7y9(){ note_dtor("_ZN3ccc7CC6x7y9E", this);} // tgen
ccc::CC6x7y9 ::CC6x7y9(){ note_ctor("_ZN3ccc7CC6x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x7y9E, buf);
    ::ccc::CC6x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x7y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC6x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x7y9E);
    dp->::ccc::CC6x7y9::~CC6x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x7y9E(Test__ZN3ccc7CC6x7y9E, "_ZN3ccc7CC6x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x7y9C1Ev();
extern void _ZN3ccc7CC6x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x7y9E[] = {
  NSPAIR(_ZN3ccc7CC6x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC6x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC6x7y93pqrEv();
extern void _ZN3ccc7CC6x7y93efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x7y93efgEv,_ZTv0_n16_N3ccc7CC6x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x7y93efgEv,_ZThn4_N3ccc7CC6x7y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x7y93efgEv,_ZTv0_n16_N3ccc7CC6x7y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x7y9E[] = {
  {&(_ZTVN3ccc7CC6x7y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x7y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x7y9E[];
static VTBL_ENTRY alt_thunk_names559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x7y93efgEv,_ZTv0_n16_N3ccc7CC6x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x7y93efgEv,_ZThn4_N3ccc7CC6x7y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x7y9E = {  "_ZN3ccc7CC6x7y9E", // class name
  bases__ZN3ccc7CC6x7y9E, 2,
  &(vtc__ZN3ccc7CC6x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x7y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x7y9E),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  DD6x7y9  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD6x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x7y93pqrEv
  ~DD6x7y9(); // tgen
  DD6x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x7y9E) C1{ VBC2{ v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x7y93efgEv");}
void  ccc::DD6x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x7y93pqrEv");}
ccc::DD6x7y9 ::~DD6x7y9(){ note_dtor("_ZN3ccc7DD6x7y9E", this);} // tgen
ccc::DD6x7y9 ::DD6x7y9(){ note_ctor("_ZN3ccc7DD6x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x7y9E, buf);
    ::ccc::DD6x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x7y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD6x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x7y9E);
    dp->::ccc::DD6x7y9::~DD6x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x7y9E(Test__ZN3ccc7DD6x7y9E, "_ZN3ccc7DD6x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x7y9C1Ev();
extern void _ZN3ccc7DD6x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x7y9E[] = {
  NSPAIR(_ZN3ccc7DD6x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD6x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x7y93efgEv();
extern void _ZN3ccc7DD6x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x7y93pqrEv,_ZTv0_n16_N3ccc7DD6x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x7y93pqrEv,_ZThn4_N3ccc7DD6x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x7y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x7y93pqrEv,_ZTv0_n16_N3ccc7DD6x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x7y9E[] = {
  {&(_ZTVN3ccc7DD6x7y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x7y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x7y9E[];
static VTBL_ENTRY alt_thunk_names560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x7y93pqrEv,_ZTv0_n16_N3ccc7DD6x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x7y93pqrEv,_ZThn4_N3ccc7DD6x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x7y9E = {  "_ZN3ccc7DD6x7y9E", // class name
  bases__ZN3ccc7DD6x7y9E, 2,
  &(vtc__ZN3ccc7DD6x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x7y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x7y9E),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  CC6x7y10  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC6x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x7y103abcEv
  ~CC6x7y10(); // tgen
  CC6x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y10E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x7y103pqrEv");}
void  ccc::CC6x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x7y103abcEv");}
ccc::CC6x7y10 ::~CC6x7y10(){ note_dtor("_ZN3ccc8CC6x7y10E", this);} // tgen
ccc::CC6x7y10 ::CC6x7y10(){ note_ctor("_ZN3ccc8CC6x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x7y10E, buf);
    ::ccc::CC6x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x7y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC6x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x7y10E);
    dp->::ccc::CC6x7y10::~CC6x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x7y10E(Test__ZN3ccc8CC6x7y10E, "_ZN3ccc8CC6x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x7y10C1Ev();
extern void _ZN3ccc8CC6x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x7y10E[] = {
  NSPAIR(_ZN3ccc8CC6x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC6x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x7y10E[];
extern void _ZN3ccc8CC6x7y103abcEv();
extern void _ZN3ccc8CC6x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x7y103abcEv,_ZTv0_n12_N3ccc8CC6x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y103abcEv,_ZThn4_N3ccc8CC6x7y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x7y103abcEv,_ZTv0_n12_N3ccc8CC6x7y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x7y10E[] = {
  {&(_ZTVN3ccc8CC6x7y10E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x7y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x7y10E[];
static VTBL_ENTRY alt_thunk_names561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x7y103abcEv,_ZTv0_n12_N3ccc8CC6x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x7y103abcEv,_ZThn4_N3ccc8CC6x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x7y10E = {  "_ZN3ccc8CC6x7y10E", // class name
  bases__ZN3ccc8CC6x7y10E, 2,
  &(vtc__ZN3ccc8CC6x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x7y10E),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  DD6x7y10  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD6x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x7y103abcEv
  ~DD6x7y10(); // tgen
  DD6x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x7y10E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x7y103pqrEv");}
void  ccc::DD6x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x7y103abcEv");}
ccc::DD6x7y10 ::~DD6x7y10(){ note_dtor("_ZN3ccc8DD6x7y10E", this);} // tgen
ccc::DD6x7y10 ::DD6x7y10(){ note_ctor("_ZN3ccc8DD6x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x7y10E, buf);
    ::ccc::DD6x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x7y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD6x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x7y10E);
    dp->::ccc::DD6x7y10::~DD6x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x7y10E(Test__ZN3ccc8DD6x7y10E, "_ZN3ccc8DD6x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x7y10C1Ev();
extern void _ZN3ccc8DD6x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x7y10E[] = {
  NSPAIR(_ZN3ccc8DD6x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD6x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y10E[];
extern void _ZN3ccc8DD6x7y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x7y103abcEv,_ZTv0_n12_N3ccc8DD6x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x7y103abcEv,_ZThn4_N3ccc8DD6x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x7y103pqrEv,_ZTv0_n16_N3ccc8DD6x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x7y103pqrEv,_ZThn4_N3ccc8DD6x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x7y103abcEv,_ZTv0_n12_N3ccc8DD6x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x7y103pqrEv,_ZTv0_n16_N3ccc8DD6x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x7y10E[] = {
  {&(_ZTVN3ccc8DD6x7y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x7y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x7y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x7y10E[];
static VTBL_ENTRY alt_thunk_names562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x7y103pqrEv,_ZTv0_n16_N3ccc8DD6x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x7y103pqrEv,_ZThn4_N3ccc8DD6x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x7y103abcEv,_ZTv0_n12_N3ccc8DD6x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x7y103abcEv,_ZThn4_N3ccc8DD6x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x7y10E = {  "_ZN3ccc8DD6x7y10E", // class name
  bases__ZN3ccc8DD6x7y10E, 2,
  &(vtc__ZN3ccc8DD6x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x7y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x7y10E),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  CC6x7y11  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC6x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x7y113efgEv
  ~CC6x7y11(); // tgen
  CC6x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y11E) C1{ VBC2{ v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x7y113pqrEv");}
void  ccc::CC6x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x7y113efgEv");}
ccc::CC6x7y11 ::~CC6x7y11(){ note_dtor("_ZN3ccc8CC6x7y11E", this);} // tgen
ccc::CC6x7y11 ::CC6x7y11(){ note_ctor("_ZN3ccc8CC6x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x7y11E, buf);
    ::ccc::CC6x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x7y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC6x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x7y11E);
    dp->::ccc::CC6x7y11::~CC6x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x7y11E(Test__ZN3ccc8CC6x7y11E, "_ZN3ccc8CC6x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x7y11C1Ev();
extern void _ZN3ccc8CC6x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x7y11E[] = {
  NSPAIR(_ZN3ccc8CC6x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC6x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC6x7y113pqrEv();
extern void _ZN3ccc8CC6x7y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x7y113efgEv,_ZTv0_n16_N3ccc8CC6x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y113efgEv,_ZThn4_N3ccc8CC6x7y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x7y113efgEv,_ZTv0_n16_N3ccc8CC6x7y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x7y11E[] = {
  {&(_ZTVN3ccc8CC6x7y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x7y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x7y11E[];
static VTBL_ENTRY alt_thunk_names563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x7y113efgEv,_ZTv0_n16_N3ccc8CC6x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x7y113efgEv,_ZThn4_N3ccc8CC6x7y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x7y11E = {  "_ZN3ccc8CC6x7y11E", // class name
  bases__ZN3ccc8CC6x7y11E, 2,
  &(vtc__ZN3ccc8CC6x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x7y11E),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  DD6x7y11  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD6x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x7y113efgEv
  ~DD6x7y11(); // tgen
  DD6x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x7y11E) C1{ VBC2{ v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x7y113pqrEv");}
void  ccc::DD6x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x7y113efgEv");}
ccc::DD6x7y11 ::~DD6x7y11(){ note_dtor("_ZN3ccc8DD6x7y11E", this);} // tgen
ccc::DD6x7y11 ::DD6x7y11(){ note_ctor("_ZN3ccc8DD6x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x7y11E, buf);
    ::ccc::DD6x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x7y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD6x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x7y11E);
    dp->::ccc::DD6x7y11::~DD6x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x7y11E(Test__ZN3ccc8DD6x7y11E, "_ZN3ccc8DD6x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x7y11C1Ev();
extern void _ZN3ccc8DD6x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x7y11E[] = {
  NSPAIR(_ZN3ccc8DD6x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD6x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x7y113efgEv();
extern void _ZN3ccc8DD6x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x7y113pqrEv,_ZTv0_n16_N3ccc8DD6x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x7y113pqrEv,_ZThn4_N3ccc8DD6x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x7y113pqrEv,_ZTv0_n16_N3ccc8DD6x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x7y11E[] = {
  {&(_ZTVN3ccc8DD6x7y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x7y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x7y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x7y11E[];
static VTBL_ENTRY alt_thunk_names564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x7y113pqrEv,_ZTv0_n16_N3ccc8DD6x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x7y113pqrEv,_ZThn4_N3ccc8DD6x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x7y11E = {  "_ZN3ccc8DD6x7y11E", // class name
  bases__ZN3ccc8DD6x7y11E, 2,
  &(vtc__ZN3ccc8DD6x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x7y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x7y11E),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  CC6x7y12  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC6x7y123abcEv
  ~CC6x7y12(); // tgen
  CC6x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC6x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x7y123abcEv");}
ccc::CC6x7y12 ::~CC6x7y12(){ note_dtor("_ZN3ccc8CC6x7y12E", this);} // tgen
ccc::CC6x7y12 ::CC6x7y12(){ note_ctor("_ZN3ccc8CC6x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x7y12E, buf);
    ::ccc::CC6x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x7y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC6x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x7y12E);
    dp->::ccc::CC6x7y12::~CC6x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x7y12E(Test__ZN3ccc8CC6x7y12E, "_ZN3ccc8CC6x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x7y12C1Ev();
extern void _ZN3ccc8CC6x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x7y12E[] = {
  NSPAIR(_ZN3ccc8CC6x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC6x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x7y12E[];
extern void _ZN3ccc8CC6x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x7y123abcEv,_ZTv0_n12_N3ccc8CC6x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y123abcEv,_ZThn4_N3ccc8CC6x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x7y123abcEv,_ZTv0_n12_N3ccc8CC6x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x7y12E[] = {
  {&(_ZTVN3ccc8CC6x7y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x7y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x7y12E[];
static VTBL_ENTRY alt_thunk_names565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x7y123abcEv,_ZTv0_n12_N3ccc8CC6x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x7y123abcEv,_ZThn4_N3ccc8CC6x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x7y12E = {  "_ZN3ccc8CC6x7y12E", // class name
  bases__ZN3ccc8CC6x7y12E, 2,
  &(vtc__ZN3ccc8CC6x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x7y12E),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  DD6x7y12  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD6x7y123abcEv
  ~DD6x7y12(); // tgen
  DD6x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x7y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD6x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x7y123abcEv");}
ccc::DD6x7y12 ::~DD6x7y12(){ note_dtor("_ZN3ccc8DD6x7y12E", this);} // tgen
ccc::DD6x7y12 ::DD6x7y12(){ note_ctor("_ZN3ccc8DD6x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x7y12E, buf);
    ::ccc::DD6x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x7y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD6x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x7y12E);
    dp->::ccc::DD6x7y12::~DD6x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x7y12E(Test__ZN3ccc8DD6x7y12E, "_ZN3ccc8DD6x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x7y12C1Ev();
extern void _ZN3ccc8DD6x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x7y12E[] = {
  NSPAIR(_ZN3ccc8DD6x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD6x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y12E[];
extern void _ZN3ccc8DD6x7y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x7y123abcEv,_ZTv0_n12_N3ccc8DD6x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x7y123abcEv,_ZThn4_N3ccc8DD6x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x7y123abcEv,_ZTv0_n12_N3ccc8DD6x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x7y12E[] = {
  {&(_ZTVN3ccc8DD6x7y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x7y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x7y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x7y12E[];
static VTBL_ENTRY alt_thunk_names566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x7y123abcEv,_ZTv0_n12_N3ccc8DD6x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x7y123abcEv,_ZThn4_N3ccc8DD6x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x7y12E = {  "_ZN3ccc8DD6x7y12E", // class name
  bases__ZN3ccc8DD6x7y12E, 2,
  &(vtc__ZN3ccc8DD6x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x7y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x7y12E),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  CC6x7y13  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC6x7y133efgEv
  ~CC6x7y13(); // tgen
  CC6x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y13E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x7y133efgEv");}
ccc::CC6x7y13 ::~CC6x7y13(){ note_dtor("_ZN3ccc8CC6x7y13E", this);} // tgen
ccc::CC6x7y13 ::CC6x7y13(){ note_ctor("_ZN3ccc8CC6x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x7y13E, buf);
    ::ccc::CC6x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x7y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC6x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x7y13E);
    dp->::ccc::CC6x7y13::~CC6x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x7y13E(Test__ZN3ccc8CC6x7y13E, "_ZN3ccc8CC6x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x7y13C1Ev();
extern void _ZN3ccc8CC6x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x7y13E[] = {
  NSPAIR(_ZN3ccc8CC6x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC6x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC6x7y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x7y133efgEv,_ZTv0_n16_N3ccc8CC6x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x7y133efgEv,_ZThn4_N3ccc8CC6x7y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x7y133efgEv,_ZTv0_n16_N3ccc8CC6x7y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x7y13E[] = {
  {&(_ZTVN3ccc8CC6x7y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x7y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x7y13E[];
static VTBL_ENTRY alt_thunk_names567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x7y133efgEv,_ZTv0_n16_N3ccc8CC6x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x7y133efgEv,_ZThn4_N3ccc8CC6x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x7y13E = {  "_ZN3ccc8CC6x7y13E", // class name
  bases__ZN3ccc8CC6x7y13E, 2,
  &(vtc__ZN3ccc8CC6x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x7y13E),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  DD6x7y13  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD6x7y133efgEv
  ~DD6x7y13(); // tgen
  DD6x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x7y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x7y133efgEv");}
ccc::DD6x7y13 ::~DD6x7y13(){ note_dtor("_ZN3ccc8DD6x7y13E", this);} // tgen
ccc::DD6x7y13 ::DD6x7y13(){ note_ctor("_ZN3ccc8DD6x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x7y13E, buf);
    ::ccc::DD6x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x7y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD6x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x7y13E);
    dp->::ccc::DD6x7y13::~DD6x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x7y13E(Test__ZN3ccc8DD6x7y13E, "_ZN3ccc8DD6x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x7y13C1Ev();
extern void _ZN3ccc8DD6x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x7y13E[] = {
  NSPAIR(_ZN3ccc8DD6x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD6x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x7y13E[] = {
  {&(_ZTVN3ccc8DD6x7y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x7y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x7y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x7y13E[];
Class_Descriptor cd__ZN3ccc8DD6x7y13E = {  "_ZN3ccc8DD6x7y13E", // class name
  bases__ZN3ccc8DD6x7y13E, 2,
  &(vtc__ZN3ccc8DD6x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x7y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x7y13E),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  CC6x7y14  : virtual ::ccc::AA6 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC6x7y143pqrEv
  ~CC6x7y14(); // tgen
  CC6x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC6x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x7y143pqrEv");}
ccc::CC6x7y14 ::~CC6x7y14(){ note_dtor("_ZN3ccc8CC6x7y14E", this);} // tgen
ccc::CC6x7y14 ::CC6x7y14(){ note_ctor("_ZN3ccc8CC6x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x7y14E, buf);
    ::ccc::CC6x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x7y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC6x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x7y14E);
    dp->::ccc::CC6x7y14::~CC6x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x7y14E(Test__ZN3ccc8CC6x7y14E, "_ZN3ccc8CC6x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x7y14C1Ev();
extern void _ZN3ccc8CC6x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x7y14E[] = {
  NSPAIR(_ZN3ccc8CC6x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC6x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC6x7y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x7y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x7y14E[] = {
  {&(_ZTVN3ccc8CC6x7y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x7y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x7y14E[];
Class_Descriptor cd__ZN3ccc8CC6x7y14E = {  "_ZN3ccc8CC6x7y14E", // class name
  bases__ZN3ccc8CC6x7y14E, 2,
  &(vtc__ZN3ccc8CC6x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x7y14E),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  DD6x7y14  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD6x7y143pqrEv
  ~DD6x7y14(); // tgen
  DD6x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x7y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD6x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x7y143pqrEv");}
ccc::DD6x7y14 ::~DD6x7y14(){ note_dtor("_ZN3ccc8DD6x7y14E", this);} // tgen
ccc::DD6x7y14 ::DD6x7y14(){ note_ctor("_ZN3ccc8DD6x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x7y14E, buf);
    ::ccc::DD6x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x7y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD6x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x7y14E);
    dp->::ccc::DD6x7y14::~DD6x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x7y14E(Test__ZN3ccc8DD6x7y14E, "_ZN3ccc8DD6x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x7y14C1Ev();
extern void _ZN3ccc8DD6x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x7y14E[] = {
  NSPAIR(_ZN3ccc8DD6x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD6x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x7y143pqrEv,_ZTv0_n16_N3ccc8DD6x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x7y143pqrEv,_ZThn4_N3ccc8DD6x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x7y143pqrEv,_ZTv0_n16_N3ccc8DD6x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x7y14E[] = {
  {&(_ZTVN3ccc8DD6x7y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x7y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x7y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x7y14E[];
static VTBL_ENTRY alt_thunk_names568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x7y143pqrEv,_ZTv0_n16_N3ccc8DD6x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x7y143pqrEv,_ZThn4_N3ccc8DD6x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x7y14E = {  "_ZN3ccc8DD6x7y14E", // class name
  bases__ZN3ccc8DD6x7y14E, 2,
  &(vtc__ZN3ccc8DD6x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x7y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x7y14E),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  CC6x7y15  : virtual ::ccc::AA6 , ::ccc::BB7 {
  ~CC6x7y15(); // tgen
  CC6x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x7y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC6x7y15 ::~CC6x7y15(){ note_dtor("_ZN3ccc8CC6x7y15E", this);} // tgen
ccc::CC6x7y15 ::CC6x7y15(){ note_ctor("_ZN3ccc8CC6x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x7y15E, buf);
    ::ccc::CC6x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x7y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC6x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x7y15E);
    dp->::ccc::CC6x7y15::~CC6x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x7y15E(Test__ZN3ccc8CC6x7y15E, "_ZN3ccc8CC6x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x7y15C1Ev();
extern void _ZN3ccc8CC6x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x7y15E[] = {
  NSPAIR(_ZN3ccc8CC6x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC6x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x7y15E[] = {
  {&(_ZTVN3ccc8CC6x7y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x7y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x7y15E[];
Class_Descriptor cd__ZN3ccc8CC6x7y15E = {  "_ZN3ccc8CC6x7y15E", // class name
  bases__ZN3ccc8CC6x7y15E, 2,
  &(vtc__ZN3ccc8CC6x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x7y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x7y15E),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  DD6x7y15  : virtual ::ccc::AA6 , virtual ::ccc::BB7 {
  ~DD6x7y15(); // tgen
  DD6x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x7y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD6x7y15 ::~DD6x7y15(){ note_dtor("_ZN3ccc8DD6x7y15E", this);} // tgen
ccc::DD6x7y15 ::DD6x7y15(){ note_ctor("_ZN3ccc8DD6x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x7y15E, buf);
    ::ccc::DD6x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x7y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD6x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x7y15E);
    dp->::ccc::DD6x7y15::~DD6x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x7y15E(Test__ZN3ccc8DD6x7y15E, "_ZN3ccc8DD6x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x7y15C1Ev();
extern void _ZN3ccc8DD6x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x7y15E[] = {
  NSPAIR(_ZN3ccc8DD6x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD6x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x7y15E[] = {
  {&(_ZTVN3ccc8DD6x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x7y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x7y15E[];
Class_Descriptor cd__ZN3ccc8DD6x7y15E = {  "_ZN3ccc8DD6x7y15E", // class name
  bases__ZN3ccc8DD6x7y15E, 2,
  &(vtc__ZN3ccc8DD6x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x7y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x7y15E),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  CC6x8y0  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y03pqrEv
  ~CC6x8y0(); // tgen
  CC6x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y0E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y03abcEv");}
void  ccc::CC6x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y03efgEv");}
void  ccc::CC6x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y03pqrEv");}
ccc::CC6x8y0 ::~CC6x8y0(){ note_dtor("_ZN3ccc7CC6x8y0E", this);} // tgen
ccc::CC6x8y0 ::CC6x8y0(){ note_ctor("_ZN3ccc7CC6x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y0E, buf);
    ::ccc::CC6x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y0E);
    dp->::ccc::CC6x8y0::~CC6x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y0E(Test__ZN3ccc7CC6x8y0E, "_ZN3ccc7CC6x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y0C1Ev();
extern void _ZN3ccc7CC6x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y0E[] = {
  NSPAIR(_ZN3ccc7CC6x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y0E[];
extern void _ZN3ccc7CC6x8y03efgEv();
extern void _ZN3ccc7CC6x8y03abcEv();
extern void _ZN3ccc7CC6x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y03abcEv,_ZTv0_n12_N3ccc7CC6x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y03abcEv,_ZThn4_N3ccc7CC6x8y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y03efgEv,_ZTv0_n16_N3ccc7CC6x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y03efgEv,_ZThn4_N3ccc7CC6x8y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y03abcEv,_ZTv0_n12_N3ccc7CC6x8y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y03efgEv,_ZTv0_n16_N3ccc7CC6x8y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y0E[] = {
  {&(_ZTVN3ccc7CC6x8y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y0E[];
static VTBL_ENTRY alt_thunk_names569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y03efgEv,_ZTv0_n16_N3ccc7CC6x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y03efgEv,_ZThn4_N3ccc7CC6x8y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y03abcEv,_ZTv0_n12_N3ccc7CC6x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y03abcEv,_ZThn4_N3ccc7CC6x8y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y0E = {  "_ZN3ccc7CC6x8y0E", // class name
  bases__ZN3ccc7CC6x8y0E, 2,
  &(vtc__ZN3ccc7CC6x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y0E),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  DD6x8y0  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD6x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x8y03pqrEv
  ~DD6x8y0(); // tgen
  DD6x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y0E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y03abcEv");}
void  ccc::DD6x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y03efgEv");}
void  ccc::DD6x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y03pqrEv");}
ccc::DD6x8y0 ::~DD6x8y0(){ note_dtor("_ZN3ccc7DD6x8y0E", this);} // tgen
ccc::DD6x8y0 ::DD6x8y0(){ note_ctor("_ZN3ccc7DD6x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y0E, buf);
    ::ccc::DD6x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y0E);
    dp->::ccc::DD6x8y0::~DD6x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y0E(Test__ZN3ccc7DD6x8y0E, "_ZN3ccc7DD6x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y0C1Ev();
extern void _ZN3ccc7DD6x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y0E[] = {
  NSPAIR(_ZN3ccc7DD6x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y0E[];
extern void _ZN3ccc7DD6x8y03abcEv();
extern void _ZN3ccc7DD6x8y03efgEv();
extern void _ZN3ccc7DD6x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y03efgEv,_ZTv0_n12_N3ccc7DD6x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y03efgEv,_ZThn4_N3ccc7DD6x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y03abcEv,_ZTv0_n16_N3ccc7DD6x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y03abcEv,_ZThn4_N3ccc7DD6x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y03efgEv,_ZTv0_n12_N3ccc7DD6x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y03abcEv,_ZTv0_n16_N3ccc7DD6x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y0E[] = {
  {&(_ZTVN3ccc7DD6x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y0E[];
static VTBL_ENTRY alt_thunk_names570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y03abcEv,_ZTv0_n16_N3ccc7DD6x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y03abcEv,_ZThn4_N3ccc7DD6x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y03efgEv,_ZTv0_n12_N3ccc7DD6x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y03efgEv,_ZThn4_N3ccc7DD6x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y0E = {  "_ZN3ccc7DD6x8y0E", // class name
  bases__ZN3ccc7DD6x8y0E, 2,
  &(vtc__ZN3ccc7DD6x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y0E),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  CC6x8y1  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x8y13efgEv
  ~CC6x8y1(); // tgen
  CC6x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y1E) C1{ VBC2{ v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y13abcEv");}
void  ccc::CC6x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y13pqrEv");}
void  ccc::CC6x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y13efgEv");}
ccc::CC6x8y1 ::~CC6x8y1(){ note_dtor("_ZN3ccc7CC6x8y1E", this);} // tgen
ccc::CC6x8y1 ::CC6x8y1(){ note_ctor("_ZN3ccc7CC6x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y1E, buf);
    ::ccc::CC6x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y1E);
    dp->::ccc::CC6x8y1::~CC6x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y1E(Test__ZN3ccc7CC6x8y1E, "_ZN3ccc7CC6x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y1C1Ev();
extern void _ZN3ccc7CC6x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y1E[] = {
  NSPAIR(_ZN3ccc7CC6x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y1E[];
extern void _ZN3ccc7CC6x8y13efgEv();
extern void _ZN3ccc7CC6x8y13abcEv();
extern void _ZN3ccc7CC6x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y13abcEv,_ZTv0_n12_N3ccc7CC6x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y13abcEv,_ZThn4_N3ccc7CC6x8y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y13efgEv,_ZTv0_n16_N3ccc7CC6x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y13efgEv,_ZThn4_N3ccc7CC6x8y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y13abcEv,_ZTv0_n12_N3ccc7CC6x8y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y13efgEv,_ZTv0_n16_N3ccc7CC6x8y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y1E[] = {
  {&(_ZTVN3ccc7CC6x8y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y1E[];
static VTBL_ENTRY alt_thunk_names571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y13efgEv,_ZTv0_n16_N3ccc7CC6x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y13efgEv,_ZThn4_N3ccc7CC6x8y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y13abcEv,_ZTv0_n12_N3ccc7CC6x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y13abcEv,_ZThn4_N3ccc7CC6x8y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y1E = {  "_ZN3ccc7CC6x8y1E", // class name
  bases__ZN3ccc7CC6x8y1E, 2,
  &(vtc__ZN3ccc7CC6x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y1E),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  DD6x8y1  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD6x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x8y13efgEv
  ~DD6x8y1(); // tgen
  DD6x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y1E) C1{ VBC2{ v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y13abcEv");}
void  ccc::DD6x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y13pqrEv");}
void  ccc::DD6x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y13efgEv");}
ccc::DD6x8y1 ::~DD6x8y1(){ note_dtor("_ZN3ccc7DD6x8y1E", this);} // tgen
ccc::DD6x8y1 ::DD6x8y1(){ note_ctor("_ZN3ccc7DD6x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y1E, buf);
    ::ccc::DD6x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y1E);
    dp->::ccc::DD6x8y1::~DD6x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y1E(Test__ZN3ccc7DD6x8y1E, "_ZN3ccc7DD6x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y1C1Ev();
extern void _ZN3ccc7DD6x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y1E[] = {
  NSPAIR(_ZN3ccc7DD6x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y1E[];
extern void _ZN3ccc7DD6x8y13abcEv();
extern void _ZN3ccc7DD6x8y13efgEv();
extern void _ZN3ccc7DD6x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y13efgEv,_ZTv0_n12_N3ccc7DD6x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y13efgEv,_ZThn4_N3ccc7DD6x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y13abcEv,_ZTv0_n16_N3ccc7DD6x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y13abcEv,_ZThn4_N3ccc7DD6x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y13efgEv,_ZTv0_n12_N3ccc7DD6x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y13abcEv,_ZTv0_n16_N3ccc7DD6x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y1E[] = {
  {&(_ZTVN3ccc7DD6x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y1E[];
static VTBL_ENTRY alt_thunk_names572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y13abcEv,_ZTv0_n16_N3ccc7DD6x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y13abcEv,_ZThn4_N3ccc7DD6x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y13efgEv,_ZTv0_n12_N3ccc7DD6x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y13efgEv,_ZThn4_N3ccc7DD6x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y1E = {  "_ZN3ccc7DD6x8y1E", // class name
  bases__ZN3ccc7DD6x8y1E, 2,
  &(vtc__ZN3ccc7DD6x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y1E),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  CC6x8y2  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y23pqrEv
  ~CC6x8y2(); // tgen
  CC6x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y2E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y23efgEv");}
void  ccc::CC6x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y23abcEv");}
void  ccc::CC6x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y23pqrEv");}
ccc::CC6x8y2 ::~CC6x8y2(){ note_dtor("_ZN3ccc7CC6x8y2E", this);} // tgen
ccc::CC6x8y2 ::CC6x8y2(){ note_ctor("_ZN3ccc7CC6x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y2E, buf);
    ::ccc::CC6x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y2E);
    dp->::ccc::CC6x8y2::~CC6x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y2E(Test__ZN3ccc7CC6x8y2E, "_ZN3ccc7CC6x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y2C1Ev();
extern void _ZN3ccc7CC6x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y2E[] = {
  NSPAIR(_ZN3ccc7CC6x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y2E[];
extern void _ZN3ccc7CC6x8y23efgEv();
extern void _ZN3ccc7CC6x8y23abcEv();
extern void _ZN3ccc7CC6x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y23abcEv,_ZTv0_n12_N3ccc7CC6x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y23abcEv,_ZThn4_N3ccc7CC6x8y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y23efgEv,_ZTv0_n16_N3ccc7CC6x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y23efgEv,_ZThn4_N3ccc7CC6x8y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y23abcEv,_ZTv0_n12_N3ccc7CC6x8y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y23efgEv,_ZTv0_n16_N3ccc7CC6x8y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y2E[] = {
  {&(_ZTVN3ccc7CC6x8y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y2E[];
static VTBL_ENTRY alt_thunk_names573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y23efgEv,_ZTv0_n16_N3ccc7CC6x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y23efgEv,_ZThn4_N3ccc7CC6x8y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y23abcEv,_ZTv0_n12_N3ccc7CC6x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y23abcEv,_ZThn4_N3ccc7CC6x8y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y2E = {  "_ZN3ccc7CC6x8y2E", // class name
  bases__ZN3ccc7CC6x8y2E, 2,
  &(vtc__ZN3ccc7CC6x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y2E),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  DD6x8y2  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD6x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x8y23pqrEv
  ~DD6x8y2(); // tgen
  DD6x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y2E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y23efgEv");}
void  ccc::DD6x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y23abcEv");}
void  ccc::DD6x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y23pqrEv");}
ccc::DD6x8y2 ::~DD6x8y2(){ note_dtor("_ZN3ccc7DD6x8y2E", this);} // tgen
ccc::DD6x8y2 ::DD6x8y2(){ note_ctor("_ZN3ccc7DD6x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y2E, buf);
    ::ccc::DD6x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y2E);
    dp->::ccc::DD6x8y2::~DD6x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y2E(Test__ZN3ccc7DD6x8y2E, "_ZN3ccc7DD6x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y2C1Ev();
extern void _ZN3ccc7DD6x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y2E[] = {
  NSPAIR(_ZN3ccc7DD6x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y2E[];
extern void _ZN3ccc7DD6x8y23abcEv();
extern void _ZN3ccc7DD6x8y23efgEv();
extern void _ZN3ccc7DD6x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y23efgEv,_ZTv0_n12_N3ccc7DD6x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y23efgEv,_ZThn4_N3ccc7DD6x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y23abcEv,_ZTv0_n16_N3ccc7DD6x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y23abcEv,_ZThn4_N3ccc7DD6x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y23efgEv,_ZTv0_n12_N3ccc7DD6x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y23abcEv,_ZTv0_n16_N3ccc7DD6x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y2E[] = {
  {&(_ZTVN3ccc7DD6x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y2E[];
static VTBL_ENTRY alt_thunk_names574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y23abcEv,_ZTv0_n16_N3ccc7DD6x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y23abcEv,_ZThn4_N3ccc7DD6x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y23efgEv,_ZTv0_n12_N3ccc7DD6x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y23efgEv,_ZThn4_N3ccc7DD6x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y2E = {  "_ZN3ccc7DD6x8y2E", // class name
  bases__ZN3ccc7DD6x8y2E, 2,
  &(vtc__ZN3ccc7DD6x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y2E),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  CC6x8y3  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x8y33abcEv
  ~CC6x8y3(); // tgen
  CC6x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y3E) C1{ VBC2{ v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y33efgEv");}
void  ccc::CC6x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y33pqrEv");}
void  ccc::CC6x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y33abcEv");}
ccc::CC6x8y3 ::~CC6x8y3(){ note_dtor("_ZN3ccc7CC6x8y3E", this);} // tgen
ccc::CC6x8y3 ::CC6x8y3(){ note_ctor("_ZN3ccc7CC6x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y3E, buf);
    ::ccc::CC6x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y3E);
    dp->::ccc::CC6x8y3::~CC6x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y3E(Test__ZN3ccc7CC6x8y3E, "_ZN3ccc7CC6x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y3C1Ev();
extern void _ZN3ccc7CC6x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y3E[] = {
  NSPAIR(_ZN3ccc7CC6x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y3E[];
extern void _ZN3ccc7CC6x8y33efgEv();
extern void _ZN3ccc7CC6x8y33abcEv();
extern void _ZN3ccc7CC6x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y33abcEv,_ZTv0_n12_N3ccc7CC6x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y33abcEv,_ZThn4_N3ccc7CC6x8y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y33efgEv,_ZTv0_n16_N3ccc7CC6x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y33efgEv,_ZThn4_N3ccc7CC6x8y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y33abcEv,_ZTv0_n12_N3ccc7CC6x8y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y33efgEv,_ZTv0_n16_N3ccc7CC6x8y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y3E[] = {
  {&(_ZTVN3ccc7CC6x8y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y3E[];
static VTBL_ENTRY alt_thunk_names575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y33efgEv,_ZTv0_n16_N3ccc7CC6x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y33efgEv,_ZThn4_N3ccc7CC6x8y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y33abcEv,_ZTv0_n12_N3ccc7CC6x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y33abcEv,_ZThn4_N3ccc7CC6x8y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y3E = {  "_ZN3ccc7CC6x8y3E", // class name
  bases__ZN3ccc7CC6x8y3E, 2,
  &(vtc__ZN3ccc7CC6x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y3E),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  DD6x8y3  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD6x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x8y33abcEv
  ~DD6x8y3(); // tgen
  DD6x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y3E) C1{ VBC2{ v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y33efgEv");}
void  ccc::DD6x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y33pqrEv");}
void  ccc::DD6x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y33abcEv");}
ccc::DD6x8y3 ::~DD6x8y3(){ note_dtor("_ZN3ccc7DD6x8y3E", this);} // tgen
ccc::DD6x8y3 ::DD6x8y3(){ note_ctor("_ZN3ccc7DD6x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y3E, buf);
    ::ccc::DD6x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y3E);
    dp->::ccc::DD6x8y3::~DD6x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y3E(Test__ZN3ccc7DD6x8y3E, "_ZN3ccc7DD6x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y3C1Ev();
extern void _ZN3ccc7DD6x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y3E[] = {
  NSPAIR(_ZN3ccc7DD6x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y3E[];
extern void _ZN3ccc7DD6x8y33abcEv();
extern void _ZN3ccc7DD6x8y33efgEv();
extern void _ZN3ccc7DD6x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y33efgEv,_ZTv0_n12_N3ccc7DD6x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y33efgEv,_ZThn4_N3ccc7DD6x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y33abcEv,_ZTv0_n16_N3ccc7DD6x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y33abcEv,_ZThn4_N3ccc7DD6x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y33efgEv,_ZTv0_n12_N3ccc7DD6x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y33abcEv,_ZTv0_n16_N3ccc7DD6x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y3E[] = {
  {&(_ZTVN3ccc7DD6x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y3E[];
static VTBL_ENTRY alt_thunk_names576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y33abcEv,_ZTv0_n16_N3ccc7DD6x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y33abcEv,_ZThn4_N3ccc7DD6x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y33efgEv,_ZTv0_n12_N3ccc7DD6x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y33efgEv,_ZThn4_N3ccc7DD6x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y3E = {  "_ZN3ccc7DD6x8y3E", // class name
  bases__ZN3ccc7DD6x8y3E, 2,
  &(vtc__ZN3ccc7DD6x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y3E),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  CC6x8y4  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC6x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x8y43efgEv
  ~CC6x8y4(); // tgen
  CC6x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y4E) C1{ VBC2{ v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y43pqrEv");}
void  ccc::CC6x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y43abcEv");}
void  ccc::CC6x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y43efgEv");}
ccc::CC6x8y4 ::~CC6x8y4(){ note_dtor("_ZN3ccc7CC6x8y4E", this);} // tgen
ccc::CC6x8y4 ::CC6x8y4(){ note_ctor("_ZN3ccc7CC6x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y4E, buf);
    ::ccc::CC6x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y4E);
    dp->::ccc::CC6x8y4::~CC6x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y4E(Test__ZN3ccc7CC6x8y4E, "_ZN3ccc7CC6x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y4C1Ev();
extern void _ZN3ccc7CC6x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y4E[] = {
  NSPAIR(_ZN3ccc7CC6x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y4E[];
extern void _ZN3ccc7CC6x8y43efgEv();
extern void _ZN3ccc7CC6x8y43abcEv();
extern void _ZN3ccc7CC6x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y43abcEv,_ZTv0_n12_N3ccc7CC6x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y43abcEv,_ZThn4_N3ccc7CC6x8y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y43efgEv,_ZTv0_n16_N3ccc7CC6x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y43efgEv,_ZThn4_N3ccc7CC6x8y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y43abcEv,_ZTv0_n12_N3ccc7CC6x8y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y43efgEv,_ZTv0_n16_N3ccc7CC6x8y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y4E[] = {
  {&(_ZTVN3ccc7CC6x8y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y4E[];
static VTBL_ENTRY alt_thunk_names577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y43efgEv,_ZTv0_n16_N3ccc7CC6x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y43efgEv,_ZThn4_N3ccc7CC6x8y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y43abcEv,_ZTv0_n12_N3ccc7CC6x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y43abcEv,_ZThn4_N3ccc7CC6x8y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y4E = {  "_ZN3ccc7CC6x8y4E", // class name
  bases__ZN3ccc7CC6x8y4E, 2,
  &(vtc__ZN3ccc7CC6x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y4E),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  DD6x8y4  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD6x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x8y43efgEv
  ~DD6x8y4(); // tgen
  DD6x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y4E) C1{ VBC2{ v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y43pqrEv");}
void  ccc::DD6x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y43abcEv");}
void  ccc::DD6x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y43efgEv");}
ccc::DD6x8y4 ::~DD6x8y4(){ note_dtor("_ZN3ccc7DD6x8y4E", this);} // tgen
ccc::DD6x8y4 ::DD6x8y4(){ note_ctor("_ZN3ccc7DD6x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y4E, buf);
    ::ccc::DD6x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y4E);
    dp->::ccc::DD6x8y4::~DD6x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y4E(Test__ZN3ccc7DD6x8y4E, "_ZN3ccc7DD6x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y4C1Ev();
extern void _ZN3ccc7DD6x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y4E[] = {
  NSPAIR(_ZN3ccc7DD6x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y4E[];
extern void _ZN3ccc7DD6x8y43abcEv();
extern void _ZN3ccc7DD6x8y43efgEv();
extern void _ZN3ccc7DD6x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y43efgEv,_ZTv0_n12_N3ccc7DD6x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y43efgEv,_ZThn4_N3ccc7DD6x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y43abcEv,_ZTv0_n16_N3ccc7DD6x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y43abcEv,_ZThn4_N3ccc7DD6x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y43efgEv,_ZTv0_n12_N3ccc7DD6x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y43abcEv,_ZTv0_n16_N3ccc7DD6x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y4E[] = {
  {&(_ZTVN3ccc7DD6x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y4E[];
static VTBL_ENTRY alt_thunk_names578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y43abcEv,_ZTv0_n16_N3ccc7DD6x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y43abcEv,_ZThn4_N3ccc7DD6x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y43efgEv,_ZTv0_n12_N3ccc7DD6x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y43efgEv,_ZThn4_N3ccc7DD6x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y4E = {  "_ZN3ccc7DD6x8y4E", // class name
  bases__ZN3ccc7DD6x8y4E, 2,
  &(vtc__ZN3ccc7DD6x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y4E),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  CC6x8y5  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC6x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x8y53abcEv
  ~CC6x8y5(); // tgen
  CC6x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y5E) C1{ VBC2{ v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y53pqrEv");}
void  ccc::CC6x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y53efgEv");}
void  ccc::CC6x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y53abcEv");}
ccc::CC6x8y5 ::~CC6x8y5(){ note_dtor("_ZN3ccc7CC6x8y5E", this);} // tgen
ccc::CC6x8y5 ::CC6x8y5(){ note_ctor("_ZN3ccc7CC6x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y5E, buf);
    ::ccc::CC6x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y5E);
    dp->::ccc::CC6x8y5::~CC6x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y5E(Test__ZN3ccc7CC6x8y5E, "_ZN3ccc7CC6x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y5C1Ev();
extern void _ZN3ccc7CC6x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y5E[] = {
  NSPAIR(_ZN3ccc7CC6x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y5E[];
extern void _ZN3ccc7CC6x8y53efgEv();
extern void _ZN3ccc7CC6x8y53abcEv();
extern void _ZN3ccc7CC6x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y53abcEv,_ZTv0_n12_N3ccc7CC6x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y53abcEv,_ZThn4_N3ccc7CC6x8y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y53efgEv,_ZTv0_n16_N3ccc7CC6x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y53efgEv,_ZThn4_N3ccc7CC6x8y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y53abcEv,_ZTv0_n12_N3ccc7CC6x8y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y53efgEv,_ZTv0_n16_N3ccc7CC6x8y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y5E[] = {
  {&(_ZTVN3ccc7CC6x8y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y5E[];
static VTBL_ENTRY alt_thunk_names579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y53efgEv,_ZTv0_n16_N3ccc7CC6x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y53efgEv,_ZThn4_N3ccc7CC6x8y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y53abcEv,_ZTv0_n12_N3ccc7CC6x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y53abcEv,_ZThn4_N3ccc7CC6x8y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y5E = {  "_ZN3ccc7CC6x8y5E", // class name
  bases__ZN3ccc7CC6x8y5E, 2,
  &(vtc__ZN3ccc7CC6x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y5E),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  DD6x8y5  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD6x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x8y53abcEv
  ~DD6x8y5(); // tgen
  DD6x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y5E) C1{ VBC2{ v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y53pqrEv");}
void  ccc::DD6x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y53efgEv");}
void  ccc::DD6x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y53abcEv");}
ccc::DD6x8y5 ::~DD6x8y5(){ note_dtor("_ZN3ccc7DD6x8y5E", this);} // tgen
ccc::DD6x8y5 ::DD6x8y5(){ note_ctor("_ZN3ccc7DD6x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y5E, buf);
    ::ccc::DD6x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y5E);
    dp->::ccc::DD6x8y5::~DD6x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y5E(Test__ZN3ccc7DD6x8y5E, "_ZN3ccc7DD6x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y5C1Ev();
extern void _ZN3ccc7DD6x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y5E[] = {
  NSPAIR(_ZN3ccc7DD6x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y5E[];
extern void _ZN3ccc7DD6x8y53abcEv();
extern void _ZN3ccc7DD6x8y53efgEv();
extern void _ZN3ccc7DD6x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y53efgEv,_ZTv0_n12_N3ccc7DD6x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y53efgEv,_ZThn4_N3ccc7DD6x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y53abcEv,_ZTv0_n16_N3ccc7DD6x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y53abcEv,_ZThn4_N3ccc7DD6x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y53efgEv,_ZTv0_n12_N3ccc7DD6x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y53abcEv,_ZTv0_n16_N3ccc7DD6x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y5E[] = {
  {&(_ZTVN3ccc7DD6x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y5E[];
static VTBL_ENTRY alt_thunk_names580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y53abcEv,_ZTv0_n16_N3ccc7DD6x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y53abcEv,_ZThn4_N3ccc7DD6x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y53efgEv,_ZTv0_n12_N3ccc7DD6x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y53efgEv,_ZThn4_N3ccc7DD6x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y5E = {  "_ZN3ccc7DD6x8y5E", // class name
  bases__ZN3ccc7DD6x8y5E, 2,
  &(vtc__ZN3ccc7DD6x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y5E),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  CC6x8y6  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x8y63efgEv
  ~CC6x8y6(); // tgen
  CC6x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y6E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y63abcEv");}
void  ccc::CC6x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y63efgEv");}
ccc::CC6x8y6 ::~CC6x8y6(){ note_dtor("_ZN3ccc7CC6x8y6E", this);} // tgen
ccc::CC6x8y6 ::CC6x8y6(){ note_ctor("_ZN3ccc7CC6x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y6E, buf);
    ::ccc::CC6x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y6E);
    dp->::ccc::CC6x8y6::~CC6x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y6E(Test__ZN3ccc7CC6x8y6E, "_ZN3ccc7CC6x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y6C1Ev();
extern void _ZN3ccc7CC6x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y6E[] = {
  NSPAIR(_ZN3ccc7CC6x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y6E[];
extern void _ZN3ccc7CC6x8y63efgEv();
extern void _ZN3ccc7CC6x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y63abcEv,_ZTv0_n12_N3ccc7CC6x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y63abcEv,_ZThn4_N3ccc7CC6x8y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y63efgEv,_ZTv0_n16_N3ccc7CC6x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y63efgEv,_ZThn4_N3ccc7CC6x8y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y63abcEv,_ZTv0_n12_N3ccc7CC6x8y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y63efgEv,_ZTv0_n16_N3ccc7CC6x8y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y6E[] = {
  {&(_ZTVN3ccc7CC6x8y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC6x8y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y6E[];
static VTBL_ENTRY alt_thunk_names581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y63efgEv,_ZTv0_n16_N3ccc7CC6x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y63efgEv,_ZThn4_N3ccc7CC6x8y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y63abcEv,_ZTv0_n12_N3ccc7CC6x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y63abcEv,_ZThn4_N3ccc7CC6x8y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y6E = {  "_ZN3ccc7CC6x8y6E", // class name
  bases__ZN3ccc7CC6x8y6E, 2,
  &(vtc__ZN3ccc7CC6x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y6E),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  DD6x8y6  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD6x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x8y63efgEv
  ~DD6x8y6(); // tgen
  DD6x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y6E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y63abcEv");}
void  ccc::DD6x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y63efgEv");}
ccc::DD6x8y6 ::~DD6x8y6(){ note_dtor("_ZN3ccc7DD6x8y6E", this);} // tgen
ccc::DD6x8y6 ::DD6x8y6(){ note_ctor("_ZN3ccc7DD6x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y6E, buf);
    ::ccc::DD6x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y6E);
    dp->::ccc::DD6x8y6::~DD6x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y6E(Test__ZN3ccc7DD6x8y6E, "_ZN3ccc7DD6x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y6C1Ev();
extern void _ZN3ccc7DD6x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y6E[] = {
  NSPAIR(_ZN3ccc7DD6x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y6E[];
extern void _ZN3ccc7DD6x8y63abcEv();
extern void _ZN3ccc7DD6x8y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y63efgEv,_ZTv0_n12_N3ccc7DD6x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y63efgEv,_ZThn4_N3ccc7DD6x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y63abcEv,_ZTv0_n16_N3ccc7DD6x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y63abcEv,_ZThn4_N3ccc7DD6x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y63efgEv,_ZTv0_n12_N3ccc7DD6x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y63abcEv,_ZTv0_n16_N3ccc7DD6x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y6E[] = {
  {&(_ZTVN3ccc7DD6x8y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x8y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x8y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y6E[];
static VTBL_ENTRY alt_thunk_names582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y63abcEv,_ZTv0_n16_N3ccc7DD6x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y63abcEv,_ZThn4_N3ccc7DD6x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y63efgEv,_ZTv0_n12_N3ccc7DD6x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y63efgEv,_ZThn4_N3ccc7DD6x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y6E = {  "_ZN3ccc7DD6x8y6E", // class name
  bases__ZN3ccc7DD6x8y6E, 2,
  &(vtc__ZN3ccc7DD6x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y6E),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  CC6x8y7  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC6x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y73pqrEv
  ~CC6x8y7(); // tgen
  CC6x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y7E) C1{ VBC2{ v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y73abcEv");}
void  ccc::CC6x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y73pqrEv");}
ccc::CC6x8y7 ::~CC6x8y7(){ note_dtor("_ZN3ccc7CC6x8y7E", this);} // tgen
ccc::CC6x8y7 ::CC6x8y7(){ note_ctor("_ZN3ccc7CC6x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y7E, buf);
    ::ccc::CC6x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y7E);
    dp->::ccc::CC6x8y7::~CC6x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y7E(Test__ZN3ccc7CC6x8y7E, "_ZN3ccc7CC6x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y7C1Ev();
extern void _ZN3ccc7CC6x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y7E[] = {
  NSPAIR(_ZN3ccc7CC6x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC6x8y73abcEv();
extern void _ZN3ccc7CC6x8y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y73abcEv,_ZTv0_n12_N3ccc7CC6x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y73abcEv,_ZThn4_N3ccc7CC6x8y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y73abcEv,_ZTv0_n12_N3ccc7CC6x8y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y7E[] = {
  {&(_ZTVN3ccc7CC6x8y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y7E[];
static VTBL_ENTRY alt_thunk_names583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y73abcEv,_ZTv0_n12_N3ccc7CC6x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y73abcEv,_ZThn4_N3ccc7CC6x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y7E = {  "_ZN3ccc7CC6x8y7E", // class name
  bases__ZN3ccc7CC6x8y7E, 2,
  &(vtc__ZN3ccc7CC6x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y7E),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  DD6x8y7  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD6x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x8y73pqrEv
  ~DD6x8y7(); // tgen
  DD6x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y7E) C1{ VBC2{ v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y73abcEv");}
void  ccc::DD6x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y73pqrEv");}
ccc::DD6x8y7 ::~DD6x8y7(){ note_dtor("_ZN3ccc7DD6x8y7E", this);} // tgen
ccc::DD6x8y7 ::DD6x8y7(){ note_ctor("_ZN3ccc7DD6x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y7E, buf);
    ::ccc::DD6x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y7E);
    dp->::ccc::DD6x8y7::~DD6x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y7E(Test__ZN3ccc7DD6x8y7E, "_ZN3ccc7DD6x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y7C1Ev();
extern void _ZN3ccc7DD6x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y7E[] = {
  NSPAIR(_ZN3ccc7DD6x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y7E[];
extern void _ZN3ccc7DD6x8y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y73abcEv,_ZTv0_n16_N3ccc7DD6x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y73abcEv,_ZThn4_N3ccc7DD6x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y73abcEv,_ZTv0_n16_N3ccc7DD6x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y7E[] = {
  {&(_ZTVN3ccc7DD6x8y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y7E[];
static VTBL_ENTRY alt_thunk_names584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y73abcEv,_ZTv0_n16_N3ccc7DD6x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y73abcEv,_ZThn4_N3ccc7DD6x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y7E = {  "_ZN3ccc7DD6x8y7E", // class name
  bases__ZN3ccc7DD6x8y7E, 2,
  &(vtc__ZN3ccc7DD6x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y7E),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  CC6x8y8  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x8y83abcEv
  ~CC6x8y8(); // tgen
  CC6x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y8E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y83efgEv");}
void  ccc::CC6x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x8y83abcEv");}
ccc::CC6x8y8 ::~CC6x8y8(){ note_dtor("_ZN3ccc7CC6x8y8E", this);} // tgen
ccc::CC6x8y8 ::CC6x8y8(){ note_ctor("_ZN3ccc7CC6x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y8E, buf);
    ::ccc::CC6x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y8E);
    dp->::ccc::CC6x8y8::~CC6x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y8E(Test__ZN3ccc7CC6x8y8E, "_ZN3ccc7CC6x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y8C1Ev();
extern void _ZN3ccc7CC6x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y8E[] = {
  NSPAIR(_ZN3ccc7CC6x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y8E[];
extern void _ZN3ccc7CC6x8y83efgEv();
extern void _ZN3ccc7CC6x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x8y83abcEv,_ZTv0_n12_N3ccc7CC6x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y83abcEv,_ZThn4_N3ccc7CC6x8y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y83efgEv,_ZTv0_n16_N3ccc7CC6x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y83efgEv,_ZThn4_N3ccc7CC6x8y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x8y83abcEv,_ZTv0_n12_N3ccc7CC6x8y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y83efgEv,_ZTv0_n16_N3ccc7CC6x8y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y8E[] = {
  {&(_ZTVN3ccc7CC6x8y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC6x8y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y8E[];
static VTBL_ENTRY alt_thunk_names585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y83efgEv,_ZTv0_n16_N3ccc7CC6x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y83efgEv,_ZThn4_N3ccc7CC6x8y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x8y83abcEv,_ZTv0_n12_N3ccc7CC6x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y83abcEv,_ZThn4_N3ccc7CC6x8y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y8E = {  "_ZN3ccc7CC6x8y8E", // class name
  bases__ZN3ccc7CC6x8y8E, 2,
  &(vtc__ZN3ccc7CC6x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y8E),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  DD6x8y8  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD6x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x8y83abcEv
  ~DD6x8y8(); // tgen
  DD6x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y8E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y83efgEv");}
void  ccc::DD6x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x8y83abcEv");}
ccc::DD6x8y8 ::~DD6x8y8(){ note_dtor("_ZN3ccc7DD6x8y8E", this);} // tgen
ccc::DD6x8y8 ::DD6x8y8(){ note_ctor("_ZN3ccc7DD6x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y8E, buf);
    ::ccc::DD6x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y8E);
    dp->::ccc::DD6x8y8::~DD6x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y8E(Test__ZN3ccc7DD6x8y8E, "_ZN3ccc7DD6x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y8C1Ev();
extern void _ZN3ccc7DD6x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y8E[] = {
  NSPAIR(_ZN3ccc7DD6x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y8E[];
extern void _ZN3ccc7DD6x8y83abcEv();
extern void _ZN3ccc7DD6x8y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y83efgEv,_ZTv0_n12_N3ccc7DD6x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y83efgEv,_ZThn4_N3ccc7DD6x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x8y83abcEv,_ZTv0_n16_N3ccc7DD6x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y83abcEv,_ZThn4_N3ccc7DD6x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y83efgEv,_ZTv0_n12_N3ccc7DD6x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x8y83abcEv,_ZTv0_n16_N3ccc7DD6x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y8E[] = {
  {&(_ZTVN3ccc7DD6x8y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x8y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x8y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y8E[];
static VTBL_ENTRY alt_thunk_names586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x8y83abcEv,_ZTv0_n16_N3ccc7DD6x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y83abcEv,_ZThn4_N3ccc7DD6x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y83efgEv,_ZTv0_n12_N3ccc7DD6x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y83efgEv,_ZThn4_N3ccc7DD6x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y8E = {  "_ZN3ccc7DD6x8y8E", // class name
  bases__ZN3ccc7DD6x8y8E, 2,
  &(vtc__ZN3ccc7DD6x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y8E),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  CC6x8y9  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC6x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x8y93pqrEv
  ~CC6x8y9(); // tgen
  CC6x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x8y9E) C1{ VBC2{ v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x8y93efgEv");}
void  ccc::CC6x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x8y93pqrEv");}
ccc::CC6x8y9 ::~CC6x8y9(){ note_dtor("_ZN3ccc7CC6x8y9E", this);} // tgen
ccc::CC6x8y9 ::CC6x8y9(){ note_ctor("_ZN3ccc7CC6x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x8y9E, buf);
    ::ccc::CC6x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x8y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC6x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x8y9E);
    dp->::ccc::CC6x8y9::~CC6x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x8y9E(Test__ZN3ccc7CC6x8y9E, "_ZN3ccc7CC6x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x8y9C1Ev();
extern void _ZN3ccc7CC6x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x8y9E[] = {
  NSPAIR(_ZN3ccc7CC6x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC6x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x8y9E[];
extern void _ZN3ccc7CC6x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC6x8y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x8y93efgEv,_ZTv0_n16_N3ccc7CC6x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x8y93efgEv,_ZThn4_N3ccc7CC6x8y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x8y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x8y93efgEv,_ZTv0_n16_N3ccc7CC6x8y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x8y9E[] = {
  {&(_ZTVN3ccc7CC6x8y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x8y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x8y9E[];
static VTBL_ENTRY alt_thunk_names587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x8y93efgEv,_ZTv0_n16_N3ccc7CC6x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x8y93efgEv,_ZThn4_N3ccc7CC6x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x8y9E = {  "_ZN3ccc7CC6x8y9E", // class name
  bases__ZN3ccc7CC6x8y9E, 2,
  &(vtc__ZN3ccc7CC6x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x8y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x8y9E),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  DD6x8y9  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD6x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x8y93pqrEv
  ~DD6x8y9(); // tgen
  DD6x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x8y9E) C1{ VBC2{ v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x8y93efgEv");}
void  ccc::DD6x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x8y93pqrEv");}
ccc::DD6x8y9 ::~DD6x8y9(){ note_dtor("_ZN3ccc7DD6x8y9E", this);} // tgen
ccc::DD6x8y9 ::DD6x8y9(){ note_ctor("_ZN3ccc7DD6x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x8y9E, buf);
    ::ccc::DD6x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x8y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD6x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x8y9E);
    dp->::ccc::DD6x8y9::~DD6x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x8y9E(Test__ZN3ccc7DD6x8y9E, "_ZN3ccc7DD6x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x8y9C1Ev();
extern void _ZN3ccc7DD6x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x8y9E[] = {
  NSPAIR(_ZN3ccc7DD6x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD6x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x8y93efgEv();
extern void _ZN3ccc7DD6x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x8y93efgEv,_ZTv0_n12_N3ccc7DD6x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x8y93efgEv,_ZThn4_N3ccc7DD6x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x8y93efgEv,_ZTv0_n12_N3ccc7DD6x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x8y9E[] = {
  {&(_ZTVN3ccc7DD6x8y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x8y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x8y9E[];
static VTBL_ENTRY alt_thunk_names588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x8y93efgEv,_ZTv0_n12_N3ccc7DD6x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x8y93efgEv,_ZThn4_N3ccc7DD6x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x8y9E = {  "_ZN3ccc7DD6x8y9E", // class name
  bases__ZN3ccc7DD6x8y9E, 2,
  &(vtc__ZN3ccc7DD6x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x8y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x8y9E),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  CC6x8y10  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC6x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x8y103abcEv
  ~CC6x8y10(); // tgen
  CC6x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y10E) C1{ VBC2{ v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x8y103pqrEv");}
void  ccc::CC6x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x8y103abcEv");}
ccc::CC6x8y10 ::~CC6x8y10(){ note_dtor("_ZN3ccc8CC6x8y10E", this);} // tgen
ccc::CC6x8y10 ::CC6x8y10(){ note_ctor("_ZN3ccc8CC6x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x8y10E, buf);
    ::ccc::CC6x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x8y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC6x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x8y10E);
    dp->::ccc::CC6x8y10::~CC6x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x8y10E(Test__ZN3ccc8CC6x8y10E, "_ZN3ccc8CC6x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x8y10C1Ev();
extern void _ZN3ccc8CC6x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x8y10E[] = {
  NSPAIR(_ZN3ccc8CC6x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC6x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC6x8y103abcEv();
extern void _ZN3ccc8CC6x8y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x8y103abcEv,_ZTv0_n12_N3ccc8CC6x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y103abcEv,_ZThn4_N3ccc8CC6x8y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x8y103abcEv,_ZTv0_n12_N3ccc8CC6x8y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x8y10E[] = {
  {&(_ZTVN3ccc8CC6x8y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x8y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x8y10E[];
static VTBL_ENTRY alt_thunk_names589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x8y103abcEv,_ZTv0_n12_N3ccc8CC6x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x8y103abcEv,_ZThn4_N3ccc8CC6x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x8y10E = {  "_ZN3ccc8CC6x8y10E", // class name
  bases__ZN3ccc8CC6x8y10E, 2,
  &(vtc__ZN3ccc8CC6x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x8y10E),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  DD6x8y10  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD6x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x8y103abcEv
  ~DD6x8y10(); // tgen
  DD6x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x8y10E) C1{ VBC2{ v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x8y103pqrEv");}
void  ccc::DD6x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x8y103abcEv");}
ccc::DD6x8y10 ::~DD6x8y10(){ note_dtor("_ZN3ccc8DD6x8y10E", this);} // tgen
ccc::DD6x8y10 ::DD6x8y10(){ note_ctor("_ZN3ccc8DD6x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x8y10E, buf);
    ::ccc::DD6x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x8y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD6x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x8y10E);
    dp->::ccc::DD6x8y10::~DD6x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x8y10E(Test__ZN3ccc8DD6x8y10E, "_ZN3ccc8DD6x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x8y10C1Ev();
extern void _ZN3ccc8DD6x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x8y10E[] = {
  NSPAIR(_ZN3ccc8DD6x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD6x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y10E[];
extern void _ZN3ccc8DD6x8y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x8y103abcEv,_ZTv0_n16_N3ccc8DD6x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x8y103abcEv,_ZThn4_N3ccc8DD6x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x8y103abcEv,_ZTv0_n16_N3ccc8DD6x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x8y10E[] = {
  {&(_ZTVN3ccc8DD6x8y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x8y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x8y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x8y10E[];
static VTBL_ENTRY alt_thunk_names590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x8y103abcEv,_ZTv0_n16_N3ccc8DD6x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x8y103abcEv,_ZThn4_N3ccc8DD6x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x8y10E = {  "_ZN3ccc8DD6x8y10E", // class name
  bases__ZN3ccc8DD6x8y10E, 2,
  &(vtc__ZN3ccc8DD6x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x8y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x8y10E),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  CC6x8y11  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC6x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x8y113efgEv
  ~CC6x8y11(); // tgen
  CC6x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y11E) C1{ VBC2{ v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x8y113pqrEv");}
void  ccc::CC6x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x8y113efgEv");}
ccc::CC6x8y11 ::~CC6x8y11(){ note_dtor("_ZN3ccc8CC6x8y11E", this);} // tgen
ccc::CC6x8y11 ::CC6x8y11(){ note_ctor("_ZN3ccc8CC6x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x8y11E, buf);
    ::ccc::CC6x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x8y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC6x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x8y11E);
    dp->::ccc::CC6x8y11::~CC6x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x8y11E(Test__ZN3ccc8CC6x8y11E, "_ZN3ccc8CC6x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x8y11C1Ev();
extern void _ZN3ccc8CC6x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x8y11E[] = {
  NSPAIR(_ZN3ccc8CC6x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC6x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x8y11E[];
extern void _ZN3ccc8CC6x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC6x8y113pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x8y113efgEv,_ZTv0_n16_N3ccc8CC6x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y113efgEv,_ZThn4_N3ccc8CC6x8y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x8y113efgEv,_ZTv0_n16_N3ccc8CC6x8y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x8y11E[] = {
  {&(_ZTVN3ccc8CC6x8y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x8y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x8y11E[];
static VTBL_ENTRY alt_thunk_names591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x8y113efgEv,_ZTv0_n16_N3ccc8CC6x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x8y113efgEv,_ZThn4_N3ccc8CC6x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x8y11E = {  "_ZN3ccc8CC6x8y11E", // class name
  bases__ZN3ccc8CC6x8y11E, 2,
  &(vtc__ZN3ccc8CC6x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x8y11E),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  DD6x8y11  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD6x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x8y113efgEv
  ~DD6x8y11(); // tgen
  DD6x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x8y11E) C1{ VBC2{ v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x8y113pqrEv");}
void  ccc::DD6x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x8y113efgEv");}
ccc::DD6x8y11 ::~DD6x8y11(){ note_dtor("_ZN3ccc8DD6x8y11E", this);} // tgen
ccc::DD6x8y11 ::DD6x8y11(){ note_ctor("_ZN3ccc8DD6x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x8y11E, buf);
    ::ccc::DD6x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x8y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD6x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x8y11E);
    dp->::ccc::DD6x8y11::~DD6x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x8y11E(Test__ZN3ccc8DD6x8y11E, "_ZN3ccc8DD6x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x8y11C1Ev();
extern void _ZN3ccc8DD6x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x8y11E[] = {
  NSPAIR(_ZN3ccc8DD6x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD6x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x8y113efgEv();
extern void _ZN3ccc8DD6x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x8y113efgEv,_ZTv0_n12_N3ccc8DD6x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x8y113efgEv,_ZThn4_N3ccc8DD6x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x8y113efgEv,_ZTv0_n12_N3ccc8DD6x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x8y11E[] = {
  {&(_ZTVN3ccc8DD6x8y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x8y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x8y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x8y11E[];
static VTBL_ENTRY alt_thunk_names592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x8y113efgEv,_ZTv0_n12_N3ccc8DD6x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x8y113efgEv,_ZThn4_N3ccc8DD6x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x8y11E = {  "_ZN3ccc8DD6x8y11E", // class name
  bases__ZN3ccc8DD6x8y11E, 2,
  &(vtc__ZN3ccc8DD6x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x8y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x8y11E),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  CC6x8y12  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC6x8y123abcEv
  ~CC6x8y12(); // tgen
  CC6x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC6x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x8y123abcEv");}
ccc::CC6x8y12 ::~CC6x8y12(){ note_dtor("_ZN3ccc8CC6x8y12E", this);} // tgen
ccc::CC6x8y12 ::CC6x8y12(){ note_ctor("_ZN3ccc8CC6x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x8y12E, buf);
    ::ccc::CC6x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x8y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC6x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x8y12E);
    dp->::ccc::CC6x8y12::~CC6x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x8y12E(Test__ZN3ccc8CC6x8y12E, "_ZN3ccc8CC6x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x8y12C1Ev();
extern void _ZN3ccc8CC6x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x8y12E[] = {
  NSPAIR(_ZN3ccc8CC6x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC6x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC6x8y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x8y123abcEv,_ZTv0_n12_N3ccc8CC6x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y123abcEv,_ZThn4_N3ccc8CC6x8y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x8y123abcEv,_ZTv0_n12_N3ccc8CC6x8y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x8y12E[] = {
  {&(_ZTVN3ccc8CC6x8y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x8y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x8y12E[];
static VTBL_ENTRY alt_thunk_names593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x8y123abcEv,_ZTv0_n12_N3ccc8CC6x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x8y123abcEv,_ZThn4_N3ccc8CC6x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x8y12E = {  "_ZN3ccc8CC6x8y12E", // class name
  bases__ZN3ccc8CC6x8y12E, 2,
  &(vtc__ZN3ccc8CC6x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x8y12E),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  DD6x8y12  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD6x8y123abcEv
  ~DD6x8y12(); // tgen
  DD6x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x8y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD6x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x8y123abcEv");}
ccc::DD6x8y12 ::~DD6x8y12(){ note_dtor("_ZN3ccc8DD6x8y12E", this);} // tgen
ccc::DD6x8y12 ::DD6x8y12(){ note_ctor("_ZN3ccc8DD6x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x8y12E, buf);
    ::ccc::DD6x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x8y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD6x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x8y12E);
    dp->::ccc::DD6x8y12::~DD6x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x8y12E(Test__ZN3ccc8DD6x8y12E, "_ZN3ccc8DD6x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x8y12C1Ev();
extern void _ZN3ccc8DD6x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x8y12E[] = {
  NSPAIR(_ZN3ccc8DD6x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD6x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y12E[];
extern void _ZN3ccc8DD6x8y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x8y123abcEv,_ZTv0_n16_N3ccc8DD6x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x8y123abcEv,_ZThn4_N3ccc8DD6x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x8y123abcEv,_ZTv0_n16_N3ccc8DD6x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x8y12E[] = {
  {&(_ZTVN3ccc8DD6x8y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x8y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x8y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x8y12E[];
static VTBL_ENTRY alt_thunk_names594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x8y123abcEv,_ZTv0_n16_N3ccc8DD6x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x8y123abcEv,_ZThn4_N3ccc8DD6x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x8y12E = {  "_ZN3ccc8DD6x8y12E", // class name
  bases__ZN3ccc8DD6x8y12E, 2,
  &(vtc__ZN3ccc8DD6x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x8y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x8y12E),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  CC6x8y13  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC6x8y133efgEv
  ~CC6x8y13(); // tgen
  CC6x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y13E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC6x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x8y133efgEv");}
ccc::CC6x8y13 ::~CC6x8y13(){ note_dtor("_ZN3ccc8CC6x8y13E", this);} // tgen
ccc::CC6x8y13 ::CC6x8y13(){ note_ctor("_ZN3ccc8CC6x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x8y13E, buf);
    ::ccc::CC6x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x8y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC6x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x8y13E);
    dp->::ccc::CC6x8y13::~CC6x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x8y13E(Test__ZN3ccc8CC6x8y13E, "_ZN3ccc8CC6x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x8y13C1Ev();
extern void _ZN3ccc8CC6x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x8y13E[] = {
  NSPAIR(_ZN3ccc8CC6x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC6x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x8y13E[];
extern void _ZN3ccc8CC6x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x8y133efgEv,_ZTv0_n16_N3ccc8CC6x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x8y133efgEv,_ZThn4_N3ccc8CC6x8y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x8y133efgEv,_ZTv0_n16_N3ccc8CC6x8y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x8y13E[] = {
  {&(_ZTVN3ccc8CC6x8y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x8y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x8y13E[];
static VTBL_ENTRY alt_thunk_names595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x8y133efgEv,_ZTv0_n16_N3ccc8CC6x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x8y133efgEv,_ZThn4_N3ccc8CC6x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x8y13E = {  "_ZN3ccc8CC6x8y13E", // class name
  bases__ZN3ccc8CC6x8y13E, 2,
  &(vtc__ZN3ccc8CC6x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x8y13E),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  DD6x8y13  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD6x8y133efgEv
  ~DD6x8y13(); // tgen
  DD6x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x8y13E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD6x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x8y133efgEv");}
ccc::DD6x8y13 ::~DD6x8y13(){ note_dtor("_ZN3ccc8DD6x8y13E", this);} // tgen
ccc::DD6x8y13 ::DD6x8y13(){ note_ctor("_ZN3ccc8DD6x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x8y13E, buf);
    ::ccc::DD6x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x8y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD6x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x8y13E);
    dp->::ccc::DD6x8y13::~DD6x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x8y13E(Test__ZN3ccc8DD6x8y13E, "_ZN3ccc8DD6x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x8y13C1Ev();
extern void _ZN3ccc8DD6x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x8y13E[] = {
  NSPAIR(_ZN3ccc8DD6x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD6x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x8y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x8y133efgEv,_ZTv0_n12_N3ccc8DD6x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x8y133efgEv,_ZThn4_N3ccc8DD6x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x8y133efgEv,_ZTv0_n12_N3ccc8DD6x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x8y13E[] = {
  {&(_ZTVN3ccc8DD6x8y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x8y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x8y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x8y13E[];
static VTBL_ENTRY alt_thunk_names596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x8y133efgEv,_ZTv0_n12_N3ccc8DD6x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x8y133efgEv,_ZThn4_N3ccc8DD6x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x8y13E = {  "_ZN3ccc8DD6x8y13E", // class name
  bases__ZN3ccc8DD6x8y13E, 2,
  &(vtc__ZN3ccc8DD6x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x8y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x8y13E),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  CC6x8y14  : virtual ::ccc::AA6 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC6x8y143pqrEv
  ~CC6x8y14(); // tgen
  CC6x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC6x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x8y143pqrEv");}
ccc::CC6x8y14 ::~CC6x8y14(){ note_dtor("_ZN3ccc8CC6x8y14E", this);} // tgen
ccc::CC6x8y14 ::CC6x8y14(){ note_ctor("_ZN3ccc8CC6x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x8y14E, buf);
    ::ccc::CC6x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x8y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC6x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x8y14E);
    dp->::ccc::CC6x8y14::~CC6x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x8y14E(Test__ZN3ccc8CC6x8y14E, "_ZN3ccc8CC6x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x8y14C1Ev();
extern void _ZN3ccc8CC6x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x8y14E[] = {
  NSPAIR(_ZN3ccc8CC6x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC6x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC6x8y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x8y14E[] = {
  {&(_ZTVN3ccc8CC6x8y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x8y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x8y14E[];
Class_Descriptor cd__ZN3ccc8CC6x8y14E = {  "_ZN3ccc8CC6x8y14E", // class name
  bases__ZN3ccc8CC6x8y14E, 2,
  &(vtc__ZN3ccc8CC6x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x8y14E),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  DD6x8y14  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD6x8y143pqrEv
  ~DD6x8y14(); // tgen
  DD6x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x8y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD6x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x8y143pqrEv");}
ccc::DD6x8y14 ::~DD6x8y14(){ note_dtor("_ZN3ccc8DD6x8y14E", this);} // tgen
ccc::DD6x8y14 ::DD6x8y14(){ note_ctor("_ZN3ccc8DD6x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x8y14E, buf);
    ::ccc::DD6x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x8y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD6x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x8y14E);
    dp->::ccc::DD6x8y14::~DD6x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x8y14E(Test__ZN3ccc8DD6x8y14E, "_ZN3ccc8DD6x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x8y14C1Ev();
extern void _ZN3ccc8DD6x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x8y14E[] = {
  NSPAIR(_ZN3ccc8DD6x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD6x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x8y14E[] = {
  {&(_ZTVN3ccc8DD6x8y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x8y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x8y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x8y14E[];
Class_Descriptor cd__ZN3ccc8DD6x8y14E = {  "_ZN3ccc8DD6x8y14E", // class name
  bases__ZN3ccc8DD6x8y14E, 2,
  &(vtc__ZN3ccc8DD6x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x8y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x8y14E),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  CC6x8y15  : virtual ::ccc::AA6 , ::ccc::BB8 {
  ~CC6x8y15(); // tgen
  CC6x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x8y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC6x8y15 ::~CC6x8y15(){ note_dtor("_ZN3ccc8CC6x8y15E", this);} // tgen
ccc::CC6x8y15 ::CC6x8y15(){ note_ctor("_ZN3ccc8CC6x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x8y15E, buf);
    ::ccc::CC6x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x8y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC6x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x8y15E);
    dp->::ccc::CC6x8y15::~CC6x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x8y15E(Test__ZN3ccc8CC6x8y15E, "_ZN3ccc8CC6x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x8y15C1Ev();
extern void _ZN3ccc8CC6x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x8y15E[] = {
  NSPAIR(_ZN3ccc8CC6x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC6x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x8y15E[] = {
  {&(_ZTVN3ccc8CC6x8y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x8y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x8y15E[];
Class_Descriptor cd__ZN3ccc8CC6x8y15E = {  "_ZN3ccc8CC6x8y15E", // class name
  bases__ZN3ccc8CC6x8y15E, 2,
  &(vtc__ZN3ccc8CC6x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x8y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x8y15E),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  DD6x8y15  : virtual ::ccc::AA6 , virtual ::ccc::BB8 {
  ~DD6x8y15(); // tgen
  DD6x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x8y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD6x8y15 ::~DD6x8y15(){ note_dtor("_ZN3ccc8DD6x8y15E", this);} // tgen
ccc::DD6x8y15 ::DD6x8y15(){ note_ctor("_ZN3ccc8DD6x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x8y15E, buf);
    ::ccc::DD6x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x8y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD6x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x8y15E);
    dp->::ccc::DD6x8y15::~DD6x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x8y15E(Test__ZN3ccc8DD6x8y15E, "_ZN3ccc8DD6x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x8y15C1Ev();
extern void _ZN3ccc8DD6x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x8y15E[] = {
  NSPAIR(_ZN3ccc8DD6x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD6x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x8y15E[] = {
  {&(_ZTVN3ccc8DD6x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x8y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x8y15E[];
Class_Descriptor cd__ZN3ccc8DD6x8y15E = {  "_ZN3ccc8DD6x8y15E", // class name
  bases__ZN3ccc8DD6x8y15E, 2,
  &(vtc__ZN3ccc8DD6x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x8y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x8y15E),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  CC6x9y0  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC6x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y03pqrEv
  ~CC6x9y0(); // tgen
  CC6x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y0E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y03abcEv");}
void  ccc::CC6x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y03efgEv");}
void  ccc::CC6x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y03pqrEv");}
ccc::CC6x9y0 ::~CC6x9y0(){ note_dtor("_ZN3ccc7CC6x9y0E", this);} // tgen
ccc::CC6x9y0 ::CC6x9y0(){ note_ctor("_ZN3ccc7CC6x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y0E, buf);
    ::ccc::CC6x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y0E);
    dp->::ccc::CC6x9y0::~CC6x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y0E(Test__ZN3ccc7CC6x9y0E, "_ZN3ccc7CC6x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y0C1Ev();
extern void _ZN3ccc7CC6x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y0E[] = {
  NSPAIR(_ZN3ccc7CC6x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y0E[];
extern void _ZN3ccc7CC6x9y03efgEv();
extern void _ZN3ccc7CC6x9y03pqrEv();
extern void _ZN3ccc7CC6x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y03abcEv,_ZTv0_n12_N3ccc7CC6x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y03abcEv,_ZThn4_N3ccc7CC6x9y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y03efgEv,_ZTv0_n16_N3ccc7CC6x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y03efgEv,_ZThn4_N3ccc7CC6x9y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y03abcEv,_ZTv0_n12_N3ccc7CC6x9y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y03efgEv,_ZTv0_n16_N3ccc7CC6x9y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y0E[] = {
  {&(_ZTVN3ccc7CC6x9y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y0E[];
static VTBL_ENTRY alt_thunk_names597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y03efgEv,_ZTv0_n16_N3ccc7CC6x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y03efgEv,_ZThn4_N3ccc7CC6x9y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y03abcEv,_ZTv0_n12_N3ccc7CC6x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y03abcEv,_ZThn4_N3ccc7CC6x9y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y0E = {  "_ZN3ccc7CC6x9y0E", // class name
  bases__ZN3ccc7CC6x9y0E, 2,
  &(vtc__ZN3ccc7CC6x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y0E),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  DD6x9y0  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD6x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD6x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x9y03pqrEv
  ~DD6x9y0(); // tgen
  DD6x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y0E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y03abcEv");}
void  ccc::DD6x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y03efgEv");}
void  ccc::DD6x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y03pqrEv");}
ccc::DD6x9y0 ::~DD6x9y0(){ note_dtor("_ZN3ccc7DD6x9y0E", this);} // tgen
ccc::DD6x9y0 ::DD6x9y0(){ note_ctor("_ZN3ccc7DD6x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y0E, buf);
    ::ccc::DD6x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y0E);
    dp->::ccc::DD6x9y0::~DD6x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y0E(Test__ZN3ccc7DD6x9y0E, "_ZN3ccc7DD6x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y0C1Ev();
extern void _ZN3ccc7DD6x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y0E[] = {
  NSPAIR(_ZN3ccc7DD6x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y0E[];
extern void _ZN3ccc7DD6x9y03abcEv();
extern void _ZN3ccc7DD6x9y03efgEv();
extern void _ZN3ccc7DD6x9y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y03efgEv,_ZTv0_n12_N3ccc7DD6x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y03efgEv,_ZThn4_N3ccc7DD6x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y03pqrEv,_ZTv0_n16_N3ccc7DD6x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y03pqrEv,_ZThn4_N3ccc7DD6x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y03efgEv,_ZTv0_n12_N3ccc7DD6x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y03pqrEv,_ZTv0_n16_N3ccc7DD6x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y0E[] = {
  {&(_ZTVN3ccc7DD6x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y0E[];
static VTBL_ENTRY alt_thunk_names598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y03pqrEv,_ZTv0_n16_N3ccc7DD6x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y03pqrEv,_ZThn4_N3ccc7DD6x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y03efgEv,_ZTv0_n12_N3ccc7DD6x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y03efgEv,_ZThn4_N3ccc7DD6x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y0E = {  "_ZN3ccc7DD6x9y0E", // class name
  bases__ZN3ccc7DD6x9y0E, 2,
  &(vtc__ZN3ccc7DD6x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y0E),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  CC6x9y1  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x9y13efgEv
  ~CC6x9y1(); // tgen
  CC6x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y1E) C1{ VBC2{ v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y13abcEv");}
void  ccc::CC6x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y13pqrEv");}
void  ccc::CC6x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y13efgEv");}
ccc::CC6x9y1 ::~CC6x9y1(){ note_dtor("_ZN3ccc7CC6x9y1E", this);} // tgen
ccc::CC6x9y1 ::CC6x9y1(){ note_ctor("_ZN3ccc7CC6x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y1E, buf);
    ::ccc::CC6x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y1E);
    dp->::ccc::CC6x9y1::~CC6x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y1E(Test__ZN3ccc7CC6x9y1E, "_ZN3ccc7CC6x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y1C1Ev();
extern void _ZN3ccc7CC6x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y1E[] = {
  NSPAIR(_ZN3ccc7CC6x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y1E[];
extern void _ZN3ccc7CC6x9y13efgEv();
extern void _ZN3ccc7CC6x9y13pqrEv();
extern void _ZN3ccc7CC6x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y13abcEv,_ZTv0_n12_N3ccc7CC6x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y13abcEv,_ZThn4_N3ccc7CC6x9y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y13efgEv,_ZTv0_n16_N3ccc7CC6x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y13efgEv,_ZThn4_N3ccc7CC6x9y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y13abcEv,_ZTv0_n12_N3ccc7CC6x9y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y13efgEv,_ZTv0_n16_N3ccc7CC6x9y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y1E[] = {
  {&(_ZTVN3ccc7CC6x9y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y1E[];
static VTBL_ENTRY alt_thunk_names599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y13efgEv,_ZTv0_n16_N3ccc7CC6x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y13efgEv,_ZThn4_N3ccc7CC6x9y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y13abcEv,_ZTv0_n12_N3ccc7CC6x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y13abcEv,_ZThn4_N3ccc7CC6x9y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y1E = {  "_ZN3ccc7CC6x9y1E", // class name
  bases__ZN3ccc7CC6x9y1E, 2,
  &(vtc__ZN3ccc7CC6x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y1E),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  DD6x9y1  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD6x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x9y13efgEv
  ~DD6x9y1(); // tgen
  DD6x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y1E) C1{ VBC2{ v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y13abcEv");}
void  ccc::DD6x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y13pqrEv");}
void  ccc::DD6x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y13efgEv");}
ccc::DD6x9y1 ::~DD6x9y1(){ note_dtor("_ZN3ccc7DD6x9y1E", this);} // tgen
ccc::DD6x9y1 ::DD6x9y1(){ note_ctor("_ZN3ccc7DD6x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y1E, buf);
    ::ccc::DD6x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y1E);
    dp->::ccc::DD6x9y1::~DD6x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y1E(Test__ZN3ccc7DD6x9y1E, "_ZN3ccc7DD6x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y1C1Ev();
extern void _ZN3ccc7DD6x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y1E[] = {
  NSPAIR(_ZN3ccc7DD6x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y1E[];
extern void _ZN3ccc7DD6x9y13abcEv();
extern void _ZN3ccc7DD6x9y13efgEv();
extern void _ZN3ccc7DD6x9y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y13efgEv,_ZTv0_n12_N3ccc7DD6x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y13efgEv,_ZThn4_N3ccc7DD6x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y13pqrEv,_ZTv0_n16_N3ccc7DD6x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y13pqrEv,_ZThn4_N3ccc7DD6x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y13efgEv,_ZTv0_n12_N3ccc7DD6x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y13pqrEv,_ZTv0_n16_N3ccc7DD6x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y1E[] = {
  {&(_ZTVN3ccc7DD6x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y1E[];
static VTBL_ENTRY alt_thunk_names600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y13pqrEv,_ZTv0_n16_N3ccc7DD6x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y13pqrEv,_ZThn4_N3ccc7DD6x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y13efgEv,_ZTv0_n12_N3ccc7DD6x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y13efgEv,_ZThn4_N3ccc7DD6x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y1E = {  "_ZN3ccc7DD6x9y1E", // class name
  bases__ZN3ccc7DD6x9y1E, 2,
  &(vtc__ZN3ccc7DD6x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y1E),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  CC6x9y2  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC6x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y23pqrEv
  ~CC6x9y2(); // tgen
  CC6x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y2E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y23efgEv");}
void  ccc::CC6x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y23abcEv");}
void  ccc::CC6x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y23pqrEv");}
ccc::CC6x9y2 ::~CC6x9y2(){ note_dtor("_ZN3ccc7CC6x9y2E", this);} // tgen
ccc::CC6x9y2 ::CC6x9y2(){ note_ctor("_ZN3ccc7CC6x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y2E, buf);
    ::ccc::CC6x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y2E);
    dp->::ccc::CC6x9y2::~CC6x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y2E(Test__ZN3ccc7CC6x9y2E, "_ZN3ccc7CC6x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y2C1Ev();
extern void _ZN3ccc7CC6x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y2E[] = {
  NSPAIR(_ZN3ccc7CC6x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y2E[];
extern void _ZN3ccc7CC6x9y23efgEv();
extern void _ZN3ccc7CC6x9y23pqrEv();
extern void _ZN3ccc7CC6x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y23abcEv,_ZTv0_n12_N3ccc7CC6x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y23abcEv,_ZThn4_N3ccc7CC6x9y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y23efgEv,_ZTv0_n16_N3ccc7CC6x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y23efgEv,_ZThn4_N3ccc7CC6x9y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y23abcEv,_ZTv0_n12_N3ccc7CC6x9y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y23efgEv,_ZTv0_n16_N3ccc7CC6x9y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y2E[] = {
  {&(_ZTVN3ccc7CC6x9y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y2E[];
static VTBL_ENTRY alt_thunk_names601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y23efgEv,_ZTv0_n16_N3ccc7CC6x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y23efgEv,_ZThn4_N3ccc7CC6x9y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y23abcEv,_ZTv0_n12_N3ccc7CC6x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y23abcEv,_ZThn4_N3ccc7CC6x9y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y2E = {  "_ZN3ccc7CC6x9y2E", // class name
  bases__ZN3ccc7CC6x9y2E, 2,
  &(vtc__ZN3ccc7CC6x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y2E),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  DD6x9y2  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD6x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD6x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x9y23pqrEv
  ~DD6x9y2(); // tgen
  DD6x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y2E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y23efgEv");}
void  ccc::DD6x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y23abcEv");}
void  ccc::DD6x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y23pqrEv");}
ccc::DD6x9y2 ::~DD6x9y2(){ note_dtor("_ZN3ccc7DD6x9y2E", this);} // tgen
ccc::DD6x9y2 ::DD6x9y2(){ note_ctor("_ZN3ccc7DD6x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y2E, buf);
    ::ccc::DD6x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y2E);
    dp->::ccc::DD6x9y2::~DD6x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y2E(Test__ZN3ccc7DD6x9y2E, "_ZN3ccc7DD6x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y2C1Ev();
extern void _ZN3ccc7DD6x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y2E[] = {
  NSPAIR(_ZN3ccc7DD6x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y2E[];
extern void _ZN3ccc7DD6x9y23abcEv();
extern void _ZN3ccc7DD6x9y23efgEv();
extern void _ZN3ccc7DD6x9y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y23efgEv,_ZTv0_n12_N3ccc7DD6x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y23efgEv,_ZThn4_N3ccc7DD6x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y23pqrEv,_ZTv0_n16_N3ccc7DD6x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y23pqrEv,_ZThn4_N3ccc7DD6x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y23efgEv,_ZTv0_n12_N3ccc7DD6x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y23pqrEv,_ZTv0_n16_N3ccc7DD6x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y2E[] = {
  {&(_ZTVN3ccc7DD6x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y2E[];
static VTBL_ENTRY alt_thunk_names602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y23pqrEv,_ZTv0_n16_N3ccc7DD6x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y23pqrEv,_ZThn4_N3ccc7DD6x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y23efgEv,_ZTv0_n12_N3ccc7DD6x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y23efgEv,_ZThn4_N3ccc7DD6x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y2E = {  "_ZN3ccc7DD6x9y2E", // class name
  bases__ZN3ccc7DD6x9y2E, 2,
  &(vtc__ZN3ccc7DD6x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y2E),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  CC6x9y3  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x9y33abcEv
  ~CC6x9y3(); // tgen
  CC6x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y3E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y33efgEv");}
void  ccc::CC6x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y33pqrEv");}
void  ccc::CC6x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y33abcEv");}
ccc::CC6x9y3 ::~CC6x9y3(){ note_dtor("_ZN3ccc7CC6x9y3E", this);} // tgen
ccc::CC6x9y3 ::CC6x9y3(){ note_ctor("_ZN3ccc7CC6x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y3E, buf);
    ::ccc::CC6x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y3E);
    dp->::ccc::CC6x9y3::~CC6x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y3E(Test__ZN3ccc7CC6x9y3E, "_ZN3ccc7CC6x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y3C1Ev();
extern void _ZN3ccc7CC6x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y3E[] = {
  NSPAIR(_ZN3ccc7CC6x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y3E[];
extern void _ZN3ccc7CC6x9y33efgEv();
extern void _ZN3ccc7CC6x9y33pqrEv();
extern void _ZN3ccc7CC6x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y33abcEv,_ZTv0_n12_N3ccc7CC6x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y33abcEv,_ZThn4_N3ccc7CC6x9y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y33efgEv,_ZTv0_n16_N3ccc7CC6x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y33efgEv,_ZThn4_N3ccc7CC6x9y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y33abcEv,_ZTv0_n12_N3ccc7CC6x9y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y33efgEv,_ZTv0_n16_N3ccc7CC6x9y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y3E[] = {
  {&(_ZTVN3ccc7CC6x9y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y3E[];
static VTBL_ENTRY alt_thunk_names603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y33efgEv,_ZTv0_n16_N3ccc7CC6x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y33efgEv,_ZThn4_N3ccc7CC6x9y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y33abcEv,_ZTv0_n12_N3ccc7CC6x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y33abcEv,_ZThn4_N3ccc7CC6x9y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y3E = {  "_ZN3ccc7CC6x9y3E", // class name
  bases__ZN3ccc7CC6x9y3E, 2,
  &(vtc__ZN3ccc7CC6x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y3E),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  DD6x9y3  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD6x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x9y33abcEv
  ~DD6x9y3(); // tgen
  DD6x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y3E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y33efgEv");}
void  ccc::DD6x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y33pqrEv");}
void  ccc::DD6x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y33abcEv");}
ccc::DD6x9y3 ::~DD6x9y3(){ note_dtor("_ZN3ccc7DD6x9y3E", this);} // tgen
ccc::DD6x9y3 ::DD6x9y3(){ note_ctor("_ZN3ccc7DD6x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y3E, buf);
    ::ccc::DD6x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y3E);
    dp->::ccc::DD6x9y3::~DD6x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y3E(Test__ZN3ccc7DD6x9y3E, "_ZN3ccc7DD6x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y3C1Ev();
extern void _ZN3ccc7DD6x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y3E[] = {
  NSPAIR(_ZN3ccc7DD6x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y3E[];
extern void _ZN3ccc7DD6x9y33abcEv();
extern void _ZN3ccc7DD6x9y33efgEv();
extern void _ZN3ccc7DD6x9y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y33efgEv,_ZTv0_n12_N3ccc7DD6x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y33efgEv,_ZThn4_N3ccc7DD6x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y33pqrEv,_ZTv0_n16_N3ccc7DD6x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y33pqrEv,_ZThn4_N3ccc7DD6x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y33efgEv,_ZTv0_n12_N3ccc7DD6x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y33pqrEv,_ZTv0_n16_N3ccc7DD6x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y3E[] = {
  {&(_ZTVN3ccc7DD6x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y3E[];
static VTBL_ENTRY alt_thunk_names604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y33pqrEv,_ZTv0_n16_N3ccc7DD6x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y33pqrEv,_ZThn4_N3ccc7DD6x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y33efgEv,_ZTv0_n12_N3ccc7DD6x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y33efgEv,_ZThn4_N3ccc7DD6x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y3E = {  "_ZN3ccc7DD6x9y3E", // class name
  bases__ZN3ccc7DD6x9y3E, 2,
  &(vtc__ZN3ccc7DD6x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y3E),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  CC6x9y4  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC6x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC6x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC6x9y43efgEv
  ~CC6x9y4(); // tgen
  CC6x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y4E) C1{ VBC2{ v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y43pqrEv");}
void  ccc::CC6x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y43abcEv");}
void  ccc::CC6x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y43efgEv");}
ccc::CC6x9y4 ::~CC6x9y4(){ note_dtor("_ZN3ccc7CC6x9y4E", this);} // tgen
ccc::CC6x9y4 ::CC6x9y4(){ note_ctor("_ZN3ccc7CC6x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y4E, buf);
    ::ccc::CC6x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y4E);
    dp->::ccc::CC6x9y4::~CC6x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y4E(Test__ZN3ccc7CC6x9y4E, "_ZN3ccc7CC6x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y4C1Ev();
extern void _ZN3ccc7CC6x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y4E[] = {
  NSPAIR(_ZN3ccc7CC6x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y4E[];
extern void _ZN3ccc7CC6x9y43efgEv();
extern void _ZN3ccc7CC6x9y43pqrEv();
extern void _ZN3ccc7CC6x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y43abcEv,_ZTv0_n12_N3ccc7CC6x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y43abcEv,_ZThn4_N3ccc7CC6x9y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y43efgEv,_ZTv0_n16_N3ccc7CC6x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y43efgEv,_ZThn4_N3ccc7CC6x9y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y43abcEv,_ZTv0_n12_N3ccc7CC6x9y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y43efgEv,_ZTv0_n16_N3ccc7CC6x9y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y4E[] = {
  {&(_ZTVN3ccc7CC6x9y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y4E[];
static VTBL_ENTRY alt_thunk_names605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y43efgEv,_ZTv0_n16_N3ccc7CC6x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y43efgEv,_ZThn4_N3ccc7CC6x9y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y43abcEv,_ZTv0_n12_N3ccc7CC6x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y43abcEv,_ZThn4_N3ccc7CC6x9y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y4E = {  "_ZN3ccc7CC6x9y4E", // class name
  bases__ZN3ccc7CC6x9y4E, 2,
  &(vtc__ZN3ccc7CC6x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y4E),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  DD6x9y4  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD6x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD6x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD6x9y43efgEv
  ~DD6x9y4(); // tgen
  DD6x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y4E) C1{ VBC2{ v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y43pqrEv");}
void  ccc::DD6x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y43abcEv");}
void  ccc::DD6x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y43efgEv");}
ccc::DD6x9y4 ::~DD6x9y4(){ note_dtor("_ZN3ccc7DD6x9y4E", this);} // tgen
ccc::DD6x9y4 ::DD6x9y4(){ note_ctor("_ZN3ccc7DD6x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y4E, buf);
    ::ccc::DD6x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y4E);
    dp->::ccc::DD6x9y4::~DD6x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y4E(Test__ZN3ccc7DD6x9y4E, "_ZN3ccc7DD6x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y4C1Ev();
extern void _ZN3ccc7DD6x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y4E[] = {
  NSPAIR(_ZN3ccc7DD6x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y4E[];
extern void _ZN3ccc7DD6x9y43abcEv();
extern void _ZN3ccc7DD6x9y43efgEv();
extern void _ZN3ccc7DD6x9y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y43efgEv,_ZTv0_n12_N3ccc7DD6x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y43efgEv,_ZThn4_N3ccc7DD6x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y43pqrEv,_ZTv0_n16_N3ccc7DD6x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y43pqrEv,_ZThn4_N3ccc7DD6x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y43efgEv,_ZTv0_n12_N3ccc7DD6x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y43pqrEv,_ZTv0_n16_N3ccc7DD6x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y4E[] = {
  {&(_ZTVN3ccc7DD6x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y4E[];
static VTBL_ENTRY alt_thunk_names606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y43pqrEv,_ZTv0_n16_N3ccc7DD6x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y43pqrEv,_ZThn4_N3ccc7DD6x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y43efgEv,_ZTv0_n12_N3ccc7DD6x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y43efgEv,_ZThn4_N3ccc7DD6x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y4E = {  "_ZN3ccc7DD6x9y4E", // class name
  bases__ZN3ccc7DD6x9y4E, 2,
  &(vtc__ZN3ccc7DD6x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y4E),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  CC6x9y5  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC6x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC6x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC6x9y53abcEv
  ~CC6x9y5(); // tgen
  CC6x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y5E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y53pqrEv");}
void  ccc::CC6x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y53efgEv");}
void  ccc::CC6x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y53abcEv");}
ccc::CC6x9y5 ::~CC6x9y5(){ note_dtor("_ZN3ccc7CC6x9y5E", this);} // tgen
ccc::CC6x9y5 ::CC6x9y5(){ note_ctor("_ZN3ccc7CC6x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y5E, buf);
    ::ccc::CC6x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y5E);
    dp->::ccc::CC6x9y5::~CC6x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y5E(Test__ZN3ccc7CC6x9y5E, "_ZN3ccc7CC6x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y5C1Ev();
extern void _ZN3ccc7CC6x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y5E[] = {
  NSPAIR(_ZN3ccc7CC6x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y5E[];
extern void _ZN3ccc7CC6x9y53efgEv();
extern void _ZN3ccc7CC6x9y53pqrEv();
extern void _ZN3ccc7CC6x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y53abcEv,_ZTv0_n12_N3ccc7CC6x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y53abcEv,_ZThn4_N3ccc7CC6x9y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y53efgEv,_ZTv0_n16_N3ccc7CC6x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y53efgEv,_ZThn4_N3ccc7CC6x9y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y53abcEv,_ZTv0_n12_N3ccc7CC6x9y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y53efgEv,_ZTv0_n16_N3ccc7CC6x9y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y5E[] = {
  {&(_ZTVN3ccc7CC6x9y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y5E[];
static VTBL_ENTRY alt_thunk_names607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y53efgEv,_ZTv0_n16_N3ccc7CC6x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y53efgEv,_ZThn4_N3ccc7CC6x9y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y53abcEv,_ZTv0_n12_N3ccc7CC6x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y53abcEv,_ZThn4_N3ccc7CC6x9y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y5E = {  "_ZN3ccc7CC6x9y5E", // class name
  bases__ZN3ccc7CC6x9y5E, 2,
  &(vtc__ZN3ccc7CC6x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y5E),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  DD6x9y5  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD6x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD6x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD6x9y53abcEv
  ~DD6x9y5(); // tgen
  DD6x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y5E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y53pqrEv");}
void  ccc::DD6x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y53efgEv");}
void  ccc::DD6x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y53abcEv");}
ccc::DD6x9y5 ::~DD6x9y5(){ note_dtor("_ZN3ccc7DD6x9y5E", this);} // tgen
ccc::DD6x9y5 ::DD6x9y5(){ note_ctor("_ZN3ccc7DD6x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y5E, buf);
    ::ccc::DD6x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y5E);
    dp->::ccc::DD6x9y5::~DD6x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y5E(Test__ZN3ccc7DD6x9y5E, "_ZN3ccc7DD6x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y5C1Ev();
extern void _ZN3ccc7DD6x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y5E[] = {
  NSPAIR(_ZN3ccc7DD6x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y5E[];
extern void _ZN3ccc7DD6x9y53abcEv();
extern void _ZN3ccc7DD6x9y53efgEv();
extern void _ZN3ccc7DD6x9y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y53efgEv,_ZTv0_n12_N3ccc7DD6x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y53efgEv,_ZThn4_N3ccc7DD6x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y53pqrEv,_ZTv0_n16_N3ccc7DD6x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y53pqrEv,_ZThn4_N3ccc7DD6x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y53efgEv,_ZTv0_n12_N3ccc7DD6x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y53pqrEv,_ZTv0_n16_N3ccc7DD6x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y5E[] = {
  {&(_ZTVN3ccc7DD6x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y5E[];
static VTBL_ENTRY alt_thunk_names608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y53pqrEv,_ZTv0_n16_N3ccc7DD6x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y53pqrEv,_ZThn4_N3ccc7DD6x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y53efgEv,_ZTv0_n12_N3ccc7DD6x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y53efgEv,_ZThn4_N3ccc7DD6x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y5E = {  "_ZN3ccc7DD6x9y5E", // class name
  bases__ZN3ccc7DD6x9y5E, 2,
  &(vtc__ZN3ccc7DD6x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y5E),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  CC6x9y6  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC6x9y63efgEv
  ~CC6x9y6(); // tgen
  CC6x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y6E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y63abcEv");}
void  ccc::CC6x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y63efgEv");}
ccc::CC6x9y6 ::~CC6x9y6(){ note_dtor("_ZN3ccc7CC6x9y6E", this);} // tgen
ccc::CC6x9y6 ::CC6x9y6(){ note_ctor("_ZN3ccc7CC6x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y6E, buf);
    ::ccc::CC6x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y6E);
    dp->::ccc::CC6x9y6::~CC6x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y6E(Test__ZN3ccc7CC6x9y6E, "_ZN3ccc7CC6x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y6C1Ev();
extern void _ZN3ccc7CC6x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y6E[] = {
  NSPAIR(_ZN3ccc7CC6x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y6E[];
extern void _ZN3ccc7CC6x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC6x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y63abcEv,_ZTv0_n12_N3ccc7CC6x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y63abcEv,_ZThn4_N3ccc7CC6x9y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y63efgEv,_ZTv0_n16_N3ccc7CC6x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y63efgEv,_ZThn4_N3ccc7CC6x9y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y63abcEv,_ZTv0_n12_N3ccc7CC6x9y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y63efgEv,_ZTv0_n16_N3ccc7CC6x9y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y6E[] = {
  {&(_ZTVN3ccc7CC6x9y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y6E[];
static VTBL_ENTRY alt_thunk_names609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y63efgEv,_ZTv0_n16_N3ccc7CC6x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y63efgEv,_ZThn4_N3ccc7CC6x9y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y63abcEv,_ZTv0_n12_N3ccc7CC6x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y63abcEv,_ZThn4_N3ccc7CC6x9y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y6E = {  "_ZN3ccc7CC6x9y6E", // class name
  bases__ZN3ccc7CC6x9y6E, 2,
  &(vtc__ZN3ccc7CC6x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y6E),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  DD6x9y6  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD6x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD6x9y63efgEv
  ~DD6x9y6(); // tgen
  DD6x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y6E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y63abcEv");}
void  ccc::DD6x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y63efgEv");}
ccc::DD6x9y6 ::~DD6x9y6(){ note_dtor("_ZN3ccc7DD6x9y6E", this);} // tgen
ccc::DD6x9y6 ::DD6x9y6(){ note_ctor("_ZN3ccc7DD6x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y6E, buf);
    ::ccc::DD6x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y6E);
    dp->::ccc::DD6x9y6::~DD6x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y6E(Test__ZN3ccc7DD6x9y6E, "_ZN3ccc7DD6x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y6C1Ev();
extern void _ZN3ccc7DD6x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y6E[] = {
  NSPAIR(_ZN3ccc7DD6x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y6E[];
extern void _ZN3ccc7DD6x9y63abcEv();
extern void _ZN3ccc7DD6x9y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y63efgEv,_ZTv0_n12_N3ccc7DD6x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y63efgEv,_ZThn4_N3ccc7DD6x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y63efgEv,_ZTv0_n12_N3ccc7DD6x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y6E[] = {
  {&(_ZTVN3ccc7DD6x9y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x9y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x9y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y6E[];
static VTBL_ENTRY alt_thunk_names610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y63efgEv,_ZTv0_n12_N3ccc7DD6x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y63efgEv,_ZThn4_N3ccc7DD6x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y6E = {  "_ZN3ccc7DD6x9y6E", // class name
  bases__ZN3ccc7DD6x9y6E, 2,
  &(vtc__ZN3ccc7DD6x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y6E),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  CC6x9y7  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC6x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y73pqrEv
  ~CC6x9y7(); // tgen
  CC6x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y7E) C1{ VBC2{ v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y73abcEv");}
void  ccc::CC6x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y73pqrEv");}
ccc::CC6x9y7 ::~CC6x9y7(){ note_dtor("_ZN3ccc7CC6x9y7E", this);} // tgen
ccc::CC6x9y7 ::CC6x9y7(){ note_ctor("_ZN3ccc7CC6x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y7E, buf);
    ::ccc::CC6x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y7E);
    dp->::ccc::CC6x9y7::~CC6x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y7E(Test__ZN3ccc7CC6x9y7E, "_ZN3ccc7CC6x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y7C1Ev();
extern void _ZN3ccc7CC6x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y7E[] = {
  NSPAIR(_ZN3ccc7CC6x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC6x9y73pqrEv();
extern void _ZN3ccc7CC6x9y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y73abcEv,_ZTv0_n12_N3ccc7CC6x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y73abcEv,_ZThn4_N3ccc7CC6x9y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y73abcEv,_ZTv0_n12_N3ccc7CC6x9y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y7E[] = {
  {&(_ZTVN3ccc7CC6x9y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y7E[];
static VTBL_ENTRY alt_thunk_names611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y73abcEv,_ZTv0_n12_N3ccc7CC6x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y73abcEv,_ZThn4_N3ccc7CC6x9y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y7E = {  "_ZN3ccc7CC6x9y7E", // class name
  bases__ZN3ccc7CC6x9y7E, 2,
  &(vtc__ZN3ccc7CC6x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y7E),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  DD6x9y7  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD6x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD6x9y73pqrEv
  ~DD6x9y7(); // tgen
  DD6x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y7E) C1{ VBC2{ v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y73abcEv");}
void  ccc::DD6x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y73pqrEv");}
ccc::DD6x9y7 ::~DD6x9y7(){ note_dtor("_ZN3ccc7DD6x9y7E", this);} // tgen
ccc::DD6x9y7 ::DD6x9y7(){ note_ctor("_ZN3ccc7DD6x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y7E, buf);
    ::ccc::DD6x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y7E);
    dp->::ccc::DD6x9y7::~DD6x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y7E(Test__ZN3ccc7DD6x9y7E, "_ZN3ccc7DD6x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y7C1Ev();
extern void _ZN3ccc7DD6x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y7E[] = {
  NSPAIR(_ZN3ccc7DD6x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y7E[];
extern void _ZN3ccc7DD6x9y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc7DD6x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y73pqrEv,_ZTv0_n16_N3ccc7DD6x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y73pqrEv,_ZThn4_N3ccc7DD6x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y73pqrEv,_ZTv0_n16_N3ccc7DD6x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y7E[] = {
  {&(_ZTVN3ccc7DD6x9y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y7E[];
static VTBL_ENTRY alt_thunk_names612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y73pqrEv,_ZTv0_n16_N3ccc7DD6x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y73pqrEv,_ZThn4_N3ccc7DD6x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y7E = {  "_ZN3ccc7DD6x9y7E", // class name
  bases__ZN3ccc7DD6x9y7E, 2,
  &(vtc__ZN3ccc7DD6x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y7E),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  CC6x9y8  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC6x9y83abcEv
  ~CC6x9y8(); // tgen
  CC6x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y8E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y83efgEv");}
void  ccc::CC6x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC6x9y83abcEv");}
ccc::CC6x9y8 ::~CC6x9y8(){ note_dtor("_ZN3ccc7CC6x9y8E", this);} // tgen
ccc::CC6x9y8 ::CC6x9y8(){ note_ctor("_ZN3ccc7CC6x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y8E, buf);
    ::ccc::CC6x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y8E);
    dp->::ccc::CC6x9y8::~CC6x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y8E(Test__ZN3ccc7CC6x9y8E, "_ZN3ccc7CC6x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y8C1Ev();
extern void _ZN3ccc7CC6x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y8E[] = {
  NSPAIR(_ZN3ccc7CC6x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y8E[];
extern void _ZN3ccc7CC6x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC6x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC6x9y83abcEv,_ZTv0_n12_N3ccc7CC6x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y83abcEv,_ZThn4_N3ccc7CC6x9y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y83efgEv,_ZTv0_n16_N3ccc7CC6x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y83efgEv,_ZThn4_N3ccc7CC6x9y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC6x9y83abcEv,_ZTv0_n12_N3ccc7CC6x9y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y83efgEv,_ZTv0_n16_N3ccc7CC6x9y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y8E[] = {
  {&(_ZTVN3ccc7CC6x9y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC6x9y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y8E[];
static VTBL_ENTRY alt_thunk_names613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y83efgEv,_ZTv0_n16_N3ccc7CC6x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y83efgEv,_ZThn4_N3ccc7CC6x9y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC6x9y83abcEv,_ZTv0_n12_N3ccc7CC6x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y83abcEv,_ZThn4_N3ccc7CC6x9y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y8E = {  "_ZN3ccc7CC6x9y8E", // class name
  bases__ZN3ccc7CC6x9y8E, 2,
  &(vtc__ZN3ccc7CC6x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y8E),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  DD6x9y8  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD6x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD6x9y83abcEv
  ~DD6x9y8(); // tgen
  DD6x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y8E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y83efgEv");}
void  ccc::DD6x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD6x9y83abcEv");}
ccc::DD6x9y8 ::~DD6x9y8(){ note_dtor("_ZN3ccc7DD6x9y8E", this);} // tgen
ccc::DD6x9y8 ::DD6x9y8(){ note_ctor("_ZN3ccc7DD6x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y8E, buf);
    ::ccc::DD6x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y8E);
    dp->::ccc::DD6x9y8::~DD6x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y8E(Test__ZN3ccc7DD6x9y8E, "_ZN3ccc7DD6x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y8C1Ev();
extern void _ZN3ccc7DD6x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y8E[] = {
  NSPAIR(_ZN3ccc7DD6x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y8E[];
extern void _ZN3ccc7DD6x9y83abcEv();
extern void _ZN3ccc7DD6x9y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y83efgEv,_ZTv0_n12_N3ccc7DD6x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y83efgEv,_ZThn4_N3ccc7DD6x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y83efgEv,_ZTv0_n12_N3ccc7DD6x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y8E[] = {
  {&(_ZTVN3ccc7DD6x9y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x9y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD6x9y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y8E[];
static VTBL_ENTRY alt_thunk_names614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y83efgEv,_ZTv0_n12_N3ccc7DD6x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y83efgEv,_ZThn4_N3ccc7DD6x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y8E = {  "_ZN3ccc7DD6x9y8E", // class name
  bases__ZN3ccc7DD6x9y8E, 2,
  &(vtc__ZN3ccc7DD6x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y8E),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  CC6x9y9  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC6x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC6x9y93pqrEv
  ~CC6x9y9(); // tgen
  CC6x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC6x9y9E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC6x9y93efgEv");}
void  ccc::CC6x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC6x9y93pqrEv");}
ccc::CC6x9y9 ::~CC6x9y9(){ note_dtor("_ZN3ccc7CC6x9y9E", this);} // tgen
ccc::CC6x9y9 ::CC6x9y9(){ note_ctor("_ZN3ccc7CC6x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC6x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC6x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC6x9y9E, buf);
    ::ccc::CC6x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC6x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC6x9y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc7CC6x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC6x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC6x9y9E);
    dp->::ccc::CC6x9y9::~CC6x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC6x9y9E(Test__ZN3ccc7CC6x9y9E, "_ZN3ccc7CC6x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC6x9y9C1Ev();
extern void _ZN3ccc7CC6x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC6x9y9E[] = {
  NSPAIR(_ZN3ccc7CC6x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC6x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC6x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC6x9y9E[];
extern void _ZN3ccc7CC6x9y93efgEv();
extern void _ZN3ccc7CC6x9y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC6x9y93efgEv,_ZTv0_n16_N3ccc7CC6x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC6x9y93efgEv,_ZThn4_N3ccc7CC6x9y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC6x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC6x9y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC6x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC6x9y93efgEv,_ZTv0_n16_N3ccc7CC6x9y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC6x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC6x9y9E[] = {
  {&(_ZTVN3ccc7CC6x9y9E[3]),  3,11},
  {&(_ZTVN3ccc7CC6x9y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC6x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC6x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC6x9y9E[];
static VTBL_ENTRY alt_thunk_names615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC6x9y93efgEv,_ZTv0_n16_N3ccc7CC6x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC6x9y93efgEv,_ZThn4_N3ccc7CC6x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC6x9y9E = {  "_ZN3ccc7CC6x9y9E", // class name
  bases__ZN3ccc7CC6x9y9E, 2,
  &(vtc__ZN3ccc7CC6x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC6x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC6x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC6x9y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC6x9y9E),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  DD6x9y9  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD6x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD6x9y93pqrEv
  ~DD6x9y9(); // tgen
  DD6x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD6x9y9E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD6x9y93efgEv");}
void  ccc::DD6x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD6x9y93pqrEv");}
ccc::DD6x9y9 ::~DD6x9y9(){ note_dtor("_ZN3ccc7DD6x9y9E", this);} // tgen
ccc::DD6x9y9 ::DD6x9y9(){ note_ctor("_ZN3ccc7DD6x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD6x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD6x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD6x9y9E, buf);
    ::ccc::DD6x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD6x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD6x9y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc7DD6x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD6x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD6x9y9E);
    dp->::ccc::DD6x9y9::~DD6x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD6x9y9E(Test__ZN3ccc7DD6x9y9E, "_ZN3ccc7DD6x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD6x9y9C1Ev();
extern void _ZN3ccc7DD6x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD6x9y9E[] = {
  NSPAIR(_ZN3ccc7DD6x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD6x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD6x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc7DD6x9y93efgEv();
extern void _ZN3ccc7DD6x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD6x9y93efgEv,_ZTv0_n12_N3ccc7DD6x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y93efgEv,_ZThn4_N3ccc7DD6x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD6x9y93pqrEv,_ZTv0_n16_N3ccc7DD6x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD6x9y93pqrEv,_ZThn4_N3ccc7DD6x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD6x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD6x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD6x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD6x9y93efgEv,_ZTv0_n12_N3ccc7DD6x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD6x9y93pqrEv,_ZTv0_n16_N3ccc7DD6x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD6x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD6x9y9E[] = {
  {&(_ZTVN3ccc7DD6x9y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD6x9y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD6x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD6x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD6x9y9E[];
static VTBL_ENTRY alt_thunk_names616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD6x9y93pqrEv,_ZTv0_n16_N3ccc7DD6x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y93pqrEv,_ZThn4_N3ccc7DD6x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD6x9y93efgEv,_ZTv0_n12_N3ccc7DD6x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD6x9y93efgEv,_ZThn4_N3ccc7DD6x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD6x9y9E = {  "_ZN3ccc7DD6x9y9E", // class name
  bases__ZN3ccc7DD6x9y9E, 2,
  &(vtc__ZN3ccc7DD6x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD6x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD6x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD6x9y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD6x9y9E),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  CC6x9y10  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC6x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x9y103abcEv
  ~CC6x9y10(); // tgen
  CC6x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y10E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x9y103pqrEv");}
void  ccc::CC6x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x9y103abcEv");}
ccc::CC6x9y10 ::~CC6x9y10(){ note_dtor("_ZN3ccc8CC6x9y10E", this);} // tgen
ccc::CC6x9y10 ::CC6x9y10(){ note_ctor("_ZN3ccc8CC6x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC6x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x9y10E, buf);
    ::ccc::CC6x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x9y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC6x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x9y10E);
    dp->::ccc::CC6x9y10::~CC6x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x9y10E(Test__ZN3ccc8CC6x9y10E, "_ZN3ccc8CC6x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x9y10C1Ev();
extern void _ZN3ccc8CC6x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC6x9y10E[] = {
  NSPAIR(_ZN3ccc8CC6x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC6x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC6x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC6x9y103pqrEv();
extern void _ZN3ccc8CC6x9y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x9y103abcEv,_ZTv0_n12_N3ccc8CC6x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y103abcEv,_ZThn4_N3ccc8CC6x9y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x9y103abcEv,_ZTv0_n12_N3ccc8CC6x9y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x9y10E[] = {
  {&(_ZTVN3ccc8CC6x9y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x9y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x9y10E[];
static VTBL_ENTRY alt_thunk_names617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x9y103abcEv,_ZTv0_n12_N3ccc8CC6x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x9y103abcEv,_ZThn4_N3ccc8CC6x9y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x9y10E = {  "_ZN3ccc8CC6x9y10E", // class name
  bases__ZN3ccc8CC6x9y10E, 2,
  &(vtc__ZN3ccc8CC6x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x9y10E),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  DD6x9y10  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD6x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x9y103abcEv
  ~DD6x9y10(); // tgen
  DD6x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD6x9y10E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x9y103pqrEv");}
void  ccc::DD6x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x9y103abcEv");}
ccc::DD6x9y10 ::~DD6x9y10(){ note_dtor("_ZN3ccc8DD6x9y10E", this);} // tgen
ccc::DD6x9y10 ::DD6x9y10(){ note_ctor("_ZN3ccc8DD6x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD6x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x9y10E, buf);
    ::ccc::DD6x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x9y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD6x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x9y10E);
    dp->::ccc::DD6x9y10::~DD6x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x9y10E(Test__ZN3ccc8DD6x9y10E, "_ZN3ccc8DD6x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x9y10C1Ev();
extern void _ZN3ccc8DD6x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD6x9y10E[] = {
  NSPAIR(_ZN3ccc8DD6x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD6x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD6x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y10E[];
extern void _ZN3ccc8DD6x9y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x9y103pqrEv,_ZTv0_n16_N3ccc8DD6x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x9y103pqrEv,_ZThn4_N3ccc8DD6x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x9y103pqrEv,_ZTv0_n16_N3ccc8DD6x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x9y10E[] = {
  {&(_ZTVN3ccc8DD6x9y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x9y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x9y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x9y10E[];
static VTBL_ENTRY alt_thunk_names618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x9y103pqrEv,_ZTv0_n16_N3ccc8DD6x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x9y103pqrEv,_ZThn4_N3ccc8DD6x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x9y10E = {  "_ZN3ccc8DD6x9y10E", // class name
  bases__ZN3ccc8DD6x9y10E, 2,
  &(vtc__ZN3ccc8DD6x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x9y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x9y10E),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  CC6x9y11  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC6x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x9y113efgEv
  ~CC6x9y11(); // tgen
  CC6x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y11E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x9y113pqrEv");}
void  ccc::CC6x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x9y113efgEv");}
ccc::CC6x9y11 ::~CC6x9y11(){ note_dtor("_ZN3ccc8CC6x9y11E", this);} // tgen
ccc::CC6x9y11 ::CC6x9y11(){ note_ctor("_ZN3ccc8CC6x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC6x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x9y11E, buf);
    ::ccc::CC6x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x9y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC6x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x9y11E);
    dp->::ccc::CC6x9y11::~CC6x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x9y11E(Test__ZN3ccc8CC6x9y11E, "_ZN3ccc8CC6x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x9y11C1Ev();
extern void _ZN3ccc8CC6x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC6x9y11E[] = {
  NSPAIR(_ZN3ccc8CC6x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC6x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC6x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x9y11E[];
extern void _ZN3ccc8CC6x9y113efgEv();
extern void _ZN3ccc8CC6x9y113pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x9y113efgEv,_ZTv0_n16_N3ccc8CC6x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y113efgEv,_ZThn4_N3ccc8CC6x9y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x9y113efgEv,_ZTv0_n16_N3ccc8CC6x9y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x9y11E[] = {
  {&(_ZTVN3ccc8CC6x9y11E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x9y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x9y11E[];
static VTBL_ENTRY alt_thunk_names619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x9y113efgEv,_ZTv0_n16_N3ccc8CC6x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x9y113efgEv,_ZThn4_N3ccc8CC6x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x9y11E = {  "_ZN3ccc8CC6x9y11E", // class name
  bases__ZN3ccc8CC6x9y11E, 2,
  &(vtc__ZN3ccc8CC6x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x9y11E),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  DD6x9y11  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD6x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x9y113efgEv
  ~DD6x9y11(); // tgen
  DD6x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD6x9y11E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x9y113pqrEv");}
void  ccc::DD6x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x9y113efgEv");}
ccc::DD6x9y11 ::~DD6x9y11(){ note_dtor("_ZN3ccc8DD6x9y11E", this);} // tgen
ccc::DD6x9y11 ::DD6x9y11(){ note_ctor("_ZN3ccc8DD6x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD6x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x9y11E, buf);
    ::ccc::DD6x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x9y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD6x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x9y11E);
    dp->::ccc::DD6x9y11::~DD6x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x9y11E(Test__ZN3ccc8DD6x9y11E, "_ZN3ccc8DD6x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x9y11C1Ev();
extern void _ZN3ccc8DD6x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD6x9y11E[] = {
  NSPAIR(_ZN3ccc8DD6x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD6x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD6x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x9y113efgEv();
extern void _ZN3ccc8DD6x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x9y113efgEv,_ZTv0_n12_N3ccc8DD6x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x9y113efgEv,_ZThn4_N3ccc8DD6x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x9y113pqrEv,_ZTv0_n16_N3ccc8DD6x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x9y113pqrEv,_ZThn4_N3ccc8DD6x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x9y113efgEv,_ZTv0_n12_N3ccc8DD6x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x9y113pqrEv,_ZTv0_n16_N3ccc8DD6x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x9y11E[] = {
  {&(_ZTVN3ccc8DD6x9y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x9y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x9y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x9y11E[];
static VTBL_ENTRY alt_thunk_names620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x9y113pqrEv,_ZTv0_n16_N3ccc8DD6x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x9y113pqrEv,_ZThn4_N3ccc8DD6x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x9y113efgEv,_ZTv0_n12_N3ccc8DD6x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x9y113efgEv,_ZThn4_N3ccc8DD6x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x9y11E = {  "_ZN3ccc8DD6x9y11E", // class name
  bases__ZN3ccc8DD6x9y11E, 2,
  &(vtc__ZN3ccc8DD6x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x9y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x9y11E),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  CC6x9y12  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC6x9y123abcEv
  ~CC6x9y12(); // tgen
  CC6x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x9y123abcEv");}
ccc::CC6x9y12 ::~CC6x9y12(){ note_dtor("_ZN3ccc8CC6x9y12E", this);} // tgen
ccc::CC6x9y12 ::CC6x9y12(){ note_ctor("_ZN3ccc8CC6x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC6x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x9y12E, buf);
    ::ccc::CC6x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x9y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC6x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x9y12E);
    dp->::ccc::CC6x9y12::~CC6x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x9y12E(Test__ZN3ccc8CC6x9y12E, "_ZN3ccc8CC6x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x9y12C1Ev();
extern void _ZN3ccc8CC6x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC6x9y12E[] = {
  NSPAIR(_ZN3ccc8CC6x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC6x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC6x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC6x9y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x9y123abcEv,_ZTv0_n12_N3ccc8CC6x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y123abcEv,_ZThn4_N3ccc8CC6x9y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x9y123abcEv,_ZTv0_n12_N3ccc8CC6x9y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x9y12E[] = {
  {&(_ZTVN3ccc8CC6x9y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x9y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x9y12E[];
static VTBL_ENTRY alt_thunk_names621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x9y123abcEv,_ZTv0_n12_N3ccc8CC6x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x9y123abcEv,_ZThn4_N3ccc8CC6x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x9y12E = {  "_ZN3ccc8CC6x9y12E", // class name
  bases__ZN3ccc8CC6x9y12E, 2,
  &(vtc__ZN3ccc8CC6x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x9y12E),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  DD6x9y12  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD6x9y123abcEv
  ~DD6x9y12(); // tgen
  DD6x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD6x9y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x9y123abcEv");}
ccc::DD6x9y12 ::~DD6x9y12(){ note_dtor("_ZN3ccc8DD6x9y12E", this);} // tgen
ccc::DD6x9y12 ::DD6x9y12(){ note_ctor("_ZN3ccc8DD6x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD6x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x9y12E, buf);
    ::ccc::DD6x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x9y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD6x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x9y12E);
    dp->::ccc::DD6x9y12::~DD6x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x9y12E(Test__ZN3ccc8DD6x9y12E, "_ZN3ccc8DD6x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x9y12C1Ev();
extern void _ZN3ccc8DD6x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD6x9y12E[] = {
  NSPAIR(_ZN3ccc8DD6x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD6x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD6x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y12E[];
extern void _ZN3ccc8DD6x9y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x9y12E[] = {
  {&(_ZTVN3ccc8DD6x9y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x9y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x9y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x9y12E[];
Class_Descriptor cd__ZN3ccc8DD6x9y12E = {  "_ZN3ccc8DD6x9y12E", // class name
  bases__ZN3ccc8DD6x9y12E, 2,
  &(vtc__ZN3ccc8DD6x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x9y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x9y12E),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  CC6x9y13  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC6x9y133efgEv
  ~CC6x9y13(); // tgen
  CC6x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y13E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC6x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x9y133efgEv");}
ccc::CC6x9y13 ::~CC6x9y13(){ note_dtor("_ZN3ccc8CC6x9y13E", this);} // tgen
ccc::CC6x9y13 ::CC6x9y13(){ note_ctor("_ZN3ccc8CC6x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC6x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x9y13E, buf);
    ::ccc::CC6x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x9y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC6x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x9y13E);
    dp->::ccc::CC6x9y13::~CC6x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x9y13E(Test__ZN3ccc8CC6x9y13E, "_ZN3ccc8CC6x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x9y13C1Ev();
extern void _ZN3ccc8CC6x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC6x9y13E[] = {
  NSPAIR(_ZN3ccc8CC6x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC6x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC6x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x9y13E[];
extern void _ZN3ccc8CC6x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x9y133efgEv,_ZTv0_n16_N3ccc8CC6x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x9y133efgEv,_ZThn4_N3ccc8CC6x9y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x9y133efgEv,_ZTv0_n16_N3ccc8CC6x9y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x9y13E[] = {
  {&(_ZTVN3ccc8CC6x9y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x9y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x9y13E[];
static VTBL_ENTRY alt_thunk_names622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x9y133efgEv,_ZTv0_n16_N3ccc8CC6x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x9y133efgEv,_ZThn4_N3ccc8CC6x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x9y13E = {  "_ZN3ccc8CC6x9y13E", // class name
  bases__ZN3ccc8CC6x9y13E, 2,
  &(vtc__ZN3ccc8CC6x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x9y13E),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names622,
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x9y13  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD6x9y133efgEv
  ~DD6x9y13(); // tgen
  DD6x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD6x9y13E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD6x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x9y133efgEv");}
ccc::DD6x9y13 ::~DD6x9y13(){ note_dtor("_ZN3ccc8DD6x9y13E", this);} // tgen
ccc::DD6x9y13 ::DD6x9y13(){ note_ctor("_ZN3ccc8DD6x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD6x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x9y13E, buf);
    ::ccc::DD6x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x9y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD6x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x9y13E);
    dp->::ccc::DD6x9y13::~DD6x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x9y13E(Test__ZN3ccc8DD6x9y13E, "_ZN3ccc8DD6x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x9y13C1Ev();
extern void _ZN3ccc8DD6x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD6x9y13E[] = {
  NSPAIR(_ZN3ccc8DD6x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD6x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD6x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x9y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x9y133efgEv,_ZTv0_n12_N3ccc8DD6x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x9y133efgEv,_ZThn4_N3ccc8DD6x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x9y133efgEv,_ZTv0_n12_N3ccc8DD6x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x9y13E[] = {
  {&(_ZTVN3ccc8DD6x9y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x9y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x9y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x9y13E[];
static VTBL_ENTRY alt_thunk_names623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x9y133efgEv,_ZTv0_n12_N3ccc8DD6x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x9y133efgEv,_ZThn4_N3ccc8DD6x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x9y13E = {  "_ZN3ccc8DD6x9y13E", // class name
  bases__ZN3ccc8DD6x9y13E, 2,
  &(vtc__ZN3ccc8DD6x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x9y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x9y13E),3, //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  CC6x9y14  : virtual ::ccc::AA6 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC6x9y143pqrEv
  ~CC6x9y14(); // tgen
  CC6x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC6x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x9y143pqrEv");}
ccc::CC6x9y14 ::~CC6x9y14(){ note_dtor("_ZN3ccc8CC6x9y14E", this);} // tgen
ccc::CC6x9y14 ::CC6x9y14(){ note_ctor("_ZN3ccc8CC6x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC6x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x9y14E, buf);
    ::ccc::CC6x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x9y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC6x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x9y14E);
    dp->::ccc::CC6x9y14::~CC6x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x9y14E(Test__ZN3ccc8CC6x9y14E, "_ZN3ccc8CC6x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x9y14C1Ev();
extern void _ZN3ccc8CC6x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC6x9y14E[] = {
  NSPAIR(_ZN3ccc8CC6x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC6x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC6x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC6x9y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x9y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x9y14E[] = {
  {&(_ZTVN3ccc8CC6x9y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x9y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x9y14E[];
Class_Descriptor cd__ZN3ccc8CC6x9y14E = {  "_ZN3ccc8CC6x9y14E", // class name
  bases__ZN3ccc8CC6x9y14E, 2,
  &(vtc__ZN3ccc8CC6x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x9y14E),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  DD6x9y14  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD6x9y143pqrEv
  ~DD6x9y14(); // tgen
  DD6x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD6x9y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD6x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x9y143pqrEv");}
ccc::DD6x9y14 ::~DD6x9y14(){ note_dtor("_ZN3ccc8DD6x9y14E", this);} // tgen
ccc::DD6x9y14 ::DD6x9y14(){ note_ctor("_ZN3ccc8DD6x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD6x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x9y14E, buf);
    ::ccc::DD6x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x9y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD6x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x9y14E);
    dp->::ccc::DD6x9y14::~DD6x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x9y14E(Test__ZN3ccc8DD6x9y14E, "_ZN3ccc8DD6x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x9y14C1Ev();
extern void _ZN3ccc8DD6x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD6x9y14E[] = {
  NSPAIR(_ZN3ccc8DD6x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD6x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD6x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x9y143pqrEv,_ZTv0_n16_N3ccc8DD6x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x9y143pqrEv,_ZThn4_N3ccc8DD6x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x9y143pqrEv,_ZTv0_n16_N3ccc8DD6x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x9y14E[] = {
  {&(_ZTVN3ccc8DD6x9y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x9y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x9y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x9y14E[];
static VTBL_ENTRY alt_thunk_names624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x9y143pqrEv,_ZTv0_n16_N3ccc8DD6x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x9y143pqrEv,_ZThn4_N3ccc8DD6x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x9y14E = {  "_ZN3ccc8DD6x9y14E", // class name
  bases__ZN3ccc8DD6x9y14E, 2,
  &(vtc__ZN3ccc8DD6x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x9y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x9y14E),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  CC6x9y15  : virtual ::ccc::AA6 , ::ccc::BB9 {
  ~CC6x9y15(); // tgen
  CC6x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC6x9y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC6x9y15 ::~CC6x9y15(){ note_dtor("_ZN3ccc8CC6x9y15E", this);} // tgen
ccc::CC6x9y15 ::CC6x9y15(){ note_ctor("_ZN3ccc8CC6x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC6x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x9y15E, buf);
    ::ccc::CC6x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x9y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC6x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x9y15E);
    dp->::ccc::CC6x9y15::~CC6x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x9y15E(Test__ZN3ccc8CC6x9y15E, "_ZN3ccc8CC6x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x9y15C1Ev();
extern void _ZN3ccc8CC6x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC6x9y15E[] = {
  NSPAIR(_ZN3ccc8CC6x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC6x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC6x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x9y15E[] = {
  {&(_ZTVN3ccc8CC6x9y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x9y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x9y15E[];
Class_Descriptor cd__ZN3ccc8CC6x9y15E = {  "_ZN3ccc8CC6x9y15E", // class name
  bases__ZN3ccc8CC6x9y15E, 2,
  &(vtc__ZN3ccc8CC6x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x9y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x9y15E),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  DD6x9y15  : virtual ::ccc::AA6 , virtual ::ccc::BB9 {
  ~DD6x9y15(); // tgen
  DD6x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD6x9y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD6x9y15 ::~DD6x9y15(){ note_dtor("_ZN3ccc8DD6x9y15E", this);} // tgen
ccc::DD6x9y15 ::DD6x9y15(){ note_ctor("_ZN3ccc8DD6x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD6x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x9y15E, buf);
    ::ccc::DD6x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x9y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD6x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x9y15E);
    dp->::ccc::DD6x9y15::~DD6x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x9y15E(Test__ZN3ccc8DD6x9y15E, "_ZN3ccc8DD6x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x9y15C1Ev();
extern void _ZN3ccc8DD6x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD6x9y15E[] = {
  NSPAIR(_ZN3ccc8DD6x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD6x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD6x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x9y15E[] = {
  {&(_ZTVN3ccc8DD6x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x9y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x9y15E[];
Class_Descriptor cd__ZN3ccc8DD6x9y15E = {  "_ZN3ccc8DD6x9y15E", // class name
  bases__ZN3ccc8DD6x9y15E, 2,
  &(vtc__ZN3ccc8DD6x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x9y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x9y15E),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  CC6x10y0  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y03pqrEv
  ~CC6x10y0(); // tgen
  CC6x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y0E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y03abcEv");}
void  ccc::CC6x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y03efgEv");}
void  ccc::CC6x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y03pqrEv");}
ccc::CC6x10y0 ::~CC6x10y0(){ note_dtor("_ZN3ccc8CC6x10y0E", this);} // tgen
ccc::CC6x10y0 ::CC6x10y0(){ note_ctor("_ZN3ccc8CC6x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y0E, buf);
    ::ccc::CC6x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y0E);
    dp->::ccc::CC6x10y0::~CC6x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y0E(Test__ZN3ccc8CC6x10y0E, "_ZN3ccc8CC6x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y0C1Ev();
extern void _ZN3ccc8CC6x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y0E[] = {
  NSPAIR(_ZN3ccc8CC6x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y0E[];
extern void _ZN3ccc8CC6x10y03pqrEv();
extern void _ZN3ccc8CC6x10y03abcEv();
extern void _ZN3ccc8CC6x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y03abcEv,_ZTv0_n12_N3ccc8CC6x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y03abcEv,_ZThn4_N3ccc8CC6x10y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y03efgEv,_ZTv0_n16_N3ccc8CC6x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y03efgEv,_ZThn4_N3ccc8CC6x10y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y03abcEv,_ZTv0_n12_N3ccc8CC6x10y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y03efgEv,_ZTv0_n16_N3ccc8CC6x10y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y0E[] = {
  {&(_ZTVN3ccc8CC6x10y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y0E[];
static VTBL_ENTRY alt_thunk_names625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y03efgEv,_ZTv0_n16_N3ccc8CC6x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y03efgEv,_ZThn4_N3ccc8CC6x10y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y03abcEv,_ZTv0_n12_N3ccc8CC6x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y03abcEv,_ZThn4_N3ccc8CC6x10y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y0E = {  "_ZN3ccc8CC6x10y0E", // class name
  bases__ZN3ccc8CC6x10y0E, 2,
  &(vtc__ZN3ccc8CC6x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y0E),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  DD6x10y0  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD6x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD6x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x10y03pqrEv
  ~DD6x10y0(); // tgen
  DD6x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y0E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y03abcEv");}
void  ccc::DD6x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y03efgEv");}
void  ccc::DD6x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y03pqrEv");}
ccc::DD6x10y0 ::~DD6x10y0(){ note_dtor("_ZN3ccc8DD6x10y0E", this);} // tgen
ccc::DD6x10y0 ::DD6x10y0(){ note_ctor("_ZN3ccc8DD6x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y0E, buf);
    ::ccc::DD6x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y0E);
    dp->::ccc::DD6x10y0::~DD6x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y0E(Test__ZN3ccc8DD6x10y0E, "_ZN3ccc8DD6x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y0C1Ev();
extern void _ZN3ccc8DD6x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y0E[] = {
  NSPAIR(_ZN3ccc8DD6x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y0E[];
extern void _ZN3ccc8DD6x10y03abcEv();
extern void _ZN3ccc8DD6x10y03efgEv();
extern void _ZN3ccc8DD6x10y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y03pqrEv,_ZTv0_n12_N3ccc8DD6x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y03pqrEv,_ZThn4_N3ccc8DD6x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y03abcEv,_ZTv0_n16_N3ccc8DD6x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y03abcEv,_ZThn4_N3ccc8DD6x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y03pqrEv,_ZTv0_n12_N3ccc8DD6x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y03abcEv,_ZTv0_n16_N3ccc8DD6x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y0E[] = {
  {&(_ZTVN3ccc8DD6x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y0E[];
static VTBL_ENTRY alt_thunk_names626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y03abcEv,_ZTv0_n16_N3ccc8DD6x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y03abcEv,_ZThn4_N3ccc8DD6x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y03pqrEv,_ZTv0_n12_N3ccc8DD6x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y03pqrEv,_ZThn4_N3ccc8DD6x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y0E = {  "_ZN3ccc8DD6x10y0E", // class name
  bases__ZN3ccc8DD6x10y0E, 2,
  &(vtc__ZN3ccc8DD6x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y0E),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  CC6x10y1  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x10y13efgEv
  ~CC6x10y1(); // tgen
  CC6x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y1E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y13abcEv");}
void  ccc::CC6x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y13pqrEv");}
void  ccc::CC6x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y13efgEv");}
ccc::CC6x10y1 ::~CC6x10y1(){ note_dtor("_ZN3ccc8CC6x10y1E", this);} // tgen
ccc::CC6x10y1 ::CC6x10y1(){ note_ctor("_ZN3ccc8CC6x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y1E, buf);
    ::ccc::CC6x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y1E);
    dp->::ccc::CC6x10y1::~CC6x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y1E(Test__ZN3ccc8CC6x10y1E, "_ZN3ccc8CC6x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y1C1Ev();
extern void _ZN3ccc8CC6x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y1E[] = {
  NSPAIR(_ZN3ccc8CC6x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y1E[];
extern void _ZN3ccc8CC6x10y13pqrEv();
extern void _ZN3ccc8CC6x10y13abcEv();
extern void _ZN3ccc8CC6x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y13abcEv,_ZTv0_n12_N3ccc8CC6x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y13abcEv,_ZThn4_N3ccc8CC6x10y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y13efgEv,_ZTv0_n16_N3ccc8CC6x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y13efgEv,_ZThn4_N3ccc8CC6x10y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y13abcEv,_ZTv0_n12_N3ccc8CC6x10y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y13efgEv,_ZTv0_n16_N3ccc8CC6x10y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y1E[] = {
  {&(_ZTVN3ccc8CC6x10y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y1E[];
static VTBL_ENTRY alt_thunk_names627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y13efgEv,_ZTv0_n16_N3ccc8CC6x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y13efgEv,_ZThn4_N3ccc8CC6x10y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y13abcEv,_ZTv0_n12_N3ccc8CC6x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y13abcEv,_ZThn4_N3ccc8CC6x10y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y1E = {  "_ZN3ccc8CC6x10y1E", // class name
  bases__ZN3ccc8CC6x10y1E, 2,
  &(vtc__ZN3ccc8CC6x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y1E),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  DD6x10y1  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD6x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x10y13efgEv
  ~DD6x10y1(); // tgen
  DD6x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y1E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y13abcEv");}
void  ccc::DD6x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y13pqrEv");}
void  ccc::DD6x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y13efgEv");}
ccc::DD6x10y1 ::~DD6x10y1(){ note_dtor("_ZN3ccc8DD6x10y1E", this);} // tgen
ccc::DD6x10y1 ::DD6x10y1(){ note_ctor("_ZN3ccc8DD6x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y1E, buf);
    ::ccc::DD6x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y1E);
    dp->::ccc::DD6x10y1::~DD6x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y1E(Test__ZN3ccc8DD6x10y1E, "_ZN3ccc8DD6x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y1C1Ev();
extern void _ZN3ccc8DD6x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y1E[] = {
  NSPAIR(_ZN3ccc8DD6x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y1E[];
extern void _ZN3ccc8DD6x10y13abcEv();
extern void _ZN3ccc8DD6x10y13efgEv();
extern void _ZN3ccc8DD6x10y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y13pqrEv,_ZTv0_n12_N3ccc8DD6x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y13pqrEv,_ZThn4_N3ccc8DD6x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y13abcEv,_ZTv0_n16_N3ccc8DD6x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y13abcEv,_ZThn4_N3ccc8DD6x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y13pqrEv,_ZTv0_n12_N3ccc8DD6x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y13abcEv,_ZTv0_n16_N3ccc8DD6x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y1E[] = {
  {&(_ZTVN3ccc8DD6x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y1E[];
static VTBL_ENTRY alt_thunk_names628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y13abcEv,_ZTv0_n16_N3ccc8DD6x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y13abcEv,_ZThn4_N3ccc8DD6x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y13pqrEv,_ZTv0_n12_N3ccc8DD6x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y13pqrEv,_ZThn4_N3ccc8DD6x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y1E = {  "_ZN3ccc8DD6x10y1E", // class name
  bases__ZN3ccc8DD6x10y1E, 2,
  &(vtc__ZN3ccc8DD6x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y1E),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  CC6x10y2  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y23pqrEv
  ~CC6x10y2(); // tgen
  CC6x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y2E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y23efgEv");}
void  ccc::CC6x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y23abcEv");}
void  ccc::CC6x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y23pqrEv");}
ccc::CC6x10y2 ::~CC6x10y2(){ note_dtor("_ZN3ccc8CC6x10y2E", this);} // tgen
ccc::CC6x10y2 ::CC6x10y2(){ note_ctor("_ZN3ccc8CC6x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y2E, buf);
    ::ccc::CC6x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y2E);
    dp->::ccc::CC6x10y2::~CC6x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y2E(Test__ZN3ccc8CC6x10y2E, "_ZN3ccc8CC6x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y2C1Ev();
extern void _ZN3ccc8CC6x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y2E[] = {
  NSPAIR(_ZN3ccc8CC6x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y2E[];
extern void _ZN3ccc8CC6x10y23pqrEv();
extern void _ZN3ccc8CC6x10y23abcEv();
extern void _ZN3ccc8CC6x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y23abcEv,_ZTv0_n12_N3ccc8CC6x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y23abcEv,_ZThn4_N3ccc8CC6x10y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y23efgEv,_ZTv0_n16_N3ccc8CC6x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y23efgEv,_ZThn4_N3ccc8CC6x10y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y23abcEv,_ZTv0_n12_N3ccc8CC6x10y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y23efgEv,_ZTv0_n16_N3ccc8CC6x10y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y2E[] = {
  {&(_ZTVN3ccc8CC6x10y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y2E[];
static VTBL_ENTRY alt_thunk_names629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y23efgEv,_ZTv0_n16_N3ccc8CC6x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y23efgEv,_ZThn4_N3ccc8CC6x10y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y23abcEv,_ZTv0_n12_N3ccc8CC6x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y23abcEv,_ZThn4_N3ccc8CC6x10y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y2E = {  "_ZN3ccc8CC6x10y2E", // class name
  bases__ZN3ccc8CC6x10y2E, 2,
  &(vtc__ZN3ccc8CC6x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y2E),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  DD6x10y2  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD6x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD6x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x10y23pqrEv
  ~DD6x10y2(); // tgen
  DD6x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y2E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y23efgEv");}
void  ccc::DD6x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y23abcEv");}
void  ccc::DD6x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y23pqrEv");}
ccc::DD6x10y2 ::~DD6x10y2(){ note_dtor("_ZN3ccc8DD6x10y2E", this);} // tgen
ccc::DD6x10y2 ::DD6x10y2(){ note_ctor("_ZN3ccc8DD6x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y2E, buf);
    ::ccc::DD6x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y2E);
    dp->::ccc::DD6x10y2::~DD6x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y2E(Test__ZN3ccc8DD6x10y2E, "_ZN3ccc8DD6x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y2C1Ev();
extern void _ZN3ccc8DD6x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y2E[] = {
  NSPAIR(_ZN3ccc8DD6x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y2E[];
extern void _ZN3ccc8DD6x10y23abcEv();
extern void _ZN3ccc8DD6x10y23efgEv();
extern void _ZN3ccc8DD6x10y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y23pqrEv,_ZTv0_n12_N3ccc8DD6x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y23pqrEv,_ZThn4_N3ccc8DD6x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y23abcEv,_ZTv0_n16_N3ccc8DD6x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y23abcEv,_ZThn4_N3ccc8DD6x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y23pqrEv,_ZTv0_n12_N3ccc8DD6x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y23abcEv,_ZTv0_n16_N3ccc8DD6x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y2E[] = {
  {&(_ZTVN3ccc8DD6x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y2E[];
static VTBL_ENTRY alt_thunk_names630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y23abcEv,_ZTv0_n16_N3ccc8DD6x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y23abcEv,_ZThn4_N3ccc8DD6x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y23pqrEv,_ZTv0_n12_N3ccc8DD6x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y23pqrEv,_ZThn4_N3ccc8DD6x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y2E = {  "_ZN3ccc8DD6x10y2E", // class name
  bases__ZN3ccc8DD6x10y2E, 2,
  &(vtc__ZN3ccc8DD6x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y2E),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  CC6x10y3  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x10y33abcEv
  ~CC6x10y3(); // tgen
  CC6x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y3E) C1{ VBC2{ v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y33efgEv");}
void  ccc::CC6x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y33pqrEv");}
void  ccc::CC6x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y33abcEv");}
ccc::CC6x10y3 ::~CC6x10y3(){ note_dtor("_ZN3ccc8CC6x10y3E", this);} // tgen
ccc::CC6x10y3 ::CC6x10y3(){ note_ctor("_ZN3ccc8CC6x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y3E, buf);
    ::ccc::CC6x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y3E);
    dp->::ccc::CC6x10y3::~CC6x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y3E(Test__ZN3ccc8CC6x10y3E, "_ZN3ccc8CC6x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y3C1Ev();
extern void _ZN3ccc8CC6x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y3E[] = {
  NSPAIR(_ZN3ccc8CC6x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y3E[];
extern void _ZN3ccc8CC6x10y33pqrEv();
extern void _ZN3ccc8CC6x10y33abcEv();
extern void _ZN3ccc8CC6x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y33abcEv,_ZTv0_n12_N3ccc8CC6x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y33abcEv,_ZThn4_N3ccc8CC6x10y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y33efgEv,_ZTv0_n16_N3ccc8CC6x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y33efgEv,_ZThn4_N3ccc8CC6x10y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y33abcEv,_ZTv0_n12_N3ccc8CC6x10y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y33efgEv,_ZTv0_n16_N3ccc8CC6x10y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y3E[] = {
  {&(_ZTVN3ccc8CC6x10y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y3E[];
static VTBL_ENTRY alt_thunk_names631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y33efgEv,_ZTv0_n16_N3ccc8CC6x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y33efgEv,_ZThn4_N3ccc8CC6x10y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y33abcEv,_ZTv0_n12_N3ccc8CC6x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y33abcEv,_ZThn4_N3ccc8CC6x10y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y3E = {  "_ZN3ccc8CC6x10y3E", // class name
  bases__ZN3ccc8CC6x10y3E, 2,
  &(vtc__ZN3ccc8CC6x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y3E),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  DD6x10y3  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD6x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x10y33abcEv
  ~DD6x10y3(); // tgen
  DD6x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y3E) C1{ VBC2{ v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y33efgEv");}
void  ccc::DD6x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y33pqrEv");}
void  ccc::DD6x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y33abcEv");}
ccc::DD6x10y3 ::~DD6x10y3(){ note_dtor("_ZN3ccc8DD6x10y3E", this);} // tgen
ccc::DD6x10y3 ::DD6x10y3(){ note_ctor("_ZN3ccc8DD6x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y3E, buf);
    ::ccc::DD6x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y3E);
    dp->::ccc::DD6x10y3::~DD6x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y3E(Test__ZN3ccc8DD6x10y3E, "_ZN3ccc8DD6x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y3C1Ev();
extern void _ZN3ccc8DD6x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y3E[] = {
  NSPAIR(_ZN3ccc8DD6x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y3E[];
extern void _ZN3ccc8DD6x10y33abcEv();
extern void _ZN3ccc8DD6x10y33efgEv();
extern void _ZN3ccc8DD6x10y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y33pqrEv,_ZTv0_n12_N3ccc8DD6x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y33pqrEv,_ZThn4_N3ccc8DD6x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y33abcEv,_ZTv0_n16_N3ccc8DD6x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y33abcEv,_ZThn4_N3ccc8DD6x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y33pqrEv,_ZTv0_n12_N3ccc8DD6x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y33abcEv,_ZTv0_n16_N3ccc8DD6x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y3E[] = {
  {&(_ZTVN3ccc8DD6x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y3E[];
static VTBL_ENTRY alt_thunk_names632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y33abcEv,_ZTv0_n16_N3ccc8DD6x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y33abcEv,_ZThn4_N3ccc8DD6x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y33pqrEv,_ZTv0_n12_N3ccc8DD6x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y33pqrEv,_ZThn4_N3ccc8DD6x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y3E = {  "_ZN3ccc8DD6x10y3E", // class name
  bases__ZN3ccc8DD6x10y3E, 2,
  &(vtc__ZN3ccc8DD6x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y3E),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  CC6x10y4  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC6x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x10y43efgEv
  ~CC6x10y4(); // tgen
  CC6x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y4E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y43pqrEv");}
void  ccc::CC6x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y43abcEv");}
void  ccc::CC6x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y43efgEv");}
ccc::CC6x10y4 ::~CC6x10y4(){ note_dtor("_ZN3ccc8CC6x10y4E", this);} // tgen
ccc::CC6x10y4 ::CC6x10y4(){ note_ctor("_ZN3ccc8CC6x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y4E, buf);
    ::ccc::CC6x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y4E);
    dp->::ccc::CC6x10y4::~CC6x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y4E(Test__ZN3ccc8CC6x10y4E, "_ZN3ccc8CC6x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y4C1Ev();
extern void _ZN3ccc8CC6x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y4E[] = {
  NSPAIR(_ZN3ccc8CC6x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y4E[];
extern void _ZN3ccc8CC6x10y43pqrEv();
extern void _ZN3ccc8CC6x10y43abcEv();
extern void _ZN3ccc8CC6x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y43abcEv,_ZTv0_n12_N3ccc8CC6x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y43abcEv,_ZThn4_N3ccc8CC6x10y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y43efgEv,_ZTv0_n16_N3ccc8CC6x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y43efgEv,_ZThn4_N3ccc8CC6x10y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y43abcEv,_ZTv0_n12_N3ccc8CC6x10y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y43efgEv,_ZTv0_n16_N3ccc8CC6x10y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y4E[] = {
  {&(_ZTVN3ccc8CC6x10y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y4E[];
static VTBL_ENTRY alt_thunk_names633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y43efgEv,_ZTv0_n16_N3ccc8CC6x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y43efgEv,_ZThn4_N3ccc8CC6x10y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y43abcEv,_ZTv0_n12_N3ccc8CC6x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y43abcEv,_ZThn4_N3ccc8CC6x10y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y4E = {  "_ZN3ccc8CC6x10y4E", // class name
  bases__ZN3ccc8CC6x10y4E, 2,
  &(vtc__ZN3ccc8CC6x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y4E),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  DD6x10y4  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD6x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD6x10y43efgEv
  ~DD6x10y4(); // tgen
  DD6x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y4E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y43pqrEv");}
void  ccc::DD6x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y43abcEv");}
void  ccc::DD6x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y43efgEv");}
ccc::DD6x10y4 ::~DD6x10y4(){ note_dtor("_ZN3ccc8DD6x10y4E", this);} // tgen
ccc::DD6x10y4 ::DD6x10y4(){ note_ctor("_ZN3ccc8DD6x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y4E, buf);
    ::ccc::DD6x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y4E);
    dp->::ccc::DD6x10y4::~DD6x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y4E(Test__ZN3ccc8DD6x10y4E, "_ZN3ccc8DD6x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y4C1Ev();
extern void _ZN3ccc8DD6x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y4E[] = {
  NSPAIR(_ZN3ccc8DD6x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y4E[];
extern void _ZN3ccc8DD6x10y43abcEv();
extern void _ZN3ccc8DD6x10y43efgEv();
extern void _ZN3ccc8DD6x10y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y43pqrEv,_ZTv0_n12_N3ccc8DD6x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y43pqrEv,_ZThn4_N3ccc8DD6x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y43abcEv,_ZTv0_n16_N3ccc8DD6x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y43abcEv,_ZThn4_N3ccc8DD6x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y43pqrEv,_ZTv0_n12_N3ccc8DD6x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y43abcEv,_ZTv0_n16_N3ccc8DD6x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y4E[] = {
  {&(_ZTVN3ccc8DD6x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y4E[];
static VTBL_ENTRY alt_thunk_names634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y43abcEv,_ZTv0_n16_N3ccc8DD6x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y43abcEv,_ZThn4_N3ccc8DD6x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y43pqrEv,_ZTv0_n12_N3ccc8DD6x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y43pqrEv,_ZThn4_N3ccc8DD6x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y4E = {  "_ZN3ccc8DD6x10y4E", // class name
  bases__ZN3ccc8DD6x10y4E, 2,
  &(vtc__ZN3ccc8DD6x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y4E),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  CC6x10y5  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC6x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x10y53abcEv
  ~CC6x10y5(); // tgen
  CC6x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y5E) C1{ VBC2{ v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y53pqrEv");}
void  ccc::CC6x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y53efgEv");}
void  ccc::CC6x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y53abcEv");}
ccc::CC6x10y5 ::~CC6x10y5(){ note_dtor("_ZN3ccc8CC6x10y5E", this);} // tgen
ccc::CC6x10y5 ::CC6x10y5(){ note_ctor("_ZN3ccc8CC6x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y5E, buf);
    ::ccc::CC6x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y5E);
    dp->::ccc::CC6x10y5::~CC6x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y5E(Test__ZN3ccc8CC6x10y5E, "_ZN3ccc8CC6x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y5C1Ev();
extern void _ZN3ccc8CC6x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y5E[] = {
  NSPAIR(_ZN3ccc8CC6x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y5E[];
extern void _ZN3ccc8CC6x10y53pqrEv();
extern void _ZN3ccc8CC6x10y53abcEv();
extern void _ZN3ccc8CC6x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y53abcEv,_ZTv0_n12_N3ccc8CC6x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y53abcEv,_ZThn4_N3ccc8CC6x10y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y53efgEv,_ZTv0_n16_N3ccc8CC6x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y53efgEv,_ZThn4_N3ccc8CC6x10y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y53abcEv,_ZTv0_n12_N3ccc8CC6x10y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y53efgEv,_ZTv0_n16_N3ccc8CC6x10y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y5E[] = {
  {&(_ZTVN3ccc8CC6x10y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y5E[];
static VTBL_ENTRY alt_thunk_names635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y53efgEv,_ZTv0_n16_N3ccc8CC6x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y53efgEv,_ZThn4_N3ccc8CC6x10y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y53abcEv,_ZTv0_n12_N3ccc8CC6x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y53abcEv,_ZThn4_N3ccc8CC6x10y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y5E = {  "_ZN3ccc8CC6x10y5E", // class name
  bases__ZN3ccc8CC6x10y5E, 2,
  &(vtc__ZN3ccc8CC6x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y5E),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  DD6x10y5  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD6x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD6x10y53abcEv
  ~DD6x10y5(); // tgen
  DD6x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y5E) C1{ VBC2{ v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y53pqrEv");}
void  ccc::DD6x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y53efgEv");}
void  ccc::DD6x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y53abcEv");}
ccc::DD6x10y5 ::~DD6x10y5(){ note_dtor("_ZN3ccc8DD6x10y5E", this);} // tgen
ccc::DD6x10y5 ::DD6x10y5(){ note_ctor("_ZN3ccc8DD6x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y5E, buf);
    ::ccc::DD6x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y5E);
    dp->::ccc::DD6x10y5::~DD6x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y5E(Test__ZN3ccc8DD6x10y5E, "_ZN3ccc8DD6x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y5C1Ev();
extern void _ZN3ccc8DD6x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y5E[] = {
  NSPAIR(_ZN3ccc8DD6x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y5E[];
extern void _ZN3ccc8DD6x10y53abcEv();
extern void _ZN3ccc8DD6x10y53efgEv();
extern void _ZN3ccc8DD6x10y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y53pqrEv,_ZTv0_n12_N3ccc8DD6x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y53pqrEv,_ZThn4_N3ccc8DD6x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y53abcEv,_ZTv0_n16_N3ccc8DD6x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y53abcEv,_ZThn4_N3ccc8DD6x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y53pqrEv,_ZTv0_n12_N3ccc8DD6x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y53abcEv,_ZTv0_n16_N3ccc8DD6x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y5E[] = {
  {&(_ZTVN3ccc8DD6x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y5E[];
static VTBL_ENTRY alt_thunk_names636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y53abcEv,_ZTv0_n16_N3ccc8DD6x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y53abcEv,_ZThn4_N3ccc8DD6x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y53pqrEv,_ZTv0_n12_N3ccc8DD6x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y53pqrEv,_ZThn4_N3ccc8DD6x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y5E = {  "_ZN3ccc8DD6x10y5E", // class name
  bases__ZN3ccc8DD6x10y5E, 2,
  &(vtc__ZN3ccc8DD6x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y5E),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  CC6x10y6  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x10y63efgEv
  ~CC6x10y6(); // tgen
  CC6x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y6E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y63abcEv");}
void  ccc::CC6x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y63efgEv");}
ccc::CC6x10y6 ::~CC6x10y6(){ note_dtor("_ZN3ccc8CC6x10y6E", this);} // tgen
ccc::CC6x10y6 ::CC6x10y6(){ note_ctor("_ZN3ccc8CC6x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y6E, buf);
    ::ccc::CC6x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y6E);
    dp->::ccc::CC6x10y6::~CC6x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y6E(Test__ZN3ccc8CC6x10y6E, "_ZN3ccc8CC6x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y6C1Ev();
extern void _ZN3ccc8CC6x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y6E[] = {
  NSPAIR(_ZN3ccc8CC6x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC6x10y63abcEv();
extern void _ZN3ccc8CC6x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y63abcEv,_ZTv0_n12_N3ccc8CC6x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y63abcEv,_ZThn4_N3ccc8CC6x10y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y63efgEv,_ZTv0_n16_N3ccc8CC6x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y63efgEv,_ZThn4_N3ccc8CC6x10y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y63abcEv,_ZTv0_n12_N3ccc8CC6x10y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y63efgEv,_ZTv0_n16_N3ccc8CC6x10y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y6E[] = {
  {&(_ZTVN3ccc8CC6x10y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y6E[];
static VTBL_ENTRY alt_thunk_names637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y63efgEv,_ZTv0_n16_N3ccc8CC6x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y63efgEv,_ZThn4_N3ccc8CC6x10y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y63abcEv,_ZTv0_n12_N3ccc8CC6x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y63abcEv,_ZThn4_N3ccc8CC6x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y6E = {  "_ZN3ccc8CC6x10y6E", // class name
  bases__ZN3ccc8CC6x10y6E, 2,
  &(vtc__ZN3ccc8CC6x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y6E),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  DD6x10y6  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD6x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD6x10y63efgEv
  ~DD6x10y6(); // tgen
  DD6x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y6E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y63abcEv");}
void  ccc::DD6x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y63efgEv");}
ccc::DD6x10y6 ::~DD6x10y6(){ note_dtor("_ZN3ccc8DD6x10y6E", this);} // tgen
ccc::DD6x10y6 ::DD6x10y6(){ note_ctor("_ZN3ccc8DD6x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y6E, buf);
    ::ccc::DD6x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y6E);
    dp->::ccc::DD6x10y6::~DD6x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y6E(Test__ZN3ccc8DD6x10y6E, "_ZN3ccc8DD6x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y6C1Ev();
extern void _ZN3ccc8DD6x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y6E[] = {
  NSPAIR(_ZN3ccc8DD6x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y6E[];
extern void _ZN3ccc8DD6x10y63abcEv();
extern void _ZN3ccc8DD6x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y63abcEv,_ZTv0_n16_N3ccc8DD6x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y63abcEv,_ZThn4_N3ccc8DD6x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y63abcEv,_ZTv0_n16_N3ccc8DD6x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y6E[] = {
  {&(_ZTVN3ccc8DD6x10y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x10y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x10y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y6E[];
static VTBL_ENTRY alt_thunk_names638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y63abcEv,_ZTv0_n16_N3ccc8DD6x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y63abcEv,_ZThn4_N3ccc8DD6x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y6E = {  "_ZN3ccc8DD6x10y6E", // class name
  bases__ZN3ccc8DD6x10y6E, 2,
  &(vtc__ZN3ccc8DD6x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y6E),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  CC6x10y7  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC6x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y73pqrEv
  ~CC6x10y7(); // tgen
  CC6x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y7E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y73abcEv");}
void  ccc::CC6x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y73pqrEv");}
ccc::CC6x10y7 ::~CC6x10y7(){ note_dtor("_ZN3ccc8CC6x10y7E", this);} // tgen
ccc::CC6x10y7 ::CC6x10y7(){ note_ctor("_ZN3ccc8CC6x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y7E, buf);
    ::ccc::CC6x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y7E);
    dp->::ccc::CC6x10y7::~CC6x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y7E(Test__ZN3ccc8CC6x10y7E, "_ZN3ccc8CC6x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y7C1Ev();
extern void _ZN3ccc8CC6x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y7E[] = {
  NSPAIR(_ZN3ccc8CC6x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y7E[];
extern void _ZN3ccc8CC6x10y73pqrEv();
extern void _ZN3ccc8CC6x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y73abcEv,_ZTv0_n12_N3ccc8CC6x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y73abcEv,_ZThn4_N3ccc8CC6x10y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y73abcEv,_ZTv0_n12_N3ccc8CC6x10y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y7E[] = {
  {&(_ZTVN3ccc8CC6x10y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x10y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y7E[];
static VTBL_ENTRY alt_thunk_names639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y73abcEv,_ZTv0_n12_N3ccc8CC6x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y73abcEv,_ZThn4_N3ccc8CC6x10y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y7E = {  "_ZN3ccc8CC6x10y7E", // class name
  bases__ZN3ccc8CC6x10y7E, 2,
  &(vtc__ZN3ccc8CC6x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y7E),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  DD6x10y7  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD6x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x10y73pqrEv
  ~DD6x10y7(); // tgen
  DD6x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y7E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y73abcEv");}
void  ccc::DD6x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y73pqrEv");}
ccc::DD6x10y7 ::~DD6x10y7(){ note_dtor("_ZN3ccc8DD6x10y7E", this);} // tgen
ccc::DD6x10y7 ::DD6x10y7(){ note_ctor("_ZN3ccc8DD6x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y7E, buf);
    ::ccc::DD6x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y7E);
    dp->::ccc::DD6x10y7::~DD6x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y7E(Test__ZN3ccc8DD6x10y7E, "_ZN3ccc8DD6x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y7C1Ev();
extern void _ZN3ccc8DD6x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y7E[] = {
  NSPAIR(_ZN3ccc8DD6x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y7E[];
extern void _ZN3ccc8DD6x10y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x10y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y73pqrEv,_ZTv0_n12_N3ccc8DD6x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y73pqrEv,_ZThn4_N3ccc8DD6x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y73abcEv,_ZTv0_n16_N3ccc8DD6x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y73abcEv,_ZThn4_N3ccc8DD6x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y73pqrEv,_ZTv0_n12_N3ccc8DD6x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y73abcEv,_ZTv0_n16_N3ccc8DD6x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y7E[] = {
  {&(_ZTVN3ccc8DD6x10y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y7E[];
static VTBL_ENTRY alt_thunk_names640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y73abcEv,_ZTv0_n16_N3ccc8DD6x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y73abcEv,_ZThn4_N3ccc8DD6x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y73pqrEv,_ZTv0_n12_N3ccc8DD6x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y73pqrEv,_ZThn4_N3ccc8DD6x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y7E = {  "_ZN3ccc8DD6x10y7E", // class name
  bases__ZN3ccc8DD6x10y7E, 2,
  &(vtc__ZN3ccc8DD6x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y7E),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  CC6x10y8  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x10y83abcEv
  ~CC6x10y8(); // tgen
  CC6x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y8E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y83efgEv");}
void  ccc::CC6x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x10y83abcEv");}
ccc::CC6x10y8 ::~CC6x10y8(){ note_dtor("_ZN3ccc8CC6x10y8E", this);} // tgen
ccc::CC6x10y8 ::CC6x10y8(){ note_ctor("_ZN3ccc8CC6x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y8E, buf);
    ::ccc::CC6x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y8E);
    dp->::ccc::CC6x10y8::~CC6x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y8E(Test__ZN3ccc8CC6x10y8E, "_ZN3ccc8CC6x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y8C1Ev();
extern void _ZN3ccc8CC6x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y8E[] = {
  NSPAIR(_ZN3ccc8CC6x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC6x10y83abcEv();
extern void _ZN3ccc8CC6x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x10y83abcEv,_ZTv0_n12_N3ccc8CC6x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y83abcEv,_ZThn4_N3ccc8CC6x10y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y83efgEv,_ZTv0_n16_N3ccc8CC6x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y83efgEv,_ZThn4_N3ccc8CC6x10y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x10y83abcEv,_ZTv0_n12_N3ccc8CC6x10y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y83efgEv,_ZTv0_n16_N3ccc8CC6x10y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y8E[] = {
  {&(_ZTVN3ccc8CC6x10y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y8E[];
static VTBL_ENTRY alt_thunk_names641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y83efgEv,_ZTv0_n16_N3ccc8CC6x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y83efgEv,_ZThn4_N3ccc8CC6x10y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x10y83abcEv,_ZTv0_n12_N3ccc8CC6x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y83abcEv,_ZThn4_N3ccc8CC6x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y8E = {  "_ZN3ccc8CC6x10y8E", // class name
  bases__ZN3ccc8CC6x10y8E, 2,
  &(vtc__ZN3ccc8CC6x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y8E),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  DD6x10y8  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD6x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD6x10y83abcEv
  ~DD6x10y8(); // tgen
  DD6x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y8E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y83efgEv");}
void  ccc::DD6x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x10y83abcEv");}
ccc::DD6x10y8 ::~DD6x10y8(){ note_dtor("_ZN3ccc8DD6x10y8E", this);} // tgen
ccc::DD6x10y8 ::DD6x10y8(){ note_ctor("_ZN3ccc8DD6x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y8E, buf);
    ::ccc::DD6x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y8E);
    dp->::ccc::DD6x10y8::~DD6x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y8E(Test__ZN3ccc8DD6x10y8E, "_ZN3ccc8DD6x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y8C1Ev();
extern void _ZN3ccc8DD6x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y8E[] = {
  NSPAIR(_ZN3ccc8DD6x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y8E[];
extern void _ZN3ccc8DD6x10y83abcEv();
extern void _ZN3ccc8DD6x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x10y83abcEv,_ZTv0_n16_N3ccc8DD6x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y83abcEv,_ZThn4_N3ccc8DD6x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x10y83abcEv,_ZTv0_n16_N3ccc8DD6x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y8E[] = {
  {&(_ZTVN3ccc8DD6x10y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x10y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x10y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y8E[];
static VTBL_ENTRY alt_thunk_names642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x10y83abcEv,_ZTv0_n16_N3ccc8DD6x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y83abcEv,_ZThn4_N3ccc8DD6x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y8E = {  "_ZN3ccc8DD6x10y8E", // class name
  bases__ZN3ccc8DD6x10y8E, 2,
  &(vtc__ZN3ccc8DD6x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y8E),3, //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  CC6x10y9  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC6x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x10y93pqrEv
  ~CC6x10y9(); // tgen
  CC6x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x10y9E) C1{ VBC2{ v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x10y93efgEv");}
void  ccc::CC6x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x10y93pqrEv");}
ccc::CC6x10y9 ::~CC6x10y9(){ note_dtor("_ZN3ccc8CC6x10y9E", this);} // tgen
ccc::CC6x10y9 ::CC6x10y9(){ note_ctor("_ZN3ccc8CC6x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC6x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x10y9E, buf);
    ::ccc::CC6x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x10y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC6x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x10y9E);
    dp->::ccc::CC6x10y9::~CC6x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x10y9E(Test__ZN3ccc8CC6x10y9E, "_ZN3ccc8CC6x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x10y9C1Ev();
extern void _ZN3ccc8CC6x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC6x10y9E[] = {
  NSPAIR(_ZN3ccc8CC6x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC6x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC6x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x10y9E[];
extern void _ZN3ccc8CC6x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC6x10y93efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x10y93efgEv,_ZTv0_n16_N3ccc8CC6x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x10y93efgEv,_ZThn4_N3ccc8CC6x10y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x10y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x10y93efgEv,_ZTv0_n16_N3ccc8CC6x10y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x10y9E[] = {
  {&(_ZTVN3ccc8CC6x10y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x10y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x10y9E[];
static VTBL_ENTRY alt_thunk_names643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x10y93efgEv,_ZTv0_n16_N3ccc8CC6x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x10y93efgEv,_ZThn4_N3ccc8CC6x10y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x10y9E = {  "_ZN3ccc8CC6x10y9E", // class name
  bases__ZN3ccc8CC6x10y9E, 2,
  &(vtc__ZN3ccc8CC6x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x10y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x10y9E),2, //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  DD6x10y9  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD6x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x10y93pqrEv
  ~DD6x10y9(); // tgen
  DD6x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD6x10y9E) C1{ VBC2{ v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x10y93efgEv");}
void  ccc::DD6x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x10y93pqrEv");}
ccc::DD6x10y9 ::~DD6x10y9(){ note_dtor("_ZN3ccc8DD6x10y9E", this);} // tgen
ccc::DD6x10y9 ::DD6x10y9(){ note_ctor("_ZN3ccc8DD6x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD6x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x10y9E, buf);
    ::ccc::DD6x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x10y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD6x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x10y9E);
    dp->::ccc::DD6x10y9::~DD6x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x10y9E(Test__ZN3ccc8DD6x10y9E, "_ZN3ccc8DD6x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x10y9C1Ev();
extern void _ZN3ccc8DD6x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD6x10y9E[] = {
  NSPAIR(_ZN3ccc8DD6x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD6x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD6x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x10y93efgEv();
extern void _ZN3ccc8DD6x10y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x10y93pqrEv,_ZTv0_n12_N3ccc8DD6x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x10y93pqrEv,_ZThn4_N3ccc8DD6x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x10y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x10y93pqrEv,_ZTv0_n12_N3ccc8DD6x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x10y9E[] = {
  {&(_ZTVN3ccc8DD6x10y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x10y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x10y9E[];
static VTBL_ENTRY alt_thunk_names644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x10y93pqrEv,_ZTv0_n12_N3ccc8DD6x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x10y93pqrEv,_ZThn4_N3ccc8DD6x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x10y9E = {  "_ZN3ccc8DD6x10y9E", // class name
  bases__ZN3ccc8DD6x10y9E, 2,
  &(vtc__ZN3ccc8DD6x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x10y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x10y9E),3, //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  CC6x10y10  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC6x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x10y103abcEv
  ~CC6x10y10(); // tgen
  CC6x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y10E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x10y103pqrEv");}
void  ccc::CC6x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x10y103abcEv");}
ccc::CC6x10y10 ::~CC6x10y10(){ note_dtor("_ZN3ccc9CC6x10y10E", this);} // tgen
ccc::CC6x10y10 ::CC6x10y10(){ note_ctor("_ZN3ccc9CC6x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC6x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x10y10E, buf);
    ::ccc::CC6x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x10y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC6x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x10y10E);
    dp->::ccc::CC6x10y10::~CC6x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x10y10E(Test__ZN3ccc9CC6x10y10E, "_ZN3ccc9CC6x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x10y10C1Ev();
extern void _ZN3ccc9CC6x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC6x10y10E[] = {
  NSPAIR(_ZN3ccc9CC6x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC6x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC6x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x10y10E[];
extern void _ZN3ccc9CC6x10y103pqrEv();
extern void _ZN3ccc9CC6x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x10y103abcEv,_ZTv0_n12_N3ccc9CC6x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y103abcEv,_ZThn4_N3ccc9CC6x10y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x10y103abcEv,_ZTv0_n12_N3ccc9CC6x10y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x10y10E[] = {
  {&(_ZTVN3ccc9CC6x10y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x10y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x10y10E[];
static VTBL_ENTRY alt_thunk_names645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x10y103abcEv,_ZTv0_n12_N3ccc9CC6x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x10y103abcEv,_ZThn4_N3ccc9CC6x10y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x10y10E = {  "_ZN3ccc9CC6x10y10E", // class name
  bases__ZN3ccc9CC6x10y10E, 2,
  &(vtc__ZN3ccc9CC6x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x10y10E),2, //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  DD6x10y10  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD6x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD6x10y103abcEv
  ~DD6x10y10(); // tgen
  DD6x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD6x10y10E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x10y103pqrEv");}
void  ccc::DD6x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x10y103abcEv");}
ccc::DD6x10y10 ::~DD6x10y10(){ note_dtor("_ZN3ccc9DD6x10y10E", this);} // tgen
ccc::DD6x10y10 ::DD6x10y10(){ note_ctor("_ZN3ccc9DD6x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD6x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x10y10E, buf);
    ::ccc::DD6x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x10y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD6x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x10y10E);
    dp->::ccc::DD6x10y10::~DD6x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x10y10E(Test__ZN3ccc9DD6x10y10E, "_ZN3ccc9DD6x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x10y10C1Ev();
extern void _ZN3ccc9DD6x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD6x10y10E[] = {
  NSPAIR(_ZN3ccc9DD6x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD6x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD6x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y10E[];
extern void _ZN3ccc9DD6x10y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x10y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x10y103pqrEv,_ZTv0_n12_N3ccc9DD6x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x10y103pqrEv,_ZThn4_N3ccc9DD6x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD6x10y103abcEv,_ZTv0_n16_N3ccc9DD6x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x10y103abcEv,_ZThn4_N3ccc9DD6x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x10y103pqrEv,_ZTv0_n12_N3ccc9DD6x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD6x10y103abcEv,_ZTv0_n16_N3ccc9DD6x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x10y10E[] = {
  {&(_ZTVN3ccc9DD6x10y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x10y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x10y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x10y10E[];
static VTBL_ENTRY alt_thunk_names646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD6x10y103abcEv,_ZTv0_n16_N3ccc9DD6x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x10y103abcEv,_ZThn4_N3ccc9DD6x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x10y103pqrEv,_ZTv0_n12_N3ccc9DD6x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x10y103pqrEv,_ZThn4_N3ccc9DD6x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x10y10E = {  "_ZN3ccc9DD6x10y10E", // class name
  bases__ZN3ccc9DD6x10y10E, 2,
  &(vtc__ZN3ccc9DD6x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x10y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x10y10E),3, //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  CC6x10y11  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC6x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x10y113efgEv
  ~CC6x10y11(); // tgen
  CC6x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y11E) C1{ VBC2{ v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x10y113pqrEv");}
void  ccc::CC6x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x10y113efgEv");}
ccc::CC6x10y11 ::~CC6x10y11(){ note_dtor("_ZN3ccc9CC6x10y11E", this);} // tgen
ccc::CC6x10y11 ::CC6x10y11(){ note_ctor("_ZN3ccc9CC6x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC6x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x10y11E, buf);
    ::ccc::CC6x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x10y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC6x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x10y11E);
    dp->::ccc::CC6x10y11::~CC6x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x10y11E(Test__ZN3ccc9CC6x10y11E, "_ZN3ccc9CC6x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x10y11C1Ev();
extern void _ZN3ccc9CC6x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC6x10y11E[] = {
  NSPAIR(_ZN3ccc9CC6x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC6x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC6x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x10y11E[];
extern void _ZN3ccc9CC6x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC6x10y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x10y113efgEv,_ZTv0_n16_N3ccc9CC6x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y113efgEv,_ZThn4_N3ccc9CC6x10y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x10y113efgEv,_ZTv0_n16_N3ccc9CC6x10y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x10y11E[] = {
  {&(_ZTVN3ccc9CC6x10y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC6x10y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x10y11E[];
static VTBL_ENTRY alt_thunk_names647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x10y113efgEv,_ZTv0_n16_N3ccc9CC6x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x10y113efgEv,_ZThn4_N3ccc9CC6x10y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x10y11E = {  "_ZN3ccc9CC6x10y11E", // class name
  bases__ZN3ccc9CC6x10y11E, 2,
  &(vtc__ZN3ccc9CC6x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x10y11E),2, //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  DD6x10y11  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD6x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD6x10y113efgEv
  ~DD6x10y11(); // tgen
  DD6x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD6x10y11E) C1{ VBC2{ v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x10y113pqrEv");}
void  ccc::DD6x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x10y113efgEv");}
ccc::DD6x10y11 ::~DD6x10y11(){ note_dtor("_ZN3ccc9DD6x10y11E", this);} // tgen
ccc::DD6x10y11 ::DD6x10y11(){ note_ctor("_ZN3ccc9DD6x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD6x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x10y11E, buf);
    ::ccc::DD6x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x10y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD6x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x10y11E);
    dp->::ccc::DD6x10y11::~DD6x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x10y11E(Test__ZN3ccc9DD6x10y11E, "_ZN3ccc9DD6x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x10y11C1Ev();
extern void _ZN3ccc9DD6x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD6x10y11E[] = {
  NSPAIR(_ZN3ccc9DD6x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD6x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD6x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x10y113efgEv();
extern void _ZN3ccc9DD6x10y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x10y113pqrEv,_ZTv0_n12_N3ccc9DD6x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x10y113pqrEv,_ZThn4_N3ccc9DD6x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x10y113pqrEv,_ZTv0_n12_N3ccc9DD6x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x10y11E[] = {
  {&(_ZTVN3ccc9DD6x10y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x10y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x10y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x10y11E[];
static VTBL_ENTRY alt_thunk_names648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x10y113pqrEv,_ZTv0_n12_N3ccc9DD6x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x10y113pqrEv,_ZThn4_N3ccc9DD6x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x10y11E = {  "_ZN3ccc9DD6x10y11E", // class name
  bases__ZN3ccc9DD6x10y11E, 2,
  &(vtc__ZN3ccc9DD6x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x10y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x10y11E),3, //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  CC6x10y12  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC6x10y123abcEv
  ~CC6x10y12(); // tgen
  CC6x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC6x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x10y123abcEv");}
ccc::CC6x10y12 ::~CC6x10y12(){ note_dtor("_ZN3ccc9CC6x10y12E", this);} // tgen
ccc::CC6x10y12 ::CC6x10y12(){ note_ctor("_ZN3ccc9CC6x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC6x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x10y12E, buf);
    ::ccc::CC6x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x10y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC6x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x10y12E);
    dp->::ccc::CC6x10y12::~CC6x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x10y12E(Test__ZN3ccc9CC6x10y12E, "_ZN3ccc9CC6x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x10y12C1Ev();
extern void _ZN3ccc9CC6x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC6x10y12E[] = {
  NSPAIR(_ZN3ccc9CC6x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC6x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC6x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC6x10y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x10y123abcEv,_ZTv0_n12_N3ccc9CC6x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y123abcEv,_ZThn4_N3ccc9CC6x10y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x10y123abcEv,_ZTv0_n12_N3ccc9CC6x10y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x10y12E[] = {
  {&(_ZTVN3ccc9CC6x10y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x10y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x10y12E[];
static VTBL_ENTRY alt_thunk_names649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x10y123abcEv,_ZTv0_n12_N3ccc9CC6x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x10y123abcEv,_ZThn4_N3ccc9CC6x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x10y12E = {  "_ZN3ccc9CC6x10y12E", // class name
  bases__ZN3ccc9CC6x10y12E, 2,
  &(vtc__ZN3ccc9CC6x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x10y12E),2, //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  DD6x10y12  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD6x10y123abcEv
  ~DD6x10y12(); // tgen
  DD6x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD6x10y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD6x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x10y123abcEv");}
ccc::DD6x10y12 ::~DD6x10y12(){ note_dtor("_ZN3ccc9DD6x10y12E", this);} // tgen
ccc::DD6x10y12 ::DD6x10y12(){ note_ctor("_ZN3ccc9DD6x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD6x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x10y12E, buf);
    ::ccc::DD6x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x10y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD6x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x10y12E);
    dp->::ccc::DD6x10y12::~DD6x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x10y12E(Test__ZN3ccc9DD6x10y12E, "_ZN3ccc9DD6x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x10y12C1Ev();
extern void _ZN3ccc9DD6x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD6x10y12E[] = {
  NSPAIR(_ZN3ccc9DD6x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD6x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD6x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y12E[];
extern void _ZN3ccc9DD6x10y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD6x10y123abcEv,_ZTv0_n16_N3ccc9DD6x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x10y123abcEv,_ZThn4_N3ccc9DD6x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD6x10y123abcEv,_ZTv0_n16_N3ccc9DD6x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x10y12E[] = {
  {&(_ZTVN3ccc9DD6x10y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x10y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x10y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x10y12E[];
static VTBL_ENTRY alt_thunk_names650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD6x10y123abcEv,_ZTv0_n16_N3ccc9DD6x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x10y123abcEv,_ZThn4_N3ccc9DD6x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x10y12E = {  "_ZN3ccc9DD6x10y12E", // class name
  bases__ZN3ccc9DD6x10y12E, 2,
  &(vtc__ZN3ccc9DD6x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x10y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x10y12E),3, //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  CC6x10y13  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC6x10y133efgEv
  ~CC6x10y13(); // tgen
  CC6x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y13E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x10y133efgEv");}
ccc::CC6x10y13 ::~CC6x10y13(){ note_dtor("_ZN3ccc9CC6x10y13E", this);} // tgen
ccc::CC6x10y13 ::CC6x10y13(){ note_ctor("_ZN3ccc9CC6x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC6x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x10y13E, buf);
    ::ccc::CC6x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x10y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC6x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x10y13E);
    dp->::ccc::CC6x10y13::~CC6x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x10y13E(Test__ZN3ccc9CC6x10y13E, "_ZN3ccc9CC6x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x10y13C1Ev();
extern void _ZN3ccc9CC6x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC6x10y13E[] = {
  NSPAIR(_ZN3ccc9CC6x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC6x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC6x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC6x10y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x10y133efgEv,_ZTv0_n16_N3ccc9CC6x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x10y133efgEv,_ZThn4_N3ccc9CC6x10y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x10y133efgEv,_ZTv0_n16_N3ccc9CC6x10y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x10y13E[] = {
  {&(_ZTVN3ccc9CC6x10y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC6x10y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x10y13E[];
static VTBL_ENTRY alt_thunk_names651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x10y133efgEv,_ZTv0_n16_N3ccc9CC6x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x10y133efgEv,_ZThn4_N3ccc9CC6x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x10y13E = {  "_ZN3ccc9CC6x10y13E", // class name
  bases__ZN3ccc9CC6x10y13E, 2,
  &(vtc__ZN3ccc9CC6x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x10y13E),2, //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  DD6x10y13  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD6x10y133efgEv
  ~DD6x10y13(); // tgen
  DD6x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD6x10y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x10y133efgEv");}
ccc::DD6x10y13 ::~DD6x10y13(){ note_dtor("_ZN3ccc9DD6x10y13E", this);} // tgen
ccc::DD6x10y13 ::DD6x10y13(){ note_ctor("_ZN3ccc9DD6x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD6x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x10y13E, buf);
    ::ccc::DD6x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x10y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD6x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x10y13E);
    dp->::ccc::DD6x10y13::~DD6x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x10y13E(Test__ZN3ccc9DD6x10y13E, "_ZN3ccc9DD6x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x10y13C1Ev();
extern void _ZN3ccc9DD6x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD6x10y13E[] = {
  NSPAIR(_ZN3ccc9DD6x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD6x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD6x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x10y13E[] = {
  {&(_ZTVN3ccc9DD6x10y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x10y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x10y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x10y13E[];
Class_Descriptor cd__ZN3ccc9DD6x10y13E = {  "_ZN3ccc9DD6x10y13E", // class name
  bases__ZN3ccc9DD6x10y13E, 2,
  &(vtc__ZN3ccc9DD6x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x10y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x10y13E),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  CC6x10y14  : virtual ::ccc::AA6 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC6x10y143pqrEv
  ~CC6x10y14(); // tgen
  CC6x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC6x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x10y143pqrEv");}
ccc::CC6x10y14 ::~CC6x10y14(){ note_dtor("_ZN3ccc9CC6x10y14E", this);} // tgen
ccc::CC6x10y14 ::CC6x10y14(){ note_ctor("_ZN3ccc9CC6x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC6x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x10y14E, buf);
    ::ccc::CC6x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x10y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC6x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x10y14E);
    dp->::ccc::CC6x10y14::~CC6x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x10y14E(Test__ZN3ccc9CC6x10y14E, "_ZN3ccc9CC6x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x10y14C1Ev();
extern void _ZN3ccc9CC6x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC6x10y14E[] = {
  NSPAIR(_ZN3ccc9CC6x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC6x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC6x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x10y14E[];
extern void _ZN3ccc9CC6x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x10y14E[] = {
  {&(_ZTVN3ccc9CC6x10y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x10y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x10y14E[];
Class_Descriptor cd__ZN3ccc9CC6x10y14E = {  "_ZN3ccc9CC6x10y14E", // class name
  bases__ZN3ccc9CC6x10y14E, 2,
  &(vtc__ZN3ccc9CC6x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x10y14E),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  DD6x10y14  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD6x10y143pqrEv
  ~DD6x10y14(); // tgen
  DD6x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD6x10y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD6x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x10y143pqrEv");}
ccc::DD6x10y14 ::~DD6x10y14(){ note_dtor("_ZN3ccc9DD6x10y14E", this);} // tgen
ccc::DD6x10y14 ::DD6x10y14(){ note_ctor("_ZN3ccc9DD6x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD6x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x10y14E, buf);
    ::ccc::DD6x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x10y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD6x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x10y14E);
    dp->::ccc::DD6x10y14::~DD6x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x10y14E(Test__ZN3ccc9DD6x10y14E, "_ZN3ccc9DD6x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x10y14C1Ev();
extern void _ZN3ccc9DD6x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD6x10y14E[] = {
  NSPAIR(_ZN3ccc9DD6x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD6x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD6x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x10y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x10y143pqrEv,_ZTv0_n12_N3ccc9DD6x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x10y143pqrEv,_ZThn4_N3ccc9DD6x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x10y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x10y143pqrEv,_ZTv0_n12_N3ccc9DD6x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x10y14E[] = {
  {&(_ZTVN3ccc9DD6x10y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x10y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x10y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x10y14E[];
static VTBL_ENTRY alt_thunk_names652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x10y143pqrEv,_ZTv0_n12_N3ccc9DD6x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x10y143pqrEv,_ZThn4_N3ccc9DD6x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x10y14E = {  "_ZN3ccc9DD6x10y14E", // class name
  bases__ZN3ccc9DD6x10y14E, 2,
  &(vtc__ZN3ccc9DD6x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x10y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x10y14E),3, //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  CC6x10y15  : virtual ::ccc::AA6 , ::ccc::BB10 {
  ~CC6x10y15(); // tgen
  CC6x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x10y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC6x10y15 ::~CC6x10y15(){ note_dtor("_ZN3ccc9CC6x10y15E", this);} // tgen
ccc::CC6x10y15 ::CC6x10y15(){ note_ctor("_ZN3ccc9CC6x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC6x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x10y15E, buf);
    ::ccc::CC6x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x10y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC6x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x10y15E);
    dp->::ccc::CC6x10y15::~CC6x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x10y15E(Test__ZN3ccc9CC6x10y15E, "_ZN3ccc9CC6x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x10y15C1Ev();
extern void _ZN3ccc9CC6x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC6x10y15E[] = {
  NSPAIR(_ZN3ccc9CC6x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC6x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC6x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x10y15E[] = {
  {&(_ZTVN3ccc9CC6x10y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x10y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x10y15E[];
Class_Descriptor cd__ZN3ccc9CC6x10y15E = {  "_ZN3ccc9CC6x10y15E", // class name
  bases__ZN3ccc9CC6x10y15E, 2,
  &(vtc__ZN3ccc9CC6x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x10y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x10y15E),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  DD6x10y15  : virtual ::ccc::AA6 , virtual ::ccc::BB10 {
  ~DD6x10y15(); // tgen
  DD6x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD6x10y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD6x10y15 ::~DD6x10y15(){ note_dtor("_ZN3ccc9DD6x10y15E", this);} // tgen
ccc::DD6x10y15 ::DD6x10y15(){ note_ctor("_ZN3ccc9DD6x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD6x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x10y15E, buf);
    ::ccc::DD6x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x10y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD6x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x10y15E);
    dp->::ccc::DD6x10y15::~DD6x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x10y15E(Test__ZN3ccc9DD6x10y15E, "_ZN3ccc9DD6x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x10y15C1Ev();
extern void _ZN3ccc9DD6x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD6x10y15E[] = {
  NSPAIR(_ZN3ccc9DD6x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD6x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD6x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x10y15E[] = {
  {&(_ZTVN3ccc9DD6x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x10y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x10y15E[];
Class_Descriptor cd__ZN3ccc9DD6x10y15E = {  "_ZN3ccc9DD6x10y15E", // class name
  bases__ZN3ccc9DD6x10y15E, 2,
  &(vtc__ZN3ccc9DD6x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x10y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x10y15E),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  CC6x11y0  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y03pqrEv
  ~CC6x11y0(); // tgen
  CC6x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y0E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y03abcEv");}
void  ccc::CC6x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y03efgEv");}
void  ccc::CC6x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y03pqrEv");}
ccc::CC6x11y0 ::~CC6x11y0(){ note_dtor("_ZN3ccc8CC6x11y0E", this);} // tgen
ccc::CC6x11y0 ::CC6x11y0(){ note_ctor("_ZN3ccc8CC6x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y0E, buf);
    ::ccc::CC6x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y0E);
    dp->::ccc::CC6x11y0::~CC6x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y0E(Test__ZN3ccc8CC6x11y0E, "_ZN3ccc8CC6x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y0C1Ev();
extern void _ZN3ccc8CC6x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y0E[] = {
  NSPAIR(_ZN3ccc8CC6x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y0E[];
extern void _ZN3ccc8CC6x11y03pqrEv();
extern void _ZN3ccc8CC6x11y03efgEv();
extern void _ZN3ccc8CC6x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y03abcEv,_ZTv0_n12_N3ccc8CC6x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y03abcEv,_ZThn4_N3ccc8CC6x11y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y03efgEv,_ZTv0_n16_N3ccc8CC6x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y03efgEv,_ZThn4_N3ccc8CC6x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y03abcEv,_ZTv0_n12_N3ccc8CC6x11y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y03efgEv,_ZTv0_n16_N3ccc8CC6x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y0E[] = {
  {&(_ZTVN3ccc8CC6x11y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y0E[];
static VTBL_ENTRY alt_thunk_names653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y03efgEv,_ZTv0_n16_N3ccc8CC6x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y03efgEv,_ZThn4_N3ccc8CC6x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y03abcEv,_ZTv0_n12_N3ccc8CC6x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y03abcEv,_ZThn4_N3ccc8CC6x11y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y0E = {  "_ZN3ccc8CC6x11y0E", // class name
  bases__ZN3ccc8CC6x11y0E, 2,
  &(vtc__ZN3ccc8CC6x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y0E),2, //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  DD6x11y0  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD6x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD6x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x11y03pqrEv
  ~DD6x11y0(); // tgen
  DD6x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y0E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y03abcEv");}
void  ccc::DD6x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y03efgEv");}
void  ccc::DD6x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y03pqrEv");}
ccc::DD6x11y0 ::~DD6x11y0(){ note_dtor("_ZN3ccc8DD6x11y0E", this);} // tgen
ccc::DD6x11y0 ::DD6x11y0(){ note_ctor("_ZN3ccc8DD6x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y0E, buf);
    ::ccc::DD6x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y0E);
    dp->::ccc::DD6x11y0::~DD6x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y0E(Test__ZN3ccc8DD6x11y0E, "_ZN3ccc8DD6x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y0C1Ev();
extern void _ZN3ccc8DD6x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y0E[] = {
  NSPAIR(_ZN3ccc8DD6x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y0E[];
extern void _ZN3ccc8DD6x11y03abcEv();
extern void _ZN3ccc8DD6x11y03efgEv();
extern void _ZN3ccc8DD6x11y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y03pqrEv,_ZTv0_n12_N3ccc8DD6x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y03pqrEv,_ZThn4_N3ccc8DD6x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y03efgEv,_ZTv0_n16_N3ccc8DD6x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y03efgEv,_ZThn4_N3ccc8DD6x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y03pqrEv,_ZTv0_n12_N3ccc8DD6x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y03efgEv,_ZTv0_n16_N3ccc8DD6x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y0E[] = {
  {&(_ZTVN3ccc8DD6x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y0E[];
static VTBL_ENTRY alt_thunk_names654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y03efgEv,_ZTv0_n16_N3ccc8DD6x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y03efgEv,_ZThn4_N3ccc8DD6x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y03pqrEv,_ZTv0_n12_N3ccc8DD6x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y03pqrEv,_ZThn4_N3ccc8DD6x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y0E = {  "_ZN3ccc8DD6x11y0E", // class name
  bases__ZN3ccc8DD6x11y0E, 2,
  &(vtc__ZN3ccc8DD6x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y0E),3, //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  CC6x11y1  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x11y13efgEv
  ~CC6x11y1(); // tgen
  CC6x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y1E) C1{ VBC2{ v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y13abcEv");}
void  ccc::CC6x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y13pqrEv");}
void  ccc::CC6x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y13efgEv");}
ccc::CC6x11y1 ::~CC6x11y1(){ note_dtor("_ZN3ccc8CC6x11y1E", this);} // tgen
ccc::CC6x11y1 ::CC6x11y1(){ note_ctor("_ZN3ccc8CC6x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y1E, buf);
    ::ccc::CC6x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y1E);
    dp->::ccc::CC6x11y1::~CC6x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y1E(Test__ZN3ccc8CC6x11y1E, "_ZN3ccc8CC6x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y1C1Ev();
extern void _ZN3ccc8CC6x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y1E[] = {
  NSPAIR(_ZN3ccc8CC6x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y1E[];
extern void _ZN3ccc8CC6x11y13pqrEv();
extern void _ZN3ccc8CC6x11y13efgEv();
extern void _ZN3ccc8CC6x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y13abcEv,_ZTv0_n12_N3ccc8CC6x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y13abcEv,_ZThn4_N3ccc8CC6x11y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y13efgEv,_ZTv0_n16_N3ccc8CC6x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y13efgEv,_ZThn4_N3ccc8CC6x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y13abcEv,_ZTv0_n12_N3ccc8CC6x11y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y13efgEv,_ZTv0_n16_N3ccc8CC6x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y1E[] = {
  {&(_ZTVN3ccc8CC6x11y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y1E[];
static VTBL_ENTRY alt_thunk_names655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y13efgEv,_ZTv0_n16_N3ccc8CC6x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y13efgEv,_ZThn4_N3ccc8CC6x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y13abcEv,_ZTv0_n12_N3ccc8CC6x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y13abcEv,_ZThn4_N3ccc8CC6x11y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y1E = {  "_ZN3ccc8CC6x11y1E", // class name
  bases__ZN3ccc8CC6x11y1E, 2,
  &(vtc__ZN3ccc8CC6x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y1E),2, //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  DD6x11y1  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD6x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x11y13efgEv
  ~DD6x11y1(); // tgen
  DD6x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y1E) C1{ VBC2{ v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y13abcEv");}
void  ccc::DD6x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y13pqrEv");}
void  ccc::DD6x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y13efgEv");}
ccc::DD6x11y1 ::~DD6x11y1(){ note_dtor("_ZN3ccc8DD6x11y1E", this);} // tgen
ccc::DD6x11y1 ::DD6x11y1(){ note_ctor("_ZN3ccc8DD6x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y1E, buf);
    ::ccc::DD6x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y1E);
    dp->::ccc::DD6x11y1::~DD6x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y1E(Test__ZN3ccc8DD6x11y1E, "_ZN3ccc8DD6x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y1C1Ev();
extern void _ZN3ccc8DD6x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y1E[] = {
  NSPAIR(_ZN3ccc8DD6x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y1E[];
extern void _ZN3ccc8DD6x11y13abcEv();
extern void _ZN3ccc8DD6x11y13efgEv();
extern void _ZN3ccc8DD6x11y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y13pqrEv,_ZTv0_n12_N3ccc8DD6x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y13pqrEv,_ZThn4_N3ccc8DD6x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y13efgEv,_ZTv0_n16_N3ccc8DD6x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y13efgEv,_ZThn4_N3ccc8DD6x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y13pqrEv,_ZTv0_n12_N3ccc8DD6x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y13efgEv,_ZTv0_n16_N3ccc8DD6x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y1E[] = {
  {&(_ZTVN3ccc8DD6x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y1E[];
static VTBL_ENTRY alt_thunk_names656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y13efgEv,_ZTv0_n16_N3ccc8DD6x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y13efgEv,_ZThn4_N3ccc8DD6x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y13pqrEv,_ZTv0_n12_N3ccc8DD6x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y13pqrEv,_ZThn4_N3ccc8DD6x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y1E = {  "_ZN3ccc8DD6x11y1E", // class name
  bases__ZN3ccc8DD6x11y1E, 2,
  &(vtc__ZN3ccc8DD6x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y1E),3, //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  CC6x11y2  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y23pqrEv
  ~CC6x11y2(); // tgen
  CC6x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y2E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y23efgEv");}
void  ccc::CC6x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y23abcEv");}
void  ccc::CC6x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y23pqrEv");}
ccc::CC6x11y2 ::~CC6x11y2(){ note_dtor("_ZN3ccc8CC6x11y2E", this);} // tgen
ccc::CC6x11y2 ::CC6x11y2(){ note_ctor("_ZN3ccc8CC6x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y2E, buf);
    ::ccc::CC6x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y2E);
    dp->::ccc::CC6x11y2::~CC6x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y2E(Test__ZN3ccc8CC6x11y2E, "_ZN3ccc8CC6x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y2C1Ev();
extern void _ZN3ccc8CC6x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y2E[] = {
  NSPAIR(_ZN3ccc8CC6x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y2E[];
extern void _ZN3ccc8CC6x11y23pqrEv();
extern void _ZN3ccc8CC6x11y23efgEv();
extern void _ZN3ccc8CC6x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y23abcEv,_ZTv0_n12_N3ccc8CC6x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y23abcEv,_ZThn4_N3ccc8CC6x11y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y23efgEv,_ZTv0_n16_N3ccc8CC6x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y23efgEv,_ZThn4_N3ccc8CC6x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y23abcEv,_ZTv0_n12_N3ccc8CC6x11y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y23efgEv,_ZTv0_n16_N3ccc8CC6x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y2E[] = {
  {&(_ZTVN3ccc8CC6x11y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y2E[];
static VTBL_ENTRY alt_thunk_names657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y23efgEv,_ZTv0_n16_N3ccc8CC6x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y23efgEv,_ZThn4_N3ccc8CC6x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y23abcEv,_ZTv0_n12_N3ccc8CC6x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y23abcEv,_ZThn4_N3ccc8CC6x11y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y2E = {  "_ZN3ccc8CC6x11y2E", // class name
  bases__ZN3ccc8CC6x11y2E, 2,
  &(vtc__ZN3ccc8CC6x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y2E),2, //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  DD6x11y2  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD6x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD6x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x11y23pqrEv
  ~DD6x11y2(); // tgen
  DD6x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y2E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y23efgEv");}
void  ccc::DD6x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y23abcEv");}
void  ccc::DD6x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y23pqrEv");}
ccc::DD6x11y2 ::~DD6x11y2(){ note_dtor("_ZN3ccc8DD6x11y2E", this);} // tgen
ccc::DD6x11y2 ::DD6x11y2(){ note_ctor("_ZN3ccc8DD6x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y2E, buf);
    ::ccc::DD6x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y2E);
    dp->::ccc::DD6x11y2::~DD6x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y2E(Test__ZN3ccc8DD6x11y2E, "_ZN3ccc8DD6x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y2C1Ev();
extern void _ZN3ccc8DD6x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y2E[] = {
  NSPAIR(_ZN3ccc8DD6x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y2E[];
extern void _ZN3ccc8DD6x11y23abcEv();
extern void _ZN3ccc8DD6x11y23efgEv();
extern void _ZN3ccc8DD6x11y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y23pqrEv,_ZTv0_n12_N3ccc8DD6x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y23pqrEv,_ZThn4_N3ccc8DD6x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y23efgEv,_ZTv0_n16_N3ccc8DD6x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y23efgEv,_ZThn4_N3ccc8DD6x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y23pqrEv,_ZTv0_n12_N3ccc8DD6x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y23efgEv,_ZTv0_n16_N3ccc8DD6x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y2E[] = {
  {&(_ZTVN3ccc8DD6x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y2E[];
static VTBL_ENTRY alt_thunk_names658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y23efgEv,_ZTv0_n16_N3ccc8DD6x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y23efgEv,_ZThn4_N3ccc8DD6x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y23pqrEv,_ZTv0_n12_N3ccc8DD6x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y23pqrEv,_ZThn4_N3ccc8DD6x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y2E = {  "_ZN3ccc8DD6x11y2E", // class name
  bases__ZN3ccc8DD6x11y2E, 2,
  &(vtc__ZN3ccc8DD6x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y2E),3, //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  CC6x11y3  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x11y33abcEv
  ~CC6x11y3(); // tgen
  CC6x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y3E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y33efgEv");}
void  ccc::CC6x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y33pqrEv");}
void  ccc::CC6x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y33abcEv");}
ccc::CC6x11y3 ::~CC6x11y3(){ note_dtor("_ZN3ccc8CC6x11y3E", this);} // tgen
ccc::CC6x11y3 ::CC6x11y3(){ note_ctor("_ZN3ccc8CC6x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y3E, buf);
    ::ccc::CC6x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y3E);
    dp->::ccc::CC6x11y3::~CC6x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y3E(Test__ZN3ccc8CC6x11y3E, "_ZN3ccc8CC6x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y3C1Ev();
extern void _ZN3ccc8CC6x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y3E[] = {
  NSPAIR(_ZN3ccc8CC6x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y3E[];
extern void _ZN3ccc8CC6x11y33pqrEv();
extern void _ZN3ccc8CC6x11y33efgEv();
extern void _ZN3ccc8CC6x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y33abcEv,_ZTv0_n12_N3ccc8CC6x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y33abcEv,_ZThn4_N3ccc8CC6x11y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y33efgEv,_ZTv0_n16_N3ccc8CC6x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y33efgEv,_ZThn4_N3ccc8CC6x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y33abcEv,_ZTv0_n12_N3ccc8CC6x11y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y33efgEv,_ZTv0_n16_N3ccc8CC6x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y3E[] = {
  {&(_ZTVN3ccc8CC6x11y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y3E[];
static VTBL_ENTRY alt_thunk_names659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y33efgEv,_ZTv0_n16_N3ccc8CC6x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y33efgEv,_ZThn4_N3ccc8CC6x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y33abcEv,_ZTv0_n12_N3ccc8CC6x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y33abcEv,_ZThn4_N3ccc8CC6x11y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y3E = {  "_ZN3ccc8CC6x11y3E", // class name
  bases__ZN3ccc8CC6x11y3E, 2,
  &(vtc__ZN3ccc8CC6x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y3E),2, //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  DD6x11y3  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD6x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x11y33abcEv
  ~DD6x11y3(); // tgen
  DD6x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y3E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y33efgEv");}
void  ccc::DD6x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y33pqrEv");}
void  ccc::DD6x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y33abcEv");}
ccc::DD6x11y3 ::~DD6x11y3(){ note_dtor("_ZN3ccc8DD6x11y3E", this);} // tgen
ccc::DD6x11y3 ::DD6x11y3(){ note_ctor("_ZN3ccc8DD6x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y3E, buf);
    ::ccc::DD6x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y3E);
    dp->::ccc::DD6x11y3::~DD6x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y3E(Test__ZN3ccc8DD6x11y3E, "_ZN3ccc8DD6x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y3C1Ev();
extern void _ZN3ccc8DD6x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y3E[] = {
  NSPAIR(_ZN3ccc8DD6x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y3E[];
extern void _ZN3ccc8DD6x11y33abcEv();
extern void _ZN3ccc8DD6x11y33efgEv();
extern void _ZN3ccc8DD6x11y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y33pqrEv,_ZTv0_n12_N3ccc8DD6x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y33pqrEv,_ZThn4_N3ccc8DD6x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y33efgEv,_ZTv0_n16_N3ccc8DD6x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y33efgEv,_ZThn4_N3ccc8DD6x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y33pqrEv,_ZTv0_n12_N3ccc8DD6x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y33efgEv,_ZTv0_n16_N3ccc8DD6x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y3E[] = {
  {&(_ZTVN3ccc8DD6x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y3E[];
static VTBL_ENTRY alt_thunk_names660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y33efgEv,_ZTv0_n16_N3ccc8DD6x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y33efgEv,_ZThn4_N3ccc8DD6x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y33pqrEv,_ZTv0_n12_N3ccc8DD6x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y33pqrEv,_ZThn4_N3ccc8DD6x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y3E = {  "_ZN3ccc8DD6x11y3E", // class name
  bases__ZN3ccc8DD6x11y3E, 2,
  &(vtc__ZN3ccc8DD6x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y3E),3, //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  CC6x11y4  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC6x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x11y43efgEv
  ~CC6x11y4(); // tgen
  CC6x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y4E) C1{ VBC2{ v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y43pqrEv");}
void  ccc::CC6x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y43abcEv");}
void  ccc::CC6x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y43efgEv");}
ccc::CC6x11y4 ::~CC6x11y4(){ note_dtor("_ZN3ccc8CC6x11y4E", this);} // tgen
ccc::CC6x11y4 ::CC6x11y4(){ note_ctor("_ZN3ccc8CC6x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y4E, buf);
    ::ccc::CC6x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y4E);
    dp->::ccc::CC6x11y4::~CC6x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y4E(Test__ZN3ccc8CC6x11y4E, "_ZN3ccc8CC6x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y4C1Ev();
extern void _ZN3ccc8CC6x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y4E[] = {
  NSPAIR(_ZN3ccc8CC6x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y4E[];
extern void _ZN3ccc8CC6x11y43pqrEv();
extern void _ZN3ccc8CC6x11y43efgEv();
extern void _ZN3ccc8CC6x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y43abcEv,_ZTv0_n12_N3ccc8CC6x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y43abcEv,_ZThn4_N3ccc8CC6x11y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y43efgEv,_ZTv0_n16_N3ccc8CC6x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y43efgEv,_ZThn4_N3ccc8CC6x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y43abcEv,_ZTv0_n12_N3ccc8CC6x11y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y43efgEv,_ZTv0_n16_N3ccc8CC6x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y4E[] = {
  {&(_ZTVN3ccc8CC6x11y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y4E[];
static VTBL_ENTRY alt_thunk_names661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y43efgEv,_ZTv0_n16_N3ccc8CC6x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y43efgEv,_ZThn4_N3ccc8CC6x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y43abcEv,_ZTv0_n12_N3ccc8CC6x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y43abcEv,_ZThn4_N3ccc8CC6x11y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y4E = {  "_ZN3ccc8CC6x11y4E", // class name
  bases__ZN3ccc8CC6x11y4E, 2,
  &(vtc__ZN3ccc8CC6x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y4E),2, //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  DD6x11y4  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD6x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD6x11y43efgEv
  ~DD6x11y4(); // tgen
  DD6x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y4E) C1{ VBC2{ v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y43pqrEv");}
void  ccc::DD6x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y43abcEv");}
void  ccc::DD6x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y43efgEv");}
ccc::DD6x11y4 ::~DD6x11y4(){ note_dtor("_ZN3ccc8DD6x11y4E", this);} // tgen
ccc::DD6x11y4 ::DD6x11y4(){ note_ctor("_ZN3ccc8DD6x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y4E, buf);
    ::ccc::DD6x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y4E);
    dp->::ccc::DD6x11y4::~DD6x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y4E(Test__ZN3ccc8DD6x11y4E, "_ZN3ccc8DD6x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y4C1Ev();
extern void _ZN3ccc8DD6x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y4E[] = {
  NSPAIR(_ZN3ccc8DD6x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y4E[];
extern void _ZN3ccc8DD6x11y43abcEv();
extern void _ZN3ccc8DD6x11y43efgEv();
extern void _ZN3ccc8DD6x11y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y43pqrEv,_ZTv0_n12_N3ccc8DD6x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y43pqrEv,_ZThn4_N3ccc8DD6x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y43efgEv,_ZTv0_n16_N3ccc8DD6x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y43efgEv,_ZThn4_N3ccc8DD6x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y43pqrEv,_ZTv0_n12_N3ccc8DD6x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y43efgEv,_ZTv0_n16_N3ccc8DD6x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y4E[] = {
  {&(_ZTVN3ccc8DD6x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y4E[];
static VTBL_ENTRY alt_thunk_names662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y43efgEv,_ZTv0_n16_N3ccc8DD6x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y43efgEv,_ZThn4_N3ccc8DD6x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y43pqrEv,_ZTv0_n12_N3ccc8DD6x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y43pqrEv,_ZThn4_N3ccc8DD6x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y4E = {  "_ZN3ccc8DD6x11y4E", // class name
  bases__ZN3ccc8DD6x11y4E, 2,
  &(vtc__ZN3ccc8DD6x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y4E),3, //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  CC6x11y5  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC6x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x11y53abcEv
  ~CC6x11y5(); // tgen
  CC6x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y5E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y53pqrEv");}
void  ccc::CC6x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y53efgEv");}
void  ccc::CC6x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y53abcEv");}
ccc::CC6x11y5 ::~CC6x11y5(){ note_dtor("_ZN3ccc8CC6x11y5E", this);} // tgen
ccc::CC6x11y5 ::CC6x11y5(){ note_ctor("_ZN3ccc8CC6x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y5E, buf);
    ::ccc::CC6x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y5E);
    dp->::ccc::CC6x11y5::~CC6x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y5E(Test__ZN3ccc8CC6x11y5E, "_ZN3ccc8CC6x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y5C1Ev();
extern void _ZN3ccc8CC6x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y5E[] = {
  NSPAIR(_ZN3ccc8CC6x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y5E[];
extern void _ZN3ccc8CC6x11y53pqrEv();
extern void _ZN3ccc8CC6x11y53efgEv();
extern void _ZN3ccc8CC6x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y53abcEv,_ZTv0_n12_N3ccc8CC6x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y53abcEv,_ZThn4_N3ccc8CC6x11y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y53efgEv,_ZTv0_n16_N3ccc8CC6x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y53efgEv,_ZThn4_N3ccc8CC6x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y53abcEv,_ZTv0_n12_N3ccc8CC6x11y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y53efgEv,_ZTv0_n16_N3ccc8CC6x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y5E[] = {
  {&(_ZTVN3ccc8CC6x11y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y5E[];
static VTBL_ENTRY alt_thunk_names663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y53efgEv,_ZTv0_n16_N3ccc8CC6x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y53efgEv,_ZThn4_N3ccc8CC6x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y53abcEv,_ZTv0_n12_N3ccc8CC6x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y53abcEv,_ZThn4_N3ccc8CC6x11y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y5E = {  "_ZN3ccc8CC6x11y5E", // class name
  bases__ZN3ccc8CC6x11y5E, 2,
  &(vtc__ZN3ccc8CC6x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y5E),2, //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  DD6x11y5  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD6x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD6x11y53abcEv
  ~DD6x11y5(); // tgen
  DD6x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y5E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y53pqrEv");}
void  ccc::DD6x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y53efgEv");}
void  ccc::DD6x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y53abcEv");}
ccc::DD6x11y5 ::~DD6x11y5(){ note_dtor("_ZN3ccc8DD6x11y5E", this);} // tgen
ccc::DD6x11y5 ::DD6x11y5(){ note_ctor("_ZN3ccc8DD6x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y5E, buf);
    ::ccc::DD6x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y5E);
    dp->::ccc::DD6x11y5::~DD6x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y5E(Test__ZN3ccc8DD6x11y5E, "_ZN3ccc8DD6x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y5C1Ev();
extern void _ZN3ccc8DD6x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y5E[] = {
  NSPAIR(_ZN3ccc8DD6x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y5E[];
extern void _ZN3ccc8DD6x11y53abcEv();
extern void _ZN3ccc8DD6x11y53efgEv();
extern void _ZN3ccc8DD6x11y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y53pqrEv,_ZTv0_n12_N3ccc8DD6x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y53pqrEv,_ZThn4_N3ccc8DD6x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y53efgEv,_ZTv0_n16_N3ccc8DD6x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y53efgEv,_ZThn4_N3ccc8DD6x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y53pqrEv,_ZTv0_n12_N3ccc8DD6x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y53efgEv,_ZTv0_n16_N3ccc8DD6x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y5E[] = {
  {&(_ZTVN3ccc8DD6x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y5E[];
static VTBL_ENTRY alt_thunk_names664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y53efgEv,_ZTv0_n16_N3ccc8DD6x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y53efgEv,_ZThn4_N3ccc8DD6x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y53pqrEv,_ZTv0_n12_N3ccc8DD6x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y53pqrEv,_ZThn4_N3ccc8DD6x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y5E = {  "_ZN3ccc8DD6x11y5E", // class name
  bases__ZN3ccc8DD6x11y5E, 2,
  &(vtc__ZN3ccc8DD6x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y5E),3, //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  CC6x11y6  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x11y63efgEv
  ~CC6x11y6(); // tgen
  CC6x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y6E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y63abcEv");}
void  ccc::CC6x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y63efgEv");}
ccc::CC6x11y6 ::~CC6x11y6(){ note_dtor("_ZN3ccc8CC6x11y6E", this);} // tgen
ccc::CC6x11y6 ::CC6x11y6(){ note_ctor("_ZN3ccc8CC6x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y6E, buf);
    ::ccc::CC6x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y6E);
    dp->::ccc::CC6x11y6::~CC6x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y6E(Test__ZN3ccc8CC6x11y6E, "_ZN3ccc8CC6x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y6C1Ev();
extern void _ZN3ccc8CC6x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y6E[] = {
  NSPAIR(_ZN3ccc8CC6x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC6x11y63efgEv();
extern void _ZN3ccc8CC6x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y63abcEv,_ZTv0_n12_N3ccc8CC6x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y63abcEv,_ZThn4_N3ccc8CC6x11y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y63efgEv,_ZTv0_n16_N3ccc8CC6x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y63efgEv,_ZThn4_N3ccc8CC6x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y63abcEv,_ZTv0_n12_N3ccc8CC6x11y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y63efgEv,_ZTv0_n16_N3ccc8CC6x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y6E[] = {
  {&(_ZTVN3ccc8CC6x11y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y6E[];
static VTBL_ENTRY alt_thunk_names665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y63efgEv,_ZTv0_n16_N3ccc8CC6x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y63efgEv,_ZThn4_N3ccc8CC6x11y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y63abcEv,_ZTv0_n12_N3ccc8CC6x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y63abcEv,_ZThn4_N3ccc8CC6x11y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y6E = {  "_ZN3ccc8CC6x11y6E", // class name
  bases__ZN3ccc8CC6x11y6E, 2,
  &(vtc__ZN3ccc8CC6x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y6E),2, //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  DD6x11y6  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD6x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD6x11y63efgEv
  ~DD6x11y6(); // tgen
  DD6x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y6E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y63abcEv");}
void  ccc::DD6x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y63efgEv");}
ccc::DD6x11y6 ::~DD6x11y6(){ note_dtor("_ZN3ccc8DD6x11y6E", this);} // tgen
ccc::DD6x11y6 ::DD6x11y6(){ note_ctor("_ZN3ccc8DD6x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y6E, buf);
    ::ccc::DD6x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y6E);
    dp->::ccc::DD6x11y6::~DD6x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y6E(Test__ZN3ccc8DD6x11y6E, "_ZN3ccc8DD6x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y6C1Ev();
extern void _ZN3ccc8DD6x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y6E[] = {
  NSPAIR(_ZN3ccc8DD6x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y6E[];
extern void _ZN3ccc8DD6x11y63abcEv();
extern void _ZN3ccc8DD6x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y63efgEv,_ZTv0_n16_N3ccc8DD6x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y63efgEv,_ZThn4_N3ccc8DD6x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y63efgEv,_ZTv0_n16_N3ccc8DD6x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y6E[] = {
  {&(_ZTVN3ccc8DD6x11y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x11y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x11y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y6E[];
static VTBL_ENTRY alt_thunk_names666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y63efgEv,_ZTv0_n16_N3ccc8DD6x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y63efgEv,_ZThn4_N3ccc8DD6x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y6E = {  "_ZN3ccc8DD6x11y6E", // class name
  bases__ZN3ccc8DD6x11y6E, 2,
  &(vtc__ZN3ccc8DD6x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y6E),3, //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  CC6x11y7  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC6x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y73pqrEv
  ~CC6x11y7(); // tgen
  CC6x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y7E) C1{ VBC2{ v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y73abcEv");}
void  ccc::CC6x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y73pqrEv");}
ccc::CC6x11y7 ::~CC6x11y7(){ note_dtor("_ZN3ccc8CC6x11y7E", this);} // tgen
ccc::CC6x11y7 ::CC6x11y7(){ note_ctor("_ZN3ccc8CC6x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y7E, buf);
    ::ccc::CC6x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y7E);
    dp->::ccc::CC6x11y7::~CC6x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y7E(Test__ZN3ccc8CC6x11y7E, "_ZN3ccc8CC6x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y7C1Ev();
extern void _ZN3ccc8CC6x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y7E[] = {
  NSPAIR(_ZN3ccc8CC6x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y7E[];
extern void _ZN3ccc8CC6x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC6x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y73abcEv,_ZTv0_n12_N3ccc8CC6x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y73abcEv,_ZThn4_N3ccc8CC6x11y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y73abcEv,_ZTv0_n12_N3ccc8CC6x11y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y7E[] = {
  {&(_ZTVN3ccc8CC6x11y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y7E[];
static VTBL_ENTRY alt_thunk_names667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y73abcEv,_ZTv0_n12_N3ccc8CC6x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y73abcEv,_ZThn4_N3ccc8CC6x11y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y7E = {  "_ZN3ccc8CC6x11y7E", // class name
  bases__ZN3ccc8CC6x11y7E, 2,
  &(vtc__ZN3ccc8CC6x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y7E),2, //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  DD6x11y7  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD6x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x11y73pqrEv
  ~DD6x11y7(); // tgen
  DD6x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y7E) C1{ VBC2{ v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y73abcEv");}
void  ccc::DD6x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y73pqrEv");}
ccc::DD6x11y7 ::~DD6x11y7(){ note_dtor("_ZN3ccc8DD6x11y7E", this);} // tgen
ccc::DD6x11y7 ::DD6x11y7(){ note_ctor("_ZN3ccc8DD6x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y7E, buf);
    ::ccc::DD6x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y7E);
    dp->::ccc::DD6x11y7::~DD6x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y7E(Test__ZN3ccc8DD6x11y7E, "_ZN3ccc8DD6x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y7C1Ev();
extern void _ZN3ccc8DD6x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y7E[] = {
  NSPAIR(_ZN3ccc8DD6x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y7E[];
extern void _ZN3ccc8DD6x11y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x11y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y73pqrEv,_ZTv0_n12_N3ccc8DD6x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y73pqrEv,_ZThn4_N3ccc8DD6x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y73pqrEv,_ZTv0_n12_N3ccc8DD6x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y7E[] = {
  {&(_ZTVN3ccc8DD6x11y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y7E[];
static VTBL_ENTRY alt_thunk_names668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y73pqrEv,_ZTv0_n12_N3ccc8DD6x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y73pqrEv,_ZThn4_N3ccc8DD6x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y7E = {  "_ZN3ccc8DD6x11y7E", // class name
  bases__ZN3ccc8DD6x11y7E, 2,
  &(vtc__ZN3ccc8DD6x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y7E),3, //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  CC6x11y8  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x11y83abcEv
  ~CC6x11y8(); // tgen
  CC6x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y8E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y83efgEv");}
void  ccc::CC6x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x11y83abcEv");}
ccc::CC6x11y8 ::~CC6x11y8(){ note_dtor("_ZN3ccc8CC6x11y8E", this);} // tgen
ccc::CC6x11y8 ::CC6x11y8(){ note_ctor("_ZN3ccc8CC6x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y8E, buf);
    ::ccc::CC6x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y8E);
    dp->::ccc::CC6x11y8::~CC6x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y8E(Test__ZN3ccc8CC6x11y8E, "_ZN3ccc8CC6x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y8C1Ev();
extern void _ZN3ccc8CC6x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y8E[] = {
  NSPAIR(_ZN3ccc8CC6x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC6x11y83efgEv();
extern void _ZN3ccc8CC6x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x11y83abcEv,_ZTv0_n12_N3ccc8CC6x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y83abcEv,_ZThn4_N3ccc8CC6x11y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y83efgEv,_ZTv0_n16_N3ccc8CC6x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y83efgEv,_ZThn4_N3ccc8CC6x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x11y83abcEv,_ZTv0_n12_N3ccc8CC6x11y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y83efgEv,_ZTv0_n16_N3ccc8CC6x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y8E[] = {
  {&(_ZTVN3ccc8CC6x11y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x11y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y8E[];
static VTBL_ENTRY alt_thunk_names669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y83efgEv,_ZTv0_n16_N3ccc8CC6x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y83efgEv,_ZThn4_N3ccc8CC6x11y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x11y83abcEv,_ZTv0_n12_N3ccc8CC6x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y83abcEv,_ZThn4_N3ccc8CC6x11y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y8E = {  "_ZN3ccc8CC6x11y8E", // class name
  bases__ZN3ccc8CC6x11y8E, 2,
  &(vtc__ZN3ccc8CC6x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y8E),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  DD6x11y8  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD6x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD6x11y83abcEv
  ~DD6x11y8(); // tgen
  DD6x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y8E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y83efgEv");}
void  ccc::DD6x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x11y83abcEv");}
ccc::DD6x11y8 ::~DD6x11y8(){ note_dtor("_ZN3ccc8DD6x11y8E", this);} // tgen
ccc::DD6x11y8 ::DD6x11y8(){ note_ctor("_ZN3ccc8DD6x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y8E, buf);
    ::ccc::DD6x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y8E);
    dp->::ccc::DD6x11y8::~DD6x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y8E(Test__ZN3ccc8DD6x11y8E, "_ZN3ccc8DD6x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y8C1Ev();
extern void _ZN3ccc8DD6x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y8E[] = {
  NSPAIR(_ZN3ccc8DD6x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y8E[];
extern void _ZN3ccc8DD6x11y83abcEv();
extern void _ZN3ccc8DD6x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y83efgEv,_ZTv0_n16_N3ccc8DD6x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y83efgEv,_ZThn4_N3ccc8DD6x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y83efgEv,_ZTv0_n16_N3ccc8DD6x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y8E[] = {
  {&(_ZTVN3ccc8DD6x11y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x11y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD6x11y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y8E[];
static VTBL_ENTRY alt_thunk_names670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y83efgEv,_ZTv0_n16_N3ccc8DD6x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y83efgEv,_ZThn4_N3ccc8DD6x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y8E = {  "_ZN3ccc8DD6x11y8E", // class name
  bases__ZN3ccc8DD6x11y8E, 2,
  &(vtc__ZN3ccc8DD6x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y8E),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  CC6x11y9  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC6x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x11y93pqrEv
  ~CC6x11y9(); // tgen
  CC6x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x11y9E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x11y93efgEv");}
void  ccc::CC6x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x11y93pqrEv");}
ccc::CC6x11y9 ::~CC6x11y9(){ note_dtor("_ZN3ccc8CC6x11y9E", this);} // tgen
ccc::CC6x11y9 ::CC6x11y9(){ note_ctor("_ZN3ccc8CC6x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC6x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x11y9E, buf);
    ::ccc::CC6x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x11y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC6x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x11y9E);
    dp->::ccc::CC6x11y9::~CC6x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x11y9E(Test__ZN3ccc8CC6x11y9E, "_ZN3ccc8CC6x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x11y9C1Ev();
extern void _ZN3ccc8CC6x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC6x11y9E[] = {
  NSPAIR(_ZN3ccc8CC6x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC6x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC6x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x11y9E[];
extern void _ZN3ccc8CC6x11y93pqrEv();
extern void _ZN3ccc8CC6x11y93efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x11y93efgEv,_ZTv0_n16_N3ccc8CC6x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x11y93efgEv,_ZThn4_N3ccc8CC6x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x11y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x11y93efgEv,_ZTv0_n16_N3ccc8CC6x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x11y9E[] = {
  {&(_ZTVN3ccc8CC6x11y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x11y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x11y9E[];
static VTBL_ENTRY alt_thunk_names671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x11y93efgEv,_ZTv0_n16_N3ccc8CC6x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x11y93efgEv,_ZThn4_N3ccc8CC6x11y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x11y9E = {  "_ZN3ccc8CC6x11y9E", // class name
  bases__ZN3ccc8CC6x11y9E, 2,
  &(vtc__ZN3ccc8CC6x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x11y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x11y9E),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  DD6x11y9  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD6x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x11y93pqrEv
  ~DD6x11y9(); // tgen
  DD6x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD6x11y9E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x11y93efgEv");}
void  ccc::DD6x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x11y93pqrEv");}
ccc::DD6x11y9 ::~DD6x11y9(){ note_dtor("_ZN3ccc8DD6x11y9E", this);} // tgen
ccc::DD6x11y9 ::DD6x11y9(){ note_ctor("_ZN3ccc8DD6x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD6x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x11y9E, buf);
    ::ccc::DD6x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x11y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD6x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x11y9E);
    dp->::ccc::DD6x11y9::~DD6x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x11y9E(Test__ZN3ccc8DD6x11y9E, "_ZN3ccc8DD6x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x11y9C1Ev();
extern void _ZN3ccc8DD6x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD6x11y9E[] = {
  NSPAIR(_ZN3ccc8DD6x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD6x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD6x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x11y93efgEv();
extern void _ZN3ccc8DD6x11y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x11y93pqrEv,_ZTv0_n12_N3ccc8DD6x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y93pqrEv,_ZThn4_N3ccc8DD6x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD6x11y93efgEv,_ZTv0_n16_N3ccc8DD6x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x11y93efgEv,_ZThn4_N3ccc8DD6x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x11y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x11y93pqrEv,_ZTv0_n12_N3ccc8DD6x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD6x11y93efgEv,_ZTv0_n16_N3ccc8DD6x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x11y9E[] = {
  {&(_ZTVN3ccc8DD6x11y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD6x11y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x11y9E[];
static VTBL_ENTRY alt_thunk_names672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD6x11y93efgEv,_ZTv0_n16_N3ccc8DD6x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y93efgEv,_ZThn4_N3ccc8DD6x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x11y93pqrEv,_ZTv0_n12_N3ccc8DD6x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x11y93pqrEv,_ZThn4_N3ccc8DD6x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x11y9E = {  "_ZN3ccc8DD6x11y9E", // class name
  bases__ZN3ccc8DD6x11y9E, 2,
  &(vtc__ZN3ccc8DD6x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x11y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x11y9E),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  CC6x11y10  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC6x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x11y103abcEv
  ~CC6x11y10(); // tgen
  CC6x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y10E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x11y103pqrEv");}
void  ccc::CC6x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x11y103abcEv");}
ccc::CC6x11y10 ::~CC6x11y10(){ note_dtor("_ZN3ccc9CC6x11y10E", this);} // tgen
ccc::CC6x11y10 ::CC6x11y10(){ note_ctor("_ZN3ccc9CC6x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC6x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x11y10E, buf);
    ::ccc::CC6x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x11y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC6x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x11y10E);
    dp->::ccc::CC6x11y10::~CC6x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x11y10E(Test__ZN3ccc9CC6x11y10E, "_ZN3ccc9CC6x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x11y10C1Ev();
extern void _ZN3ccc9CC6x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC6x11y10E[] = {
  NSPAIR(_ZN3ccc9CC6x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC6x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC6x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x11y10E[];
extern void _ZN3ccc9CC6x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC6x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x11y103abcEv,_ZTv0_n12_N3ccc9CC6x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y103abcEv,_ZThn4_N3ccc9CC6x11y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x11y103abcEv,_ZTv0_n12_N3ccc9CC6x11y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x11y10E[] = {
  {&(_ZTVN3ccc9CC6x11y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC6x11y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x11y10E[];
static VTBL_ENTRY alt_thunk_names673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x11y103abcEv,_ZTv0_n12_N3ccc9CC6x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x11y103abcEv,_ZThn4_N3ccc9CC6x11y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x11y10E = {  "_ZN3ccc9CC6x11y10E", // class name
  bases__ZN3ccc9CC6x11y10E, 2,
  &(vtc__ZN3ccc9CC6x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x11y10E),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  DD6x11y10  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD6x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD6x11y103abcEv
  ~DD6x11y10(); // tgen
  DD6x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD6x11y10E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x11y103pqrEv");}
void  ccc::DD6x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x11y103abcEv");}
ccc::DD6x11y10 ::~DD6x11y10(){ note_dtor("_ZN3ccc9DD6x11y10E", this);} // tgen
ccc::DD6x11y10 ::DD6x11y10(){ note_ctor("_ZN3ccc9DD6x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD6x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x11y10E, buf);
    ::ccc::DD6x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x11y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD6x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x11y10E);
    dp->::ccc::DD6x11y10::~DD6x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x11y10E(Test__ZN3ccc9DD6x11y10E, "_ZN3ccc9DD6x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x11y10C1Ev();
extern void _ZN3ccc9DD6x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD6x11y10E[] = {
  NSPAIR(_ZN3ccc9DD6x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD6x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD6x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y10E[];
extern void _ZN3ccc9DD6x11y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x11y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x11y103pqrEv,_ZTv0_n12_N3ccc9DD6x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x11y103pqrEv,_ZThn4_N3ccc9DD6x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x11y103pqrEv,_ZTv0_n12_N3ccc9DD6x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x11y10E[] = {
  {&(_ZTVN3ccc9DD6x11y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x11y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x11y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x11y10E[];
static VTBL_ENTRY alt_thunk_names674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x11y103pqrEv,_ZTv0_n12_N3ccc9DD6x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x11y103pqrEv,_ZThn4_N3ccc9DD6x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x11y10E = {  "_ZN3ccc9DD6x11y10E", // class name
  bases__ZN3ccc9DD6x11y10E, 2,
  &(vtc__ZN3ccc9DD6x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x11y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x11y10E),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  CC6x11y11  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC6x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x11y113efgEv
  ~CC6x11y11(); // tgen
  CC6x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y11E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x11y113pqrEv");}
void  ccc::CC6x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x11y113efgEv");}
ccc::CC6x11y11 ::~CC6x11y11(){ note_dtor("_ZN3ccc9CC6x11y11E", this);} // tgen
ccc::CC6x11y11 ::CC6x11y11(){ note_ctor("_ZN3ccc9CC6x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC6x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x11y11E, buf);
    ::ccc::CC6x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x11y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC6x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x11y11E);
    dp->::ccc::CC6x11y11::~CC6x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x11y11E(Test__ZN3ccc9CC6x11y11E, "_ZN3ccc9CC6x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x11y11C1Ev();
extern void _ZN3ccc9CC6x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC6x11y11E[] = {
  NSPAIR(_ZN3ccc9CC6x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC6x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC6x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x11y11E[];
extern void _ZN3ccc9CC6x11y113pqrEv();
extern void _ZN3ccc9CC6x11y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x11y113efgEv,_ZTv0_n16_N3ccc9CC6x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y113efgEv,_ZThn4_N3ccc9CC6x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x11y113efgEv,_ZTv0_n16_N3ccc9CC6x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x11y11E[] = {
  {&(_ZTVN3ccc9CC6x11y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x11y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x11y11E[];
static VTBL_ENTRY alt_thunk_names675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x11y113efgEv,_ZTv0_n16_N3ccc9CC6x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x11y113efgEv,_ZThn4_N3ccc9CC6x11y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x11y11E = {  "_ZN3ccc9CC6x11y11E", // class name
  bases__ZN3ccc9CC6x11y11E, 2,
  &(vtc__ZN3ccc9CC6x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x11y11E),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  DD6x11y11  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD6x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD6x11y113efgEv
  ~DD6x11y11(); // tgen
  DD6x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD6x11y11E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x11y113pqrEv");}
void  ccc::DD6x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x11y113efgEv");}
ccc::DD6x11y11 ::~DD6x11y11(){ note_dtor("_ZN3ccc9DD6x11y11E", this);} // tgen
ccc::DD6x11y11 ::DD6x11y11(){ note_ctor("_ZN3ccc9DD6x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD6x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x11y11E, buf);
    ::ccc::DD6x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x11y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD6x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x11y11E);
    dp->::ccc::DD6x11y11::~DD6x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x11y11E(Test__ZN3ccc9DD6x11y11E, "_ZN3ccc9DD6x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x11y11C1Ev();
extern void _ZN3ccc9DD6x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD6x11y11E[] = {
  NSPAIR(_ZN3ccc9DD6x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD6x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD6x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x11y113efgEv();
extern void _ZN3ccc9DD6x11y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x11y113pqrEv,_ZTv0_n12_N3ccc9DD6x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x11y113pqrEv,_ZThn4_N3ccc9DD6x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD6x11y113efgEv,_ZTv0_n16_N3ccc9DD6x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x11y113efgEv,_ZThn4_N3ccc9DD6x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x11y113pqrEv,_ZTv0_n12_N3ccc9DD6x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD6x11y113efgEv,_ZTv0_n16_N3ccc9DD6x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x11y11E[] = {
  {&(_ZTVN3ccc9DD6x11y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x11y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x11y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x11y11E[];
static VTBL_ENTRY alt_thunk_names676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD6x11y113efgEv,_ZTv0_n16_N3ccc9DD6x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x11y113efgEv,_ZThn4_N3ccc9DD6x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x11y113pqrEv,_ZTv0_n12_N3ccc9DD6x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x11y113pqrEv,_ZThn4_N3ccc9DD6x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x11y11E = {  "_ZN3ccc9DD6x11y11E", // class name
  bases__ZN3ccc9DD6x11y11E, 2,
  &(vtc__ZN3ccc9DD6x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x11y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x11y11E),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  CC6x11y12  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC6x11y123abcEv
  ~CC6x11y12(); // tgen
  CC6x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC6x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x11y123abcEv");}
ccc::CC6x11y12 ::~CC6x11y12(){ note_dtor("_ZN3ccc9CC6x11y12E", this);} // tgen
ccc::CC6x11y12 ::CC6x11y12(){ note_ctor("_ZN3ccc9CC6x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC6x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x11y12E, buf);
    ::ccc::CC6x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x11y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC6x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x11y12E);
    dp->::ccc::CC6x11y12::~CC6x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x11y12E(Test__ZN3ccc9CC6x11y12E, "_ZN3ccc9CC6x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x11y12C1Ev();
extern void _ZN3ccc9CC6x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC6x11y12E[] = {
  NSPAIR(_ZN3ccc9CC6x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC6x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC6x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC6x11y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x11y123abcEv,_ZTv0_n12_N3ccc9CC6x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y123abcEv,_ZThn4_N3ccc9CC6x11y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x11y123abcEv,_ZTv0_n12_N3ccc9CC6x11y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x11y12E[] = {
  {&(_ZTVN3ccc9CC6x11y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC6x11y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x11y12E[];
static VTBL_ENTRY alt_thunk_names677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x11y123abcEv,_ZTv0_n12_N3ccc9CC6x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x11y123abcEv,_ZThn4_N3ccc9CC6x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x11y12E = {  "_ZN3ccc9CC6x11y12E", // class name
  bases__ZN3ccc9CC6x11y12E, 2,
  &(vtc__ZN3ccc9CC6x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x11y12E),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  DD6x11y12  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD6x11y123abcEv
  ~DD6x11y12(); // tgen
  DD6x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD6x11y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD6x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x11y123abcEv");}
ccc::DD6x11y12 ::~DD6x11y12(){ note_dtor("_ZN3ccc9DD6x11y12E", this);} // tgen
ccc::DD6x11y12 ::DD6x11y12(){ note_ctor("_ZN3ccc9DD6x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD6x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x11y12E, buf);
    ::ccc::DD6x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x11y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD6x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x11y12E);
    dp->::ccc::DD6x11y12::~DD6x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x11y12E(Test__ZN3ccc9DD6x11y12E, "_ZN3ccc9DD6x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x11y12C1Ev();
extern void _ZN3ccc9DD6x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD6x11y12E[] = {
  NSPAIR(_ZN3ccc9DD6x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD6x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD6x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y12E[];
extern void _ZN3ccc9DD6x11y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x11y12E[] = {
  {&(_ZTVN3ccc9DD6x11y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x11y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x11y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x11y12E[];
Class_Descriptor cd__ZN3ccc9DD6x11y12E = {  "_ZN3ccc9DD6x11y12E", // class name
  bases__ZN3ccc9DD6x11y12E, 2,
  &(vtc__ZN3ccc9DD6x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x11y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x11y12E),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  CC6x11y13  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC6x11y133efgEv
  ~CC6x11y13(); // tgen
  CC6x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y13E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC6x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x11y133efgEv");}
ccc::CC6x11y13 ::~CC6x11y13(){ note_dtor("_ZN3ccc9CC6x11y13E", this);} // tgen
ccc::CC6x11y13 ::CC6x11y13(){ note_ctor("_ZN3ccc9CC6x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC6x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x11y13E, buf);
    ::ccc::CC6x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x11y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC6x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x11y13E);
    dp->::ccc::CC6x11y13::~CC6x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x11y13E(Test__ZN3ccc9CC6x11y13E, "_ZN3ccc9CC6x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x11y13C1Ev();
extern void _ZN3ccc9CC6x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC6x11y13E[] = {
  NSPAIR(_ZN3ccc9CC6x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC6x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC6x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC6x11y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x11y133efgEv,_ZTv0_n16_N3ccc9CC6x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x11y133efgEv,_ZThn4_N3ccc9CC6x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x11y133efgEv,_ZTv0_n16_N3ccc9CC6x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x11y13E[] = {
  {&(_ZTVN3ccc9CC6x11y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x11y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x11y13E[];
static VTBL_ENTRY alt_thunk_names678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x11y133efgEv,_ZTv0_n16_N3ccc9CC6x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x11y133efgEv,_ZThn4_N3ccc9CC6x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x11y13E = {  "_ZN3ccc9CC6x11y13E", // class name
  bases__ZN3ccc9CC6x11y13E, 2,
  &(vtc__ZN3ccc9CC6x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x11y13E),2, //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  DD6x11y13  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD6x11y133efgEv
  ~DD6x11y13(); // tgen
  DD6x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD6x11y13E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD6x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x11y133efgEv");}
ccc::DD6x11y13 ::~DD6x11y13(){ note_dtor("_ZN3ccc9DD6x11y13E", this);} // tgen
ccc::DD6x11y13 ::DD6x11y13(){ note_ctor("_ZN3ccc9DD6x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD6x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x11y13E, buf);
    ::ccc::DD6x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x11y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD6x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x11y13E);
    dp->::ccc::DD6x11y13::~DD6x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x11y13E(Test__ZN3ccc9DD6x11y13E, "_ZN3ccc9DD6x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x11y13C1Ev();
extern void _ZN3ccc9DD6x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD6x11y13E[] = {
  NSPAIR(_ZN3ccc9DD6x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD6x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD6x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD6x11y133efgEv,_ZTv0_n16_N3ccc9DD6x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x11y133efgEv,_ZThn4_N3ccc9DD6x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD6x11y133efgEv,_ZTv0_n16_N3ccc9DD6x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x11y13E[] = {
  {&(_ZTVN3ccc9DD6x11y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x11y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x11y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x11y13E[];
static VTBL_ENTRY alt_thunk_names679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD6x11y133efgEv,_ZTv0_n16_N3ccc9DD6x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x11y133efgEv,_ZThn4_N3ccc9DD6x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x11y13E = {  "_ZN3ccc9DD6x11y13E", // class name
  bases__ZN3ccc9DD6x11y13E, 2,
  &(vtc__ZN3ccc9DD6x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x11y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x11y13E),3, //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  CC6x11y14  : virtual ::ccc::AA6 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC6x11y143pqrEv
  ~CC6x11y14(); // tgen
  CC6x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC6x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x11y143pqrEv");}
ccc::CC6x11y14 ::~CC6x11y14(){ note_dtor("_ZN3ccc9CC6x11y14E", this);} // tgen
ccc::CC6x11y14 ::CC6x11y14(){ note_ctor("_ZN3ccc9CC6x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC6x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x11y14E, buf);
    ::ccc::CC6x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x11y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC6x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x11y14E);
    dp->::ccc::CC6x11y14::~CC6x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x11y14E(Test__ZN3ccc9CC6x11y14E, "_ZN3ccc9CC6x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x11y14C1Ev();
extern void _ZN3ccc9CC6x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC6x11y14E[] = {
  NSPAIR(_ZN3ccc9CC6x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC6x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC6x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x11y14E[];
extern void _ZN3ccc9CC6x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x11y14E[] = {
  {&(_ZTVN3ccc9CC6x11y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x11y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x11y14E[];
Class_Descriptor cd__ZN3ccc9CC6x11y14E = {  "_ZN3ccc9CC6x11y14E", // class name
  bases__ZN3ccc9CC6x11y14E, 2,
  &(vtc__ZN3ccc9CC6x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x11y14E),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  DD6x11y14  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD6x11y143pqrEv
  ~DD6x11y14(); // tgen
  DD6x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD6x11y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD6x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x11y143pqrEv");}
ccc::DD6x11y14 ::~DD6x11y14(){ note_dtor("_ZN3ccc9DD6x11y14E", this);} // tgen
ccc::DD6x11y14 ::DD6x11y14(){ note_ctor("_ZN3ccc9DD6x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD6x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x11y14E, buf);
    ::ccc::DD6x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x11y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD6x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x11y14E);
    dp->::ccc::DD6x11y14::~DD6x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x11y14E(Test__ZN3ccc9DD6x11y14E, "_ZN3ccc9DD6x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x11y14C1Ev();
extern void _ZN3ccc9DD6x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD6x11y14E[] = {
  NSPAIR(_ZN3ccc9DD6x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD6x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD6x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x11y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x11y143pqrEv,_ZTv0_n12_N3ccc9DD6x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x11y143pqrEv,_ZThn4_N3ccc9DD6x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x11y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x11y143pqrEv,_ZTv0_n12_N3ccc9DD6x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x11y14E[] = {
  {&(_ZTVN3ccc9DD6x11y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x11y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD6x11y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x11y14E[];
static VTBL_ENTRY alt_thunk_names680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x11y143pqrEv,_ZTv0_n12_N3ccc9DD6x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x11y143pqrEv,_ZThn4_N3ccc9DD6x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x11y14E = {  "_ZN3ccc9DD6x11y14E", // class name
  bases__ZN3ccc9DD6x11y14E, 2,
  &(vtc__ZN3ccc9DD6x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x11y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x11y14E),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  CC6x11y15  : virtual ::ccc::AA6 , ::ccc::BB11 {
  ~CC6x11y15(); // tgen
  CC6x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x11y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC6x11y15 ::~CC6x11y15(){ note_dtor("_ZN3ccc9CC6x11y15E", this);} // tgen
ccc::CC6x11y15 ::CC6x11y15(){ note_ctor("_ZN3ccc9CC6x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC6x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x11y15E, buf);
    ::ccc::CC6x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x11y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC6x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x11y15E);
    dp->::ccc::CC6x11y15::~CC6x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x11y15E(Test__ZN3ccc9CC6x11y15E, "_ZN3ccc9CC6x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x11y15C1Ev();
extern void _ZN3ccc9CC6x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC6x11y15E[] = {
  NSPAIR(_ZN3ccc9CC6x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC6x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC6x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x11y15E[] = {
  {&(_ZTVN3ccc9CC6x11y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x11y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x11y15E[];
Class_Descriptor cd__ZN3ccc9CC6x11y15E = {  "_ZN3ccc9CC6x11y15E", // class name
  bases__ZN3ccc9CC6x11y15E, 2,
  &(vtc__ZN3ccc9CC6x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x11y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x11y15E),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  DD6x11y15  : virtual ::ccc::AA6 , virtual ::ccc::BB11 {
  ~DD6x11y15(); // tgen
  DD6x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD6x11y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD6x11y15 ::~DD6x11y15(){ note_dtor("_ZN3ccc9DD6x11y15E", this);} // tgen
ccc::DD6x11y15 ::DD6x11y15(){ note_ctor("_ZN3ccc9DD6x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD6x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x11y15E, buf);
    ::ccc::DD6x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x11y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD6x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x11y15E);
    dp->::ccc::DD6x11y15::~DD6x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x11y15E(Test__ZN3ccc9DD6x11y15E, "_ZN3ccc9DD6x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x11y15C1Ev();
extern void _ZN3ccc9DD6x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD6x11y15E[] = {
  NSPAIR(_ZN3ccc9DD6x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD6x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD6x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x11y15E[] = {
  {&(_ZTVN3ccc9DD6x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD6x11y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x11y15E[];
Class_Descriptor cd__ZN3ccc9DD6x11y15E = {  "_ZN3ccc9DD6x11y15E", // class name
  bases__ZN3ccc9DD6x11y15E, 2,
  &(vtc__ZN3ccc9DD6x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x11y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x11y15E),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  CC6x12y0  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y03pqrEv
  ~CC6x12y0(); // tgen
  CC6x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y0E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y03abcEv");}
void  ccc::CC6x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y03efgEv");}
void  ccc::CC6x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y03pqrEv");}
ccc::CC6x12y0 ::~CC6x12y0(){ note_dtor("_ZN3ccc8CC6x12y0E", this);} // tgen
ccc::CC6x12y0 ::CC6x12y0(){ note_ctor("_ZN3ccc8CC6x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y0E, buf);
    ::ccc::CC6x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y0E);
    dp->::ccc::CC6x12y0::~CC6x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y0E(Test__ZN3ccc8CC6x12y0E, "_ZN3ccc8CC6x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y0C1Ev();
extern void _ZN3ccc8CC6x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y0E[] = {
  NSPAIR(_ZN3ccc8CC6x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y0E[];
extern void _ZN3ccc8CC6x12y03abcEv();
extern void _ZN3ccc8CC6x12y03efgEv();
extern void _ZN3ccc8CC6x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y03abcEv,_ZTv0_n12_N3ccc8CC6x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y03abcEv,_ZThn4_N3ccc8CC6x12y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y03efgEv,_ZTv0_n16_N3ccc8CC6x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y03efgEv,_ZThn4_N3ccc8CC6x12y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y03abcEv,_ZTv0_n12_N3ccc8CC6x12y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y03efgEv,_ZTv0_n16_N3ccc8CC6x12y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y0E[] = {
  {&(_ZTVN3ccc8CC6x12y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y0E[];
static VTBL_ENTRY alt_thunk_names681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y03efgEv,_ZTv0_n16_N3ccc8CC6x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y03efgEv,_ZThn4_N3ccc8CC6x12y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y03abcEv,_ZTv0_n12_N3ccc8CC6x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y03abcEv,_ZThn4_N3ccc8CC6x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y0E = {  "_ZN3ccc8CC6x12y0E", // class name
  bases__ZN3ccc8CC6x12y0E, 2,
  &(vtc__ZN3ccc8CC6x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y0E),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  DD6x12y0  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD6x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD6x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x12y03pqrEv
  ~DD6x12y0(); // tgen
  DD6x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y0E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y03abcEv");}
void  ccc::DD6x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y03efgEv");}
void  ccc::DD6x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y03pqrEv");}
ccc::DD6x12y0 ::~DD6x12y0(){ note_dtor("_ZN3ccc8DD6x12y0E", this);} // tgen
ccc::DD6x12y0 ::DD6x12y0(){ note_ctor("_ZN3ccc8DD6x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y0E, buf);
    ::ccc::DD6x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y0E);
    dp->::ccc::DD6x12y0::~DD6x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y0E(Test__ZN3ccc8DD6x12y0E, "_ZN3ccc8DD6x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y0C1Ev();
extern void _ZN3ccc8DD6x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y0E[] = {
  NSPAIR(_ZN3ccc8DD6x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y0E[];
extern void _ZN3ccc8DD6x12y03abcEv();
extern void _ZN3ccc8DD6x12y03efgEv();
extern void _ZN3ccc8DD6x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y03abcEv,_ZTv0_n12_N3ccc8DD6x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y03abcEv,_ZThn4_N3ccc8DD6x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y03abcEv,_ZTv0_n12_N3ccc8DD6x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y0E[] = {
  {&(_ZTVN3ccc8DD6x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y0E[];
static VTBL_ENTRY alt_thunk_names682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y03abcEv,_ZTv0_n12_N3ccc8DD6x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y03abcEv,_ZThn4_N3ccc8DD6x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y0E = {  "_ZN3ccc8DD6x12y0E", // class name
  bases__ZN3ccc8DD6x12y0E, 2,
  &(vtc__ZN3ccc8DD6x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y0E),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  CC6x12y1  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x12y13efgEv
  ~CC6x12y1(); // tgen
  CC6x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y1E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y13abcEv");}
void  ccc::CC6x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y13pqrEv");}
void  ccc::CC6x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y13efgEv");}
ccc::CC6x12y1 ::~CC6x12y1(){ note_dtor("_ZN3ccc8CC6x12y1E", this);} // tgen
ccc::CC6x12y1 ::CC6x12y1(){ note_ctor("_ZN3ccc8CC6x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y1E, buf);
    ::ccc::CC6x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y1E);
    dp->::ccc::CC6x12y1::~CC6x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y1E(Test__ZN3ccc8CC6x12y1E, "_ZN3ccc8CC6x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y1C1Ev();
extern void _ZN3ccc8CC6x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y1E[] = {
  NSPAIR(_ZN3ccc8CC6x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y1E[];
extern void _ZN3ccc8CC6x12y13abcEv();
extern void _ZN3ccc8CC6x12y13pqrEv();
extern void _ZN3ccc8CC6x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y13abcEv,_ZTv0_n12_N3ccc8CC6x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y13abcEv,_ZThn4_N3ccc8CC6x12y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y13efgEv,_ZTv0_n16_N3ccc8CC6x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y13efgEv,_ZThn4_N3ccc8CC6x12y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y13abcEv,_ZTv0_n12_N3ccc8CC6x12y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y13efgEv,_ZTv0_n16_N3ccc8CC6x12y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y1E[] = {
  {&(_ZTVN3ccc8CC6x12y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y1E[];
static VTBL_ENTRY alt_thunk_names683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y13efgEv,_ZTv0_n16_N3ccc8CC6x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y13efgEv,_ZThn4_N3ccc8CC6x12y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y13abcEv,_ZTv0_n12_N3ccc8CC6x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y13abcEv,_ZThn4_N3ccc8CC6x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y1E = {  "_ZN3ccc8CC6x12y1E", // class name
  bases__ZN3ccc8CC6x12y1E, 2,
  &(vtc__ZN3ccc8CC6x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y1E),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  DD6x12y1  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD6x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x12y13efgEv
  ~DD6x12y1(); // tgen
  DD6x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y1E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y13abcEv");}
void  ccc::DD6x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y13pqrEv");}
void  ccc::DD6x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y13efgEv");}
ccc::DD6x12y1 ::~DD6x12y1(){ note_dtor("_ZN3ccc8DD6x12y1E", this);} // tgen
ccc::DD6x12y1 ::DD6x12y1(){ note_ctor("_ZN3ccc8DD6x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y1E, buf);
    ::ccc::DD6x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y1E);
    dp->::ccc::DD6x12y1::~DD6x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y1E(Test__ZN3ccc8DD6x12y1E, "_ZN3ccc8DD6x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y1C1Ev();
extern void _ZN3ccc8DD6x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y1E[] = {
  NSPAIR(_ZN3ccc8DD6x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y1E[];
extern void _ZN3ccc8DD6x12y13abcEv();
extern void _ZN3ccc8DD6x12y13efgEv();
extern void _ZN3ccc8DD6x12y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y13abcEv,_ZTv0_n12_N3ccc8DD6x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y13abcEv,_ZThn4_N3ccc8DD6x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y13abcEv,_ZTv0_n12_N3ccc8DD6x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y1E[] = {
  {&(_ZTVN3ccc8DD6x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y1E[];
static VTBL_ENTRY alt_thunk_names684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y13abcEv,_ZTv0_n12_N3ccc8DD6x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y13abcEv,_ZThn4_N3ccc8DD6x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y1E = {  "_ZN3ccc8DD6x12y1E", // class name
  bases__ZN3ccc8DD6x12y1E, 2,
  &(vtc__ZN3ccc8DD6x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y1E),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  CC6x12y2  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y23pqrEv
  ~CC6x12y2(); // tgen
  CC6x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y2E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y23efgEv");}
void  ccc::CC6x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y23abcEv");}
void  ccc::CC6x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y23pqrEv");}
ccc::CC6x12y2 ::~CC6x12y2(){ note_dtor("_ZN3ccc8CC6x12y2E", this);} // tgen
ccc::CC6x12y2 ::CC6x12y2(){ note_ctor("_ZN3ccc8CC6x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y2E, buf);
    ::ccc::CC6x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y2E);
    dp->::ccc::CC6x12y2::~CC6x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y2E(Test__ZN3ccc8CC6x12y2E, "_ZN3ccc8CC6x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y2C1Ev();
extern void _ZN3ccc8CC6x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y2E[] = {
  NSPAIR(_ZN3ccc8CC6x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y2E[];
extern void _ZN3ccc8CC6x12y23abcEv();
extern void _ZN3ccc8CC6x12y23efgEv();
extern void _ZN3ccc8CC6x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y23abcEv,_ZTv0_n12_N3ccc8CC6x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y23abcEv,_ZThn4_N3ccc8CC6x12y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y23efgEv,_ZTv0_n16_N3ccc8CC6x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y23efgEv,_ZThn4_N3ccc8CC6x12y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y23abcEv,_ZTv0_n12_N3ccc8CC6x12y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y23efgEv,_ZTv0_n16_N3ccc8CC6x12y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y2E[] = {
  {&(_ZTVN3ccc8CC6x12y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y2E[];
static VTBL_ENTRY alt_thunk_names685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y23efgEv,_ZTv0_n16_N3ccc8CC6x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y23efgEv,_ZThn4_N3ccc8CC6x12y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y23abcEv,_ZTv0_n12_N3ccc8CC6x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y23abcEv,_ZThn4_N3ccc8CC6x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y2E = {  "_ZN3ccc8CC6x12y2E", // class name
  bases__ZN3ccc8CC6x12y2E, 2,
  &(vtc__ZN3ccc8CC6x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y2E),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  DD6x12y2  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD6x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD6x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x12y23pqrEv
  ~DD6x12y2(); // tgen
  DD6x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y2E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y23efgEv");}
void  ccc::DD6x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y23abcEv");}
void  ccc::DD6x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y23pqrEv");}
ccc::DD6x12y2 ::~DD6x12y2(){ note_dtor("_ZN3ccc8DD6x12y2E", this);} // tgen
ccc::DD6x12y2 ::DD6x12y2(){ note_ctor("_ZN3ccc8DD6x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y2E, buf);
    ::ccc::DD6x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y2E);
    dp->::ccc::DD6x12y2::~DD6x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y2E(Test__ZN3ccc8DD6x12y2E, "_ZN3ccc8DD6x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y2C1Ev();
extern void _ZN3ccc8DD6x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y2E[] = {
  NSPAIR(_ZN3ccc8DD6x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y2E[];
extern void _ZN3ccc8DD6x12y23abcEv();
extern void _ZN3ccc8DD6x12y23efgEv();
extern void _ZN3ccc8DD6x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y23abcEv,_ZTv0_n12_N3ccc8DD6x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y23abcEv,_ZThn4_N3ccc8DD6x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y23abcEv,_ZTv0_n12_N3ccc8DD6x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y2E[] = {
  {&(_ZTVN3ccc8DD6x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y2E[];
static VTBL_ENTRY alt_thunk_names686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y23abcEv,_ZTv0_n12_N3ccc8DD6x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y23abcEv,_ZThn4_N3ccc8DD6x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y2E = {  "_ZN3ccc8DD6x12y2E", // class name
  bases__ZN3ccc8DD6x12y2E, 2,
  &(vtc__ZN3ccc8DD6x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y2E),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  CC6x12y3  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x12y33abcEv
  ~CC6x12y3(); // tgen
  CC6x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y3E) C1{ VBC2{ v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y33efgEv");}
void  ccc::CC6x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y33pqrEv");}
void  ccc::CC6x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y33abcEv");}
ccc::CC6x12y3 ::~CC6x12y3(){ note_dtor("_ZN3ccc8CC6x12y3E", this);} // tgen
ccc::CC6x12y3 ::CC6x12y3(){ note_ctor("_ZN3ccc8CC6x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y3E, buf);
    ::ccc::CC6x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y3E);
    dp->::ccc::CC6x12y3::~CC6x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y3E(Test__ZN3ccc8CC6x12y3E, "_ZN3ccc8CC6x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y3C1Ev();
extern void _ZN3ccc8CC6x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y3E[] = {
  NSPAIR(_ZN3ccc8CC6x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y3E[];
extern void _ZN3ccc8CC6x12y33abcEv();
extern void _ZN3ccc8CC6x12y33efgEv();
extern void _ZN3ccc8CC6x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y33abcEv,_ZTv0_n12_N3ccc8CC6x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y33abcEv,_ZThn4_N3ccc8CC6x12y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y33efgEv,_ZTv0_n16_N3ccc8CC6x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y33efgEv,_ZThn4_N3ccc8CC6x12y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y33abcEv,_ZTv0_n12_N3ccc8CC6x12y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y33efgEv,_ZTv0_n16_N3ccc8CC6x12y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y3E[] = {
  {&(_ZTVN3ccc8CC6x12y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y3E[];
static VTBL_ENTRY alt_thunk_names687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y33efgEv,_ZTv0_n16_N3ccc8CC6x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y33efgEv,_ZThn4_N3ccc8CC6x12y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y33abcEv,_ZTv0_n12_N3ccc8CC6x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y33abcEv,_ZThn4_N3ccc8CC6x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y3E = {  "_ZN3ccc8CC6x12y3E", // class name
  bases__ZN3ccc8CC6x12y3E, 2,
  &(vtc__ZN3ccc8CC6x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y3E),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  DD6x12y3  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD6x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x12y33abcEv
  ~DD6x12y3(); // tgen
  DD6x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y3E) C1{ VBC2{ v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y33efgEv");}
void  ccc::DD6x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y33pqrEv");}
void  ccc::DD6x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y33abcEv");}
ccc::DD6x12y3 ::~DD6x12y3(){ note_dtor("_ZN3ccc8DD6x12y3E", this);} // tgen
ccc::DD6x12y3 ::DD6x12y3(){ note_ctor("_ZN3ccc8DD6x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y3E, buf);
    ::ccc::DD6x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y3E);
    dp->::ccc::DD6x12y3::~DD6x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y3E(Test__ZN3ccc8DD6x12y3E, "_ZN3ccc8DD6x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y3C1Ev();
extern void _ZN3ccc8DD6x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y3E[] = {
  NSPAIR(_ZN3ccc8DD6x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y3E[];
extern void _ZN3ccc8DD6x12y33abcEv();
extern void _ZN3ccc8DD6x12y33efgEv();
extern void _ZN3ccc8DD6x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y33abcEv,_ZTv0_n12_N3ccc8DD6x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y33abcEv,_ZThn4_N3ccc8DD6x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y33abcEv,_ZTv0_n12_N3ccc8DD6x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y3E[] = {
  {&(_ZTVN3ccc8DD6x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y3E[];
static VTBL_ENTRY alt_thunk_names688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y33abcEv,_ZTv0_n12_N3ccc8DD6x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y33abcEv,_ZThn4_N3ccc8DD6x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y3E = {  "_ZN3ccc8DD6x12y3E", // class name
  bases__ZN3ccc8DD6x12y3E, 2,
  &(vtc__ZN3ccc8DD6x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y3E),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  CC6x12y4  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC6x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x12y43efgEv
  ~CC6x12y4(); // tgen
  CC6x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y4E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y43pqrEv");}
void  ccc::CC6x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y43abcEv");}
void  ccc::CC6x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y43efgEv");}
ccc::CC6x12y4 ::~CC6x12y4(){ note_dtor("_ZN3ccc8CC6x12y4E", this);} // tgen
ccc::CC6x12y4 ::CC6x12y4(){ note_ctor("_ZN3ccc8CC6x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y4E, buf);
    ::ccc::CC6x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y4E);
    dp->::ccc::CC6x12y4::~CC6x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y4E(Test__ZN3ccc8CC6x12y4E, "_ZN3ccc8CC6x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y4C1Ev();
extern void _ZN3ccc8CC6x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y4E[] = {
  NSPAIR(_ZN3ccc8CC6x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y4E[];
extern void _ZN3ccc8CC6x12y43abcEv();
extern void _ZN3ccc8CC6x12y43pqrEv();
extern void _ZN3ccc8CC6x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y43abcEv,_ZTv0_n12_N3ccc8CC6x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y43abcEv,_ZThn4_N3ccc8CC6x12y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y43efgEv,_ZTv0_n16_N3ccc8CC6x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y43efgEv,_ZThn4_N3ccc8CC6x12y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y43abcEv,_ZTv0_n12_N3ccc8CC6x12y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y43efgEv,_ZTv0_n16_N3ccc8CC6x12y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y4E[] = {
  {&(_ZTVN3ccc8CC6x12y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y4E[];
static VTBL_ENTRY alt_thunk_names689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y43efgEv,_ZTv0_n16_N3ccc8CC6x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y43efgEv,_ZThn4_N3ccc8CC6x12y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y43abcEv,_ZTv0_n12_N3ccc8CC6x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y43abcEv,_ZThn4_N3ccc8CC6x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y4E = {  "_ZN3ccc8CC6x12y4E", // class name
  bases__ZN3ccc8CC6x12y4E, 2,
  &(vtc__ZN3ccc8CC6x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y4E),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  DD6x12y4  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD6x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD6x12y43efgEv
  ~DD6x12y4(); // tgen
  DD6x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y4E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y43pqrEv");}
void  ccc::DD6x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y43abcEv");}
void  ccc::DD6x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y43efgEv");}
ccc::DD6x12y4 ::~DD6x12y4(){ note_dtor("_ZN3ccc8DD6x12y4E", this);} // tgen
ccc::DD6x12y4 ::DD6x12y4(){ note_ctor("_ZN3ccc8DD6x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y4E, buf);
    ::ccc::DD6x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y4E);
    dp->::ccc::DD6x12y4::~DD6x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y4E(Test__ZN3ccc8DD6x12y4E, "_ZN3ccc8DD6x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y4C1Ev();
extern void _ZN3ccc8DD6x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y4E[] = {
  NSPAIR(_ZN3ccc8DD6x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y4E[];
extern void _ZN3ccc8DD6x12y43abcEv();
extern void _ZN3ccc8DD6x12y43efgEv();
extern void _ZN3ccc8DD6x12y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y43abcEv,_ZTv0_n12_N3ccc8DD6x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y43abcEv,_ZThn4_N3ccc8DD6x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y43abcEv,_ZTv0_n12_N3ccc8DD6x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y4E[] = {
  {&(_ZTVN3ccc8DD6x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y4E[];
static VTBL_ENTRY alt_thunk_names690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y43abcEv,_ZTv0_n12_N3ccc8DD6x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y43abcEv,_ZThn4_N3ccc8DD6x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y4E = {  "_ZN3ccc8DD6x12y4E", // class name
  bases__ZN3ccc8DD6x12y4E, 2,
  &(vtc__ZN3ccc8DD6x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y4E),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  CC6x12y5  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC6x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x12y53abcEv
  ~CC6x12y5(); // tgen
  CC6x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y5E) C1{ VBC2{ v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y53pqrEv");}
void  ccc::CC6x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y53efgEv");}
void  ccc::CC6x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y53abcEv");}
ccc::CC6x12y5 ::~CC6x12y5(){ note_dtor("_ZN3ccc8CC6x12y5E", this);} // tgen
ccc::CC6x12y5 ::CC6x12y5(){ note_ctor("_ZN3ccc8CC6x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y5E, buf);
    ::ccc::CC6x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y5E);
    dp->::ccc::CC6x12y5::~CC6x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y5E(Test__ZN3ccc8CC6x12y5E, "_ZN3ccc8CC6x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y5C1Ev();
extern void _ZN3ccc8CC6x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y5E[] = {
  NSPAIR(_ZN3ccc8CC6x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y5E[];
extern void _ZN3ccc8CC6x12y53abcEv();
extern void _ZN3ccc8CC6x12y53pqrEv();
extern void _ZN3ccc8CC6x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y53abcEv,_ZTv0_n12_N3ccc8CC6x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y53abcEv,_ZThn4_N3ccc8CC6x12y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y53efgEv,_ZTv0_n16_N3ccc8CC6x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y53efgEv,_ZThn4_N3ccc8CC6x12y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y53abcEv,_ZTv0_n12_N3ccc8CC6x12y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y53efgEv,_ZTv0_n16_N3ccc8CC6x12y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y5E[] = {
  {&(_ZTVN3ccc8CC6x12y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y5E[];
static VTBL_ENTRY alt_thunk_names691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y53efgEv,_ZTv0_n16_N3ccc8CC6x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y53efgEv,_ZThn4_N3ccc8CC6x12y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y53abcEv,_ZTv0_n12_N3ccc8CC6x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y53abcEv,_ZThn4_N3ccc8CC6x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y5E = {  "_ZN3ccc8CC6x12y5E", // class name
  bases__ZN3ccc8CC6x12y5E, 2,
  &(vtc__ZN3ccc8CC6x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y5E),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  DD6x12y5  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD6x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD6x12y53abcEv
  ~DD6x12y5(); // tgen
  DD6x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y5E) C1{ VBC2{ v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y53pqrEv");}
void  ccc::DD6x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y53efgEv");}
void  ccc::DD6x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y53abcEv");}
ccc::DD6x12y5 ::~DD6x12y5(){ note_dtor("_ZN3ccc8DD6x12y5E", this);} // tgen
ccc::DD6x12y5 ::DD6x12y5(){ note_ctor("_ZN3ccc8DD6x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y5E, buf);
    ::ccc::DD6x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y5E);
    dp->::ccc::DD6x12y5::~DD6x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y5E(Test__ZN3ccc8DD6x12y5E, "_ZN3ccc8DD6x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y5C1Ev();
extern void _ZN3ccc8DD6x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y5E[] = {
  NSPAIR(_ZN3ccc8DD6x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y5E[];
extern void _ZN3ccc8DD6x12y53abcEv();
extern void _ZN3ccc8DD6x12y53efgEv();
extern void _ZN3ccc8DD6x12y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y53abcEv,_ZTv0_n12_N3ccc8DD6x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y53abcEv,_ZThn4_N3ccc8DD6x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y53abcEv,_ZTv0_n12_N3ccc8DD6x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y5E[] = {
  {&(_ZTVN3ccc8DD6x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y5E[];
static VTBL_ENTRY alt_thunk_names692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y53abcEv,_ZTv0_n12_N3ccc8DD6x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y53abcEv,_ZThn4_N3ccc8DD6x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y5E = {  "_ZN3ccc8DD6x12y5E", // class name
  bases__ZN3ccc8DD6x12y5E, 2,
  &(vtc__ZN3ccc8DD6x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y5E),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  CC6x12y6  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x12y63efgEv
  ~CC6x12y6(); // tgen
  CC6x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y6E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y63abcEv");}
void  ccc::CC6x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y63efgEv");}
ccc::CC6x12y6 ::~CC6x12y6(){ note_dtor("_ZN3ccc8CC6x12y6E", this);} // tgen
ccc::CC6x12y6 ::CC6x12y6(){ note_ctor("_ZN3ccc8CC6x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y6E, buf);
    ::ccc::CC6x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y6E);
    dp->::ccc::CC6x12y6::~CC6x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y6E(Test__ZN3ccc8CC6x12y6E, "_ZN3ccc8CC6x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y6C1Ev();
extern void _ZN3ccc8CC6x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y6E[] = {
  NSPAIR(_ZN3ccc8CC6x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y6E[];
extern void _ZN3ccc8CC6x12y63abcEv();
extern void _ZN3ccc8CC6x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y63abcEv,_ZTv0_n12_N3ccc8CC6x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y63abcEv,_ZThn4_N3ccc8CC6x12y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y63efgEv,_ZTv0_n16_N3ccc8CC6x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y63efgEv,_ZThn4_N3ccc8CC6x12y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y63abcEv,_ZTv0_n12_N3ccc8CC6x12y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y63efgEv,_ZTv0_n16_N3ccc8CC6x12y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y6E[] = {
  {&(_ZTVN3ccc8CC6x12y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x12y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y6E[];
static VTBL_ENTRY alt_thunk_names693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y63efgEv,_ZTv0_n16_N3ccc8CC6x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y63efgEv,_ZThn4_N3ccc8CC6x12y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y63abcEv,_ZTv0_n12_N3ccc8CC6x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y63abcEv,_ZThn4_N3ccc8CC6x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y6E = {  "_ZN3ccc8CC6x12y6E", // class name
  bases__ZN3ccc8CC6x12y6E, 2,
  &(vtc__ZN3ccc8CC6x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y6E),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  DD6x12y6  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD6x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD6x12y63efgEv
  ~DD6x12y6(); // tgen
  DD6x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y6E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y63abcEv");}
void  ccc::DD6x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y63efgEv");}
ccc::DD6x12y6 ::~DD6x12y6(){ note_dtor("_ZN3ccc8DD6x12y6E", this);} // tgen
ccc::DD6x12y6 ::DD6x12y6(){ note_ctor("_ZN3ccc8DD6x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y6E, buf);
    ::ccc::DD6x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y6E);
    dp->::ccc::DD6x12y6::~DD6x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y6E(Test__ZN3ccc8DD6x12y6E, "_ZN3ccc8DD6x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y6C1Ev();
extern void _ZN3ccc8DD6x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y6E[] = {
  NSPAIR(_ZN3ccc8DD6x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y6E[];
extern void _ZN3ccc8DD6x12y63abcEv();
extern void _ZN3ccc8DD6x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y63abcEv,_ZTv0_n12_N3ccc8DD6x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y63abcEv,_ZThn4_N3ccc8DD6x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y63abcEv,_ZTv0_n12_N3ccc8DD6x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y6E[] = {
  {&(_ZTVN3ccc8DD6x12y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x12y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x12y6E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y6E[];
static VTBL_ENTRY alt_thunk_names694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y63abcEv,_ZTv0_n12_N3ccc8DD6x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y63abcEv,_ZThn4_N3ccc8DD6x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y6E = {  "_ZN3ccc8DD6x12y6E", // class name
  bases__ZN3ccc8DD6x12y6E, 2,
  &(vtc__ZN3ccc8DD6x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y6E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y6E),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  CC6x12y7  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC6x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y73pqrEv
  ~CC6x12y7(); // tgen
  CC6x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y7E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y73abcEv");}
void  ccc::CC6x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y73pqrEv");}
ccc::CC6x12y7 ::~CC6x12y7(){ note_dtor("_ZN3ccc8CC6x12y7E", this);} // tgen
ccc::CC6x12y7 ::CC6x12y7(){ note_ctor("_ZN3ccc8CC6x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y7E, buf);
    ::ccc::CC6x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y7E);
    dp->::ccc::CC6x12y7::~CC6x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y7E(Test__ZN3ccc8CC6x12y7E, "_ZN3ccc8CC6x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y7C1Ev();
extern void _ZN3ccc8CC6x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y7E[] = {
  NSPAIR(_ZN3ccc8CC6x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y7E[];
extern void _ZN3ccc8CC6x12y73abcEv();
extern void _ZN3ccc8CC6x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y73abcEv,_ZTv0_n12_N3ccc8CC6x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y73abcEv,_ZThn4_N3ccc8CC6x12y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y73abcEv,_ZTv0_n12_N3ccc8CC6x12y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y7E[] = {
  {&(_ZTVN3ccc8CC6x12y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x12y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y7E[];
static VTBL_ENTRY alt_thunk_names695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y73abcEv,_ZTv0_n12_N3ccc8CC6x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y73abcEv,_ZThn4_N3ccc8CC6x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y7E = {  "_ZN3ccc8CC6x12y7E", // class name
  bases__ZN3ccc8CC6x12y7E, 2,
  &(vtc__ZN3ccc8CC6x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y7E),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  DD6x12y7  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD6x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x12y73pqrEv
  ~DD6x12y7(); // tgen
  DD6x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y7E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y73abcEv");}
void  ccc::DD6x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y73pqrEv");}
ccc::DD6x12y7 ::~DD6x12y7(){ note_dtor("_ZN3ccc8DD6x12y7E", this);} // tgen
ccc::DD6x12y7 ::DD6x12y7(){ note_ctor("_ZN3ccc8DD6x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y7E, buf);
    ::ccc::DD6x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y7E);
    dp->::ccc::DD6x12y7::~DD6x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y7E(Test__ZN3ccc8DD6x12y7E, "_ZN3ccc8DD6x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y7C1Ev();
extern void _ZN3ccc8DD6x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y7E[] = {
  NSPAIR(_ZN3ccc8DD6x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y7E[];
extern void _ZN3ccc8DD6x12y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y73abcEv,_ZTv0_n12_N3ccc8DD6x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y73abcEv,_ZThn4_N3ccc8DD6x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y73abcEv,_ZTv0_n12_N3ccc8DD6x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y7E[] = {
  {&(_ZTVN3ccc8DD6x12y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y7E[];
static VTBL_ENTRY alt_thunk_names696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y73abcEv,_ZTv0_n12_N3ccc8DD6x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y73abcEv,_ZThn4_N3ccc8DD6x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y7E = {  "_ZN3ccc8DD6x12y7E", // class name
  bases__ZN3ccc8DD6x12y7E, 2,
  &(vtc__ZN3ccc8DD6x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y7E),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  CC6x12y8  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x12y83abcEv
  ~CC6x12y8(); // tgen
  CC6x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y8E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y83efgEv");}
void  ccc::CC6x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x12y83abcEv");}
ccc::CC6x12y8 ::~CC6x12y8(){ note_dtor("_ZN3ccc8CC6x12y8E", this);} // tgen
ccc::CC6x12y8 ::CC6x12y8(){ note_ctor("_ZN3ccc8CC6x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y8E, buf);
    ::ccc::CC6x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y8E);
    dp->::ccc::CC6x12y8::~CC6x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y8E(Test__ZN3ccc8CC6x12y8E, "_ZN3ccc8CC6x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y8C1Ev();
extern void _ZN3ccc8CC6x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y8E[] = {
  NSPAIR(_ZN3ccc8CC6x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y8E[];
extern void _ZN3ccc8CC6x12y83abcEv();
extern void _ZN3ccc8CC6x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x12y83abcEv,_ZTv0_n12_N3ccc8CC6x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y83abcEv,_ZThn4_N3ccc8CC6x12y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y83efgEv,_ZTv0_n16_N3ccc8CC6x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y83efgEv,_ZThn4_N3ccc8CC6x12y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x12y83abcEv,_ZTv0_n12_N3ccc8CC6x12y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y83efgEv,_ZTv0_n16_N3ccc8CC6x12y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y8E[] = {
  {&(_ZTVN3ccc8CC6x12y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x12y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y8E[];
static VTBL_ENTRY alt_thunk_names697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y83efgEv,_ZTv0_n16_N3ccc8CC6x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y83efgEv,_ZThn4_N3ccc8CC6x12y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x12y83abcEv,_ZTv0_n12_N3ccc8CC6x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y83abcEv,_ZThn4_N3ccc8CC6x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y8E = {  "_ZN3ccc8CC6x12y8E", // class name
  bases__ZN3ccc8CC6x12y8E, 2,
  &(vtc__ZN3ccc8CC6x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y8E),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  DD6x12y8  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD6x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD6x12y83abcEv
  ~DD6x12y8(); // tgen
  DD6x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y8E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y83efgEv");}
void  ccc::DD6x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x12y83abcEv");}
ccc::DD6x12y8 ::~DD6x12y8(){ note_dtor("_ZN3ccc8DD6x12y8E", this);} // tgen
ccc::DD6x12y8 ::DD6x12y8(){ note_ctor("_ZN3ccc8DD6x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y8E, buf);
    ::ccc::DD6x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y8E);
    dp->::ccc::DD6x12y8::~DD6x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y8E(Test__ZN3ccc8DD6x12y8E, "_ZN3ccc8DD6x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y8C1Ev();
extern void _ZN3ccc8DD6x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y8E[] = {
  NSPAIR(_ZN3ccc8DD6x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y8E[];
extern void _ZN3ccc8DD6x12y83abcEv();
extern void _ZN3ccc8DD6x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x12y83abcEv,_ZTv0_n12_N3ccc8DD6x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x12y83abcEv,_ZThn4_N3ccc8DD6x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x12y83abcEv,_ZTv0_n12_N3ccc8DD6x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y8E[] = {
  {&(_ZTVN3ccc8DD6x12y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x12y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x12y8E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y8E[];
static VTBL_ENTRY alt_thunk_names698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x12y83abcEv,_ZTv0_n12_N3ccc8DD6x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x12y83abcEv,_ZThn4_N3ccc8DD6x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x12y8E = {  "_ZN3ccc8DD6x12y8E", // class name
  bases__ZN3ccc8DD6x12y8E, 2,
  &(vtc__ZN3ccc8DD6x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y8E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y8E),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  CC6x12y9  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC6x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x12y93pqrEv
  ~CC6x12y9(); // tgen
  CC6x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x12y9E) C1{ VBC2{ v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x12y93efgEv");}
void  ccc::CC6x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x12y93pqrEv");}
ccc::CC6x12y9 ::~CC6x12y9(){ note_dtor("_ZN3ccc8CC6x12y9E", this);} // tgen
ccc::CC6x12y9 ::CC6x12y9(){ note_ctor("_ZN3ccc8CC6x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC6x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x12y9E, buf);
    ::ccc::CC6x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x12y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC6x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x12y9E);
    dp->::ccc::CC6x12y9::~CC6x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x12y9E(Test__ZN3ccc8CC6x12y9E, "_ZN3ccc8CC6x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x12y9C1Ev();
extern void _ZN3ccc8CC6x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC6x12y9E[] = {
  NSPAIR(_ZN3ccc8CC6x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC6x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC6x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC6x12y93efgEv();
extern void _ZN3ccc8CC6x12y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x12y93efgEv,_ZTv0_n16_N3ccc8CC6x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x12y93efgEv,_ZThn4_N3ccc8CC6x12y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x12y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x12y93efgEv,_ZTv0_n16_N3ccc8CC6x12y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x12y9E[] = {
  {&(_ZTVN3ccc8CC6x12y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x12y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x12y9E[];
static VTBL_ENTRY alt_thunk_names699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x12y93efgEv,_ZTv0_n16_N3ccc8CC6x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x12y93efgEv,_ZThn4_N3ccc8CC6x12y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x12y9E = {  "_ZN3ccc8CC6x12y9E", // class name
  bases__ZN3ccc8CC6x12y9E, 2,
  &(vtc__ZN3ccc8CC6x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x12y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x12y9E),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  DD6x12y9  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD6x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x12y93pqrEv
  ~DD6x12y9(); // tgen
  DD6x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD6x12y9E) C1{ VBC2{ v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x12y93efgEv");}
void  ccc::DD6x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x12y93pqrEv");}
ccc::DD6x12y9 ::~DD6x12y9(){ note_dtor("_ZN3ccc8DD6x12y9E", this);} // tgen
ccc::DD6x12y9 ::DD6x12y9(){ note_ctor("_ZN3ccc8DD6x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD6x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x12y9E, buf);
    ::ccc::DD6x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x12y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD6x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x12y9E);
    dp->::ccc::DD6x12y9::~DD6x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x12y9E(Test__ZN3ccc8DD6x12y9E, "_ZN3ccc8DD6x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x12y9C1Ev();
extern void _ZN3ccc8DD6x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD6x12y9E[] = {
  NSPAIR(_ZN3ccc8DD6x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD6x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD6x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x12y93efgEv();
extern void _ZN3ccc8DD6x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x12y9E[] = {
  {&(_ZTVN3ccc8DD6x12y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x12y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x12y9E[];
Class_Descriptor cd__ZN3ccc8DD6x12y9E = {  "_ZN3ccc8DD6x12y9E", // class name
  bases__ZN3ccc8DD6x12y9E, 2,
  &(vtc__ZN3ccc8DD6x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x12y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x12y9E),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  CC6x12y10  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC6x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x12y103abcEv
  ~CC6x12y10(); // tgen
  CC6x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y10E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x12y103pqrEv");}
void  ccc::CC6x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x12y103abcEv");}
ccc::CC6x12y10 ::~CC6x12y10(){ note_dtor("_ZN3ccc9CC6x12y10E", this);} // tgen
ccc::CC6x12y10 ::CC6x12y10(){ note_ctor("_ZN3ccc9CC6x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC6x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x12y10E, buf);
    ::ccc::CC6x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x12y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC6x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x12y10E);
    dp->::ccc::CC6x12y10::~CC6x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x12y10E(Test__ZN3ccc9CC6x12y10E, "_ZN3ccc9CC6x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x12y10C1Ev();
extern void _ZN3ccc9CC6x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC6x12y10E[] = {
  NSPAIR(_ZN3ccc9CC6x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC6x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC6x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x12y10E[];
extern void _ZN3ccc9CC6x12y103abcEv();
extern void _ZN3ccc9CC6x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x12y103abcEv,_ZTv0_n12_N3ccc9CC6x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x12y103abcEv,_ZThn4_N3ccc9CC6x12y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x12y103abcEv,_ZTv0_n12_N3ccc9CC6x12y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x12y10E[] = {
  {&(_ZTVN3ccc9CC6x12y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x12y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x12y10E[];
static VTBL_ENTRY alt_thunk_names700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x12y103abcEv,_ZTv0_n12_N3ccc9CC6x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x12y103abcEv,_ZThn4_N3ccc9CC6x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x12y10E = {  "_ZN3ccc9CC6x12y10E", // class name
  bases__ZN3ccc9CC6x12y10E, 2,
  &(vtc__ZN3ccc9CC6x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x12y10E),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  DD6x12y10  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD6x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD6x12y103abcEv
  ~DD6x12y10(); // tgen
  DD6x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD6x12y10E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x12y103pqrEv");}
void  ccc::DD6x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x12y103abcEv");}
ccc::DD6x12y10 ::~DD6x12y10(){ note_dtor("_ZN3ccc9DD6x12y10E", this);} // tgen
ccc::DD6x12y10 ::DD6x12y10(){ note_ctor("_ZN3ccc9DD6x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD6x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x12y10E, buf);
    ::ccc::DD6x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x12y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD6x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x12y10E);
    dp->::ccc::DD6x12y10::~DD6x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x12y10E(Test__ZN3ccc9DD6x12y10E, "_ZN3ccc9DD6x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x12y10C1Ev();
extern void _ZN3ccc9DD6x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD6x12y10E[] = {
  NSPAIR(_ZN3ccc9DD6x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD6x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD6x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y10E[];
extern void _ZN3ccc9DD6x12y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x12y103abcEv,_ZTv0_n12_N3ccc9DD6x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x12y103abcEv,_ZThn4_N3ccc9DD6x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x12y103abcEv,_ZTv0_n12_N3ccc9DD6x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x12y10E[] = {
  {&(_ZTVN3ccc9DD6x12y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x12y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x12y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x12y10E[];
static VTBL_ENTRY alt_thunk_names701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x12y103abcEv,_ZTv0_n12_N3ccc9DD6x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x12y103abcEv,_ZThn4_N3ccc9DD6x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x12y10E = {  "_ZN3ccc9DD6x12y10E", // class name
  bases__ZN3ccc9DD6x12y10E, 2,
  &(vtc__ZN3ccc9DD6x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x12y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x12y10E),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  CC6x12y11  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC6x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x12y113efgEv
  ~CC6x12y11(); // tgen
  CC6x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y11E) C1{ VBC2{ v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x12y113pqrEv");}
void  ccc::CC6x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x12y113efgEv");}
ccc::CC6x12y11 ::~CC6x12y11(){ note_dtor("_ZN3ccc9CC6x12y11E", this);} // tgen
ccc::CC6x12y11 ::CC6x12y11(){ note_ctor("_ZN3ccc9CC6x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC6x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x12y11E, buf);
    ::ccc::CC6x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x12y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC6x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x12y11E);
    dp->::ccc::CC6x12y11::~CC6x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x12y11E(Test__ZN3ccc9CC6x12y11E, "_ZN3ccc9CC6x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x12y11C1Ev();
extern void _ZN3ccc9CC6x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC6x12y11E[] = {
  NSPAIR(_ZN3ccc9CC6x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC6x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC6x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC6x12y113pqrEv();
extern void _ZN3ccc9CC6x12y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x12y113efgEv,_ZTv0_n16_N3ccc9CC6x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x12y113efgEv,_ZThn4_N3ccc9CC6x12y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x12y113efgEv,_ZTv0_n16_N3ccc9CC6x12y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x12y11E[] = {
  {&(_ZTVN3ccc9CC6x12y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC6x12y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x12y11E[];
static VTBL_ENTRY alt_thunk_names702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x12y113efgEv,_ZTv0_n16_N3ccc9CC6x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x12y113efgEv,_ZThn4_N3ccc9CC6x12y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x12y11E = {  "_ZN3ccc9CC6x12y11E", // class name
  bases__ZN3ccc9CC6x12y11E, 2,
  &(vtc__ZN3ccc9CC6x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x12y11E),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  DD6x12y11  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD6x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD6x12y113efgEv
  ~DD6x12y11(); // tgen
  DD6x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD6x12y11E) C1{ VBC2{ v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x12y113pqrEv");}
void  ccc::DD6x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x12y113efgEv");}
ccc::DD6x12y11 ::~DD6x12y11(){ note_dtor("_ZN3ccc9DD6x12y11E", this);} // tgen
ccc::DD6x12y11 ::DD6x12y11(){ note_ctor("_ZN3ccc9DD6x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD6x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x12y11E, buf);
    ::ccc::DD6x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x12y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD6x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x12y11E);
    dp->::ccc::DD6x12y11::~DD6x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x12y11E(Test__ZN3ccc9DD6x12y11E, "_ZN3ccc9DD6x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x12y11C1Ev();
extern void _ZN3ccc9DD6x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD6x12y11E[] = {
  NSPAIR(_ZN3ccc9DD6x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD6x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD6x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x12y113efgEv();
extern void _ZN3ccc9DD6x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y113pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x12y11E[] = {
  {&(_ZTVN3ccc9DD6x12y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x12y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x12y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x12y11E[];
Class_Descriptor cd__ZN3ccc9DD6x12y11E = {  "_ZN3ccc9DD6x12y11E", // class name
  bases__ZN3ccc9DD6x12y11E, 2,
  &(vtc__ZN3ccc9DD6x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x12y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x12y11E),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  CC6x12y12  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC6x12y123abcEv
  ~CC6x12y12(); // tgen
  CC6x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y12E) C1{ VBC2{ v1 v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC6x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x12y123abcEv");}
ccc::CC6x12y12 ::~CC6x12y12(){ note_dtor("_ZN3ccc9CC6x12y12E", this);} // tgen
ccc::CC6x12y12 ::CC6x12y12(){ note_ctor("_ZN3ccc9CC6x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC6x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x12y12E, buf);
    ::ccc::CC6x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x12y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC6x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x12y12E);
    dp->::ccc::CC6x12y12::~CC6x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x12y12E(Test__ZN3ccc9CC6x12y12E, "_ZN3ccc9CC6x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x12y12C1Ev();
extern void _ZN3ccc9CC6x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC6x12y12E[] = {
  NSPAIR(_ZN3ccc9CC6x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC6x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC6x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x12y12E[];
extern void _ZN3ccc9CC6x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x12y123abcEv,_ZTv0_n12_N3ccc9CC6x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x12y123abcEv,_ZThn4_N3ccc9CC6x12y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x12y123abcEv,_ZTv0_n12_N3ccc9CC6x12y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x12y12E[] = {
  {&(_ZTVN3ccc9CC6x12y12E[3]),  3,10},
  {&(_ZTVN3ccc9CC6x12y12E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x12y12E[];
static VTBL_ENTRY alt_thunk_names703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x12y123abcEv,_ZTv0_n12_N3ccc9CC6x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x12y123abcEv,_ZThn4_N3ccc9CC6x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x12y12E = {  "_ZN3ccc9CC6x12y12E", // class name
  bases__ZN3ccc9CC6x12y12E, 2,
  &(vtc__ZN3ccc9CC6x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y12E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x12y12E),2, //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  DD6x12y12  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD6x12y123abcEv
  ~DD6x12y12(); // tgen
  DD6x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD6x12y12E) C1{ VBC2{ v1 v2} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD6x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x12y123abcEv");}
ccc::DD6x12y12 ::~DD6x12y12(){ note_dtor("_ZN3ccc9DD6x12y12E", this);} // tgen
ccc::DD6x12y12 ::DD6x12y12(){ note_ctor("_ZN3ccc9DD6x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD6x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x12y12E, buf);
    ::ccc::DD6x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x12y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD6x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x12y12E);
    dp->::ccc::DD6x12y12::~DD6x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x12y12E(Test__ZN3ccc9DD6x12y12E, "_ZN3ccc9DD6x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x12y12C1Ev();
extern void _ZN3ccc9DD6x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD6x12y12E[] = {
  NSPAIR(_ZN3ccc9DD6x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD6x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD6x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y12E[];
extern void _ZN3ccc9DD6x12y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x12y123abcEv,_ZTv0_n12_N3ccc9DD6x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x12y123abcEv,_ZThn4_N3ccc9DD6x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x12y123abcEv,_ZTv0_n12_N3ccc9DD6x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x12y12E[] = {
  {&(_ZTVN3ccc9DD6x12y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x12y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x12y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x12y12E[];
static VTBL_ENTRY alt_thunk_names704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x12y123abcEv,_ZTv0_n12_N3ccc9DD6x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x12y123abcEv,_ZThn4_N3ccc9DD6x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x12y12E = {  "_ZN3ccc9DD6x12y12E", // class name
  bases__ZN3ccc9DD6x12y12E, 2,
  &(vtc__ZN3ccc9DD6x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x12y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x12y12E),3, //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  CC6x12y13  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC6x12y133efgEv
  ~CC6x12y13(); // tgen
  CC6x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y13E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC6x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x12y133efgEv");}
ccc::CC6x12y13 ::~CC6x12y13(){ note_dtor("_ZN3ccc9CC6x12y13E", this);} // tgen
ccc::CC6x12y13 ::CC6x12y13(){ note_ctor("_ZN3ccc9CC6x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC6x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x12y13E, buf);
    ::ccc::CC6x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x12y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC6x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x12y13E);
    dp->::ccc::CC6x12y13::~CC6x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x12y13E(Test__ZN3ccc9CC6x12y13E, "_ZN3ccc9CC6x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x12y13C1Ev();
extern void _ZN3ccc9CC6x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC6x12y13E[] = {
  NSPAIR(_ZN3ccc9CC6x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC6x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC6x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC6x12y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x12y133efgEv,_ZTv0_n16_N3ccc9CC6x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x12y133efgEv,_ZThn4_N3ccc9CC6x12y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x12y133efgEv,_ZTv0_n16_N3ccc9CC6x12y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x12y13E[] = {
  {&(_ZTVN3ccc9CC6x12y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x12y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x12y13E[];
static VTBL_ENTRY alt_thunk_names705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x12y133efgEv,_ZTv0_n16_N3ccc9CC6x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x12y133efgEv,_ZThn4_N3ccc9CC6x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x12y13E = {  "_ZN3ccc9CC6x12y13E", // class name
  bases__ZN3ccc9CC6x12y13E, 2,
  &(vtc__ZN3ccc9CC6x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x12y13E),2, //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  DD6x12y13  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD6x12y133efgEv
  ~DD6x12y13(); // tgen
  DD6x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD6x12y13E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD6x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x12y133efgEv");}
ccc::DD6x12y13 ::~DD6x12y13(){ note_dtor("_ZN3ccc9DD6x12y13E", this);} // tgen
ccc::DD6x12y13 ::DD6x12y13(){ note_ctor("_ZN3ccc9DD6x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD6x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x12y13E, buf);
    ::ccc::DD6x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x12y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD6x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x12y13E);
    dp->::ccc::DD6x12y13::~DD6x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x12y13E(Test__ZN3ccc9DD6x12y13E, "_ZN3ccc9DD6x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x12y13C1Ev();
extern void _ZN3ccc9DD6x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD6x12y13E[] = {
  NSPAIR(_ZN3ccc9DD6x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD6x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD6x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x12y13E[] = {
  {&(_ZTVN3ccc9DD6x12y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x12y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x12y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x12y13E[];
Class_Descriptor cd__ZN3ccc9DD6x12y13E = {  "_ZN3ccc9DD6x12y13E", // class name
  bases__ZN3ccc9DD6x12y13E, 2,
  &(vtc__ZN3ccc9DD6x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x12y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x12y13E),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  CC6x12y14  : virtual ::ccc::AA6 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC6x12y143pqrEv
  ~CC6x12y14(); // tgen
  CC6x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y14E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC6x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x12y143pqrEv");}
ccc::CC6x12y14 ::~CC6x12y14(){ note_dtor("_ZN3ccc9CC6x12y14E", this);} // tgen
ccc::CC6x12y14 ::CC6x12y14(){ note_ctor("_ZN3ccc9CC6x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC6x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x12y14E, buf);
    ::ccc::CC6x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x12y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC6x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x12y14E);
    dp->::ccc::CC6x12y14::~CC6x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x12y14E(Test__ZN3ccc9CC6x12y14E, "_ZN3ccc9CC6x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x12y14C1Ev();
extern void _ZN3ccc9CC6x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC6x12y14E[] = {
  NSPAIR(_ZN3ccc9CC6x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC6x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC6x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC6x12y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x12y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x12y14E[] = {
  {&(_ZTVN3ccc9CC6x12y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x12y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x12y14E[];
Class_Descriptor cd__ZN3ccc9CC6x12y14E = {  "_ZN3ccc9CC6x12y14E", // class name
  bases__ZN3ccc9CC6x12y14E, 2,
  &(vtc__ZN3ccc9CC6x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x12y14E),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  DD6x12y14  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD6x12y143pqrEv
  ~DD6x12y14(); // tgen
  DD6x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD6x12y14E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD6x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x12y143pqrEv");}
ccc::DD6x12y14 ::~DD6x12y14(){ note_dtor("_ZN3ccc9DD6x12y14E", this);} // tgen
ccc::DD6x12y14 ::DD6x12y14(){ note_ctor("_ZN3ccc9DD6x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD6x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x12y14E, buf);
    ::ccc::DD6x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x12y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD6x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x12y14E);
    dp->::ccc::DD6x12y14::~DD6x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x12y14E(Test__ZN3ccc9DD6x12y14E, "_ZN3ccc9DD6x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x12y14C1Ev();
extern void _ZN3ccc9DD6x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD6x12y14E[] = {
  NSPAIR(_ZN3ccc9DD6x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD6x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD6x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x12y14E[] = {
  {&(_ZTVN3ccc9DD6x12y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x12y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x12y14E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x12y14E[];
Class_Descriptor cd__ZN3ccc9DD6x12y14E = {  "_ZN3ccc9DD6x12y14E", // class name
  bases__ZN3ccc9DD6x12y14E, 2,
  &(vtc__ZN3ccc9DD6x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x12y14E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x12y14E),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  CC6x12y15  : virtual ::ccc::AA6 , ::ccc::BB12 {
  ~CC6x12y15(); // tgen
  CC6x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x12y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC6x12y15 ::~CC6x12y15(){ note_dtor("_ZN3ccc9CC6x12y15E", this);} // tgen
ccc::CC6x12y15 ::CC6x12y15(){ note_ctor("_ZN3ccc9CC6x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC6x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x12y15E, buf);
    ::ccc::CC6x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x12y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC6x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x12y15E);
    dp->::ccc::CC6x12y15::~CC6x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x12y15E(Test__ZN3ccc9CC6x12y15E, "_ZN3ccc9CC6x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x12y15C1Ev();
extern void _ZN3ccc9CC6x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC6x12y15E[] = {
  NSPAIR(_ZN3ccc9CC6x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC6x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC6x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x12y15E[] = {
  {&(_ZTVN3ccc9CC6x12y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC6x12y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x12y15E[];
Class_Descriptor cd__ZN3ccc9CC6x12y15E = {  "_ZN3ccc9CC6x12y15E", // class name
  bases__ZN3ccc9CC6x12y15E, 2,
  &(vtc__ZN3ccc9CC6x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x12y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x12y15E),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  DD6x12y15  : virtual ::ccc::AA6 , virtual ::ccc::BB12 {
  ~DD6x12y15(); // tgen
  DD6x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD6x12y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD6x12y15 ::~DD6x12y15(){ note_dtor("_ZN3ccc9DD6x12y15E", this);} // tgen
ccc::DD6x12y15 ::DD6x12y15(){ note_ctor("_ZN3ccc9DD6x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD6x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x12y15E, buf);
    ::ccc::DD6x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x12y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD6x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x12y15E);
    dp->::ccc::DD6x12y15::~DD6x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x12y15E(Test__ZN3ccc9DD6x12y15E, "_ZN3ccc9DD6x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x12y15C1Ev();
extern void _ZN3ccc9DD6x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD6x12y15E[] = {
  NSPAIR(_ZN3ccc9DD6x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD6x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD6x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x12y15E[] = {
  {&(_ZTVN3ccc9DD6x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x12y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x12y15E[];
Class_Descriptor cd__ZN3ccc9DD6x12y15E = {  "_ZN3ccc9DD6x12y15E", // class name
  bases__ZN3ccc9DD6x12y15E, 2,
  &(vtc__ZN3ccc9DD6x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x12y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x12y15E),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  CC6x13y0  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y03pqrEv
  ~CC6x13y0(); // tgen
  CC6x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y0E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y03abcEv");}
void  ccc::CC6x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y03efgEv");}
void  ccc::CC6x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y03pqrEv");}
ccc::CC6x13y0 ::~CC6x13y0(){ note_dtor("_ZN3ccc8CC6x13y0E", this);} // tgen
ccc::CC6x13y0 ::CC6x13y0(){ note_ctor("_ZN3ccc8CC6x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y0E, buf);
    ::ccc::CC6x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y0E);
    dp->::ccc::CC6x13y0::~CC6x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y0E(Test__ZN3ccc8CC6x13y0E, "_ZN3ccc8CC6x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y0C1Ev();
extern void _ZN3ccc8CC6x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y0E[] = {
  NSPAIR(_ZN3ccc8CC6x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y0E[];
extern void _ZN3ccc8CC6x13y03efgEv();
extern void _ZN3ccc8CC6x13y03abcEv();
extern void _ZN3ccc8CC6x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y03abcEv,_ZTv0_n12_N3ccc8CC6x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y03abcEv,_ZThn4_N3ccc8CC6x13y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y03efgEv,_ZTv0_n16_N3ccc8CC6x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y03efgEv,_ZThn4_N3ccc8CC6x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y03abcEv,_ZTv0_n12_N3ccc8CC6x13y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y03efgEv,_ZTv0_n16_N3ccc8CC6x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y0E[] = {
  {&(_ZTVN3ccc8CC6x13y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y0E[];
static VTBL_ENTRY alt_thunk_names706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y03efgEv,_ZTv0_n16_N3ccc8CC6x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y03efgEv,_ZThn4_N3ccc8CC6x13y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y03abcEv,_ZTv0_n12_N3ccc8CC6x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y03abcEv,_ZThn4_N3ccc8CC6x13y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y0E = {  "_ZN3ccc8CC6x13y0E", // class name
  bases__ZN3ccc8CC6x13y0E, 2,
  &(vtc__ZN3ccc8CC6x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y0E),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  DD6x13y0  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD6x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD6x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x13y03pqrEv
  ~DD6x13y0(); // tgen
  DD6x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y0E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y03abcEv");}
void  ccc::DD6x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y03efgEv");}
void  ccc::DD6x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y03pqrEv");}
ccc::DD6x13y0 ::~DD6x13y0(){ note_dtor("_ZN3ccc8DD6x13y0E", this);} // tgen
ccc::DD6x13y0 ::DD6x13y0(){ note_ctor("_ZN3ccc8DD6x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y0E, buf);
    ::ccc::DD6x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y0E);
    dp->::ccc::DD6x13y0::~DD6x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y0E(Test__ZN3ccc8DD6x13y0E, "_ZN3ccc8DD6x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y0C1Ev();
extern void _ZN3ccc8DD6x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y0E[] = {
  NSPAIR(_ZN3ccc8DD6x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y0E[];
extern void _ZN3ccc8DD6x13y03abcEv();
extern void _ZN3ccc8DD6x13y03efgEv();
extern void _ZN3ccc8DD6x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y03efgEv,_ZTv0_n12_N3ccc8DD6x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y03efgEv,_ZThn4_N3ccc8DD6x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y03efgEv,_ZTv0_n12_N3ccc8DD6x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y0E[] = {
  {&(_ZTVN3ccc8DD6x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y0E[];
static VTBL_ENTRY alt_thunk_names707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y03efgEv,_ZTv0_n12_N3ccc8DD6x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y03efgEv,_ZThn4_N3ccc8DD6x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y0E = {  "_ZN3ccc8DD6x13y0E", // class name
  bases__ZN3ccc8DD6x13y0E, 2,
  &(vtc__ZN3ccc8DD6x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y0E),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  CC6x13y1  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x13y13efgEv
  ~CC6x13y1(); // tgen
  CC6x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y1E) C1{ VBC2{ v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y13abcEv");}
void  ccc::CC6x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y13pqrEv");}
void  ccc::CC6x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y13efgEv");}
ccc::CC6x13y1 ::~CC6x13y1(){ note_dtor("_ZN3ccc8CC6x13y1E", this);} // tgen
ccc::CC6x13y1 ::CC6x13y1(){ note_ctor("_ZN3ccc8CC6x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y1E, buf);
    ::ccc::CC6x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y1E);
    dp->::ccc::CC6x13y1::~CC6x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y1E(Test__ZN3ccc8CC6x13y1E, "_ZN3ccc8CC6x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y1C1Ev();
extern void _ZN3ccc8CC6x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y1E[] = {
  NSPAIR(_ZN3ccc8CC6x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y1E[];
extern void _ZN3ccc8CC6x13y13efgEv();
extern void _ZN3ccc8CC6x13y13abcEv();
extern void _ZN3ccc8CC6x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y13abcEv,_ZTv0_n12_N3ccc8CC6x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y13abcEv,_ZThn4_N3ccc8CC6x13y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y13efgEv,_ZTv0_n16_N3ccc8CC6x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y13efgEv,_ZThn4_N3ccc8CC6x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y13abcEv,_ZTv0_n12_N3ccc8CC6x13y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y13efgEv,_ZTv0_n16_N3ccc8CC6x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y1E[] = {
  {&(_ZTVN3ccc8CC6x13y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y1E[];
static VTBL_ENTRY alt_thunk_names708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y13efgEv,_ZTv0_n16_N3ccc8CC6x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y13efgEv,_ZThn4_N3ccc8CC6x13y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y13abcEv,_ZTv0_n12_N3ccc8CC6x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y13abcEv,_ZThn4_N3ccc8CC6x13y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y1E = {  "_ZN3ccc8CC6x13y1E", // class name
  bases__ZN3ccc8CC6x13y1E, 2,
  &(vtc__ZN3ccc8CC6x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y1E),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  DD6x13y1  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD6x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x13y13efgEv
  ~DD6x13y1(); // tgen
  DD6x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y1E) C1{ VBC2{ v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y13abcEv");}
void  ccc::DD6x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y13pqrEv");}
void  ccc::DD6x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y13efgEv");}
ccc::DD6x13y1 ::~DD6x13y1(){ note_dtor("_ZN3ccc8DD6x13y1E", this);} // tgen
ccc::DD6x13y1 ::DD6x13y1(){ note_ctor("_ZN3ccc8DD6x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y1E, buf);
    ::ccc::DD6x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y1E);
    dp->::ccc::DD6x13y1::~DD6x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y1E(Test__ZN3ccc8DD6x13y1E, "_ZN3ccc8DD6x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y1C1Ev();
extern void _ZN3ccc8DD6x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y1E[] = {
  NSPAIR(_ZN3ccc8DD6x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y1E[];
extern void _ZN3ccc8DD6x13y13abcEv();
extern void _ZN3ccc8DD6x13y13efgEv();
extern void _ZN3ccc8DD6x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y13efgEv,_ZTv0_n12_N3ccc8DD6x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y13efgEv,_ZThn4_N3ccc8DD6x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y13efgEv,_ZTv0_n12_N3ccc8DD6x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y1E[] = {
  {&(_ZTVN3ccc8DD6x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y1E[];
static VTBL_ENTRY alt_thunk_names709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y13efgEv,_ZTv0_n12_N3ccc8DD6x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y13efgEv,_ZThn4_N3ccc8DD6x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y1E = {  "_ZN3ccc8DD6x13y1E", // class name
  bases__ZN3ccc8DD6x13y1E, 2,
  &(vtc__ZN3ccc8DD6x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y1E),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  CC6x13y2  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y23pqrEv
  ~CC6x13y2(); // tgen
  CC6x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y2E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y23efgEv");}
void  ccc::CC6x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y23abcEv");}
void  ccc::CC6x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y23pqrEv");}
ccc::CC6x13y2 ::~CC6x13y2(){ note_dtor("_ZN3ccc8CC6x13y2E", this);} // tgen
ccc::CC6x13y2 ::CC6x13y2(){ note_ctor("_ZN3ccc8CC6x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y2E, buf);
    ::ccc::CC6x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y2E);
    dp->::ccc::CC6x13y2::~CC6x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y2E(Test__ZN3ccc8CC6x13y2E, "_ZN3ccc8CC6x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y2C1Ev();
extern void _ZN3ccc8CC6x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y2E[] = {
  NSPAIR(_ZN3ccc8CC6x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y2E[];
extern void _ZN3ccc8CC6x13y23efgEv();
extern void _ZN3ccc8CC6x13y23abcEv();
extern void _ZN3ccc8CC6x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y23abcEv,_ZTv0_n12_N3ccc8CC6x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y23abcEv,_ZThn4_N3ccc8CC6x13y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y23efgEv,_ZTv0_n16_N3ccc8CC6x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y23efgEv,_ZThn4_N3ccc8CC6x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y23abcEv,_ZTv0_n12_N3ccc8CC6x13y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y23efgEv,_ZTv0_n16_N3ccc8CC6x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y2E[] = {
  {&(_ZTVN3ccc8CC6x13y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y2E[];
static VTBL_ENTRY alt_thunk_names710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y23efgEv,_ZTv0_n16_N3ccc8CC6x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y23efgEv,_ZThn4_N3ccc8CC6x13y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y23abcEv,_ZTv0_n12_N3ccc8CC6x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y23abcEv,_ZThn4_N3ccc8CC6x13y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y2E = {  "_ZN3ccc8CC6x13y2E", // class name
  bases__ZN3ccc8CC6x13y2E, 2,
  &(vtc__ZN3ccc8CC6x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y2E),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  DD6x13y2  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD6x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD6x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x13y23pqrEv
  ~DD6x13y2(); // tgen
  DD6x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y2E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y23efgEv");}
void  ccc::DD6x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y23abcEv");}
void  ccc::DD6x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y23pqrEv");}
ccc::DD6x13y2 ::~DD6x13y2(){ note_dtor("_ZN3ccc8DD6x13y2E", this);} // tgen
ccc::DD6x13y2 ::DD6x13y2(){ note_ctor("_ZN3ccc8DD6x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y2E, buf);
    ::ccc::DD6x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y2E);
    dp->::ccc::DD6x13y2::~DD6x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y2E(Test__ZN3ccc8DD6x13y2E, "_ZN3ccc8DD6x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y2C1Ev();
extern void _ZN3ccc8DD6x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y2E[] = {
  NSPAIR(_ZN3ccc8DD6x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y2E[];
extern void _ZN3ccc8DD6x13y23abcEv();
extern void _ZN3ccc8DD6x13y23efgEv();
extern void _ZN3ccc8DD6x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y23efgEv,_ZTv0_n12_N3ccc8DD6x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y23efgEv,_ZThn4_N3ccc8DD6x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y23efgEv,_ZTv0_n12_N3ccc8DD6x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y2E[] = {
  {&(_ZTVN3ccc8DD6x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y2E[];
static VTBL_ENTRY alt_thunk_names711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y23efgEv,_ZTv0_n12_N3ccc8DD6x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y23efgEv,_ZThn4_N3ccc8DD6x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y2E = {  "_ZN3ccc8DD6x13y2E", // class name
  bases__ZN3ccc8DD6x13y2E, 2,
  &(vtc__ZN3ccc8DD6x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y2E),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  CC6x13y3  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x13y33abcEv
  ~CC6x13y3(); // tgen
  CC6x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y3E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y33efgEv");}
void  ccc::CC6x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y33pqrEv");}
void  ccc::CC6x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y33abcEv");}
ccc::CC6x13y3 ::~CC6x13y3(){ note_dtor("_ZN3ccc8CC6x13y3E", this);} // tgen
ccc::CC6x13y3 ::CC6x13y3(){ note_ctor("_ZN3ccc8CC6x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y3E, buf);
    ::ccc::CC6x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y3E);
    dp->::ccc::CC6x13y3::~CC6x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y3E(Test__ZN3ccc8CC6x13y3E, "_ZN3ccc8CC6x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y3C1Ev();
extern void _ZN3ccc8CC6x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y3E[] = {
  NSPAIR(_ZN3ccc8CC6x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y3E[];
extern void _ZN3ccc8CC6x13y33efgEv();
extern void _ZN3ccc8CC6x13y33pqrEv();
extern void _ZN3ccc8CC6x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y33abcEv,_ZTv0_n12_N3ccc8CC6x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y33abcEv,_ZThn4_N3ccc8CC6x13y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y33efgEv,_ZTv0_n16_N3ccc8CC6x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y33efgEv,_ZThn4_N3ccc8CC6x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y33abcEv,_ZTv0_n12_N3ccc8CC6x13y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y33efgEv,_ZTv0_n16_N3ccc8CC6x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y3E[] = {
  {&(_ZTVN3ccc8CC6x13y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y3E[];
static VTBL_ENTRY alt_thunk_names712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y33efgEv,_ZTv0_n16_N3ccc8CC6x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y33efgEv,_ZThn4_N3ccc8CC6x13y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y33abcEv,_ZTv0_n12_N3ccc8CC6x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y33abcEv,_ZThn4_N3ccc8CC6x13y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y3E = {  "_ZN3ccc8CC6x13y3E", // class name
  bases__ZN3ccc8CC6x13y3E, 2,
  &(vtc__ZN3ccc8CC6x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y3E),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  DD6x13y3  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD6x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x13y33abcEv
  ~DD6x13y3(); // tgen
  DD6x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y3E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y33efgEv");}
void  ccc::DD6x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y33pqrEv");}
void  ccc::DD6x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y33abcEv");}
ccc::DD6x13y3 ::~DD6x13y3(){ note_dtor("_ZN3ccc8DD6x13y3E", this);} // tgen
ccc::DD6x13y3 ::DD6x13y3(){ note_ctor("_ZN3ccc8DD6x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y3E, buf);
    ::ccc::DD6x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y3E);
    dp->::ccc::DD6x13y3::~DD6x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y3E(Test__ZN3ccc8DD6x13y3E, "_ZN3ccc8DD6x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y3C1Ev();
extern void _ZN3ccc8DD6x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y3E[] = {
  NSPAIR(_ZN3ccc8DD6x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y3E[];
extern void _ZN3ccc8DD6x13y33abcEv();
extern void _ZN3ccc8DD6x13y33efgEv();
extern void _ZN3ccc8DD6x13y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y33efgEv,_ZTv0_n12_N3ccc8DD6x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y33efgEv,_ZThn4_N3ccc8DD6x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y33efgEv,_ZTv0_n12_N3ccc8DD6x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y3E[] = {
  {&(_ZTVN3ccc8DD6x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y3E[];
static VTBL_ENTRY alt_thunk_names713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y33efgEv,_ZTv0_n12_N3ccc8DD6x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y33efgEv,_ZThn4_N3ccc8DD6x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y3E = {  "_ZN3ccc8DD6x13y3E", // class name
  bases__ZN3ccc8DD6x13y3E, 2,
  &(vtc__ZN3ccc8DD6x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y3E),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  CC6x13y4  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC6x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x13y43efgEv
  ~CC6x13y4(); // tgen
  CC6x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y4E) C1{ VBC2{ v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y43pqrEv");}
void  ccc::CC6x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y43abcEv");}
void  ccc::CC6x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y43efgEv");}
ccc::CC6x13y4 ::~CC6x13y4(){ note_dtor("_ZN3ccc8CC6x13y4E", this);} // tgen
ccc::CC6x13y4 ::CC6x13y4(){ note_ctor("_ZN3ccc8CC6x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y4E, buf);
    ::ccc::CC6x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y4E);
    dp->::ccc::CC6x13y4::~CC6x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y4E(Test__ZN3ccc8CC6x13y4E, "_ZN3ccc8CC6x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y4C1Ev();
extern void _ZN3ccc8CC6x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y4E[] = {
  NSPAIR(_ZN3ccc8CC6x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y4E[];
extern void _ZN3ccc8CC6x13y43efgEv();
extern void _ZN3ccc8CC6x13y43pqrEv();
extern void _ZN3ccc8CC6x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y43abcEv,_ZTv0_n12_N3ccc8CC6x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y43abcEv,_ZThn4_N3ccc8CC6x13y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y43efgEv,_ZTv0_n16_N3ccc8CC6x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y43efgEv,_ZThn4_N3ccc8CC6x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y43abcEv,_ZTv0_n12_N3ccc8CC6x13y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y43efgEv,_ZTv0_n16_N3ccc8CC6x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y4E[] = {
  {&(_ZTVN3ccc8CC6x13y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y4E[];
static VTBL_ENTRY alt_thunk_names714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y43efgEv,_ZTv0_n16_N3ccc8CC6x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y43efgEv,_ZThn4_N3ccc8CC6x13y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y43abcEv,_ZTv0_n12_N3ccc8CC6x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y43abcEv,_ZThn4_N3ccc8CC6x13y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y4E = {  "_ZN3ccc8CC6x13y4E", // class name
  bases__ZN3ccc8CC6x13y4E, 2,
  &(vtc__ZN3ccc8CC6x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y4E),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  DD6x13y4  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD6x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD6x13y43efgEv
  ~DD6x13y4(); // tgen
  DD6x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y4E) C1{ VBC2{ v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y43pqrEv");}
void  ccc::DD6x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y43abcEv");}
void  ccc::DD6x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y43efgEv");}
ccc::DD6x13y4 ::~DD6x13y4(){ note_dtor("_ZN3ccc8DD6x13y4E", this);} // tgen
ccc::DD6x13y4 ::DD6x13y4(){ note_ctor("_ZN3ccc8DD6x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y4E, buf);
    ::ccc::DD6x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y4E);
    dp->::ccc::DD6x13y4::~DD6x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y4E(Test__ZN3ccc8DD6x13y4E, "_ZN3ccc8DD6x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y4C1Ev();
extern void _ZN3ccc8DD6x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y4E[] = {
  NSPAIR(_ZN3ccc8DD6x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y4E[];
extern void _ZN3ccc8DD6x13y43abcEv();
extern void _ZN3ccc8DD6x13y43efgEv();
extern void _ZN3ccc8DD6x13y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y43efgEv,_ZTv0_n12_N3ccc8DD6x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y43efgEv,_ZThn4_N3ccc8DD6x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y43efgEv,_ZTv0_n12_N3ccc8DD6x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y4E[] = {
  {&(_ZTVN3ccc8DD6x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y4E[];
static VTBL_ENTRY alt_thunk_names715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y43efgEv,_ZTv0_n12_N3ccc8DD6x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y43efgEv,_ZThn4_N3ccc8DD6x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y4E = {  "_ZN3ccc8DD6x13y4E", // class name
  bases__ZN3ccc8DD6x13y4E, 2,
  &(vtc__ZN3ccc8DD6x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y4E),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  CC6x13y5  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC6x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x13y53abcEv
  ~CC6x13y5(); // tgen
  CC6x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y5E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y53pqrEv");}
void  ccc::CC6x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y53efgEv");}
void  ccc::CC6x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y53abcEv");}
ccc::CC6x13y5 ::~CC6x13y5(){ note_dtor("_ZN3ccc8CC6x13y5E", this);} // tgen
ccc::CC6x13y5 ::CC6x13y5(){ note_ctor("_ZN3ccc8CC6x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y5E, buf);
    ::ccc::CC6x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y5E);
    dp->::ccc::CC6x13y5::~CC6x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y5E(Test__ZN3ccc8CC6x13y5E, "_ZN3ccc8CC6x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y5C1Ev();
extern void _ZN3ccc8CC6x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y5E[] = {
  NSPAIR(_ZN3ccc8CC6x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y5E[];
extern void _ZN3ccc8CC6x13y53efgEv();
extern void _ZN3ccc8CC6x13y53pqrEv();
extern void _ZN3ccc8CC6x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y53abcEv,_ZTv0_n12_N3ccc8CC6x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y53abcEv,_ZThn4_N3ccc8CC6x13y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y53efgEv,_ZTv0_n16_N3ccc8CC6x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y53efgEv,_ZThn4_N3ccc8CC6x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y53abcEv,_ZTv0_n12_N3ccc8CC6x13y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y53efgEv,_ZTv0_n16_N3ccc8CC6x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y5E[] = {
  {&(_ZTVN3ccc8CC6x13y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y5E[];
static VTBL_ENTRY alt_thunk_names716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y53efgEv,_ZTv0_n16_N3ccc8CC6x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y53efgEv,_ZThn4_N3ccc8CC6x13y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y53abcEv,_ZTv0_n12_N3ccc8CC6x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y53abcEv,_ZThn4_N3ccc8CC6x13y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y5E = {  "_ZN3ccc8CC6x13y5E", // class name
  bases__ZN3ccc8CC6x13y5E, 2,
  &(vtc__ZN3ccc8CC6x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y5E),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  DD6x13y5  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD6x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD6x13y53abcEv
  ~DD6x13y5(); // tgen
  DD6x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y5E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y53pqrEv");}
void  ccc::DD6x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y53efgEv");}
void  ccc::DD6x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y53abcEv");}
ccc::DD6x13y5 ::~DD6x13y5(){ note_dtor("_ZN3ccc8DD6x13y5E", this);} // tgen
ccc::DD6x13y5 ::DD6x13y5(){ note_ctor("_ZN3ccc8DD6x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y5E, buf);
    ::ccc::DD6x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y5E);
    dp->::ccc::DD6x13y5::~DD6x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y5E(Test__ZN3ccc8DD6x13y5E, "_ZN3ccc8DD6x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y5C1Ev();
extern void _ZN3ccc8DD6x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y5E[] = {
  NSPAIR(_ZN3ccc8DD6x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y5E[];
extern void _ZN3ccc8DD6x13y53abcEv();
extern void _ZN3ccc8DD6x13y53efgEv();
extern void _ZN3ccc8DD6x13y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y53efgEv,_ZTv0_n12_N3ccc8DD6x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y53efgEv,_ZThn4_N3ccc8DD6x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y53efgEv,_ZTv0_n12_N3ccc8DD6x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y5E[] = {
  {&(_ZTVN3ccc8DD6x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y5E[];
static VTBL_ENTRY alt_thunk_names717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y53efgEv,_ZTv0_n12_N3ccc8DD6x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y53efgEv,_ZThn4_N3ccc8DD6x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y5E = {  "_ZN3ccc8DD6x13y5E", // class name
  bases__ZN3ccc8DD6x13y5E, 2,
  &(vtc__ZN3ccc8DD6x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y5E),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  CC6x13y6  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x13y63efgEv
  ~CC6x13y6(); // tgen
  CC6x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y6E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y63abcEv");}
void  ccc::CC6x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y63efgEv");}
ccc::CC6x13y6 ::~CC6x13y6(){ note_dtor("_ZN3ccc8CC6x13y6E", this);} // tgen
ccc::CC6x13y6 ::CC6x13y6(){ note_ctor("_ZN3ccc8CC6x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y6E, buf);
    ::ccc::CC6x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y6E);
    dp->::ccc::CC6x13y6::~CC6x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y6E(Test__ZN3ccc8CC6x13y6E, "_ZN3ccc8CC6x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y6C1Ev();
extern void _ZN3ccc8CC6x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y6E[] = {
  NSPAIR(_ZN3ccc8CC6x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y6E[];
extern void _ZN3ccc8CC6x13y63efgEv();
extern void _ZN3ccc8CC6x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y63abcEv,_ZTv0_n12_N3ccc8CC6x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y63abcEv,_ZThn4_N3ccc8CC6x13y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y63efgEv,_ZTv0_n16_N3ccc8CC6x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y63efgEv,_ZThn4_N3ccc8CC6x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y63abcEv,_ZTv0_n12_N3ccc8CC6x13y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y63efgEv,_ZTv0_n16_N3ccc8CC6x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y6E[] = {
  {&(_ZTVN3ccc8CC6x13y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x13y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y6E[];
static VTBL_ENTRY alt_thunk_names718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y63efgEv,_ZTv0_n16_N3ccc8CC6x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y63efgEv,_ZThn4_N3ccc8CC6x13y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y63abcEv,_ZTv0_n12_N3ccc8CC6x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y63abcEv,_ZThn4_N3ccc8CC6x13y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y6E = {  "_ZN3ccc8CC6x13y6E", // class name
  bases__ZN3ccc8CC6x13y6E, 2,
  &(vtc__ZN3ccc8CC6x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y6E),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  DD6x13y6  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD6x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD6x13y63efgEv
  ~DD6x13y6(); // tgen
  DD6x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y6E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y63abcEv");}
void  ccc::DD6x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y63efgEv");}
ccc::DD6x13y6 ::~DD6x13y6(){ note_dtor("_ZN3ccc8DD6x13y6E", this);} // tgen
ccc::DD6x13y6 ::DD6x13y6(){ note_ctor("_ZN3ccc8DD6x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y6E, buf);
    ::ccc::DD6x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y6E);
    dp->::ccc::DD6x13y6::~DD6x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y6E(Test__ZN3ccc8DD6x13y6E, "_ZN3ccc8DD6x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y6C1Ev();
extern void _ZN3ccc8DD6x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y6E[] = {
  NSPAIR(_ZN3ccc8DD6x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y6E[];
extern void _ZN3ccc8DD6x13y63abcEv();
extern void _ZN3ccc8DD6x13y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y63efgEv,_ZTv0_n12_N3ccc8DD6x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y63efgEv,_ZThn4_N3ccc8DD6x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y63efgEv,_ZTv0_n12_N3ccc8DD6x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y6E[] = {
  {&(_ZTVN3ccc8DD6x13y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x13y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x13y6E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y6E[];
static VTBL_ENTRY alt_thunk_names719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y63efgEv,_ZTv0_n12_N3ccc8DD6x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y63efgEv,_ZThn4_N3ccc8DD6x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y6E = {  "_ZN3ccc8DD6x13y6E", // class name
  bases__ZN3ccc8DD6x13y6E, 2,
  &(vtc__ZN3ccc8DD6x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y6E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y6E),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  CC6x13y7  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC6x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y73pqrEv
  ~CC6x13y7(); // tgen
  CC6x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y7E) C1{ VBC2{ v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y73abcEv");}
void  ccc::CC6x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y73pqrEv");}
ccc::CC6x13y7 ::~CC6x13y7(){ note_dtor("_ZN3ccc8CC6x13y7E", this);} // tgen
ccc::CC6x13y7 ::CC6x13y7(){ note_ctor("_ZN3ccc8CC6x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y7E, buf);
    ::ccc::CC6x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y7E);
    dp->::ccc::CC6x13y7::~CC6x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y7E(Test__ZN3ccc8CC6x13y7E, "_ZN3ccc8CC6x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y7C1Ev();
extern void _ZN3ccc8CC6x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y7E[] = {
  NSPAIR(_ZN3ccc8CC6x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC6x13y73abcEv();
extern void _ZN3ccc8CC6x13y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y73abcEv,_ZTv0_n12_N3ccc8CC6x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y73abcEv,_ZThn4_N3ccc8CC6x13y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y73abcEv,_ZTv0_n12_N3ccc8CC6x13y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y7E[] = {
  {&(_ZTVN3ccc8CC6x13y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x13y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y7E[];
static VTBL_ENTRY alt_thunk_names720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y73abcEv,_ZTv0_n12_N3ccc8CC6x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y73abcEv,_ZThn4_N3ccc8CC6x13y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y7E = {  "_ZN3ccc8CC6x13y7E", // class name
  bases__ZN3ccc8CC6x13y7E, 2,
  &(vtc__ZN3ccc8CC6x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y7E),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  DD6x13y7  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD6x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x13y73pqrEv
  ~DD6x13y7(); // tgen
  DD6x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y7E) C1{ VBC2{ v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y73abcEv");}
void  ccc::DD6x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y73pqrEv");}
ccc::DD6x13y7 ::~DD6x13y7(){ note_dtor("_ZN3ccc8DD6x13y7E", this);} // tgen
ccc::DD6x13y7 ::DD6x13y7(){ note_ctor("_ZN3ccc8DD6x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y7E, buf);
    ::ccc::DD6x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y7E);
    dp->::ccc::DD6x13y7::~DD6x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y7E(Test__ZN3ccc8DD6x13y7E, "_ZN3ccc8DD6x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y7C1Ev();
extern void _ZN3ccc8DD6x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y7E[] = {
  NSPAIR(_ZN3ccc8DD6x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y7E[];
extern void _ZN3ccc8DD6x13y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y7E[] = {
  {&(_ZTVN3ccc8DD6x13y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y7E[];
Class_Descriptor cd__ZN3ccc8DD6x13y7E = {  "_ZN3ccc8DD6x13y7E", // class name
  bases__ZN3ccc8DD6x13y7E, 2,
  &(vtc__ZN3ccc8DD6x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y7E),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  CC6x13y8  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x13y83abcEv
  ~CC6x13y8(); // tgen
  CC6x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y8E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y83efgEv");}
void  ccc::CC6x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x13y83abcEv");}
ccc::CC6x13y8 ::~CC6x13y8(){ note_dtor("_ZN3ccc8CC6x13y8E", this);} // tgen
ccc::CC6x13y8 ::CC6x13y8(){ note_ctor("_ZN3ccc8CC6x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y8E, buf);
    ::ccc::CC6x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y8E);
    dp->::ccc::CC6x13y8::~CC6x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y8E(Test__ZN3ccc8CC6x13y8E, "_ZN3ccc8CC6x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y8C1Ev();
extern void _ZN3ccc8CC6x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y8E[] = {
  NSPAIR(_ZN3ccc8CC6x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y8E[];
extern void _ZN3ccc8CC6x13y83efgEv();
extern void _ZN3ccc8CC6x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x13y83abcEv,_ZTv0_n12_N3ccc8CC6x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y83abcEv,_ZThn4_N3ccc8CC6x13y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y83efgEv,_ZTv0_n16_N3ccc8CC6x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y83efgEv,_ZThn4_N3ccc8CC6x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x13y83abcEv,_ZTv0_n12_N3ccc8CC6x13y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y83efgEv,_ZTv0_n16_N3ccc8CC6x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y8E[] = {
  {&(_ZTVN3ccc8CC6x13y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x13y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y8E[];
static VTBL_ENTRY alt_thunk_names721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y83efgEv,_ZTv0_n16_N3ccc8CC6x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y83efgEv,_ZThn4_N3ccc8CC6x13y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x13y83abcEv,_ZTv0_n12_N3ccc8CC6x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y83abcEv,_ZThn4_N3ccc8CC6x13y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y8E = {  "_ZN3ccc8CC6x13y8E", // class name
  bases__ZN3ccc8CC6x13y8E, 2,
  &(vtc__ZN3ccc8CC6x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y8E),2, //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  DD6x13y8  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD6x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD6x13y83abcEv
  ~DD6x13y8(); // tgen
  DD6x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y8E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y83efgEv");}
void  ccc::DD6x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x13y83abcEv");}
ccc::DD6x13y8 ::~DD6x13y8(){ note_dtor("_ZN3ccc8DD6x13y8E", this);} // tgen
ccc::DD6x13y8 ::DD6x13y8(){ note_ctor("_ZN3ccc8DD6x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y8E, buf);
    ::ccc::DD6x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y8E);
    dp->::ccc::DD6x13y8::~DD6x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y8E(Test__ZN3ccc8DD6x13y8E, "_ZN3ccc8DD6x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y8C1Ev();
extern void _ZN3ccc8DD6x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y8E[] = {
  NSPAIR(_ZN3ccc8DD6x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y8E[];
extern void _ZN3ccc8DD6x13y83abcEv();
extern void _ZN3ccc8DD6x13y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y83efgEv,_ZTv0_n12_N3ccc8DD6x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y83efgEv,_ZThn4_N3ccc8DD6x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y83efgEv,_ZTv0_n12_N3ccc8DD6x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y8E[] = {
  {&(_ZTVN3ccc8DD6x13y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x13y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x13y8E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y8E[];
static VTBL_ENTRY alt_thunk_names722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y83efgEv,_ZTv0_n12_N3ccc8DD6x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y83efgEv,_ZThn4_N3ccc8DD6x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y8E = {  "_ZN3ccc8DD6x13y8E", // class name
  bases__ZN3ccc8DD6x13y8E, 2,
  &(vtc__ZN3ccc8DD6x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y8E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y8E),3, //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  CC6x13y9  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC6x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x13y93pqrEv
  ~CC6x13y9(); // tgen
  CC6x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x13y9E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x13y93efgEv");}
void  ccc::CC6x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x13y93pqrEv");}
ccc::CC6x13y9 ::~CC6x13y9(){ note_dtor("_ZN3ccc8CC6x13y9E", this);} // tgen
ccc::CC6x13y9 ::CC6x13y9(){ note_ctor("_ZN3ccc8CC6x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC6x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x13y9E, buf);
    ::ccc::CC6x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x13y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC6x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x13y9E);
    dp->::ccc::CC6x13y9::~CC6x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x13y9E(Test__ZN3ccc8CC6x13y9E, "_ZN3ccc8CC6x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x13y9C1Ev();
extern void _ZN3ccc8CC6x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC6x13y9E[] = {
  NSPAIR(_ZN3ccc8CC6x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC6x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC6x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x13y9E[];
extern void _ZN3ccc8CC6x13y93efgEv();
extern void _ZN3ccc8CC6x13y93pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x13y93efgEv,_ZTv0_n16_N3ccc8CC6x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x13y93efgEv,_ZThn4_N3ccc8CC6x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x13y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x13y93efgEv,_ZTv0_n16_N3ccc8CC6x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x13y9E[] = {
  {&(_ZTVN3ccc8CC6x13y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x13y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x13y9E[];
static VTBL_ENTRY alt_thunk_names723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x13y93efgEv,_ZTv0_n16_N3ccc8CC6x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x13y93efgEv,_ZThn4_N3ccc8CC6x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x13y9E = {  "_ZN3ccc8CC6x13y9E", // class name
  bases__ZN3ccc8CC6x13y9E, 2,
  &(vtc__ZN3ccc8CC6x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x13y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x13y9E),2, //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  DD6x13y9  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD6x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x13y93pqrEv
  ~DD6x13y9(); // tgen
  DD6x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD6x13y9E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x13y93efgEv");}
void  ccc::DD6x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x13y93pqrEv");}
ccc::DD6x13y9 ::~DD6x13y9(){ note_dtor("_ZN3ccc8DD6x13y9E", this);} // tgen
ccc::DD6x13y9 ::DD6x13y9(){ note_ctor("_ZN3ccc8DD6x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD6x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x13y9E, buf);
    ::ccc::DD6x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x13y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD6x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x13y9E);
    dp->::ccc::DD6x13y9::~DD6x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x13y9E(Test__ZN3ccc8DD6x13y9E, "_ZN3ccc8DD6x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x13y9C1Ev();
extern void _ZN3ccc8DD6x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD6x13y9E[] = {
  NSPAIR(_ZN3ccc8DD6x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD6x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD6x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x13y93efgEv();
extern void _ZN3ccc8DD6x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x13y93efgEv,_ZTv0_n12_N3ccc8DD6x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x13y93efgEv,_ZThn4_N3ccc8DD6x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x13y93efgEv,_ZTv0_n12_N3ccc8DD6x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x13y9E[] = {
  {&(_ZTVN3ccc8DD6x13y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x13y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x13y9E[];
static VTBL_ENTRY alt_thunk_names724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x13y93efgEv,_ZTv0_n12_N3ccc8DD6x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x13y93efgEv,_ZThn4_N3ccc8DD6x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x13y9E = {  "_ZN3ccc8DD6x13y9E", // class name
  bases__ZN3ccc8DD6x13y9E, 2,
  &(vtc__ZN3ccc8DD6x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x13y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x13y9E),3, //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  CC6x13y10  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC6x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x13y103abcEv
  ~CC6x13y10(); // tgen
  CC6x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y10E) C1{ VBC2{ v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC6x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x13y103pqrEv");}
void  ccc::CC6x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x13y103abcEv");}
ccc::CC6x13y10 ::~CC6x13y10(){ note_dtor("_ZN3ccc9CC6x13y10E", this);} // tgen
ccc::CC6x13y10 ::CC6x13y10(){ note_ctor("_ZN3ccc9CC6x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC6x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x13y10E, buf);
    ::ccc::CC6x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x13y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC6x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x13y10E);
    dp->::ccc::CC6x13y10::~CC6x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x13y10E(Test__ZN3ccc9CC6x13y10E, "_ZN3ccc9CC6x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x13y10C1Ev();
extern void _ZN3ccc9CC6x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC6x13y10E[] = {
  NSPAIR(_ZN3ccc9CC6x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC6x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC6x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC6x13y103pqrEv();
extern void _ZN3ccc9CC6x13y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x13y103abcEv,_ZTv0_n12_N3ccc9CC6x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x13y103abcEv,_ZThn4_N3ccc9CC6x13y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x13y103abcEv,_ZTv0_n12_N3ccc9CC6x13y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x13y10E[] = {
  {&(_ZTVN3ccc9CC6x13y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC6x13y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x13y10E[];
static VTBL_ENTRY alt_thunk_names725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x13y103abcEv,_ZTv0_n12_N3ccc9CC6x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x13y103abcEv,_ZThn4_N3ccc9CC6x13y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x13y10E = {  "_ZN3ccc9CC6x13y10E", // class name
  bases__ZN3ccc9CC6x13y10E, 2,
  &(vtc__ZN3ccc9CC6x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x13y10E),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  DD6x13y10  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD6x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD6x13y103abcEv
  ~DD6x13y10(); // tgen
  DD6x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD6x13y10E) C1{ VBC2{ v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD6x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x13y103pqrEv");}
void  ccc::DD6x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x13y103abcEv");}
ccc::DD6x13y10 ::~DD6x13y10(){ note_dtor("_ZN3ccc9DD6x13y10E", this);} // tgen
ccc::DD6x13y10 ::DD6x13y10(){ note_ctor("_ZN3ccc9DD6x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD6x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x13y10E, buf);
    ::ccc::DD6x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x13y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD6x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x13y10E);
    dp->::ccc::DD6x13y10::~DD6x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x13y10E(Test__ZN3ccc9DD6x13y10E, "_ZN3ccc9DD6x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x13y10C1Ev();
extern void _ZN3ccc9DD6x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD6x13y10E[] = {
  NSPAIR(_ZN3ccc9DD6x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD6x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD6x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y10E[];
extern void _ZN3ccc9DD6x13y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y103pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x13y10E[] = {
  {&(_ZTVN3ccc9DD6x13y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x13y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x13y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x13y10E[];
Class_Descriptor cd__ZN3ccc9DD6x13y10E = {  "_ZN3ccc9DD6x13y10E", // class name
  bases__ZN3ccc9DD6x13y10E, 2,
  &(vtc__ZN3ccc9DD6x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x13y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x13y10E),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  CC6x13y11  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC6x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x13y113efgEv
  ~CC6x13y11(); // tgen
  CC6x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y11E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x13y113pqrEv");}
void  ccc::CC6x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x13y113efgEv");}
ccc::CC6x13y11 ::~CC6x13y11(){ note_dtor("_ZN3ccc9CC6x13y11E", this);} // tgen
ccc::CC6x13y11 ::CC6x13y11(){ note_ctor("_ZN3ccc9CC6x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC6x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x13y11E, buf);
    ::ccc::CC6x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x13y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC6x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x13y11E);
    dp->::ccc::CC6x13y11::~CC6x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x13y11E(Test__ZN3ccc9CC6x13y11E, "_ZN3ccc9CC6x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x13y11C1Ev();
extern void _ZN3ccc9CC6x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC6x13y11E[] = {
  NSPAIR(_ZN3ccc9CC6x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC6x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC6x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x13y11E[];
extern void _ZN3ccc9CC6x13y113efgEv();
extern void _ZN3ccc9CC6x13y113pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x13y113efgEv,_ZTv0_n16_N3ccc9CC6x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x13y113efgEv,_ZThn4_N3ccc9CC6x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x13y113efgEv,_ZTv0_n16_N3ccc9CC6x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x13y11E[] = {
  {&(_ZTVN3ccc9CC6x13y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x13y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x13y11E[];
static VTBL_ENTRY alt_thunk_names726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x13y113efgEv,_ZTv0_n16_N3ccc9CC6x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x13y113efgEv,_ZThn4_N3ccc9CC6x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x13y11E = {  "_ZN3ccc9CC6x13y11E", // class name
  bases__ZN3ccc9CC6x13y11E, 2,
  &(vtc__ZN3ccc9CC6x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x13y11E),2, //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  DD6x13y11  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD6x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD6x13y113efgEv
  ~DD6x13y11(); // tgen
  DD6x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD6x13y11E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x13y113pqrEv");}
void  ccc::DD6x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x13y113efgEv");}
ccc::DD6x13y11 ::~DD6x13y11(){ note_dtor("_ZN3ccc9DD6x13y11E", this);} // tgen
ccc::DD6x13y11 ::DD6x13y11(){ note_ctor("_ZN3ccc9DD6x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD6x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x13y11E, buf);
    ::ccc::DD6x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x13y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD6x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x13y11E);
    dp->::ccc::DD6x13y11::~DD6x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x13y11E(Test__ZN3ccc9DD6x13y11E, "_ZN3ccc9DD6x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x13y11C1Ev();
extern void _ZN3ccc9DD6x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD6x13y11E[] = {
  NSPAIR(_ZN3ccc9DD6x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD6x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD6x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x13y113efgEv();
extern void _ZN3ccc9DD6x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x13y113efgEv,_ZTv0_n12_N3ccc9DD6x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x13y113efgEv,_ZThn4_N3ccc9DD6x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x13y113efgEv,_ZTv0_n12_N3ccc9DD6x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x13y11E[] = {
  {&(_ZTVN3ccc9DD6x13y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x13y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x13y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x13y11E[];
static VTBL_ENTRY alt_thunk_names727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x13y113efgEv,_ZTv0_n12_N3ccc9DD6x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x13y113efgEv,_ZThn4_N3ccc9DD6x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x13y11E = {  "_ZN3ccc9DD6x13y11E", // class name
  bases__ZN3ccc9DD6x13y11E, 2,
  &(vtc__ZN3ccc9DD6x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x13y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x13y11E),3, //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  CC6x13y12  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC6x13y123abcEv
  ~CC6x13y12(); // tgen
  CC6x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y12E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC6x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x13y123abcEv");}
ccc::CC6x13y12 ::~CC6x13y12(){ note_dtor("_ZN3ccc9CC6x13y12E", this);} // tgen
ccc::CC6x13y12 ::CC6x13y12(){ note_ctor("_ZN3ccc9CC6x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC6x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x13y12E, buf);
    ::ccc::CC6x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x13y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC6x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x13y12E);
    dp->::ccc::CC6x13y12::~CC6x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x13y12E(Test__ZN3ccc9CC6x13y12E, "_ZN3ccc9CC6x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x13y12C1Ev();
extern void _ZN3ccc9CC6x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC6x13y12E[] = {
  NSPAIR(_ZN3ccc9CC6x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC6x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC6x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC6x13y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x13y123abcEv,_ZTv0_n12_N3ccc9CC6x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x13y123abcEv,_ZThn4_N3ccc9CC6x13y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x13y123abcEv,_ZTv0_n12_N3ccc9CC6x13y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x13y12E[] = {
  {&(_ZTVN3ccc9CC6x13y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x13y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x13y12E[];
static VTBL_ENTRY alt_thunk_names728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x13y123abcEv,_ZTv0_n12_N3ccc9CC6x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x13y123abcEv,_ZThn4_N3ccc9CC6x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x13y12E = {  "_ZN3ccc9CC6x13y12E", // class name
  bases__ZN3ccc9CC6x13y12E, 2,
  &(vtc__ZN3ccc9CC6x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x13y12E),2, //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  DD6x13y12  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD6x13y123abcEv
  ~DD6x13y12(); // tgen
  DD6x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD6x13y12E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD6x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x13y123abcEv");}
ccc::DD6x13y12 ::~DD6x13y12(){ note_dtor("_ZN3ccc9DD6x13y12E", this);} // tgen
ccc::DD6x13y12 ::DD6x13y12(){ note_ctor("_ZN3ccc9DD6x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD6x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x13y12E, buf);
    ::ccc::DD6x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x13y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD6x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x13y12E);
    dp->::ccc::DD6x13y12::~DD6x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x13y12E(Test__ZN3ccc9DD6x13y12E, "_ZN3ccc9DD6x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x13y12C1Ev();
extern void _ZN3ccc9DD6x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD6x13y12E[] = {
  NSPAIR(_ZN3ccc9DD6x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD6x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD6x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y12E[];
extern void _ZN3ccc9DD6x13y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x13y12E[] = {
  {&(_ZTVN3ccc9DD6x13y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x13y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x13y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x13y12E[];
Class_Descriptor cd__ZN3ccc9DD6x13y12E = {  "_ZN3ccc9DD6x13y12E", // class name
  bases__ZN3ccc9DD6x13y12E, 2,
  &(vtc__ZN3ccc9DD6x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x13y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x13y12E),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  CC6x13y13  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC6x13y133efgEv
  ~CC6x13y13(); // tgen
  CC6x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y13E) C1{ VBC2{ v2 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC6x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x13y133efgEv");}
ccc::CC6x13y13 ::~CC6x13y13(){ note_dtor("_ZN3ccc9CC6x13y13E", this);} // tgen
ccc::CC6x13y13 ::CC6x13y13(){ note_ctor("_ZN3ccc9CC6x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC6x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x13y13E, buf);
    ::ccc::CC6x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x13y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC6x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x13y13E);
    dp->::ccc::CC6x13y13::~CC6x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x13y13E(Test__ZN3ccc9CC6x13y13E, "_ZN3ccc9CC6x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x13y13C1Ev();
extern void _ZN3ccc9CC6x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC6x13y13E[] = {
  NSPAIR(_ZN3ccc9CC6x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC6x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC6x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x13y13E[];
extern void _ZN3ccc9CC6x13y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x13y133efgEv,_ZTv0_n16_N3ccc9CC6x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x13y133efgEv,_ZThn4_N3ccc9CC6x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x13y133efgEv,_ZTv0_n16_N3ccc9CC6x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x13y13E[] = {
  {&(_ZTVN3ccc9CC6x13y13E[3]),  3,10},
  {&(_ZTVN3ccc9CC6x13y13E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x13y13E[];
static VTBL_ENTRY alt_thunk_names729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x13y133efgEv,_ZTv0_n16_N3ccc9CC6x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x13y133efgEv,_ZThn4_N3ccc9CC6x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x13y13E = {  "_ZN3ccc9CC6x13y13E", // class name
  bases__ZN3ccc9CC6x13y13E, 2,
  &(vtc__ZN3ccc9CC6x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y13E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x13y13E),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  DD6x13y13  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD6x13y133efgEv
  ~DD6x13y13(); // tgen
  DD6x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD6x13y13E) C1{ VBC2{ v2 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD6x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x13y133efgEv");}
ccc::DD6x13y13 ::~DD6x13y13(){ note_dtor("_ZN3ccc9DD6x13y13E", this);} // tgen
ccc::DD6x13y13 ::DD6x13y13(){ note_ctor("_ZN3ccc9DD6x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD6x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x13y13E, buf);
    ::ccc::DD6x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x13y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD6x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x13y13E);
    dp->::ccc::DD6x13y13::~DD6x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x13y13E(Test__ZN3ccc9DD6x13y13E, "_ZN3ccc9DD6x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x13y13C1Ev();
extern void _ZN3ccc9DD6x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD6x13y13E[] = {
  NSPAIR(_ZN3ccc9DD6x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD6x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD6x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x13y133efgEv,_ZTv0_n12_N3ccc9DD6x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x13y133efgEv,_ZThn4_N3ccc9DD6x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y133efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x13y133efgEv,_ZTv0_n12_N3ccc9DD6x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x13y13E[] = {
  {&(_ZTVN3ccc9DD6x13y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x13y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x13y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x13y13E[];
static VTBL_ENTRY alt_thunk_names730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x13y133efgEv,_ZTv0_n12_N3ccc9DD6x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x13y133efgEv,_ZThn4_N3ccc9DD6x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x13y13E = {  "_ZN3ccc9DD6x13y13E", // class name
  bases__ZN3ccc9DD6x13y13E, 2,
  &(vtc__ZN3ccc9DD6x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x13y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x13y13E),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  CC6x13y14  : virtual ::ccc::AA6 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC6x13y143pqrEv
  ~CC6x13y14(); // tgen
  CC6x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y14E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC6x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x13y143pqrEv");}
ccc::CC6x13y14 ::~CC6x13y14(){ note_dtor("_ZN3ccc9CC6x13y14E", this);} // tgen
ccc::CC6x13y14 ::CC6x13y14(){ note_ctor("_ZN3ccc9CC6x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC6x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x13y14E, buf);
    ::ccc::CC6x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x13y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC6x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x13y14E);
    dp->::ccc::CC6x13y14::~CC6x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x13y14E(Test__ZN3ccc9CC6x13y14E, "_ZN3ccc9CC6x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x13y14C1Ev();
extern void _ZN3ccc9CC6x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC6x13y14E[] = {
  NSPAIR(_ZN3ccc9CC6x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC6x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC6x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC6x13y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x13y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x13y14E[] = {
  {&(_ZTVN3ccc9CC6x13y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x13y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x13y14E[];
Class_Descriptor cd__ZN3ccc9CC6x13y14E = {  "_ZN3ccc9CC6x13y14E", // class name
  bases__ZN3ccc9CC6x13y14E, 2,
  &(vtc__ZN3ccc9CC6x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x13y14E),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  DD6x13y14  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD6x13y143pqrEv
  ~DD6x13y14(); // tgen
  DD6x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD6x13y14E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD6x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x13y143pqrEv");}
ccc::DD6x13y14 ::~DD6x13y14(){ note_dtor("_ZN3ccc9DD6x13y14E", this);} // tgen
ccc::DD6x13y14 ::DD6x13y14(){ note_ctor("_ZN3ccc9DD6x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD6x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x13y14E, buf);
    ::ccc::DD6x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x13y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD6x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x13y14E);
    dp->::ccc::DD6x13y14::~DD6x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x13y14E(Test__ZN3ccc9DD6x13y14E, "_ZN3ccc9DD6x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x13y14C1Ev();
extern void _ZN3ccc9DD6x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD6x13y14E[] = {
  NSPAIR(_ZN3ccc9DD6x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD6x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD6x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x13y14E[] = {
  {&(_ZTVN3ccc9DD6x13y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x13y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x13y14E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x13y14E[];
Class_Descriptor cd__ZN3ccc9DD6x13y14E = {  "_ZN3ccc9DD6x13y14E", // class name
  bases__ZN3ccc9DD6x13y14E, 2,
  &(vtc__ZN3ccc9DD6x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x13y14E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x13y14E),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  CC6x13y15  : virtual ::ccc::AA6 , ::ccc::BB13 {
  ~CC6x13y15(); // tgen
  CC6x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x13y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC6x13y15 ::~CC6x13y15(){ note_dtor("_ZN3ccc9CC6x13y15E", this);} // tgen
ccc::CC6x13y15 ::CC6x13y15(){ note_ctor("_ZN3ccc9CC6x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC6x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x13y15E, buf);
    ::ccc::CC6x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x13y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC6x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x13y15E);
    dp->::ccc::CC6x13y15::~CC6x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x13y15E(Test__ZN3ccc9CC6x13y15E, "_ZN3ccc9CC6x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x13y15C1Ev();
extern void _ZN3ccc9CC6x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC6x13y15E[] = {
  NSPAIR(_ZN3ccc9CC6x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC6x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC6x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x13y15E[] = {
  {&(_ZTVN3ccc9CC6x13y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC6x13y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x13y15E[];
Class_Descriptor cd__ZN3ccc9CC6x13y15E = {  "_ZN3ccc9CC6x13y15E", // class name
  bases__ZN3ccc9CC6x13y15E, 2,
  &(vtc__ZN3ccc9CC6x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x13y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x13y15E),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  DD6x13y15  : virtual ::ccc::AA6 , virtual ::ccc::BB13 {
  ~DD6x13y15(); // tgen
  DD6x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD6x13y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD6x13y15 ::~DD6x13y15(){ note_dtor("_ZN3ccc9DD6x13y15E", this);} // tgen
ccc::DD6x13y15 ::DD6x13y15(){ note_ctor("_ZN3ccc9DD6x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD6x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x13y15E, buf);
    ::ccc::DD6x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x13y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD6x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x13y15E);
    dp->::ccc::DD6x13y15::~DD6x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x13y15E(Test__ZN3ccc9DD6x13y15E, "_ZN3ccc9DD6x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x13y15C1Ev();
extern void _ZN3ccc9DD6x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD6x13y15E[] = {
  NSPAIR(_ZN3ccc9DD6x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD6x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD6x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x13y15E[] = {
  {&(_ZTVN3ccc9DD6x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x13y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x13y15E[];
Class_Descriptor cd__ZN3ccc9DD6x13y15E = {  "_ZN3ccc9DD6x13y15E", // class name
  bases__ZN3ccc9DD6x13y15E, 2,
  &(vtc__ZN3ccc9DD6x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x13y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x13y15E),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  CC6x14y0  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y03pqrEv
  ~CC6x14y0(); // tgen
  CC6x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y0E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y03abcEv");}
void  ccc::CC6x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y03efgEv");}
void  ccc::CC6x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y03pqrEv");}
ccc::CC6x14y0 ::~CC6x14y0(){ note_dtor("_ZN3ccc8CC6x14y0E", this);} // tgen
ccc::CC6x14y0 ::CC6x14y0(){ note_ctor("_ZN3ccc8CC6x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y0E, buf);
    ::ccc::CC6x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y0E);
    dp->::ccc::CC6x14y0::~CC6x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y0E(Test__ZN3ccc8CC6x14y0E, "_ZN3ccc8CC6x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y0C1Ev();
extern void _ZN3ccc8CC6x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y0E[] = {
  NSPAIR(_ZN3ccc8CC6x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y0E[];
extern void _ZN3ccc8CC6x14y03pqrEv();
extern void _ZN3ccc8CC6x14y03abcEv();
extern void _ZN3ccc8CC6x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y03abcEv,_ZTv0_n12_N3ccc8CC6x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y03abcEv,_ZThn4_N3ccc8CC6x14y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y03efgEv,_ZTv0_n16_N3ccc8CC6x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y03efgEv,_ZThn4_N3ccc8CC6x14y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y03abcEv,_ZTv0_n12_N3ccc8CC6x14y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y03efgEv,_ZTv0_n16_N3ccc8CC6x14y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y0E[] = {
  {&(_ZTVN3ccc8CC6x14y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y0E[];
static VTBL_ENTRY alt_thunk_names731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y03efgEv,_ZTv0_n16_N3ccc8CC6x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y03efgEv,_ZThn4_N3ccc8CC6x14y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y03abcEv,_ZTv0_n12_N3ccc8CC6x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y03abcEv,_ZThn4_N3ccc8CC6x14y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y0E = {  "_ZN3ccc8CC6x14y0E", // class name
  bases__ZN3ccc8CC6x14y0E, 2,
  &(vtc__ZN3ccc8CC6x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y0E),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  DD6x14y0  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD6x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD6x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x14y03pqrEv
  ~DD6x14y0(); // tgen
  DD6x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y0E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y03abcEv");}
void  ccc::DD6x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y03efgEv");}
void  ccc::DD6x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y03pqrEv");}
ccc::DD6x14y0 ::~DD6x14y0(){ note_dtor("_ZN3ccc8DD6x14y0E", this);} // tgen
ccc::DD6x14y0 ::DD6x14y0(){ note_ctor("_ZN3ccc8DD6x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y0E, buf);
    ::ccc::DD6x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y0E);
    dp->::ccc::DD6x14y0::~DD6x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y0E(Test__ZN3ccc8DD6x14y0E, "_ZN3ccc8DD6x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y0C1Ev();
extern void _ZN3ccc8DD6x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y0E[] = {
  NSPAIR(_ZN3ccc8DD6x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y0E[];
extern void _ZN3ccc8DD6x14y03abcEv();
extern void _ZN3ccc8DD6x14y03efgEv();
extern void _ZN3ccc8DD6x14y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y03pqrEv,_ZTv0_n12_N3ccc8DD6x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y03pqrEv,_ZThn4_N3ccc8DD6x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y03pqrEv,_ZTv0_n12_N3ccc8DD6x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y0E[] = {
  {&(_ZTVN3ccc8DD6x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y0E[];
static VTBL_ENTRY alt_thunk_names732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y03pqrEv,_ZTv0_n12_N3ccc8DD6x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y03pqrEv,_ZThn4_N3ccc8DD6x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y0E = {  "_ZN3ccc8DD6x14y0E", // class name
  bases__ZN3ccc8DD6x14y0E, 2,
  &(vtc__ZN3ccc8DD6x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y0E),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  CC6x14y1  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x14y13efgEv
  ~CC6x14y1(); // tgen
  CC6x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y1E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y13abcEv");}
void  ccc::CC6x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y13pqrEv");}
void  ccc::CC6x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y13efgEv");}
ccc::CC6x14y1 ::~CC6x14y1(){ note_dtor("_ZN3ccc8CC6x14y1E", this);} // tgen
ccc::CC6x14y1 ::CC6x14y1(){ note_ctor("_ZN3ccc8CC6x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y1E, buf);
    ::ccc::CC6x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y1E);
    dp->::ccc::CC6x14y1::~CC6x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y1E(Test__ZN3ccc8CC6x14y1E, "_ZN3ccc8CC6x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y1C1Ev();
extern void _ZN3ccc8CC6x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y1E[] = {
  NSPAIR(_ZN3ccc8CC6x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y1E[];
extern void _ZN3ccc8CC6x14y13pqrEv();
extern void _ZN3ccc8CC6x14y13abcEv();
extern void _ZN3ccc8CC6x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y13abcEv,_ZTv0_n12_N3ccc8CC6x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y13abcEv,_ZThn4_N3ccc8CC6x14y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y13efgEv,_ZTv0_n16_N3ccc8CC6x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y13efgEv,_ZThn4_N3ccc8CC6x14y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y13abcEv,_ZTv0_n12_N3ccc8CC6x14y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y13efgEv,_ZTv0_n16_N3ccc8CC6x14y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y1E[] = {
  {&(_ZTVN3ccc8CC6x14y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y1E[];
static VTBL_ENTRY alt_thunk_names733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y13efgEv,_ZTv0_n16_N3ccc8CC6x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y13efgEv,_ZThn4_N3ccc8CC6x14y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y13abcEv,_ZTv0_n12_N3ccc8CC6x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y13abcEv,_ZThn4_N3ccc8CC6x14y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y1E = {  "_ZN3ccc8CC6x14y1E", // class name
  bases__ZN3ccc8CC6x14y1E, 2,
  &(vtc__ZN3ccc8CC6x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y1E),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  DD6x14y1  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD6x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x14y13efgEv
  ~DD6x14y1(); // tgen
  DD6x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y1E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y13abcEv");}
void  ccc::DD6x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y13pqrEv");}
void  ccc::DD6x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y13efgEv");}
ccc::DD6x14y1 ::~DD6x14y1(){ note_dtor("_ZN3ccc8DD6x14y1E", this);} // tgen
ccc::DD6x14y1 ::DD6x14y1(){ note_ctor("_ZN3ccc8DD6x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y1E, buf);
    ::ccc::DD6x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y1E);
    dp->::ccc::DD6x14y1::~DD6x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y1E(Test__ZN3ccc8DD6x14y1E, "_ZN3ccc8DD6x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y1C1Ev();
extern void _ZN3ccc8DD6x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y1E[] = {
  NSPAIR(_ZN3ccc8DD6x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y1E[];
extern void _ZN3ccc8DD6x14y13abcEv();
extern void _ZN3ccc8DD6x14y13efgEv();
extern void _ZN3ccc8DD6x14y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y13pqrEv,_ZTv0_n12_N3ccc8DD6x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y13pqrEv,_ZThn4_N3ccc8DD6x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y13pqrEv,_ZTv0_n12_N3ccc8DD6x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y1E[] = {
  {&(_ZTVN3ccc8DD6x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y1E[];
static VTBL_ENTRY alt_thunk_names734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y13pqrEv,_ZTv0_n12_N3ccc8DD6x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y13pqrEv,_ZThn4_N3ccc8DD6x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y1E = {  "_ZN3ccc8DD6x14y1E", // class name
  bases__ZN3ccc8DD6x14y1E, 2,
  &(vtc__ZN3ccc8DD6x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y1E),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  CC6x14y2  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y23pqrEv
  ~CC6x14y2(); // tgen
  CC6x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y2E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y23efgEv");}
void  ccc::CC6x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y23abcEv");}
void  ccc::CC6x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y23pqrEv");}
ccc::CC6x14y2 ::~CC6x14y2(){ note_dtor("_ZN3ccc8CC6x14y2E", this);} // tgen
ccc::CC6x14y2 ::CC6x14y2(){ note_ctor("_ZN3ccc8CC6x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y2E, buf);
    ::ccc::CC6x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y2E);
    dp->::ccc::CC6x14y2::~CC6x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y2E(Test__ZN3ccc8CC6x14y2E, "_ZN3ccc8CC6x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y2C1Ev();
extern void _ZN3ccc8CC6x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y2E[] = {
  NSPAIR(_ZN3ccc8CC6x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y2E[];
extern void _ZN3ccc8CC6x14y23pqrEv();
extern void _ZN3ccc8CC6x14y23efgEv();
extern void _ZN3ccc8CC6x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y23abcEv,_ZTv0_n12_N3ccc8CC6x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y23abcEv,_ZThn4_N3ccc8CC6x14y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y23efgEv,_ZTv0_n16_N3ccc8CC6x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y23efgEv,_ZThn4_N3ccc8CC6x14y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y23abcEv,_ZTv0_n12_N3ccc8CC6x14y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y23efgEv,_ZTv0_n16_N3ccc8CC6x14y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y2E[] = {
  {&(_ZTVN3ccc8CC6x14y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y2E[];
static VTBL_ENTRY alt_thunk_names735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y23efgEv,_ZTv0_n16_N3ccc8CC6x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y23efgEv,_ZThn4_N3ccc8CC6x14y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y23abcEv,_ZTv0_n12_N3ccc8CC6x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y23abcEv,_ZThn4_N3ccc8CC6x14y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y2E = {  "_ZN3ccc8CC6x14y2E", // class name
  bases__ZN3ccc8CC6x14y2E, 2,
  &(vtc__ZN3ccc8CC6x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y2E),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  DD6x14y2  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD6x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD6x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x14y23pqrEv
  ~DD6x14y2(); // tgen
  DD6x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y2E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y23efgEv");}
void  ccc::DD6x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y23abcEv");}
void  ccc::DD6x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y23pqrEv");}
ccc::DD6x14y2 ::~DD6x14y2(){ note_dtor("_ZN3ccc8DD6x14y2E", this);} // tgen
ccc::DD6x14y2 ::DD6x14y2(){ note_ctor("_ZN3ccc8DD6x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y2E, buf);
    ::ccc::DD6x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y2E);
    dp->::ccc::DD6x14y2::~DD6x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y2E(Test__ZN3ccc8DD6x14y2E, "_ZN3ccc8DD6x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y2C1Ev();
extern void _ZN3ccc8DD6x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y2E[] = {
  NSPAIR(_ZN3ccc8DD6x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y2E[];
extern void _ZN3ccc8DD6x14y23abcEv();
extern void _ZN3ccc8DD6x14y23efgEv();
extern void _ZN3ccc8DD6x14y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y23pqrEv,_ZTv0_n12_N3ccc8DD6x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y23pqrEv,_ZThn4_N3ccc8DD6x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y23pqrEv,_ZTv0_n12_N3ccc8DD6x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y2E[] = {
  {&(_ZTVN3ccc8DD6x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y2E[];
static VTBL_ENTRY alt_thunk_names736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y23pqrEv,_ZTv0_n12_N3ccc8DD6x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y23pqrEv,_ZThn4_N3ccc8DD6x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y2E = {  "_ZN3ccc8DD6x14y2E", // class name
  bases__ZN3ccc8DD6x14y2E, 2,
  &(vtc__ZN3ccc8DD6x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y2E),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  CC6x14y3  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x14y33abcEv
  ~CC6x14y3(); // tgen
  CC6x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y3E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y33efgEv");}
void  ccc::CC6x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y33pqrEv");}
void  ccc::CC6x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y33abcEv");}
ccc::CC6x14y3 ::~CC6x14y3(){ note_dtor("_ZN3ccc8CC6x14y3E", this);} // tgen
ccc::CC6x14y3 ::CC6x14y3(){ note_ctor("_ZN3ccc8CC6x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y3E, buf);
    ::ccc::CC6x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y3E);
    dp->::ccc::CC6x14y3::~CC6x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y3E(Test__ZN3ccc8CC6x14y3E, "_ZN3ccc8CC6x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y3C1Ev();
extern void _ZN3ccc8CC6x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y3E[] = {
  NSPAIR(_ZN3ccc8CC6x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y3E[];
extern void _ZN3ccc8CC6x14y33pqrEv();
extern void _ZN3ccc8CC6x14y33efgEv();
extern void _ZN3ccc8CC6x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y33abcEv,_ZTv0_n12_N3ccc8CC6x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y33abcEv,_ZThn4_N3ccc8CC6x14y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y33efgEv,_ZTv0_n16_N3ccc8CC6x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y33efgEv,_ZThn4_N3ccc8CC6x14y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y33abcEv,_ZTv0_n12_N3ccc8CC6x14y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y33efgEv,_ZTv0_n16_N3ccc8CC6x14y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y3E[] = {
  {&(_ZTVN3ccc8CC6x14y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y3E[];
static VTBL_ENTRY alt_thunk_names737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y33efgEv,_ZTv0_n16_N3ccc8CC6x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y33efgEv,_ZThn4_N3ccc8CC6x14y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y33abcEv,_ZTv0_n12_N3ccc8CC6x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y33abcEv,_ZThn4_N3ccc8CC6x14y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y3E = {  "_ZN3ccc8CC6x14y3E", // class name
  bases__ZN3ccc8CC6x14y3E, 2,
  &(vtc__ZN3ccc8CC6x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y3E),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  DD6x14y3  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD6x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x14y33abcEv
  ~DD6x14y3(); // tgen
  DD6x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y3E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y33efgEv");}
void  ccc::DD6x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y33pqrEv");}
void  ccc::DD6x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y33abcEv");}
ccc::DD6x14y3 ::~DD6x14y3(){ note_dtor("_ZN3ccc8DD6x14y3E", this);} // tgen
ccc::DD6x14y3 ::DD6x14y3(){ note_ctor("_ZN3ccc8DD6x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y3E, buf);
    ::ccc::DD6x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y3E);
    dp->::ccc::DD6x14y3::~DD6x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y3E(Test__ZN3ccc8DD6x14y3E, "_ZN3ccc8DD6x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y3C1Ev();
extern void _ZN3ccc8DD6x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y3E[] = {
  NSPAIR(_ZN3ccc8DD6x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y3E[];
extern void _ZN3ccc8DD6x14y33abcEv();
extern void _ZN3ccc8DD6x14y33efgEv();
extern void _ZN3ccc8DD6x14y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y33pqrEv,_ZTv0_n12_N3ccc8DD6x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y33pqrEv,_ZThn4_N3ccc8DD6x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y33pqrEv,_ZTv0_n12_N3ccc8DD6x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y3E[] = {
  {&(_ZTVN3ccc8DD6x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y3E[];
static VTBL_ENTRY alt_thunk_names738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y33pqrEv,_ZTv0_n12_N3ccc8DD6x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y33pqrEv,_ZThn4_N3ccc8DD6x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y3E = {  "_ZN3ccc8DD6x14y3E", // class name
  bases__ZN3ccc8DD6x14y3E, 2,
  &(vtc__ZN3ccc8DD6x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y3E),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  CC6x14y4  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC6x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x14y43efgEv
  ~CC6x14y4(); // tgen
  CC6x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y4E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y43pqrEv");}
void  ccc::CC6x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y43abcEv");}
void  ccc::CC6x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y43efgEv");}
ccc::CC6x14y4 ::~CC6x14y4(){ note_dtor("_ZN3ccc8CC6x14y4E", this);} // tgen
ccc::CC6x14y4 ::CC6x14y4(){ note_ctor("_ZN3ccc8CC6x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y4E, buf);
    ::ccc::CC6x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y4E);
    dp->::ccc::CC6x14y4::~CC6x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y4E(Test__ZN3ccc8CC6x14y4E, "_ZN3ccc8CC6x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y4C1Ev();
extern void _ZN3ccc8CC6x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y4E[] = {
  NSPAIR(_ZN3ccc8CC6x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y4E[];
extern void _ZN3ccc8CC6x14y43pqrEv();
extern void _ZN3ccc8CC6x14y43abcEv();
extern void _ZN3ccc8CC6x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y43abcEv,_ZTv0_n12_N3ccc8CC6x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y43abcEv,_ZThn4_N3ccc8CC6x14y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y43efgEv,_ZTv0_n16_N3ccc8CC6x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y43efgEv,_ZThn4_N3ccc8CC6x14y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y43abcEv,_ZTv0_n12_N3ccc8CC6x14y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y43efgEv,_ZTv0_n16_N3ccc8CC6x14y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y4E[] = {
  {&(_ZTVN3ccc8CC6x14y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y4E[];
static VTBL_ENTRY alt_thunk_names739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y43efgEv,_ZTv0_n16_N3ccc8CC6x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y43efgEv,_ZThn4_N3ccc8CC6x14y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y43abcEv,_ZTv0_n12_N3ccc8CC6x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y43abcEv,_ZThn4_N3ccc8CC6x14y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y4E = {  "_ZN3ccc8CC6x14y4E", // class name
  bases__ZN3ccc8CC6x14y4E, 2,
  &(vtc__ZN3ccc8CC6x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y4E),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  DD6x14y4  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD6x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD6x14y43efgEv
  ~DD6x14y4(); // tgen
  DD6x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y4E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y43pqrEv");}
void  ccc::DD6x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y43abcEv");}
void  ccc::DD6x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y43efgEv");}
ccc::DD6x14y4 ::~DD6x14y4(){ note_dtor("_ZN3ccc8DD6x14y4E", this);} // tgen
ccc::DD6x14y4 ::DD6x14y4(){ note_ctor("_ZN3ccc8DD6x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y4E, buf);
    ::ccc::DD6x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y4E);
    dp->::ccc::DD6x14y4::~DD6x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y4E(Test__ZN3ccc8DD6x14y4E, "_ZN3ccc8DD6x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y4C1Ev();
extern void _ZN3ccc8DD6x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y4E[] = {
  NSPAIR(_ZN3ccc8DD6x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y4E[];
extern void _ZN3ccc8DD6x14y43abcEv();
extern void _ZN3ccc8DD6x14y43efgEv();
extern void _ZN3ccc8DD6x14y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y43pqrEv,_ZTv0_n12_N3ccc8DD6x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y43pqrEv,_ZThn4_N3ccc8DD6x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y43pqrEv,_ZTv0_n12_N3ccc8DD6x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y4E[] = {
  {&(_ZTVN3ccc8DD6x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y4E[];
static VTBL_ENTRY alt_thunk_names740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y43pqrEv,_ZTv0_n12_N3ccc8DD6x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y43pqrEv,_ZThn4_N3ccc8DD6x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y4E = {  "_ZN3ccc8DD6x14y4E", // class name
  bases__ZN3ccc8DD6x14y4E, 2,
  &(vtc__ZN3ccc8DD6x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y4E),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  CC6x14y5  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC6x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x14y53abcEv
  ~CC6x14y5(); // tgen
  CC6x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y5E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y53pqrEv");}
void  ccc::CC6x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y53efgEv");}
void  ccc::CC6x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y53abcEv");}
ccc::CC6x14y5 ::~CC6x14y5(){ note_dtor("_ZN3ccc8CC6x14y5E", this);} // tgen
ccc::CC6x14y5 ::CC6x14y5(){ note_ctor("_ZN3ccc8CC6x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y5E, buf);
    ::ccc::CC6x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y5E);
    dp->::ccc::CC6x14y5::~CC6x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y5E(Test__ZN3ccc8CC6x14y5E, "_ZN3ccc8CC6x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y5C1Ev();
extern void _ZN3ccc8CC6x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y5E[] = {
  NSPAIR(_ZN3ccc8CC6x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y5E[];
extern void _ZN3ccc8CC6x14y53pqrEv();
extern void _ZN3ccc8CC6x14y53efgEv();
extern void _ZN3ccc8CC6x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y53abcEv,_ZTv0_n12_N3ccc8CC6x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y53abcEv,_ZThn4_N3ccc8CC6x14y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y53efgEv,_ZTv0_n16_N3ccc8CC6x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y53efgEv,_ZThn4_N3ccc8CC6x14y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y53abcEv,_ZTv0_n12_N3ccc8CC6x14y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y53efgEv,_ZTv0_n16_N3ccc8CC6x14y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y5E[] = {
  {&(_ZTVN3ccc8CC6x14y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y5E[];
static VTBL_ENTRY alt_thunk_names741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y53efgEv,_ZTv0_n16_N3ccc8CC6x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y53efgEv,_ZThn4_N3ccc8CC6x14y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y53abcEv,_ZTv0_n12_N3ccc8CC6x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y53abcEv,_ZThn4_N3ccc8CC6x14y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y5E = {  "_ZN3ccc8CC6x14y5E", // class name
  bases__ZN3ccc8CC6x14y5E, 2,
  &(vtc__ZN3ccc8CC6x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y5E),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  DD6x14y5  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD6x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD6x14y53abcEv
  ~DD6x14y5(); // tgen
  DD6x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y5E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y53pqrEv");}
void  ccc::DD6x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y53efgEv");}
void  ccc::DD6x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y53abcEv");}
ccc::DD6x14y5 ::~DD6x14y5(){ note_dtor("_ZN3ccc8DD6x14y5E", this);} // tgen
ccc::DD6x14y5 ::DD6x14y5(){ note_ctor("_ZN3ccc8DD6x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y5E, buf);
    ::ccc::DD6x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y5E);
    dp->::ccc::DD6x14y5::~DD6x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y5E(Test__ZN3ccc8DD6x14y5E, "_ZN3ccc8DD6x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y5C1Ev();
extern void _ZN3ccc8DD6x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y5E[] = {
  NSPAIR(_ZN3ccc8DD6x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y5E[];
extern void _ZN3ccc8DD6x14y53abcEv();
extern void _ZN3ccc8DD6x14y53efgEv();
extern void _ZN3ccc8DD6x14y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y53pqrEv,_ZTv0_n12_N3ccc8DD6x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y53pqrEv,_ZThn4_N3ccc8DD6x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y53pqrEv,_ZTv0_n12_N3ccc8DD6x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y5E[] = {
  {&(_ZTVN3ccc8DD6x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y5E[];
static VTBL_ENTRY alt_thunk_names742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y53pqrEv,_ZTv0_n12_N3ccc8DD6x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y53pqrEv,_ZThn4_N3ccc8DD6x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y5E = {  "_ZN3ccc8DD6x14y5E", // class name
  bases__ZN3ccc8DD6x14y5E, 2,
  &(vtc__ZN3ccc8DD6x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y5E),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  CC6x14y6  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x14y63efgEv
  ~CC6x14y6(); // tgen
  CC6x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y6E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y63abcEv");}
void  ccc::CC6x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y63efgEv");}
ccc::CC6x14y6 ::~CC6x14y6(){ note_dtor("_ZN3ccc8CC6x14y6E", this);} // tgen
ccc::CC6x14y6 ::CC6x14y6(){ note_ctor("_ZN3ccc8CC6x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y6E, buf);
    ::ccc::CC6x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y6E);
    dp->::ccc::CC6x14y6::~CC6x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y6E(Test__ZN3ccc8CC6x14y6E, "_ZN3ccc8CC6x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y6C1Ev();
extern void _ZN3ccc8CC6x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y6E[] = {
  NSPAIR(_ZN3ccc8CC6x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC6x14y63abcEv();
extern void _ZN3ccc8CC6x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y63abcEv,_ZTv0_n12_N3ccc8CC6x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y63abcEv,_ZThn4_N3ccc8CC6x14y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y63efgEv,_ZTv0_n16_N3ccc8CC6x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y63efgEv,_ZThn4_N3ccc8CC6x14y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y63abcEv,_ZTv0_n12_N3ccc8CC6x14y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y63efgEv,_ZTv0_n16_N3ccc8CC6x14y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y6E[] = {
  {&(_ZTVN3ccc8CC6x14y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y6E[];
static VTBL_ENTRY alt_thunk_names743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y63efgEv,_ZTv0_n16_N3ccc8CC6x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y63efgEv,_ZThn4_N3ccc8CC6x14y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y63abcEv,_ZTv0_n12_N3ccc8CC6x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y63abcEv,_ZThn4_N3ccc8CC6x14y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y6E = {  "_ZN3ccc8CC6x14y6E", // class name
  bases__ZN3ccc8CC6x14y6E, 2,
  &(vtc__ZN3ccc8CC6x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y6E),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  DD6x14y6  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD6x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD6x14y63efgEv
  ~DD6x14y6(); // tgen
  DD6x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y6E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y63abcEv");}
void  ccc::DD6x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y63efgEv");}
ccc::DD6x14y6 ::~DD6x14y6(){ note_dtor("_ZN3ccc8DD6x14y6E", this);} // tgen
ccc::DD6x14y6 ::DD6x14y6(){ note_ctor("_ZN3ccc8DD6x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y6E, buf);
    ::ccc::DD6x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y6E);
    dp->::ccc::DD6x14y6::~DD6x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y6E(Test__ZN3ccc8DD6x14y6E, "_ZN3ccc8DD6x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y6C1Ev();
extern void _ZN3ccc8DD6x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y6E[] = {
  NSPAIR(_ZN3ccc8DD6x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y6E[];
extern void _ZN3ccc8DD6x14y63abcEv();
extern void _ZN3ccc8DD6x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y6E[] = {
  {&(_ZTVN3ccc8DD6x14y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x14y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x14y6E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y6E[];
Class_Descriptor cd__ZN3ccc8DD6x14y6E = {  "_ZN3ccc8DD6x14y6E", // class name
  bases__ZN3ccc8DD6x14y6E, 2,
  &(vtc__ZN3ccc8DD6x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y6E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y6E),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  CC6x14y7  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC6x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y73pqrEv
  ~CC6x14y7(); // tgen
  CC6x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y7E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y73abcEv");}
void  ccc::CC6x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y73pqrEv");}
ccc::CC6x14y7 ::~CC6x14y7(){ note_dtor("_ZN3ccc8CC6x14y7E", this);} // tgen
ccc::CC6x14y7 ::CC6x14y7(){ note_ctor("_ZN3ccc8CC6x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y7E, buf);
    ::ccc::CC6x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y7E);
    dp->::ccc::CC6x14y7::~CC6x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y7E(Test__ZN3ccc8CC6x14y7E, "_ZN3ccc8CC6x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y7C1Ev();
extern void _ZN3ccc8CC6x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y7E[] = {
  NSPAIR(_ZN3ccc8CC6x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y7E[];
extern void _ZN3ccc8CC6x14y73pqrEv();
extern void _ZN3ccc8CC6x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y73abcEv,_ZTv0_n12_N3ccc8CC6x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y73abcEv,_ZThn4_N3ccc8CC6x14y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y73abcEv,_ZTv0_n12_N3ccc8CC6x14y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y7E[] = {
  {&(_ZTVN3ccc8CC6x14y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x14y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y7E[];
static VTBL_ENTRY alt_thunk_names744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y73abcEv,_ZTv0_n12_N3ccc8CC6x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y73abcEv,_ZThn4_N3ccc8CC6x14y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y7E = {  "_ZN3ccc8CC6x14y7E", // class name
  bases__ZN3ccc8CC6x14y7E, 2,
  &(vtc__ZN3ccc8CC6x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y7E),2, //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  DD6x14y7  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD6x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x14y73pqrEv
  ~DD6x14y7(); // tgen
  DD6x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y7E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y73abcEv");}
void  ccc::DD6x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y73pqrEv");}
ccc::DD6x14y7 ::~DD6x14y7(){ note_dtor("_ZN3ccc8DD6x14y7E", this);} // tgen
ccc::DD6x14y7 ::DD6x14y7(){ note_ctor("_ZN3ccc8DD6x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y7E, buf);
    ::ccc::DD6x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y7E);
    dp->::ccc::DD6x14y7::~DD6x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y7E(Test__ZN3ccc8DD6x14y7E, "_ZN3ccc8DD6x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y7C1Ev();
extern void _ZN3ccc8DD6x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y7E[] = {
  NSPAIR(_ZN3ccc8DD6x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y7E[];
extern void _ZN3ccc8DD6x14y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x14y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y73pqrEv,_ZTv0_n12_N3ccc8DD6x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y73pqrEv,_ZThn4_N3ccc8DD6x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y73pqrEv,_ZTv0_n12_N3ccc8DD6x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y7E[] = {
  {&(_ZTVN3ccc8DD6x14y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y7E[];
static VTBL_ENTRY alt_thunk_names745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y73pqrEv,_ZTv0_n12_N3ccc8DD6x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y73pqrEv,_ZThn4_N3ccc8DD6x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y7E = {  "_ZN3ccc8DD6x14y7E", // class name
  bases__ZN3ccc8DD6x14y7E, 2,
  &(vtc__ZN3ccc8DD6x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y7E),3, //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  CC6x14y8  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x14y83abcEv
  ~CC6x14y8(); // tgen
  CC6x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y8E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC6x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y83efgEv");}
void  ccc::CC6x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x14y83abcEv");}
ccc::CC6x14y8 ::~CC6x14y8(){ note_dtor("_ZN3ccc8CC6x14y8E", this);} // tgen
ccc::CC6x14y8 ::CC6x14y8(){ note_ctor("_ZN3ccc8CC6x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y8E, buf);
    ::ccc::CC6x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y8E);
    dp->::ccc::CC6x14y8::~CC6x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y8E(Test__ZN3ccc8CC6x14y8E, "_ZN3ccc8CC6x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y8C1Ev();
extern void _ZN3ccc8CC6x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y8E[] = {
  NSPAIR(_ZN3ccc8CC6x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC6x14y83efgEv();
extern void _ZN3ccc8CC6x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC6x14y83abcEv,_ZTv0_n12_N3ccc8CC6x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y83abcEv,_ZThn4_N3ccc8CC6x14y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y83efgEv,_ZTv0_n16_N3ccc8CC6x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y83efgEv,_ZThn4_N3ccc8CC6x14y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC6x14y83abcEv,_ZTv0_n12_N3ccc8CC6x14y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y83efgEv,_ZTv0_n16_N3ccc8CC6x14y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y8E[] = {
  {&(_ZTVN3ccc8CC6x14y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC6x14y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y8E[];
static VTBL_ENTRY alt_thunk_names746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y83efgEv,_ZTv0_n16_N3ccc8CC6x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y83efgEv,_ZThn4_N3ccc8CC6x14y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC6x14y83abcEv,_ZTv0_n12_N3ccc8CC6x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y83abcEv,_ZThn4_N3ccc8CC6x14y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y8E = {  "_ZN3ccc8CC6x14y8E", // class name
  bases__ZN3ccc8CC6x14y8E, 2,
  &(vtc__ZN3ccc8CC6x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y8E),2, //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  DD6x14y8  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD6x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD6x14y83abcEv
  ~DD6x14y8(); // tgen
  DD6x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y8E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD6x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y83efgEv");}
void  ccc::DD6x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x14y83abcEv");}
ccc::DD6x14y8 ::~DD6x14y8(){ note_dtor("_ZN3ccc8DD6x14y8E", this);} // tgen
ccc::DD6x14y8 ::DD6x14y8(){ note_ctor("_ZN3ccc8DD6x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y8E, buf);
    ::ccc::DD6x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y8E);
    dp->::ccc::DD6x14y8::~DD6x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y8E(Test__ZN3ccc8DD6x14y8E, "_ZN3ccc8DD6x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y8C1Ev();
extern void _ZN3ccc8DD6x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y8E[] = {
  NSPAIR(_ZN3ccc8DD6x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y8E[];
extern void _ZN3ccc8DD6x14y83abcEv();
extern void _ZN3ccc8DD6x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y83efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y8E[] = {
  {&(_ZTVN3ccc8DD6x14y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x14y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD6x14y8E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y8E[];
Class_Descriptor cd__ZN3ccc8DD6x14y8E = {  "_ZN3ccc8DD6x14y8E", // class name
  bases__ZN3ccc8DD6x14y8E, 2,
  &(vtc__ZN3ccc8DD6x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y8E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y8E),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  CC6x14y9  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC6x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x14y93pqrEv
  ~CC6x14y9(); // tgen
  CC6x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x14y9E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC6x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x14y93efgEv");}
void  ccc::CC6x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x14y93pqrEv");}
ccc::CC6x14y9 ::~CC6x14y9(){ note_dtor("_ZN3ccc8CC6x14y9E", this);} // tgen
ccc::CC6x14y9 ::CC6x14y9(){ note_ctor("_ZN3ccc8CC6x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC6x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC6x14y9E, buf);
    ::ccc::CC6x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC6x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x14y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc8CC6x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC6x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x14y9E);
    dp->::ccc::CC6x14y9::~CC6x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x14y9E(Test__ZN3ccc8CC6x14y9E, "_ZN3ccc8CC6x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC6x14y9C1Ev();
extern void _ZN3ccc8CC6x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC6x14y9E[] = {
  NSPAIR(_ZN3ccc8CC6x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC6x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC6x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x14y9E[];
extern void _ZN3ccc8CC6x14y93pqrEv();
extern void _ZN3ccc8CC6x14y93efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC6x14y93efgEv,_ZTv0_n16_N3ccc8CC6x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC6x14y93efgEv,_ZThn4_N3ccc8CC6x14y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC6x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x14y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC6x14y93efgEv,_ZTv0_n16_N3ccc8CC6x14y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x14y9E[] = {
  {&(_ZTVN3ccc8CC6x14y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC6x14y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x14y9E[];
static VTBL_ENTRY alt_thunk_names747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC6x14y93efgEv,_ZTv0_n16_N3ccc8CC6x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC6x14y93efgEv,_ZThn4_N3ccc8CC6x14y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC6x14y9E = {  "_ZN3ccc8CC6x14y9E", // class name
  bases__ZN3ccc8CC6x14y9E, 2,
  &(vtc__ZN3ccc8CC6x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC6x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x14y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x14y9E),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  DD6x14y9  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD6x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x14y93pqrEv
  ~DD6x14y9(); // tgen
  DD6x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD6x14y9E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD6x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x14y93efgEv");}
void  ccc::DD6x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x14y93pqrEv");}
ccc::DD6x14y9 ::~DD6x14y9(){ note_dtor("_ZN3ccc8DD6x14y9E", this);} // tgen
ccc::DD6x14y9 ::DD6x14y9(){ note_ctor("_ZN3ccc8DD6x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD6x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD6x14y9E, buf);
    ::ccc::DD6x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD6x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x14y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD6x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x14y9E);
    dp->::ccc::DD6x14y9::~DD6x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x14y9E(Test__ZN3ccc8DD6x14y9E, "_ZN3ccc8DD6x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD6x14y9C1Ev();
extern void _ZN3ccc8DD6x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD6x14y9E[] = {
  NSPAIR(_ZN3ccc8DD6x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD6x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD6x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x14y93efgEv();
extern void _ZN3ccc8DD6x14y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD6x14y93pqrEv,_ZTv0_n12_N3ccc8DD6x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD6x14y93pqrEv,_ZThn4_N3ccc8DD6x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD6x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x14y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD6x14y93pqrEv,_ZTv0_n12_N3ccc8DD6x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x14y9E[] = {
  {&(_ZTVN3ccc8DD6x14y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD6x14y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x14y9E[];
static VTBL_ENTRY alt_thunk_names748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD6x14y93pqrEv,_ZTv0_n12_N3ccc8DD6x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD6x14y93pqrEv,_ZThn4_N3ccc8DD6x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD6x14y9E = {  "_ZN3ccc8DD6x14y9E", // class name
  bases__ZN3ccc8DD6x14y9E, 2,
  &(vtc__ZN3ccc8DD6x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD6x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x14y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x14y9E),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  CC6x14y10  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC6x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x14y103abcEv
  ~CC6x14y10(); // tgen
  CC6x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y10E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x14y103pqrEv");}
void  ccc::CC6x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x14y103abcEv");}
ccc::CC6x14y10 ::~CC6x14y10(){ note_dtor("_ZN3ccc9CC6x14y10E", this);} // tgen
ccc::CC6x14y10 ::CC6x14y10(){ note_ctor("_ZN3ccc9CC6x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC6x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x14y10E, buf);
    ::ccc::CC6x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x14y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC6x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x14y10E);
    dp->::ccc::CC6x14y10::~CC6x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x14y10E(Test__ZN3ccc9CC6x14y10E, "_ZN3ccc9CC6x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x14y10C1Ev();
extern void _ZN3ccc9CC6x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC6x14y10E[] = {
  NSPAIR(_ZN3ccc9CC6x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC6x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC6x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x14y10E[];
extern void _ZN3ccc9CC6x14y103pqrEv();
extern void _ZN3ccc9CC6x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x14y103abcEv,_ZTv0_n12_N3ccc9CC6x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y103abcEv,_ZThn4_N3ccc9CC6x14y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x14y103abcEv,_ZTv0_n12_N3ccc9CC6x14y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x14y10E[] = {
  {&(_ZTVN3ccc9CC6x14y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x14y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x14y10E[];
static VTBL_ENTRY alt_thunk_names749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x14y103abcEv,_ZTv0_n12_N3ccc9CC6x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x14y103abcEv,_ZThn4_N3ccc9CC6x14y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x14y10E = {  "_ZN3ccc9CC6x14y10E", // class name
  bases__ZN3ccc9CC6x14y10E, 2,
  &(vtc__ZN3ccc9CC6x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x14y10E),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  DD6x14y10  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD6x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD6x14y103abcEv
  ~DD6x14y10(); // tgen
  DD6x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD6x14y10E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x14y103pqrEv");}
void  ccc::DD6x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x14y103abcEv");}
ccc::DD6x14y10 ::~DD6x14y10(){ note_dtor("_ZN3ccc9DD6x14y10E", this);} // tgen
ccc::DD6x14y10 ::DD6x14y10(){ note_ctor("_ZN3ccc9DD6x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD6x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x14y10E, buf);
    ::ccc::DD6x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x14y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD6x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x14y10E);
    dp->::ccc::DD6x14y10::~DD6x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x14y10E(Test__ZN3ccc9DD6x14y10E, "_ZN3ccc9DD6x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x14y10C1Ev();
extern void _ZN3ccc9DD6x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD6x14y10E[] = {
  NSPAIR(_ZN3ccc9DD6x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD6x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD6x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y10E[];
extern void _ZN3ccc9DD6x14y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x14y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x14y103pqrEv,_ZTv0_n12_N3ccc9DD6x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x14y103pqrEv,_ZThn4_N3ccc9DD6x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x14y103pqrEv,_ZTv0_n12_N3ccc9DD6x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x14y10E[] = {
  {&(_ZTVN3ccc9DD6x14y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x14y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x14y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x14y10E[];
static VTBL_ENTRY alt_thunk_names750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x14y103pqrEv,_ZTv0_n12_N3ccc9DD6x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x14y103pqrEv,_ZThn4_N3ccc9DD6x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x14y10E = {  "_ZN3ccc9DD6x14y10E", // class name
  bases__ZN3ccc9DD6x14y10E, 2,
  &(vtc__ZN3ccc9DD6x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x14y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x14y10E),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  CC6x14y11  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC6x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x14y113efgEv
  ~CC6x14y11(); // tgen
  CC6x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y11E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC6x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x14y113pqrEv");}
void  ccc::CC6x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x14y113efgEv");}
ccc::CC6x14y11 ::~CC6x14y11(){ note_dtor("_ZN3ccc9CC6x14y11E", this);} // tgen
ccc::CC6x14y11 ::CC6x14y11(){ note_ctor("_ZN3ccc9CC6x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC6x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x14y11E, buf);
    ::ccc::CC6x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x14y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC6x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x14y11E);
    dp->::ccc::CC6x14y11::~CC6x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x14y11E(Test__ZN3ccc9CC6x14y11E, "_ZN3ccc9CC6x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x14y11C1Ev();
extern void _ZN3ccc9CC6x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC6x14y11E[] = {
  NSPAIR(_ZN3ccc9CC6x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC6x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC6x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x14y11E[];
extern void _ZN3ccc9CC6x14y113pqrEv();
extern void _ZN3ccc9CC6x14y113efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x14y113efgEv,_ZTv0_n16_N3ccc9CC6x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y113efgEv,_ZThn4_N3ccc9CC6x14y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x14y113efgEv,_ZTv0_n16_N3ccc9CC6x14y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x14y11E[] = {
  {&(_ZTVN3ccc9CC6x14y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x14y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x14y11E[];
static VTBL_ENTRY alt_thunk_names751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x14y113efgEv,_ZTv0_n16_N3ccc9CC6x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x14y113efgEv,_ZThn4_N3ccc9CC6x14y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x14y11E = {  "_ZN3ccc9CC6x14y11E", // class name
  bases__ZN3ccc9CC6x14y11E, 2,
  &(vtc__ZN3ccc9CC6x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x14y11E),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  DD6x14y11  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD6x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD6x14y113efgEv
  ~DD6x14y11(); // tgen
  DD6x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD6x14y11E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD6x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x14y113pqrEv");}
void  ccc::DD6x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x14y113efgEv");}
ccc::DD6x14y11 ::~DD6x14y11(){ note_dtor("_ZN3ccc9DD6x14y11E", this);} // tgen
ccc::DD6x14y11 ::DD6x14y11(){ note_ctor("_ZN3ccc9DD6x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD6x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x14y11E, buf);
    ::ccc::DD6x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x14y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD6x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x14y11E);
    dp->::ccc::DD6x14y11::~DD6x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x14y11E(Test__ZN3ccc9DD6x14y11E, "_ZN3ccc9DD6x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x14y11C1Ev();
extern void _ZN3ccc9DD6x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD6x14y11E[] = {
  NSPAIR(_ZN3ccc9DD6x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD6x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD6x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x14y113efgEv();
extern void _ZN3ccc9DD6x14y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x14y113pqrEv,_ZTv0_n12_N3ccc9DD6x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x14y113pqrEv,_ZThn4_N3ccc9DD6x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x14y113pqrEv,_ZTv0_n12_N3ccc9DD6x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x14y11E[] = {
  {&(_ZTVN3ccc9DD6x14y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x14y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x14y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x14y11E[];
static VTBL_ENTRY alt_thunk_names752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x14y113pqrEv,_ZTv0_n12_N3ccc9DD6x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x14y113pqrEv,_ZThn4_N3ccc9DD6x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x14y11E = {  "_ZN3ccc9DD6x14y11E", // class name
  bases__ZN3ccc9DD6x14y11E, 2,
  &(vtc__ZN3ccc9DD6x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x14y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x14y11E),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  CC6x14y12  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC6x14y123abcEv
  ~CC6x14y12(); // tgen
  CC6x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y12E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC6x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x14y123abcEv");}
ccc::CC6x14y12 ::~CC6x14y12(){ note_dtor("_ZN3ccc9CC6x14y12E", this);} // tgen
ccc::CC6x14y12 ::CC6x14y12(){ note_ctor("_ZN3ccc9CC6x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC6x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x14y12E, buf);
    ::ccc::CC6x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x14y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC6x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x14y12E);
    dp->::ccc::CC6x14y12::~CC6x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x14y12E(Test__ZN3ccc9CC6x14y12E, "_ZN3ccc9CC6x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x14y12C1Ev();
extern void _ZN3ccc9CC6x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC6x14y12E[] = {
  NSPAIR(_ZN3ccc9CC6x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC6x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC6x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC6x14y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC6x14y123abcEv,_ZTv0_n12_N3ccc9CC6x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y123abcEv,_ZThn4_N3ccc9CC6x14y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC6x14y123abcEv,_ZTv0_n12_N3ccc9CC6x14y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x14y12E[] = {
  {&(_ZTVN3ccc9CC6x14y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x14y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x14y12E[];
static VTBL_ENTRY alt_thunk_names753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC6x14y123abcEv,_ZTv0_n12_N3ccc9CC6x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x14y123abcEv,_ZThn4_N3ccc9CC6x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x14y12E = {  "_ZN3ccc9CC6x14y12E", // class name
  bases__ZN3ccc9CC6x14y12E, 2,
  &(vtc__ZN3ccc9CC6x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x14y12E),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  DD6x14y12  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD6x14y123abcEv
  ~DD6x14y12(); // tgen
  DD6x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD6x14y12E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD6x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x14y123abcEv");}
ccc::DD6x14y12 ::~DD6x14y12(){ note_dtor("_ZN3ccc9DD6x14y12E", this);} // tgen
ccc::DD6x14y12 ::DD6x14y12(){ note_ctor("_ZN3ccc9DD6x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD6x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x14y12E, buf);
    ::ccc::DD6x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x14y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD6x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x14y12E);
    dp->::ccc::DD6x14y12::~DD6x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x14y12E(Test__ZN3ccc9DD6x14y12E, "_ZN3ccc9DD6x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x14y12C1Ev();
extern void _ZN3ccc9DD6x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD6x14y12E[] = {
  NSPAIR(_ZN3ccc9DD6x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD6x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD6x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y12E[];
extern void _ZN3ccc9DD6x14y123abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x14y12E[] = {
  {&(_ZTVN3ccc9DD6x14y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x14y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x14y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x14y12E[];
Class_Descriptor cd__ZN3ccc9DD6x14y12E = {  "_ZN3ccc9DD6x14y12E", // class name
  bases__ZN3ccc9DD6x14y12E, 2,
  &(vtc__ZN3ccc9DD6x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x14y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x14y12E),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  CC6x14y13  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC6x14y133efgEv
  ~CC6x14y13(); // tgen
  CC6x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y13E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC6x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x14y133efgEv");}
ccc::CC6x14y13 ::~CC6x14y13(){ note_dtor("_ZN3ccc9CC6x14y13E", this);} // tgen
ccc::CC6x14y13 ::CC6x14y13(){ note_ctor("_ZN3ccc9CC6x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC6x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x14y13E, buf);
    ::ccc::CC6x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x14y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC6x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x14y13E);
    dp->::ccc::CC6x14y13::~CC6x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x14y13E(Test__ZN3ccc9CC6x14y13E, "_ZN3ccc9CC6x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x14y13C1Ev();
extern void _ZN3ccc9CC6x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC6x14y13E[] = {
  NSPAIR(_ZN3ccc9CC6x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC6x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC6x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC6x14y133efgEv();
extern void _ZN3ccc3AA63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC6x14y133efgEv,_ZTv0_n16_N3ccc9CC6x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC6x14y133efgEv,_ZThn4_N3ccc9CC6x14y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC6x14y133efgEv,_ZTv0_n16_N3ccc9CC6x14y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x14y13E[] = {
  {&(_ZTVN3ccc9CC6x14y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC6x14y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x14y13E[];
static VTBL_ENTRY alt_thunk_names754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC6x14y133efgEv,_ZTv0_n16_N3ccc9CC6x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC6x14y133efgEv,_ZThn4_N3ccc9CC6x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC6x14y13E = {  "_ZN3ccc9CC6x14y13E", // class name
  bases__ZN3ccc9CC6x14y13E, 2,
  &(vtc__ZN3ccc9CC6x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x14y13E),2, //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  DD6x14y13  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD6x14y133efgEv
  ~DD6x14y13(); // tgen
  DD6x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD6x14y13E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD6x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x14y133efgEv");}
ccc::DD6x14y13 ::~DD6x14y13(){ note_dtor("_ZN3ccc9DD6x14y13E", this);} // tgen
ccc::DD6x14y13 ::DD6x14y13(){ note_ctor("_ZN3ccc9DD6x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD6x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x14y13E, buf);
    ::ccc::DD6x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x14y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD6x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x14y13E);
    dp->::ccc::DD6x14y13::~DD6x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x14y13E(Test__ZN3ccc9DD6x14y13E, "_ZN3ccc9DD6x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x14y13C1Ev();
extern void _ZN3ccc9DD6x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD6x14y13E[] = {
  NSPAIR(_ZN3ccc9DD6x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD6x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD6x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x14y13E[] = {
  {&(_ZTVN3ccc9DD6x14y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x14y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x14y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x14y13E[];
Class_Descriptor cd__ZN3ccc9DD6x14y13E = {  "_ZN3ccc9DD6x14y13E", // class name
  bases__ZN3ccc9DD6x14y13E, 2,
  &(vtc__ZN3ccc9DD6x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x14y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x14y13E),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  CC6x14y14  : virtual ::ccc::AA6 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC6x14y143pqrEv
  ~CC6x14y14(); // tgen
  CC6x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y14E) C1{ VBC2{ v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC6x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x14y143pqrEv");}
ccc::CC6x14y14 ::~CC6x14y14(){ note_dtor("_ZN3ccc9CC6x14y14E", this);} // tgen
ccc::CC6x14y14 ::CC6x14y14(){ note_ctor("_ZN3ccc9CC6x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC6x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x14y14E, buf);
    ::ccc::CC6x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x14y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC6x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x14y14E);
    dp->::ccc::CC6x14y14::~CC6x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x14y14E(Test__ZN3ccc9CC6x14y14E, "_ZN3ccc9CC6x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x14y14C1Ev();
extern void _ZN3ccc9CC6x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC6x14y14E[] = {
  NSPAIR(_ZN3ccc9CC6x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC6x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC6x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x14y14E[];
extern void _ZN3ccc9CC6x14y143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x14y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x14y14E[] = {
  {&(_ZTVN3ccc9CC6x14y14E[3]),  3,10},
  {&(_ZTVN3ccc9CC6x14y14E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x14y14E[];
Class_Descriptor cd__ZN3ccc9CC6x14y14E = {  "_ZN3ccc9CC6x14y14E", // class name
  bases__ZN3ccc9CC6x14y14E, 2,
  &(vtc__ZN3ccc9CC6x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y14E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x14y14E),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  DD6x14y14  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD6x14y143pqrEv
  ~DD6x14y14(); // tgen
  DD6x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD6x14y14E) C1{ VBC2{ v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD6x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x14y143pqrEv");}
ccc::DD6x14y14 ::~DD6x14y14(){ note_dtor("_ZN3ccc9DD6x14y14E", this);} // tgen
ccc::DD6x14y14 ::DD6x14y14(){ note_ctor("_ZN3ccc9DD6x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD6x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x14y14E, buf);
    ::ccc::DD6x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x14y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD6x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x14y14E);
    dp->::ccc::DD6x14y14::~DD6x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x14y14E(Test__ZN3ccc9DD6x14y14E, "_ZN3ccc9DD6x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x14y14C1Ev();
extern void _ZN3ccc9DD6x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD6x14y14E[] = {
  NSPAIR(_ZN3ccc9DD6x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD6x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD6x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD6x14y143pqrEv,_ZTv0_n12_N3ccc9DD6x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD6x14y143pqrEv,_ZThn4_N3ccc9DD6x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD6x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x14y143pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD6x14y143pqrEv,_ZTv0_n12_N3ccc9DD6x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x14y14E[] = {
  {&(_ZTVN3ccc9DD6x14y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x14y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD6x14y14E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x14y14E[];
static VTBL_ENTRY alt_thunk_names755[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD6x14y143pqrEv,_ZTv0_n12_N3ccc9DD6x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD6x14y143pqrEv,_ZThn4_N3ccc9DD6x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD6x14y14E = {  "_ZN3ccc9DD6x14y14E", // class name
  bases__ZN3ccc9DD6x14y14E, 2,
  &(vtc__ZN3ccc9DD6x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x14y14E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x14y14E),3, //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  CC6x14y15  : virtual ::ccc::AA6 , ::ccc::BB14 {
  ~CC6x14y15(); // tgen
  CC6x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x14y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC6x14y15 ::~CC6x14y15(){ note_dtor("_ZN3ccc9CC6x14y15E", this);} // tgen
ccc::CC6x14y15 ::CC6x14y15(){ note_ctor("_ZN3ccc9CC6x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC6x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC6x14y15E, buf);
    ::ccc::CC6x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC6x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x14y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), ABISELECT(8,4), "_ZN3ccc9CC6x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC6x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x14y15E);
    dp->::ccc::CC6x14y15::~CC6x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x14y15E(Test__ZN3ccc9CC6x14y15E, "_ZN3ccc9CC6x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC6x14y15C1Ev();
extern void _ZN3ccc9CC6x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC6x14y15E[] = {
  NSPAIR(_ZN3ccc9CC6x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC6x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC6x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x14y15E[] = {
  {&(_ZTVN3ccc9CC6x14y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC6x14y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x14y15E[];
Class_Descriptor cd__ZN3ccc9CC6x14y15E = {  "_ZN3ccc9CC6x14y15E", // class name
  bases__ZN3ccc9CC6x14y15E, 2,
  &(vtc__ZN3ccc9CC6x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC6x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x14y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x14y15E),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  DD6x14y15  : virtual ::ccc::AA6 , virtual ::ccc::BB14 {
  ~DD6x14y15(); // tgen
  DD6x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD6x14y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD6x14y15 ::~DD6x14y15(){ note_dtor("_ZN3ccc9DD6x14y15E", this);} // tgen
ccc::DD6x14y15 ::DD6x14y15(){ note_ctor("_ZN3ccc9DD6x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD6x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD6x14y15E, buf);
    ::ccc::DD6x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD6x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x14y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD6x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x14y15E);
    dp->::ccc::DD6x14y15::~DD6x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x14y15E(Test__ZN3ccc9DD6x14y15E, "_ZN3ccc9DD6x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD6x14y15C1Ev();
extern void _ZN3ccc9DD6x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD6x14y15E[] = {
  NSPAIR(_ZN3ccc9DD6x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD6x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD6x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x14y15E[] = {
  {&(_ZTVN3ccc9DD6x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD6x14y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x14y15E[];
Class_Descriptor cd__ZN3ccc9DD6x14y15E = {  "_ZN3ccc9DD6x14y15E", // class name
  bases__ZN3ccc9DD6x14y15E, 2,
  &(vtc__ZN3ccc9DD6x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD6x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x14y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x14y15E),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  CC6x15y0  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC6x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y03pqrEv
  ~CC6x15y0(); // tgen
  CC6x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y0E) C1{ VBC2{ v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y03abcEv");}
void  ccc::CC6x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y03efgEv");}
void  ccc::CC6x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y03pqrEv");}
ccc::CC6x15y0 ::~CC6x15y0(){ note_dtor("_ZN3ccc8CC6x15y0E", this);} // tgen
ccc::CC6x15y0 ::CC6x15y0(){ note_ctor("_ZN3ccc8CC6x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y0E, buf);
    ::ccc::CC6x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y0E);
    dp->::ccc::CC6x15y0::~CC6x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y0E(Test__ZN3ccc8CC6x15y0E, "_ZN3ccc8CC6x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y0C1Ev();
extern void _ZN3ccc8CC6x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y0E[] = {
  NSPAIR(_ZN3ccc8CC6x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y0E[];
extern void _ZN3ccc8CC6x15y03abcEv();
extern void _ZN3ccc8CC6x15y03efgEv();
extern void _ZN3ccc8CC6x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y0E[] = {
  {&(_ZTVN3ccc8CC6x15y0E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y0E[];
Class_Descriptor cd__ZN3ccc8CC6x15y0E = {  "_ZN3ccc8CC6x15y0E", // class name
  bases__ZN3ccc8CC6x15y0E, 2,
  &(vtc__ZN3ccc8CC6x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y0  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD6x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD6x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x15y03pqrEv
  ~DD6x15y0(); // tgen
  DD6x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y0E) C1{ VBC2{ v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y03abcEv");}
void  ccc::DD6x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y03efgEv");}
void  ccc::DD6x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y03pqrEv");}
ccc::DD6x15y0 ::~DD6x15y0(){ note_dtor("_ZN3ccc8DD6x15y0E", this);} // tgen
ccc::DD6x15y0 ::DD6x15y0(){ note_ctor("_ZN3ccc8DD6x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y0E, buf);
    ::ccc::DD6x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y0E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y0E);
    dp->::ccc::DD6x15y0::~DD6x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y0E(Test__ZN3ccc8DD6x15y0E, "_ZN3ccc8DD6x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y0C1Ev();
extern void _ZN3ccc8DD6x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y0E[] = {
  NSPAIR(_ZN3ccc8DD6x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y0E[];
extern void _ZN3ccc8DD6x15y03abcEv();
extern void _ZN3ccc8DD6x15y03efgEv();
extern void _ZN3ccc8DD6x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y0E[] = {
  {&(_ZTVN3ccc8DD6x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y0E[];
Class_Descriptor cd__ZN3ccc8DD6x15y0E = {  "_ZN3ccc8DD6x15y0E", // class name
  bases__ZN3ccc8DD6x15y0E, 2,
  &(vtc__ZN3ccc8DD6x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y1  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x15y13efgEv
  ~CC6x15y1(); // tgen
  CC6x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y1E) C1{ VBC2{ v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y13abcEv");}
void  ccc::CC6x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y13pqrEv");}
void  ccc::CC6x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y13efgEv");}
ccc::CC6x15y1 ::~CC6x15y1(){ note_dtor("_ZN3ccc8CC6x15y1E", this);} // tgen
ccc::CC6x15y1 ::CC6x15y1(){ note_ctor("_ZN3ccc8CC6x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y1E, buf);
    ::ccc::CC6x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y1E);
    dp->::ccc::CC6x15y1::~CC6x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y1E(Test__ZN3ccc8CC6x15y1E, "_ZN3ccc8CC6x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y1C1Ev();
extern void _ZN3ccc8CC6x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y1E[] = {
  NSPAIR(_ZN3ccc8CC6x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y1E[];
extern void _ZN3ccc8CC6x15y13abcEv();
extern void _ZN3ccc8CC6x15y13efgEv();
extern void _ZN3ccc8CC6x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y1E[] = {
  {&(_ZTVN3ccc8CC6x15y1E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y1E[];
Class_Descriptor cd__ZN3ccc8CC6x15y1E = {  "_ZN3ccc8CC6x15y1E", // class name
  bases__ZN3ccc8CC6x15y1E, 2,
  &(vtc__ZN3ccc8CC6x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y1  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD6x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x15y13efgEv
  ~DD6x15y1(); // tgen
  DD6x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y1E) C1{ VBC2{ v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y13abcEv");}
void  ccc::DD6x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y13pqrEv");}
void  ccc::DD6x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y13efgEv");}
ccc::DD6x15y1 ::~DD6x15y1(){ note_dtor("_ZN3ccc8DD6x15y1E", this);} // tgen
ccc::DD6x15y1 ::DD6x15y1(){ note_ctor("_ZN3ccc8DD6x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y1E, buf);
    ::ccc::DD6x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y1E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y1E);
    dp->::ccc::DD6x15y1::~DD6x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y1E(Test__ZN3ccc8DD6x15y1E, "_ZN3ccc8DD6x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y1C1Ev();
extern void _ZN3ccc8DD6x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y1E[] = {
  NSPAIR(_ZN3ccc8DD6x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y1E[];
extern void _ZN3ccc8DD6x15y13abcEv();
extern void _ZN3ccc8DD6x15y13efgEv();
extern void _ZN3ccc8DD6x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y1E[] = {
  {&(_ZTVN3ccc8DD6x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y1E[];
Class_Descriptor cd__ZN3ccc8DD6x15y1E = {  "_ZN3ccc8DD6x15y1E", // class name
  bases__ZN3ccc8DD6x15y1E, 2,
  &(vtc__ZN3ccc8DD6x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y2  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC6x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y23pqrEv
  ~CC6x15y2(); // tgen
  CC6x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y2E) C1{ VBC2{ v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y23efgEv");}
void  ccc::CC6x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y23abcEv");}
void  ccc::CC6x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y23pqrEv");}
ccc::CC6x15y2 ::~CC6x15y2(){ note_dtor("_ZN3ccc8CC6x15y2E", this);} // tgen
ccc::CC6x15y2 ::CC6x15y2(){ note_ctor("_ZN3ccc8CC6x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y2E, buf);
    ::ccc::CC6x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y2E);
    dp->::ccc::CC6x15y2::~CC6x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y2E(Test__ZN3ccc8CC6x15y2E, "_ZN3ccc8CC6x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y2C1Ev();
extern void _ZN3ccc8CC6x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y2E[] = {
  NSPAIR(_ZN3ccc8CC6x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y2E[];
extern void _ZN3ccc8CC6x15y23abcEv();
extern void _ZN3ccc8CC6x15y23efgEv();
extern void _ZN3ccc8CC6x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y2E[] = {
  {&(_ZTVN3ccc8CC6x15y2E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y2E[];
Class_Descriptor cd__ZN3ccc8CC6x15y2E = {  "_ZN3ccc8CC6x15y2E", // class name
  bases__ZN3ccc8CC6x15y2E, 2,
  &(vtc__ZN3ccc8CC6x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y2  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD6x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD6x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x15y23pqrEv
  ~DD6x15y2(); // tgen
  DD6x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y2E) C1{ VBC2{ v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y23efgEv");}
void  ccc::DD6x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y23abcEv");}
void  ccc::DD6x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y23pqrEv");}
ccc::DD6x15y2 ::~DD6x15y2(){ note_dtor("_ZN3ccc8DD6x15y2E", this);} // tgen
ccc::DD6x15y2 ::DD6x15y2(){ note_ctor("_ZN3ccc8DD6x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y2E, buf);
    ::ccc::DD6x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y2E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y2E);
    dp->::ccc::DD6x15y2::~DD6x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y2E(Test__ZN3ccc8DD6x15y2E, "_ZN3ccc8DD6x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y2C1Ev();
extern void _ZN3ccc8DD6x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y2E[] = {
  NSPAIR(_ZN3ccc8DD6x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y2E[];
extern void _ZN3ccc8DD6x15y23abcEv();
extern void _ZN3ccc8DD6x15y23efgEv();
extern void _ZN3ccc8DD6x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y2E[] = {
  {&(_ZTVN3ccc8DD6x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y2E[];
Class_Descriptor cd__ZN3ccc8DD6x15y2E = {  "_ZN3ccc8DD6x15y2E", // class name
  bases__ZN3ccc8DD6x15y2E, 2,
  &(vtc__ZN3ccc8DD6x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y3  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x15y33abcEv
  ~CC6x15y3(); // tgen
  CC6x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y3E) C1{ VBC2{ v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y33efgEv");}
void  ccc::CC6x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y33pqrEv");}
void  ccc::CC6x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y33abcEv");}
ccc::CC6x15y3 ::~CC6x15y3(){ note_dtor("_ZN3ccc8CC6x15y3E", this);} // tgen
ccc::CC6x15y3 ::CC6x15y3(){ note_ctor("_ZN3ccc8CC6x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y3E, buf);
    ::ccc::CC6x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y3E);
    dp->::ccc::CC6x15y3::~CC6x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y3E(Test__ZN3ccc8CC6x15y3E, "_ZN3ccc8CC6x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y3C1Ev();
extern void _ZN3ccc8CC6x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y3E[] = {
  NSPAIR(_ZN3ccc8CC6x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y3E[];
extern void _ZN3ccc8CC6x15y33abcEv();
extern void _ZN3ccc8CC6x15y33efgEv();
extern void _ZN3ccc8CC6x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y3E[] = {
  {&(_ZTVN3ccc8CC6x15y3E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y3E[];
Class_Descriptor cd__ZN3ccc8CC6x15y3E = {  "_ZN3ccc8CC6x15y3E", // class name
  bases__ZN3ccc8CC6x15y3E, 2,
  &(vtc__ZN3ccc8CC6x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y3  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD6x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x15y33abcEv
  ~DD6x15y3(); // tgen
  DD6x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y3E) C1{ VBC2{ v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y33efgEv");}
void  ccc::DD6x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y33pqrEv");}
void  ccc::DD6x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y33abcEv");}
ccc::DD6x15y3 ::~DD6x15y3(){ note_dtor("_ZN3ccc8DD6x15y3E", this);} // tgen
ccc::DD6x15y3 ::DD6x15y3(){ note_ctor("_ZN3ccc8DD6x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y3E, buf);
    ::ccc::DD6x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y3E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y3E);
    dp->::ccc::DD6x15y3::~DD6x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y3E(Test__ZN3ccc8DD6x15y3E, "_ZN3ccc8DD6x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y3C1Ev();
extern void _ZN3ccc8DD6x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y3E[] = {
  NSPAIR(_ZN3ccc8DD6x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y3E[];
extern void _ZN3ccc8DD6x15y33abcEv();
extern void _ZN3ccc8DD6x15y33efgEv();
extern void _ZN3ccc8DD6x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y3E[] = {
  {&(_ZTVN3ccc8DD6x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y3E[];
Class_Descriptor cd__ZN3ccc8DD6x15y3E = {  "_ZN3ccc8DD6x15y3E", // class name
  bases__ZN3ccc8DD6x15y3E, 2,
  &(vtc__ZN3ccc8DD6x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y4  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC6x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC6x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC6x15y43efgEv
  ~CC6x15y4(); // tgen
  CC6x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y4E) C1{ VBC2{ v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y43pqrEv");}
void  ccc::CC6x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y43abcEv");}
void  ccc::CC6x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y43efgEv");}
ccc::CC6x15y4 ::~CC6x15y4(){ note_dtor("_ZN3ccc8CC6x15y4E", this);} // tgen
ccc::CC6x15y4 ::CC6x15y4(){ note_ctor("_ZN3ccc8CC6x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y4E, buf);
    ::ccc::CC6x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y4E);
    dp->::ccc::CC6x15y4::~CC6x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y4E(Test__ZN3ccc8CC6x15y4E, "_ZN3ccc8CC6x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y4C1Ev();
extern void _ZN3ccc8CC6x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y4E[] = {
  NSPAIR(_ZN3ccc8CC6x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y4E[];
extern void _ZN3ccc8CC6x15y43abcEv();
extern void _ZN3ccc8CC6x15y43efgEv();
extern void _ZN3ccc8CC6x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y4E[] = {
  {&(_ZTVN3ccc8CC6x15y4E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y4E[];
Class_Descriptor cd__ZN3ccc8CC6x15y4E = {  "_ZN3ccc8CC6x15y4E", // class name
  bases__ZN3ccc8CC6x15y4E, 2,
  &(vtc__ZN3ccc8CC6x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y4  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD6x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD6x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD6x15y43efgEv
  ~DD6x15y4(); // tgen
  DD6x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y4E) C1{ VBC2{ v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y43pqrEv");}
void  ccc::DD6x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y43abcEv");}
void  ccc::DD6x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y43efgEv");}
ccc::DD6x15y4 ::~DD6x15y4(){ note_dtor("_ZN3ccc8DD6x15y4E", this);} // tgen
ccc::DD6x15y4 ::DD6x15y4(){ note_ctor("_ZN3ccc8DD6x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y4E, buf);
    ::ccc::DD6x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y4E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y4E);
    dp->::ccc::DD6x15y4::~DD6x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y4E(Test__ZN3ccc8DD6x15y4E, "_ZN3ccc8DD6x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y4C1Ev();
extern void _ZN3ccc8DD6x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y4E[] = {
  NSPAIR(_ZN3ccc8DD6x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y4E[];
extern void _ZN3ccc8DD6x15y43abcEv();
extern void _ZN3ccc8DD6x15y43efgEv();
extern void _ZN3ccc8DD6x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y4E[] = {
  {&(_ZTVN3ccc8DD6x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y4E[];
Class_Descriptor cd__ZN3ccc8DD6x15y4E = {  "_ZN3ccc8DD6x15y4E", // class name
  bases__ZN3ccc8DD6x15y4E, 2,
  &(vtc__ZN3ccc8DD6x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y5  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC6x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC6x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC6x15y53abcEv
  ~CC6x15y5(); // tgen
  CC6x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y5E) C1{ VBC2{ v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC6x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y53pqrEv");}
void  ccc::CC6x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y53efgEv");}
void  ccc::CC6x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y53abcEv");}
ccc::CC6x15y5 ::~CC6x15y5(){ note_dtor("_ZN3ccc8CC6x15y5E", this);} // tgen
ccc::CC6x15y5 ::CC6x15y5(){ note_ctor("_ZN3ccc8CC6x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y5E, buf);
    ::ccc::CC6x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y5E);
    dp->::ccc::CC6x15y5::~CC6x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y5E(Test__ZN3ccc8CC6x15y5E, "_ZN3ccc8CC6x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y5C1Ev();
extern void _ZN3ccc8CC6x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y5E[] = {
  NSPAIR(_ZN3ccc8CC6x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y5E[];
extern void _ZN3ccc8CC6x15y53abcEv();
extern void _ZN3ccc8CC6x15y53efgEv();
extern void _ZN3ccc8CC6x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y5E[] = {
  {&(_ZTVN3ccc8CC6x15y5E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y5E[];
Class_Descriptor cd__ZN3ccc8CC6x15y5E = {  "_ZN3ccc8CC6x15y5E", // class name
  bases__ZN3ccc8CC6x15y5E, 2,
  &(vtc__ZN3ccc8CC6x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y5  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD6x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD6x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD6x15y53abcEv
  ~DD6x15y5(); // tgen
  DD6x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y5E) C1{ VBC2{ v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD6x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y53pqrEv");}
void  ccc::DD6x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y53efgEv");}
void  ccc::DD6x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y53abcEv");}
ccc::DD6x15y5 ::~DD6x15y5(){ note_dtor("_ZN3ccc8DD6x15y5E", this);} // tgen
ccc::DD6x15y5 ::DD6x15y5(){ note_ctor("_ZN3ccc8DD6x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y5E, buf);
    ::ccc::DD6x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y5E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y5E);
    dp->::ccc::DD6x15y5::~DD6x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y5E(Test__ZN3ccc8DD6x15y5E, "_ZN3ccc8DD6x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y5C1Ev();
extern void _ZN3ccc8DD6x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y5E[] = {
  NSPAIR(_ZN3ccc8DD6x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y5E[];
extern void _ZN3ccc8DD6x15y53abcEv();
extern void _ZN3ccc8DD6x15y53efgEv();
extern void _ZN3ccc8DD6x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y5E[] = {
  {&(_ZTVN3ccc8DD6x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y5E[];
Class_Descriptor cd__ZN3ccc8DD6x15y5E = {  "_ZN3ccc8DD6x15y5E", // class name
  bases__ZN3ccc8DD6x15y5E, 2,
  &(vtc__ZN3ccc8DD6x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y6  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC6x15y63efgEv
  ~CC6x15y6(); // tgen
  CC6x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y6E) C1{ VBC2{ v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC6x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y63abcEv");}
void  ccc::CC6x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y63efgEv");}
ccc::CC6x15y6 ::~CC6x15y6(){ note_dtor("_ZN3ccc8CC6x15y6E", this);} // tgen
ccc::CC6x15y6 ::CC6x15y6(){ note_ctor("_ZN3ccc8CC6x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y6E, buf);
    ::ccc::CC6x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y6E);
    dp->::ccc::CC6x15y6::~CC6x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y6E(Test__ZN3ccc8CC6x15y6E, "_ZN3ccc8CC6x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y6C1Ev();
extern void _ZN3ccc8CC6x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y6E[] = {
  NSPAIR(_ZN3ccc8CC6x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y6E[];
extern void _ZN3ccc8CC6x15y63abcEv();
extern void _ZN3ccc8CC6x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y6E[] = {
  {&(_ZTVN3ccc8CC6x15y6E[5]),  5,7},
  {&(_ZTVN3ccc8CC6x15y6E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y6E[];
Class_Descriptor cd__ZN3ccc8CC6x15y6E = {  "_ZN3ccc8CC6x15y6E", // class name
  bases__ZN3ccc8CC6x15y6E, 2,
  &(vtc__ZN3ccc8CC6x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y6E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y6  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD6x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD6x15y63efgEv
  ~DD6x15y6(); // tgen
  DD6x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y6E) C1{ VBC2{ v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD6x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y63abcEv");}
void  ccc::DD6x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y63efgEv");}
ccc::DD6x15y6 ::~DD6x15y6(){ note_dtor("_ZN3ccc8DD6x15y6E", this);} // tgen
ccc::DD6x15y6 ::DD6x15y6(){ note_ctor("_ZN3ccc8DD6x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y6E, buf);
    ::ccc::DD6x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y6E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y6E);
    dp->::ccc::DD6x15y6::~DD6x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y6E(Test__ZN3ccc8DD6x15y6E, "_ZN3ccc8DD6x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y6C1Ev();
extern void _ZN3ccc8DD6x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y6E[] = {
  NSPAIR(_ZN3ccc8DD6x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y6E[];
extern void _ZN3ccc8DD6x15y63abcEv();
extern void _ZN3ccc8DD6x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y6E[] = {
  {&(_ZTVN3ccc8DD6x15y6E[6]),  6,8},
  {&(_ZTVN3ccc8DD6x15y6E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y6E[];
Class_Descriptor cd__ZN3ccc8DD6x15y6E = {  "_ZN3ccc8DD6x15y6E", // class name
  bases__ZN3ccc8DD6x15y6E, 2,
  &(vtc__ZN3ccc8DD6x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y6E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y7  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC6x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y73pqrEv
  ~CC6x15y7(); // tgen
  CC6x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y7E) C1{ VBC2{ v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC6x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y73abcEv");}
void  ccc::CC6x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y73pqrEv");}
ccc::CC6x15y7 ::~CC6x15y7(){ note_dtor("_ZN3ccc8CC6x15y7E", this);} // tgen
ccc::CC6x15y7 ::CC6x15y7(){ note_ctor("_ZN3ccc8CC6x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y7E, buf);
    ::ccc::CC6x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y7E);
    dp->::ccc::CC6x15y7::~CC6x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y7E(Test__ZN3ccc8CC6x15y7E, "_ZN3ccc8CC6x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y7C1Ev();
extern void _ZN3ccc8CC6x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y7E[] = {
  NSPAIR(_ZN3ccc8CC6x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y7E[];
extern void _ZN3ccc8CC6x15y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8CC6x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y7E[] = {
  {&(_ZTVN3ccc8CC6x15y7E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y7E[];
Class_Descriptor cd__ZN3ccc8CC6x15y7E = {  "_ZN3ccc8CC6x15y7E", // class name
  bases__ZN3ccc8CC6x15y7E, 2,
  &(vtc__ZN3ccc8CC6x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y7  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD6x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD6x15y73pqrEv
  ~DD6x15y7(); // tgen
  DD6x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y7E) C1{ VBC2{ v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD6x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y73abcEv");}
void  ccc::DD6x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y73pqrEv");}
ccc::DD6x15y7 ::~DD6x15y7(){ note_dtor("_ZN3ccc8DD6x15y7E", this);} // tgen
ccc::DD6x15y7 ::DD6x15y7(){ note_ctor("_ZN3ccc8DD6x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y7E, buf);
    ::ccc::DD6x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y7E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y7E);
    dp->::ccc::DD6x15y7::~DD6x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y7E(Test__ZN3ccc8DD6x15y7E, "_ZN3ccc8DD6x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y7C1Ev();
extern void _ZN3ccc8DD6x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y7E[] = {
  NSPAIR(_ZN3ccc8DD6x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y7E[];
extern void _ZN3ccc8DD6x15y73abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc8DD6x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y7E[] = {
  {&(_ZTVN3ccc8DD6x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y7E[];
Class_Descriptor cd__ZN3ccc8DD6x15y7E = {  "_ZN3ccc8DD6x15y7E", // class name
  bases__ZN3ccc8DD6x15y7E, 2,
  &(vtc__ZN3ccc8DD6x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y8  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC6x15y83abcEv
  ~CC6x15y8(); // tgen
  CC6x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y8E) C1{ VBC2{ v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC6x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y83efgEv");}
void  ccc::CC6x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC6x15y83abcEv");}
ccc::CC6x15y8 ::~CC6x15y8(){ note_dtor("_ZN3ccc8CC6x15y8E", this);} // tgen
ccc::CC6x15y8 ::CC6x15y8(){ note_ctor("_ZN3ccc8CC6x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y8E, buf);
    ::ccc::CC6x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y8E);
    dp->::ccc::CC6x15y8::~CC6x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y8E(Test__ZN3ccc8CC6x15y8E, "_ZN3ccc8CC6x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y8C1Ev();
extern void _ZN3ccc8CC6x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y8E[] = {
  NSPAIR(_ZN3ccc8CC6x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y8E[];
extern void _ZN3ccc8CC6x15y83abcEv();
extern void _ZN3ccc8CC6x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y8E[] = {
  {&(_ZTVN3ccc8CC6x15y8E[5]),  5,7},
  {&(_ZTVN3ccc8CC6x15y8E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y8E[];
Class_Descriptor cd__ZN3ccc8CC6x15y8E = {  "_ZN3ccc8CC6x15y8E", // class name
  bases__ZN3ccc8CC6x15y8E, 2,
  &(vtc__ZN3ccc8CC6x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y8E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y8  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD6x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD6x15y83abcEv
  ~DD6x15y8(); // tgen
  DD6x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y8E) C1{ VBC2{ v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD6x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y83efgEv");}
void  ccc::DD6x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD6x15y83abcEv");}
ccc::DD6x15y8 ::~DD6x15y8(){ note_dtor("_ZN3ccc8DD6x15y8E", this);} // tgen
ccc::DD6x15y8 ::DD6x15y8(){ note_ctor("_ZN3ccc8DD6x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y8E, buf);
    ::ccc::DD6x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y8E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y8E);
    dp->::ccc::DD6x15y8::~DD6x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y8E(Test__ZN3ccc8DD6x15y8E, "_ZN3ccc8DD6x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y8C1Ev();
extern void _ZN3ccc8DD6x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y8E[] = {
  NSPAIR(_ZN3ccc8DD6x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y8E[];
extern void _ZN3ccc8DD6x15y83abcEv();
extern void _ZN3ccc8DD6x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y8E[] = {
  {&(_ZTVN3ccc8DD6x15y8E[6]),  6,8},
  {&(_ZTVN3ccc8DD6x15y8E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y8E[];
Class_Descriptor cd__ZN3ccc8DD6x15y8E = {  "_ZN3ccc8DD6x15y8E", // class name
  bases__ZN3ccc8DD6x15y8E, 2,
  &(vtc__ZN3ccc8DD6x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y8E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y9  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC6x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC6x15y93pqrEv
  ~CC6x15y9(); // tgen
  CC6x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC6x15y9E) C1{ VBC2{ v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC6x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC6x15y93efgEv");}
void  ccc::CC6x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC6x15y93pqrEv");}
ccc::CC6x15y9 ::~CC6x15y9(){ note_dtor("_ZN3ccc8CC6x15y9E", this);} // tgen
ccc::CC6x15y9 ::CC6x15y9(){ note_ctor("_ZN3ccc8CC6x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC6x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC6x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC6x15y9E, buf);
    ::ccc::CC6x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC6x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC6x15y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8CC6x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC6x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC6x15y9E);
    dp->::ccc::CC6x15y9::~CC6x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC6x15y9E(Test__ZN3ccc8CC6x15y9E, "_ZN3ccc8CC6x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC6x15y9C1Ev();
extern void _ZN3ccc8CC6x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC6x15y9E[] = {
  NSPAIR(_ZN3ccc8CC6x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC6x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC6x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC6x15y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8CC6x15y93efgEv();
extern void _ZN3ccc8CC6x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC6x15y9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC6x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC6x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC6x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC6x15y9E[] = {
  {&(_ZTVN3ccc8CC6x15y9E[5]),  5,8},
  {&(_ZTVN3ccc8CC6x15y9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC6x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC6x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC6x15y9E[];
Class_Descriptor cd__ZN3ccc8CC6x15y9E = {  "_ZN3ccc8CC6x15y9E", // class name
  bases__ZN3ccc8CC6x15y9E, 2,
  &(vtc__ZN3ccc8CC6x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC6x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC6x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC6x15y9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC6x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y9  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD6x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD6x15y93pqrEv
  ~DD6x15y9(); // tgen
  DD6x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD6x15y9E) C1{ VBC2{ v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD6x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD6x15y93efgEv");}
void  ccc::DD6x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD6x15y93pqrEv");}
ccc::DD6x15y9 ::~DD6x15y9(){ note_dtor("_ZN3ccc8DD6x15y9E", this);} // tgen
ccc::DD6x15y9 ::DD6x15y9(){ note_ctor("_ZN3ccc8DD6x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD6x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD6x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD6x15y9E, buf);
    ::ccc::DD6x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD6x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD6x15y9E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc8DD6x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD6x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD6x15y9E);
    dp->::ccc::DD6x15y9::~DD6x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD6x15y9E(Test__ZN3ccc8DD6x15y9E, "_ZN3ccc8DD6x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD6x15y9C1Ev();
extern void _ZN3ccc8DD6x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD6x15y9E[] = {
  NSPAIR(_ZN3ccc8DD6x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD6x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD6x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD6x15y9E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc8DD6x15y93efgEv();
extern void _ZN3ccc8DD6x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD6x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD6x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD6x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD6x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD6x15y9E[] = {
  {&(_ZTVN3ccc8DD6x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8DD6x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD6x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD6x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD6x15y9E[];
Class_Descriptor cd__ZN3ccc8DD6x15y9E = {  "_ZN3ccc8DD6x15y9E", // class name
  bases__ZN3ccc8DD6x15y9E, 2,
  &(vtc__ZN3ccc8DD6x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD6x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD6x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD6x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD6x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y10  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC6x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC6x15y103abcEv
  ~CC6x15y10(); // tgen
  CC6x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y10E) C1{ VBC2{ v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC6x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x15y103pqrEv");}
void  ccc::CC6x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x15y103abcEv");}
ccc::CC6x15y10 ::~CC6x15y10(){ note_dtor("_ZN3ccc9CC6x15y10E", this);} // tgen
ccc::CC6x15y10 ::CC6x15y10(){ note_ctor("_ZN3ccc9CC6x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC6x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC6x15y10E, buf);
    ::ccc::CC6x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC6x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x15y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9CC6x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC6x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x15y10E);
    dp->::ccc::CC6x15y10::~CC6x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x15y10E(Test__ZN3ccc9CC6x15y10E, "_ZN3ccc9CC6x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC6x15y10C1Ev();
extern void _ZN3ccc9CC6x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC6x15y10E[] = {
  NSPAIR(_ZN3ccc9CC6x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC6x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC6x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x15y10E[];
extern void _ZN3ccc9CC6x15y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x15y10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x15y10E[] = {
  {&(_ZTVN3ccc9CC6x15y10E[5]),  5,8},
  {&(_ZTVN3ccc9CC6x15y10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x15y10E[];
Class_Descriptor cd__ZN3ccc9CC6x15y10E = {  "_ZN3ccc9CC6x15y10E", // class name
  bases__ZN3ccc9CC6x15y10E, 2,
  &(vtc__ZN3ccc9CC6x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y10  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD6x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD6x15y103abcEv
  ~DD6x15y10(); // tgen
  DD6x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD6x15y10E) C1{ VBC2{ v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD6x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x15y103pqrEv");}
void  ccc::DD6x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x15y103abcEv");}
ccc::DD6x15y10 ::~DD6x15y10(){ note_dtor("_ZN3ccc9DD6x15y10E", this);} // tgen
ccc::DD6x15y10 ::DD6x15y10(){ note_ctor("_ZN3ccc9DD6x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD6x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD6x15y10E, buf);
    ::ccc::DD6x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD6x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x15y10E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD6x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x15y10E);
    dp->::ccc::DD6x15y10::~DD6x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x15y10E(Test__ZN3ccc9DD6x15y10E, "_ZN3ccc9DD6x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD6x15y10C1Ev();
extern void _ZN3ccc9DD6x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD6x15y10E[] = {
  NSPAIR(_ZN3ccc9DD6x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD6x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD6x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD6x15y10E[];
extern void _ZN3ccc9DD6x15y103abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x15y10E[] = {
  {&(_ZTVN3ccc9DD6x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9DD6x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x15y10E[];
Class_Descriptor cd__ZN3ccc9DD6x15y10E = {  "_ZN3ccc9DD6x15y10E", // class name
  bases__ZN3ccc9DD6x15y10E, 2,
  &(vtc__ZN3ccc9DD6x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD6x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y11  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC6x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC6x15y113efgEv
  ~CC6x15y11(); // tgen
  CC6x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y11E) C1{ VBC2{ v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC6x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x15y113pqrEv");}
void  ccc::CC6x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x15y113efgEv");}
ccc::CC6x15y11 ::~CC6x15y11(){ note_dtor("_ZN3ccc9CC6x15y11E", this);} // tgen
ccc::CC6x15y11 ::CC6x15y11(){ note_ctor("_ZN3ccc9CC6x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC6x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC6x15y11E, buf);
    ::ccc::CC6x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC6x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x15y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9CC6x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC6x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x15y11E);
    dp->::ccc::CC6x15y11::~CC6x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x15y11E(Test__ZN3ccc9CC6x15y11E, "_ZN3ccc9CC6x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC6x15y11C1Ev();
extern void _ZN3ccc9CC6x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC6x15y11E[] = {
  NSPAIR(_ZN3ccc9CC6x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC6x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC6x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x15y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x15y113efgEv();
extern void _ZN3ccc9CC6x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x15y11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x15y11E[] = {
  {&(_ZTVN3ccc9CC6x15y11E[5]),  5,8},
  {&(_ZTVN3ccc9CC6x15y11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x15y11E[];
Class_Descriptor cd__ZN3ccc9CC6x15y11E = {  "_ZN3ccc9CC6x15y11E", // class name
  bases__ZN3ccc9CC6x15y11E, 2,
  &(vtc__ZN3ccc9CC6x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y11  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD6x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD6x15y113efgEv
  ~DD6x15y11(); // tgen
  DD6x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD6x15y11E) C1{ VBC2{ v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD6x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x15y113pqrEv");}
void  ccc::DD6x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x15y113efgEv");}
ccc::DD6x15y11 ::~DD6x15y11(){ note_dtor("_ZN3ccc9DD6x15y11E", this);} // tgen
ccc::DD6x15y11 ::DD6x15y11(){ note_ctor("_ZN3ccc9DD6x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD6x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD6x15y11E, buf);
    ::ccc::DD6x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD6x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x15y11E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD6x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x15y11E);
    dp->::ccc::DD6x15y11::~DD6x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x15y11E(Test__ZN3ccc9DD6x15y11E, "_ZN3ccc9DD6x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD6x15y11C1Ev();
extern void _ZN3ccc9DD6x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD6x15y11E[] = {
  NSPAIR(_ZN3ccc9DD6x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD6x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD6x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD6x15y11E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x15y113efgEv();
extern void _ZN3ccc9DD6x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x15y11E[] = {
  {&(_ZTVN3ccc9DD6x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9DD6x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x15y11E[];
Class_Descriptor cd__ZN3ccc9DD6x15y11E = {  "_ZN3ccc9DD6x15y11E", // class name
  bases__ZN3ccc9DD6x15y11E, 2,
  &(vtc__ZN3ccc9DD6x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD6x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y12  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC6x15y123abcEv
  ~CC6x15y12(); // tgen
  CC6x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y12E) C1{ VBC2{ v1 v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC6x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC6x15y123abcEv");}
ccc::CC6x15y12 ::~CC6x15y12(){ note_dtor("_ZN3ccc9CC6x15y12E", this);} // tgen
ccc::CC6x15y12 ::CC6x15y12(){ note_ctor("_ZN3ccc9CC6x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC6x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC6x15y12E, buf);
    ::ccc::CC6x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC6x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x15y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9CC6x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC6x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x15y12E);
    dp->::ccc::CC6x15y12::~CC6x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x15y12E(Test__ZN3ccc9CC6x15y12E, "_ZN3ccc9CC6x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC6x15y12C1Ev();
extern void _ZN3ccc9CC6x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC6x15y12E[] = {
  NSPAIR(_ZN3ccc9CC6x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC6x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC6x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x15y12E[];
extern void _ZN3ccc9CC6x15y123abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x15y12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x15y12E[] = {
  {&(_ZTVN3ccc9CC6x15y12E[5]),  5,7},
  {&(_ZTVN3ccc9CC6x15y12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x15y12E[];
Class_Descriptor cd__ZN3ccc9CC6x15y12E = {  "_ZN3ccc9CC6x15y12E", // class name
  bases__ZN3ccc9CC6x15y12E, 2,
  &(vtc__ZN3ccc9CC6x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y12  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD6x15y123abcEv
  ~DD6x15y12(); // tgen
  DD6x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD6x15y12E) C1{ VBC2{ v1 v2} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD6x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD6x15y123abcEv");}
ccc::DD6x15y12 ::~DD6x15y12(){ note_dtor("_ZN3ccc9DD6x15y12E", this);} // tgen
ccc::DD6x15y12 ::DD6x15y12(){ note_ctor("_ZN3ccc9DD6x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD6x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD6x15y12E, buf);
    ::ccc::DD6x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD6x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x15y12E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD6x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x15y12E);
    dp->::ccc::DD6x15y12::~DD6x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x15y12E(Test__ZN3ccc9DD6x15y12E, "_ZN3ccc9DD6x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD6x15y12C1Ev();
extern void _ZN3ccc9DD6x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD6x15y12E[] = {
  NSPAIR(_ZN3ccc9DD6x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD6x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD6x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD6x15y12E[];
extern void _ZN3ccc9DD6x15y123abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x15y12E[] = {
  {&(_ZTVN3ccc9DD6x15y12E[6]),  6,8},
  {&(_ZTVN3ccc9DD6x15y12E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x15y12E[];
Class_Descriptor cd__ZN3ccc9DD6x15y12E = {  "_ZN3ccc9DD6x15y12E", // class name
  bases__ZN3ccc9DD6x15y12E, 2,
  &(vtc__ZN3ccc9DD6x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD6x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x15y12E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y13  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC6x15y133efgEv
  ~CC6x15y13(); // tgen
  CC6x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y13E) C1{ VBC2{ v2 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC6x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC6x15y133efgEv");}
ccc::CC6x15y13 ::~CC6x15y13(){ note_dtor("_ZN3ccc9CC6x15y13E", this);} // tgen
ccc::CC6x15y13 ::CC6x15y13(){ note_ctor("_ZN3ccc9CC6x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC6x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC6x15y13E, buf);
    ::ccc::CC6x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC6x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x15y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9CC6x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC6x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x15y13E);
    dp->::ccc::CC6x15y13::~CC6x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x15y13E(Test__ZN3ccc9CC6x15y13E, "_ZN3ccc9CC6x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC6x15y13C1Ev();
extern void _ZN3ccc9CC6x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC6x15y13E[] = {
  NSPAIR(_ZN3ccc9CC6x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC6x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC6x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x15y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9CC6x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x15y13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x15y13E[] = {
  {&(_ZTVN3ccc9CC6x15y13E[5]),  5,7},
  {&(_ZTVN3ccc9CC6x15y13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x15y13E[];
Class_Descriptor cd__ZN3ccc9CC6x15y13E = {  "_ZN3ccc9CC6x15y13E", // class name
  bases__ZN3ccc9CC6x15y13E, 2,
  &(vtc__ZN3ccc9CC6x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y13  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD6x15y133efgEv
  ~DD6x15y13(); // tgen
  DD6x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD6x15y13E) C1{ VBC2{ v2 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD6x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD6x15y133efgEv");}
ccc::DD6x15y13 ::~DD6x15y13(){ note_dtor("_ZN3ccc9DD6x15y13E", this);} // tgen
ccc::DD6x15y13 ::DD6x15y13(){ note_ctor("_ZN3ccc9DD6x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD6x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD6x15y13E, buf);
    ::ccc::DD6x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD6x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x15y13E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD6x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x15y13E);
    dp->::ccc::DD6x15y13::~DD6x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x15y13E(Test__ZN3ccc9DD6x15y13E, "_ZN3ccc9DD6x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD6x15y13C1Ev();
extern void _ZN3ccc9DD6x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD6x15y13E[] = {
  NSPAIR(_ZN3ccc9DD6x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD6x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD6x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD6x15y13E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc9DD6x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x15y13E[] = {
  {&(_ZTVN3ccc9DD6x15y13E[6]),  6,8},
  {&(_ZTVN3ccc9DD6x15y13E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x15y13E[];
Class_Descriptor cd__ZN3ccc9DD6x15y13E = {  "_ZN3ccc9DD6x15y13E", // class name
  bases__ZN3ccc9DD6x15y13E, 2,
  &(vtc__ZN3ccc9DD6x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD6x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x15y13E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y14  : virtual ::ccc::AA6 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC6x15y143pqrEv
  ~CC6x15y14(); // tgen
  CC6x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y14E) C1{ VBC2{ v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC6x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC6x15y143pqrEv");}
ccc::CC6x15y14 ::~CC6x15y14(){ note_dtor("_ZN3ccc9CC6x15y14E", this);} // tgen
ccc::CC6x15y14 ::CC6x15y14(){ note_ctor("_ZN3ccc9CC6x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC6x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC6x15y14E, buf);
    ::ccc::CC6x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC6x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x15y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9CC6x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC6x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x15y14E);
    dp->::ccc::CC6x15y14::~CC6x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x15y14E(Test__ZN3ccc9CC6x15y14E, "_ZN3ccc9CC6x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC6x15y14C1Ev();
extern void _ZN3ccc9CC6x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC6x15y14E[] = {
  NSPAIR(_ZN3ccc9CC6x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC6x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC6x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x15y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9CC6x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x15y14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC6x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x15y14E[] = {
  {&(_ZTVN3ccc9CC6x15y14E[5]),  5,8},
  {&(_ZTVN3ccc9CC6x15y14E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x15y14E[];
Class_Descriptor cd__ZN3ccc9CC6x15y14E = {  "_ZN3ccc9CC6x15y14E", // class name
  bases__ZN3ccc9CC6x15y14E, 2,
  &(vtc__ZN3ccc9CC6x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y14E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y14  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD6x15y143pqrEv
  ~DD6x15y14(); // tgen
  DD6x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD6x15y14E) C1{ VBC2{ v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD6x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD6x15y143pqrEv");}
ccc::DD6x15y14 ::~DD6x15y14(){ note_dtor("_ZN3ccc9DD6x15y14E", this);} // tgen
ccc::DD6x15y14 ::DD6x15y14(){ note_ctor("_ZN3ccc9DD6x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD6x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD6x15y14E, buf);
    ::ccc::DD6x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD6x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x15y14E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD6x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x15y14E);
    dp->::ccc::DD6x15y14::~DD6x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x15y14E(Test__ZN3ccc9DD6x15y14E, "_ZN3ccc9DD6x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD6x15y14C1Ev();
extern void _ZN3ccc9DD6x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD6x15y14E[] = {
  NSPAIR(_ZN3ccc9DD6x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD6x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD6x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD6x15y14E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
extern void _ZN3ccc9DD6x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD6x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x15y14E[] = {
  {&(_ZTVN3ccc9DD6x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9DD6x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x15y14E[];
Class_Descriptor cd__ZN3ccc9DD6x15y14E = {  "_ZN3ccc9DD6x15y14E", // class name
  bases__ZN3ccc9DD6x15y14E, 2,
  &(vtc__ZN3ccc9DD6x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD6x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC6x15y15  : virtual ::ccc::AA6 , ::ccc::BB15 {
  ~CC6x15y15(); // tgen
  CC6x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC6x15y15E) C1{ VBC2{ v1 v2} BC3{}}
}
namespace ccc { 
ccc::CC6x15y15 ::~CC6x15y15(){ note_dtor("_ZN3ccc9CC6x15y15E", this);} // tgen
ccc::CC6x15y15 ::CC6x15y15(){ note_ctor("_ZN3ccc9CC6x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC6x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC6x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC6x15y15E, buf);
    ::ccc::CC6x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC6x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC6x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC6x15y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9CC6x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC6x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC6x15y15E);
    dp->::ccc::CC6x15y15::~CC6x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC6x15y15E(Test__ZN3ccc9CC6x15y15E, "_ZN3ccc9CC6x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC6x15y15C1Ev();
extern void _ZN3ccc9CC6x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC6x15y15E[] = {
  NSPAIR(_ZN3ccc9CC6x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC6x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC6x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC6x15y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC6x15y15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC6x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC6x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC6x15y15E[] = {
  {&(_ZTVN3ccc9CC6x15y15E[5]),  5,7},
  {&(_ZTVN3ccc9CC6x15y15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC6x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC6x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC6x15y15E[];
Class_Descriptor cd__ZN3ccc9CC6x15y15E = {  "_ZN3ccc9CC6x15y15E", // class name
  bases__ZN3ccc9CC6x15y15E, 2,
  &(vtc__ZN3ccc9CC6x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC6x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC6x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC6x15y15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC6x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD6x15y15  : virtual ::ccc::AA6 , virtual ::ccc::BB15 {
  ~DD6x15y15(); // tgen
  DD6x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD6x15y15E) C1{ VBC2{ v1 v2} VBC3{}}
}
namespace ccc { 
ccc::DD6x15y15 ::~DD6x15y15(){ note_dtor("_ZN3ccc9DD6x15y15E", this);} // tgen
ccc::DD6x15y15 ::DD6x15y15(){ note_ctor("_ZN3ccc9DD6x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD6x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD6x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD6x15y15E, buf);
    ::ccc::DD6x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD6x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD6x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD6x15y15E)");
    check_base_class_offset(lv, (::ccc::AA6*), 0, "_ZN3ccc9DD6x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD6x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD6x15y15E);
    dp->::ccc::DD6x15y15::~DD6x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD6x15y15E(Test__ZN3ccc9DD6x15y15E, "_ZN3ccc9DD6x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD6x15y15C1Ev();
extern void _ZN3ccc9DD6x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD6x15y15E[] = {
  NSPAIR(_ZN3ccc9DD6x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD6x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA6E;
extern VTBL_ENTRY _ZTIN3ccc3AA6E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA6E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD6x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA6E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD6x15y15E[];
extern void _ZN3ccc3AA63abcEv();
extern void _ZN3ccc3AA63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD6x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD6x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD6x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD6x15y15E[] = {
  {&(_ZTVN3ccc9DD6x15y15E[6]),  6,8},
  {&(_ZTVN3ccc9DD6x15y15E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD6x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD6x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD6x15y15E[];
Class_Descriptor cd__ZN3ccc9DD6x15y15E = {  "_ZN3ccc9DD6x15y15E", // class name
  bases__ZN3ccc9DD6x15y15E, 2,
  &(vtc__ZN3ccc9DD6x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD6x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD6x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD6x15y15E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD6x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x0y0  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y03pqrEv
  ~CC7x0y0(); // tgen
  CC7x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y0E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y03abcEv");}
void  ccc::CC7x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y03efgEv");}
void  ccc::CC7x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y03pqrEv");}
ccc::CC7x0y0 ::~CC7x0y0(){ note_dtor("_ZN3ccc7CC7x0y0E", this);} // tgen
ccc::CC7x0y0 ::CC7x0y0(){ note_ctor("_ZN3ccc7CC7x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y0E, buf);
    ::ccc::CC7x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y0E);
    dp->::ccc::CC7x0y0::~CC7x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y0E(Test__ZN3ccc7CC7x0y0E, "_ZN3ccc7CC7x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y0C1Ev();
extern void _ZN3ccc7CC7x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y0E[] = {
  NSPAIR(_ZN3ccc7CC7x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y0E[];
extern void _ZN3ccc7CC7x0y03abcEv();
extern void _ZN3ccc7CC7x0y03efgEv();
extern void _ZN3ccc7CC7x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y03abcEv,_ZTv0_n12_N3ccc7CC7x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y03abcEv,_ZThn4_N3ccc7CC7x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y03pqrEv,_ZTv0_n16_N3ccc7CC7x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y03pqrEv,_ZThn4_N3ccc7CC7x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y03abcEv,_ZTv0_n12_N3ccc7CC7x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y03pqrEv,_ZTv0_n16_N3ccc7CC7x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y0E[] = {
  {&(_ZTVN3ccc7CC7x0y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y0E[];
static VTBL_ENTRY alt_thunk_names756[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y03pqrEv,_ZTv0_n16_N3ccc7CC7x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y03pqrEv,_ZThn4_N3ccc7CC7x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y03abcEv,_ZTv0_n12_N3ccc7CC7x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y03abcEv,_ZThn4_N3ccc7CC7x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y0E = {  "_ZN3ccc7CC7x0y0E", // class name
  bases__ZN3ccc7CC7x0y0E, 2,
  &(vtc__ZN3ccc7CC7x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y0E),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  DD7x0y0  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD7x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x0y03pqrEv
  ~DD7x0y0(); // tgen
  DD7x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y0E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y03abcEv");}
void  ccc::DD7x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y03efgEv");}
void  ccc::DD7x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y03pqrEv");}
ccc::DD7x0y0 ::~DD7x0y0(){ note_dtor("_ZN3ccc7DD7x0y0E", this);} // tgen
ccc::DD7x0y0 ::DD7x0y0(){ note_ctor("_ZN3ccc7DD7x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y0E, buf);
    ::ccc::DD7x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y0E);
    dp->::ccc::DD7x0y0::~DD7x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y0E(Test__ZN3ccc7DD7x0y0E, "_ZN3ccc7DD7x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y0C1Ev();
extern void _ZN3ccc7DD7x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y0E[] = {
  NSPAIR(_ZN3ccc7DD7x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y0E[];
extern void _ZN3ccc7DD7x0y03abcEv();
extern void _ZN3ccc7DD7x0y03pqrEv();
extern void _ZN3ccc7DD7x0y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y03abcEv,_ZTv0_n12_N3ccc7DD7x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y03abcEv,_ZThn4_N3ccc7DD7x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y03efgEv,_ZTv0_n16_N3ccc7DD7x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y03efgEv,_ZThn4_N3ccc7DD7x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y03pqrEv,_ZTv0_n20_N3ccc7DD7x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y03pqrEv,_ZThn4_N3ccc7DD7x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y03abcEv,_ZTv0_n12_N3ccc7DD7x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y03efgEv,_ZTv0_n16_N3ccc7DD7x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y03pqrEv,_ZTv0_n20_N3ccc7DD7x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y0E[] = {
  {&(_ZTVN3ccc7DD7x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y0E[];
static VTBL_ENTRY alt_thunk_names757[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y03pqrEv,_ZTv0_n20_N3ccc7DD7x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y03pqrEv,_ZThn4_N3ccc7DD7x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y03efgEv,_ZTv0_n16_N3ccc7DD7x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y03efgEv,_ZThn4_N3ccc7DD7x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y03abcEv,_ZTv0_n12_N3ccc7DD7x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y03abcEv,_ZThn4_N3ccc7DD7x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y0E = {  "_ZN3ccc7DD7x0y0E", // class name
  bases__ZN3ccc7DD7x0y0E, 2,
  &(vtc__ZN3ccc7DD7x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y0E),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  CC7x0y1  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x0y13efgEv
  ~CC7x0y1(); // tgen
  CC7x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y1E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y13abcEv");}
void  ccc::CC7x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y13pqrEv");}
void  ccc::CC7x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y13efgEv");}
ccc::CC7x0y1 ::~CC7x0y1(){ note_dtor("_ZN3ccc7CC7x0y1E", this);} // tgen
ccc::CC7x0y1 ::CC7x0y1(){ note_ctor("_ZN3ccc7CC7x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y1E, buf);
    ::ccc::CC7x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y1E);
    dp->::ccc::CC7x0y1::~CC7x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y1E(Test__ZN3ccc7CC7x0y1E, "_ZN3ccc7CC7x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y1C1Ev();
extern void _ZN3ccc7CC7x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y1E[] = {
  NSPAIR(_ZN3ccc7CC7x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y1E[];
extern void _ZN3ccc7CC7x0y13abcEv();
extern void _ZN3ccc7CC7x0y13efgEv();
extern void _ZN3ccc7CC7x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y13abcEv,_ZTv0_n12_N3ccc7CC7x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y13abcEv,_ZThn4_N3ccc7CC7x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y13pqrEv,_ZTv0_n16_N3ccc7CC7x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y13pqrEv,_ZThn4_N3ccc7CC7x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y13abcEv,_ZTv0_n12_N3ccc7CC7x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y13pqrEv,_ZTv0_n16_N3ccc7CC7x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y1E[] = {
  {&(_ZTVN3ccc7CC7x0y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y1E[];
static VTBL_ENTRY alt_thunk_names758[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y13pqrEv,_ZTv0_n16_N3ccc7CC7x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y13pqrEv,_ZThn4_N3ccc7CC7x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y13abcEv,_ZTv0_n12_N3ccc7CC7x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y13abcEv,_ZThn4_N3ccc7CC7x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y1E = {  "_ZN3ccc7CC7x0y1E", // class name
  bases__ZN3ccc7CC7x0y1E, 2,
  &(vtc__ZN3ccc7CC7x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y1E),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  DD7x0y1  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD7x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x0y13efgEv
  ~DD7x0y1(); // tgen
  DD7x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y1E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y13abcEv");}
void  ccc::DD7x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y13pqrEv");}
void  ccc::DD7x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y13efgEv");}
ccc::DD7x0y1 ::~DD7x0y1(){ note_dtor("_ZN3ccc7DD7x0y1E", this);} // tgen
ccc::DD7x0y1 ::DD7x0y1(){ note_ctor("_ZN3ccc7DD7x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y1E, buf);
    ::ccc::DD7x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y1E);
    dp->::ccc::DD7x0y1::~DD7x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y1E(Test__ZN3ccc7DD7x0y1E, "_ZN3ccc7DD7x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y1C1Ev();
extern void _ZN3ccc7DD7x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y1E[] = {
  NSPAIR(_ZN3ccc7DD7x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y1E[];
extern void _ZN3ccc7DD7x0y13abcEv();
extern void _ZN3ccc7DD7x0y13pqrEv();
extern void _ZN3ccc7DD7x0y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y13abcEv,_ZTv0_n12_N3ccc7DD7x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y13abcEv,_ZThn4_N3ccc7DD7x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y13efgEv,_ZTv0_n16_N3ccc7DD7x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y13efgEv,_ZThn4_N3ccc7DD7x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y13pqrEv,_ZTv0_n20_N3ccc7DD7x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y13pqrEv,_ZThn4_N3ccc7DD7x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y13abcEv,_ZTv0_n12_N3ccc7DD7x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y13efgEv,_ZTv0_n16_N3ccc7DD7x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y13pqrEv,_ZTv0_n20_N3ccc7DD7x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y1E[] = {
  {&(_ZTVN3ccc7DD7x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y1E[];
static VTBL_ENTRY alt_thunk_names759[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y13pqrEv,_ZTv0_n20_N3ccc7DD7x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y13pqrEv,_ZThn4_N3ccc7DD7x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y13efgEv,_ZTv0_n16_N3ccc7DD7x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y13efgEv,_ZThn4_N3ccc7DD7x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y13abcEv,_ZTv0_n12_N3ccc7DD7x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y13abcEv,_ZThn4_N3ccc7DD7x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y1E = {  "_ZN3ccc7DD7x0y1E", // class name
  bases__ZN3ccc7DD7x0y1E, 2,
  &(vtc__ZN3ccc7DD7x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y1E),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  CC7x0y2  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y23pqrEv
  ~CC7x0y2(); // tgen
  CC7x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y2E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y23efgEv");}
void  ccc::CC7x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y23abcEv");}
void  ccc::CC7x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y23pqrEv");}
ccc::CC7x0y2 ::~CC7x0y2(){ note_dtor("_ZN3ccc7CC7x0y2E", this);} // tgen
ccc::CC7x0y2 ::CC7x0y2(){ note_ctor("_ZN3ccc7CC7x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y2E, buf);
    ::ccc::CC7x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y2E);
    dp->::ccc::CC7x0y2::~CC7x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y2E(Test__ZN3ccc7CC7x0y2E, "_ZN3ccc7CC7x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y2C1Ev();
extern void _ZN3ccc7CC7x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y2E[] = {
  NSPAIR(_ZN3ccc7CC7x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y2E[];
extern void _ZN3ccc7CC7x0y23abcEv();
extern void _ZN3ccc7CC7x0y23efgEv();
extern void _ZN3ccc7CC7x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y23abcEv,_ZTv0_n12_N3ccc7CC7x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y23abcEv,_ZThn4_N3ccc7CC7x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y23pqrEv,_ZTv0_n16_N3ccc7CC7x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y23pqrEv,_ZThn4_N3ccc7CC7x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y23abcEv,_ZTv0_n12_N3ccc7CC7x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y23pqrEv,_ZTv0_n16_N3ccc7CC7x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y2E[] = {
  {&(_ZTVN3ccc7CC7x0y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y2E[];
static VTBL_ENTRY alt_thunk_names760[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y23pqrEv,_ZTv0_n16_N3ccc7CC7x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y23pqrEv,_ZThn4_N3ccc7CC7x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y23abcEv,_ZTv0_n12_N3ccc7CC7x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y23abcEv,_ZThn4_N3ccc7CC7x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y2E = {  "_ZN3ccc7CC7x0y2E", // class name
  bases__ZN3ccc7CC7x0y2E, 2,
  &(vtc__ZN3ccc7CC7x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y2E),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  DD7x0y2  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD7x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x0y23pqrEv
  ~DD7x0y2(); // tgen
  DD7x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y2E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y23efgEv");}
void  ccc::DD7x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y23abcEv");}
void  ccc::DD7x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y23pqrEv");}
ccc::DD7x0y2 ::~DD7x0y2(){ note_dtor("_ZN3ccc7DD7x0y2E", this);} // tgen
ccc::DD7x0y2 ::DD7x0y2(){ note_ctor("_ZN3ccc7DD7x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y2E, buf);
    ::ccc::DD7x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y2E);
    dp->::ccc::DD7x0y2::~DD7x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y2E(Test__ZN3ccc7DD7x0y2E, "_ZN3ccc7DD7x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y2C1Ev();
extern void _ZN3ccc7DD7x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y2E[] = {
  NSPAIR(_ZN3ccc7DD7x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y2E[];
extern void _ZN3ccc7DD7x0y23abcEv();
extern void _ZN3ccc7DD7x0y23pqrEv();
extern void _ZN3ccc7DD7x0y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y23abcEv,_ZTv0_n12_N3ccc7DD7x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y23abcEv,_ZThn4_N3ccc7DD7x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y23efgEv,_ZTv0_n16_N3ccc7DD7x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y23efgEv,_ZThn4_N3ccc7DD7x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y23pqrEv,_ZTv0_n20_N3ccc7DD7x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y23pqrEv,_ZThn4_N3ccc7DD7x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y23abcEv,_ZTv0_n12_N3ccc7DD7x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y23efgEv,_ZTv0_n16_N3ccc7DD7x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y23pqrEv,_ZTv0_n20_N3ccc7DD7x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y2E[] = {
  {&(_ZTVN3ccc7DD7x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y2E[];
static VTBL_ENTRY alt_thunk_names761[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y23pqrEv,_ZTv0_n20_N3ccc7DD7x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y23pqrEv,_ZThn4_N3ccc7DD7x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y23efgEv,_ZTv0_n16_N3ccc7DD7x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y23efgEv,_ZThn4_N3ccc7DD7x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y23abcEv,_ZTv0_n12_N3ccc7DD7x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y23abcEv,_ZThn4_N3ccc7DD7x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y2E = {  "_ZN3ccc7DD7x0y2E", // class name
  bases__ZN3ccc7DD7x0y2E, 2,
  &(vtc__ZN3ccc7DD7x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y2E),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  CC7x0y3  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x0y33abcEv
  ~CC7x0y3(); // tgen
  CC7x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y3E) C1{ VBC2{ v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y33efgEv");}
void  ccc::CC7x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y33pqrEv");}
void  ccc::CC7x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y33abcEv");}
ccc::CC7x0y3 ::~CC7x0y3(){ note_dtor("_ZN3ccc7CC7x0y3E", this);} // tgen
ccc::CC7x0y3 ::CC7x0y3(){ note_ctor("_ZN3ccc7CC7x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y3E, buf);
    ::ccc::CC7x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y3E);
    dp->::ccc::CC7x0y3::~CC7x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y3E(Test__ZN3ccc7CC7x0y3E, "_ZN3ccc7CC7x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y3C1Ev();
extern void _ZN3ccc7CC7x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y3E[] = {
  NSPAIR(_ZN3ccc7CC7x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y3E[];
extern void _ZN3ccc7CC7x0y33abcEv();
extern void _ZN3ccc7CC7x0y33efgEv();
extern void _ZN3ccc7CC7x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y33abcEv,_ZTv0_n12_N3ccc7CC7x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y33abcEv,_ZThn4_N3ccc7CC7x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y33pqrEv,_ZTv0_n16_N3ccc7CC7x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y33pqrEv,_ZThn4_N3ccc7CC7x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y33abcEv,_ZTv0_n12_N3ccc7CC7x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y33pqrEv,_ZTv0_n16_N3ccc7CC7x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y3E[] = {
  {&(_ZTVN3ccc7CC7x0y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y3E[];
static VTBL_ENTRY alt_thunk_names762[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y33pqrEv,_ZTv0_n16_N3ccc7CC7x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y33pqrEv,_ZThn4_N3ccc7CC7x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y33abcEv,_ZTv0_n12_N3ccc7CC7x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y33abcEv,_ZThn4_N3ccc7CC7x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y3E = {  "_ZN3ccc7CC7x0y3E", // class name
  bases__ZN3ccc7CC7x0y3E, 2,
  &(vtc__ZN3ccc7CC7x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y3E),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  DD7x0y3  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD7x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x0y33abcEv
  ~DD7x0y3(); // tgen
  DD7x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y3E) C1{ VBC2{ v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y33efgEv");}
void  ccc::DD7x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y33pqrEv");}
void  ccc::DD7x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y33abcEv");}
ccc::DD7x0y3 ::~DD7x0y3(){ note_dtor("_ZN3ccc7DD7x0y3E", this);} // tgen
ccc::DD7x0y3 ::DD7x0y3(){ note_ctor("_ZN3ccc7DD7x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y3E, buf);
    ::ccc::DD7x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y3E);
    dp->::ccc::DD7x0y3::~DD7x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y3E(Test__ZN3ccc7DD7x0y3E, "_ZN3ccc7DD7x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y3C1Ev();
extern void _ZN3ccc7DD7x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y3E[] = {
  NSPAIR(_ZN3ccc7DD7x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y3E[];
extern void _ZN3ccc7DD7x0y33abcEv();
extern void _ZN3ccc7DD7x0y33pqrEv();
extern void _ZN3ccc7DD7x0y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y33abcEv,_ZTv0_n12_N3ccc7DD7x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y33abcEv,_ZThn4_N3ccc7DD7x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y33efgEv,_ZTv0_n16_N3ccc7DD7x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y33efgEv,_ZThn4_N3ccc7DD7x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y33pqrEv,_ZTv0_n20_N3ccc7DD7x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y33pqrEv,_ZThn4_N3ccc7DD7x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y33abcEv,_ZTv0_n12_N3ccc7DD7x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y33efgEv,_ZTv0_n16_N3ccc7DD7x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y33pqrEv,_ZTv0_n20_N3ccc7DD7x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y3E[] = {
  {&(_ZTVN3ccc7DD7x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y3E[];
static VTBL_ENTRY alt_thunk_names763[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y33pqrEv,_ZTv0_n20_N3ccc7DD7x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y33pqrEv,_ZThn4_N3ccc7DD7x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y33efgEv,_ZTv0_n16_N3ccc7DD7x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y33efgEv,_ZThn4_N3ccc7DD7x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y33abcEv,_ZTv0_n12_N3ccc7DD7x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y33abcEv,_ZThn4_N3ccc7DD7x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y3E = {  "_ZN3ccc7DD7x0y3E", // class name
  bases__ZN3ccc7DD7x0y3E, 2,
  &(vtc__ZN3ccc7DD7x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y3E),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  CC7x0y4  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC7x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x0y43efgEv
  ~CC7x0y4(); // tgen
  CC7x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y4E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y43pqrEv");}
void  ccc::CC7x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y43abcEv");}
void  ccc::CC7x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y43efgEv");}
ccc::CC7x0y4 ::~CC7x0y4(){ note_dtor("_ZN3ccc7CC7x0y4E", this);} // tgen
ccc::CC7x0y4 ::CC7x0y4(){ note_ctor("_ZN3ccc7CC7x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y4E, buf);
    ::ccc::CC7x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y4E);
    dp->::ccc::CC7x0y4::~CC7x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y4E(Test__ZN3ccc7CC7x0y4E, "_ZN3ccc7CC7x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y4C1Ev();
extern void _ZN3ccc7CC7x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y4E[] = {
  NSPAIR(_ZN3ccc7CC7x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y4E[];
extern void _ZN3ccc7CC7x0y43abcEv();
extern void _ZN3ccc7CC7x0y43efgEv();
extern void _ZN3ccc7CC7x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y43abcEv,_ZTv0_n12_N3ccc7CC7x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y43abcEv,_ZThn4_N3ccc7CC7x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y43pqrEv,_ZTv0_n16_N3ccc7CC7x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y43pqrEv,_ZThn4_N3ccc7CC7x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y43abcEv,_ZTv0_n12_N3ccc7CC7x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y43pqrEv,_ZTv0_n16_N3ccc7CC7x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y4E[] = {
  {&(_ZTVN3ccc7CC7x0y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y4E[];
static VTBL_ENTRY alt_thunk_names764[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y43pqrEv,_ZTv0_n16_N3ccc7CC7x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y43pqrEv,_ZThn4_N3ccc7CC7x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y43abcEv,_ZTv0_n12_N3ccc7CC7x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y43abcEv,_ZThn4_N3ccc7CC7x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y4E = {  "_ZN3ccc7CC7x0y4E", // class name
  bases__ZN3ccc7CC7x0y4E, 2,
  &(vtc__ZN3ccc7CC7x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y4E),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  DD7x0y4  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD7x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x0y43efgEv
  ~DD7x0y4(); // tgen
  DD7x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y4E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y43pqrEv");}
void  ccc::DD7x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y43abcEv");}
void  ccc::DD7x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y43efgEv");}
ccc::DD7x0y4 ::~DD7x0y4(){ note_dtor("_ZN3ccc7DD7x0y4E", this);} // tgen
ccc::DD7x0y4 ::DD7x0y4(){ note_ctor("_ZN3ccc7DD7x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y4E, buf);
    ::ccc::DD7x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y4E);
    dp->::ccc::DD7x0y4::~DD7x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y4E(Test__ZN3ccc7DD7x0y4E, "_ZN3ccc7DD7x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y4C1Ev();
extern void _ZN3ccc7DD7x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y4E[] = {
  NSPAIR(_ZN3ccc7DD7x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y4E[];
extern void _ZN3ccc7DD7x0y43abcEv();
extern void _ZN3ccc7DD7x0y43pqrEv();
extern void _ZN3ccc7DD7x0y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y43abcEv,_ZTv0_n12_N3ccc7DD7x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y43abcEv,_ZThn4_N3ccc7DD7x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y43efgEv,_ZTv0_n16_N3ccc7DD7x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y43efgEv,_ZThn4_N3ccc7DD7x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y43pqrEv,_ZTv0_n20_N3ccc7DD7x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y43pqrEv,_ZThn4_N3ccc7DD7x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y43abcEv,_ZTv0_n12_N3ccc7DD7x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y43efgEv,_ZTv0_n16_N3ccc7DD7x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y43pqrEv,_ZTv0_n20_N3ccc7DD7x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y4E[] = {
  {&(_ZTVN3ccc7DD7x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y4E[];
static VTBL_ENTRY alt_thunk_names765[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y43pqrEv,_ZTv0_n20_N3ccc7DD7x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y43pqrEv,_ZThn4_N3ccc7DD7x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y43efgEv,_ZTv0_n16_N3ccc7DD7x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y43efgEv,_ZThn4_N3ccc7DD7x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y43abcEv,_ZTv0_n12_N3ccc7DD7x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y43abcEv,_ZThn4_N3ccc7DD7x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y4E = {  "_ZN3ccc7DD7x0y4E", // class name
  bases__ZN3ccc7DD7x0y4E, 2,
  &(vtc__ZN3ccc7DD7x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y4E),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  CC7x0y5  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC7x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x0y53abcEv
  ~CC7x0y5(); // tgen
  CC7x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y5E) C1{ VBC2{ v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y53pqrEv");}
void  ccc::CC7x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y53efgEv");}
void  ccc::CC7x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y53abcEv");}
ccc::CC7x0y5 ::~CC7x0y5(){ note_dtor("_ZN3ccc7CC7x0y5E", this);} // tgen
ccc::CC7x0y5 ::CC7x0y5(){ note_ctor("_ZN3ccc7CC7x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y5E, buf);
    ::ccc::CC7x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y5E);
    dp->::ccc::CC7x0y5::~CC7x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y5E(Test__ZN3ccc7CC7x0y5E, "_ZN3ccc7CC7x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y5C1Ev();
extern void _ZN3ccc7CC7x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y5E[] = {
  NSPAIR(_ZN3ccc7CC7x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y5E[];
extern void _ZN3ccc7CC7x0y53abcEv();
extern void _ZN3ccc7CC7x0y53efgEv();
extern void _ZN3ccc7CC7x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y53abcEv,_ZTv0_n12_N3ccc7CC7x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y53abcEv,_ZThn4_N3ccc7CC7x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y53pqrEv,_ZTv0_n16_N3ccc7CC7x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y53pqrEv,_ZThn4_N3ccc7CC7x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y53abcEv,_ZTv0_n12_N3ccc7CC7x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y53pqrEv,_ZTv0_n16_N3ccc7CC7x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y5E[] = {
  {&(_ZTVN3ccc7CC7x0y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y5E[];
static VTBL_ENTRY alt_thunk_names766[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y53pqrEv,_ZTv0_n16_N3ccc7CC7x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y53pqrEv,_ZThn4_N3ccc7CC7x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y53abcEv,_ZTv0_n12_N3ccc7CC7x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y53abcEv,_ZThn4_N3ccc7CC7x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y5E = {  "_ZN3ccc7CC7x0y5E", // class name
  bases__ZN3ccc7CC7x0y5E, 2,
  &(vtc__ZN3ccc7CC7x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y5E),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  DD7x0y5  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD7x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x0y53abcEv
  ~DD7x0y5(); // tgen
  DD7x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y5E) C1{ VBC2{ v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y53pqrEv");}
void  ccc::DD7x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y53efgEv");}
void  ccc::DD7x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y53abcEv");}
ccc::DD7x0y5 ::~DD7x0y5(){ note_dtor("_ZN3ccc7DD7x0y5E", this);} // tgen
ccc::DD7x0y5 ::DD7x0y5(){ note_ctor("_ZN3ccc7DD7x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y5E, buf);
    ::ccc::DD7x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y5E);
    dp->::ccc::DD7x0y5::~DD7x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y5E(Test__ZN3ccc7DD7x0y5E, "_ZN3ccc7DD7x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y5C1Ev();
extern void _ZN3ccc7DD7x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y5E[] = {
  NSPAIR(_ZN3ccc7DD7x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y5E[];
extern void _ZN3ccc7DD7x0y53abcEv();
extern void _ZN3ccc7DD7x0y53pqrEv();
extern void _ZN3ccc7DD7x0y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y53abcEv,_ZTv0_n12_N3ccc7DD7x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y53abcEv,_ZThn4_N3ccc7DD7x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y53efgEv,_ZTv0_n16_N3ccc7DD7x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y53efgEv,_ZThn4_N3ccc7DD7x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y53pqrEv,_ZTv0_n20_N3ccc7DD7x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y53pqrEv,_ZThn4_N3ccc7DD7x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y53abcEv,_ZTv0_n12_N3ccc7DD7x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y53efgEv,_ZTv0_n16_N3ccc7DD7x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y53pqrEv,_ZTv0_n20_N3ccc7DD7x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y5E[] = {
  {&(_ZTVN3ccc7DD7x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y5E[];
static VTBL_ENTRY alt_thunk_names767[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y53pqrEv,_ZTv0_n20_N3ccc7DD7x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y53pqrEv,_ZThn4_N3ccc7DD7x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y53efgEv,_ZTv0_n16_N3ccc7DD7x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y53efgEv,_ZThn4_N3ccc7DD7x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y53abcEv,_ZTv0_n12_N3ccc7DD7x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y53abcEv,_ZThn4_N3ccc7DD7x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y5E = {  "_ZN3ccc7DD7x0y5E", // class name
  bases__ZN3ccc7DD7x0y5E, 2,
  &(vtc__ZN3ccc7DD7x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y5E),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  CC7x0y6  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x0y63efgEv
  ~CC7x0y6(); // tgen
  CC7x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y6E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y63abcEv");}
void  ccc::CC7x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y63efgEv");}
ccc::CC7x0y6 ::~CC7x0y6(){ note_dtor("_ZN3ccc7CC7x0y6E", this);} // tgen
ccc::CC7x0y6 ::CC7x0y6(){ note_ctor("_ZN3ccc7CC7x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y6E, buf);
    ::ccc::CC7x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y6E);
    dp->::ccc::CC7x0y6::~CC7x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y6E(Test__ZN3ccc7CC7x0y6E, "_ZN3ccc7CC7x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y6C1Ev();
extern void _ZN3ccc7CC7x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y6E[] = {
  NSPAIR(_ZN3ccc7CC7x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y6E[];
extern void _ZN3ccc7CC7x0y63abcEv();
extern void _ZN3ccc7CC7x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y63abcEv,_ZTv0_n12_N3ccc7CC7x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y63abcEv,_ZThn4_N3ccc7CC7x0y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y63abcEv,_ZTv0_n12_N3ccc7CC7x0y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y6E[] = {
  {&(_ZTVN3ccc7CC7x0y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y6E[];
static VTBL_ENTRY alt_thunk_names768[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y63abcEv,_ZTv0_n12_N3ccc7CC7x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y63abcEv,_ZThn4_N3ccc7CC7x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y6E = {  "_ZN3ccc7CC7x0y6E", // class name
  bases__ZN3ccc7CC7x0y6E, 2,
  &(vtc__ZN3ccc7CC7x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y6E),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  DD7x0y6  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD7x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x0y63efgEv
  ~DD7x0y6(); // tgen
  DD7x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y6E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y63abcEv");}
void  ccc::DD7x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y63efgEv");}
ccc::DD7x0y6 ::~DD7x0y6(){ note_dtor("_ZN3ccc7DD7x0y6E", this);} // tgen
ccc::DD7x0y6 ::DD7x0y6(){ note_ctor("_ZN3ccc7DD7x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y6E, buf);
    ::ccc::DD7x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y6E);
    dp->::ccc::DD7x0y6::~DD7x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y6E(Test__ZN3ccc7DD7x0y6E, "_ZN3ccc7DD7x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y6C1Ev();
extern void _ZN3ccc7DD7x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y6E[] = {
  NSPAIR(_ZN3ccc7DD7x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y6E[];
extern void _ZN3ccc7DD7x0y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x0y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y63abcEv,_ZTv0_n12_N3ccc7DD7x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y63abcEv,_ZThn4_N3ccc7DD7x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y63efgEv,_ZTv0_n16_N3ccc7DD7x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y63efgEv,_ZThn4_N3ccc7DD7x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y63abcEv,_ZTv0_n12_N3ccc7DD7x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y63efgEv,_ZTv0_n16_N3ccc7DD7x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y6E[] = {
  {&(_ZTVN3ccc7DD7x0y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y6E[];
static VTBL_ENTRY alt_thunk_names769[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y63efgEv,_ZTv0_n16_N3ccc7DD7x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y63efgEv,_ZThn4_N3ccc7DD7x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y63abcEv,_ZTv0_n12_N3ccc7DD7x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y63abcEv,_ZThn4_N3ccc7DD7x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y6E = {  "_ZN3ccc7DD7x0y6E", // class name
  bases__ZN3ccc7DD7x0y6E, 2,
  &(vtc__ZN3ccc7DD7x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y6E),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  CC7x0y7  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC7x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y73pqrEv
  ~CC7x0y7(); // tgen
  CC7x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y7E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y73abcEv");}
void  ccc::CC7x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y73pqrEv");}
ccc::CC7x0y7 ::~CC7x0y7(){ note_dtor("_ZN3ccc7CC7x0y7E", this);} // tgen
ccc::CC7x0y7 ::CC7x0y7(){ note_ctor("_ZN3ccc7CC7x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y7E, buf);
    ::ccc::CC7x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y7E);
    dp->::ccc::CC7x0y7::~CC7x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y7E(Test__ZN3ccc7CC7x0y7E, "_ZN3ccc7CC7x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y7C1Ev();
extern void _ZN3ccc7CC7x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y7E[] = {
  NSPAIR(_ZN3ccc7CC7x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y7E[];
extern void _ZN3ccc7CC7x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC7x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y73abcEv,_ZTv0_n12_N3ccc7CC7x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y73abcEv,_ZThn4_N3ccc7CC7x0y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y73pqrEv,_ZTv0_n16_N3ccc7CC7x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y73pqrEv,_ZThn4_N3ccc7CC7x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y73abcEv,_ZTv0_n12_N3ccc7CC7x0y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y73pqrEv,_ZTv0_n16_N3ccc7CC7x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y7E[] = {
  {&(_ZTVN3ccc7CC7x0y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y7E[];
static VTBL_ENTRY alt_thunk_names770[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y73pqrEv,_ZTv0_n16_N3ccc7CC7x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y73pqrEv,_ZThn4_N3ccc7CC7x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y73abcEv,_ZTv0_n12_N3ccc7CC7x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y73abcEv,_ZThn4_N3ccc7CC7x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y7E = {  "_ZN3ccc7CC7x0y7E", // class name
  bases__ZN3ccc7CC7x0y7E, 2,
  &(vtc__ZN3ccc7CC7x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y7E),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  DD7x0y7  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD7x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x0y73pqrEv
  ~DD7x0y7(); // tgen
  DD7x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y7E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y73abcEv");}
void  ccc::DD7x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y73pqrEv");}
ccc::DD7x0y7 ::~DD7x0y7(){ note_dtor("_ZN3ccc7DD7x0y7E", this);} // tgen
ccc::DD7x0y7 ::DD7x0y7(){ note_ctor("_ZN3ccc7DD7x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y7E, buf);
    ::ccc::DD7x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y7E);
    dp->::ccc::DD7x0y7::~DD7x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y7E(Test__ZN3ccc7DD7x0y7E, "_ZN3ccc7DD7x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y7C1Ev();
extern void _ZN3ccc7DD7x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y7E[] = {
  NSPAIR(_ZN3ccc7DD7x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y7E[];
extern void _ZN3ccc7DD7x0y73abcEv();
extern void _ZN3ccc7DD7x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y73abcEv,_ZTv0_n12_N3ccc7DD7x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y73abcEv,_ZThn4_N3ccc7DD7x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y73pqrEv,_ZTv0_n20_N3ccc7DD7x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y73pqrEv,_ZThn4_N3ccc7DD7x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y73abcEv,_ZTv0_n12_N3ccc7DD7x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y73pqrEv,_ZTv0_n20_N3ccc7DD7x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y7E[] = {
  {&(_ZTVN3ccc7DD7x0y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x0y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x0y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y7E[];
static VTBL_ENTRY alt_thunk_names771[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y73pqrEv,_ZTv0_n20_N3ccc7DD7x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y73pqrEv,_ZThn4_N3ccc7DD7x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y73abcEv,_ZTv0_n12_N3ccc7DD7x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y73abcEv,_ZThn4_N3ccc7DD7x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y7E = {  "_ZN3ccc7DD7x0y7E", // class name
  bases__ZN3ccc7DD7x0y7E, 2,
  &(vtc__ZN3ccc7DD7x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y7E),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  CC7x0y8  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x0y83abcEv
  ~CC7x0y8(); // tgen
  CC7x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y8E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y83efgEv");}
void  ccc::CC7x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x0y83abcEv");}
ccc::CC7x0y8 ::~CC7x0y8(){ note_dtor("_ZN3ccc7CC7x0y8E", this);} // tgen
ccc::CC7x0y8 ::CC7x0y8(){ note_ctor("_ZN3ccc7CC7x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y8E, buf);
    ::ccc::CC7x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y8E);
    dp->::ccc::CC7x0y8::~CC7x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y8E(Test__ZN3ccc7CC7x0y8E, "_ZN3ccc7CC7x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y8C1Ev();
extern void _ZN3ccc7CC7x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y8E[] = {
  NSPAIR(_ZN3ccc7CC7x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y8E[];
extern void _ZN3ccc7CC7x0y83abcEv();
extern void _ZN3ccc7CC7x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x0y83abcEv,_ZTv0_n12_N3ccc7CC7x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y83abcEv,_ZThn4_N3ccc7CC7x0y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x0y83abcEv,_ZTv0_n12_N3ccc7CC7x0y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y8E[] = {
  {&(_ZTVN3ccc7CC7x0y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y8E[];
static VTBL_ENTRY alt_thunk_names772[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x0y83abcEv,_ZTv0_n12_N3ccc7CC7x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y83abcEv,_ZThn4_N3ccc7CC7x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y8E = {  "_ZN3ccc7CC7x0y8E", // class name
  bases__ZN3ccc7CC7x0y8E, 2,
  &(vtc__ZN3ccc7CC7x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y8E),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  DD7x0y8  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD7x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x0y83abcEv
  ~DD7x0y8(); // tgen
  DD7x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y8E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y83efgEv");}
void  ccc::DD7x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x0y83abcEv");}
ccc::DD7x0y8 ::~DD7x0y8(){ note_dtor("_ZN3ccc7DD7x0y8E", this);} // tgen
ccc::DD7x0y8 ::DD7x0y8(){ note_ctor("_ZN3ccc7DD7x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y8E, buf);
    ::ccc::DD7x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y8E);
    dp->::ccc::DD7x0y8::~DD7x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y8E(Test__ZN3ccc7DD7x0y8E, "_ZN3ccc7DD7x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y8C1Ev();
extern void _ZN3ccc7DD7x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y8E[] = {
  NSPAIR(_ZN3ccc7DD7x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y8E[];
extern void _ZN3ccc7DD7x0y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x0y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x0y83abcEv,_ZTv0_n12_N3ccc7DD7x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y83abcEv,_ZThn4_N3ccc7DD7x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y83efgEv,_ZTv0_n16_N3ccc7DD7x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y83efgEv,_ZThn4_N3ccc7DD7x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x0y83abcEv,_ZTv0_n12_N3ccc7DD7x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y83efgEv,_ZTv0_n16_N3ccc7DD7x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y8E[] = {
  {&(_ZTVN3ccc7DD7x0y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y8E[];
static VTBL_ENTRY alt_thunk_names773[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y83efgEv,_ZTv0_n16_N3ccc7DD7x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y83efgEv,_ZThn4_N3ccc7DD7x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x0y83abcEv,_ZTv0_n12_N3ccc7DD7x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y83abcEv,_ZThn4_N3ccc7DD7x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y8E = {  "_ZN3ccc7DD7x0y8E", // class name
  bases__ZN3ccc7DD7x0y8E, 2,
  &(vtc__ZN3ccc7DD7x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y8E),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  CC7x0y9  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC7x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x0y93pqrEv
  ~CC7x0y9(); // tgen
  CC7x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x0y9E) C1{ VBC2{ v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x0y93efgEv");}
void  ccc::CC7x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x0y93pqrEv");}
ccc::CC7x0y9 ::~CC7x0y9(){ note_dtor("_ZN3ccc7CC7x0y9E", this);} // tgen
ccc::CC7x0y9 ::CC7x0y9(){ note_ctor("_ZN3ccc7CC7x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x0y9E, buf);
    ::ccc::CC7x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x0y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC7x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x0y9E);
    dp->::ccc::CC7x0y9::~CC7x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x0y9E(Test__ZN3ccc7CC7x0y9E, "_ZN3ccc7CC7x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x0y9C1Ev();
extern void _ZN3ccc7CC7x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x0y9E[] = {
  NSPAIR(_ZN3ccc7CC7x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC7x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC7x0y93efgEv();
extern void _ZN3ccc7CC7x0y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x0y93pqrEv,_ZTv0_n16_N3ccc7CC7x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x0y93pqrEv,_ZThn4_N3ccc7CC7x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x0y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x0y93pqrEv,_ZTv0_n16_N3ccc7CC7x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x0y9E[] = {
  {&(_ZTVN3ccc7CC7x0y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x0y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x0y9E[];
static VTBL_ENTRY alt_thunk_names774[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x0y93pqrEv,_ZTv0_n16_N3ccc7CC7x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x0y93pqrEv,_ZThn4_N3ccc7CC7x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x0y9E = {  "_ZN3ccc7CC7x0y9E", // class name
  bases__ZN3ccc7CC7x0y9E, 2,
  &(vtc__ZN3ccc7CC7x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x0y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x0y9E),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  DD7x0y9  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD7x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x0y93pqrEv
  ~DD7x0y9(); // tgen
  DD7x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x0y9E) C1{ VBC2{ v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x0y93efgEv");}
void  ccc::DD7x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x0y93pqrEv");}
ccc::DD7x0y9 ::~DD7x0y9(){ note_dtor("_ZN3ccc7DD7x0y9E", this);} // tgen
ccc::DD7x0y9 ::DD7x0y9(){ note_ctor("_ZN3ccc7DD7x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x0y9E, buf);
    ::ccc::DD7x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x0y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD7x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x0y9E);
    dp->::ccc::DD7x0y9::~DD7x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x0y9E(Test__ZN3ccc7DD7x0y9E, "_ZN3ccc7DD7x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x0y9C1Ev();
extern void _ZN3ccc7DD7x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x0y9E[] = {
  NSPAIR(_ZN3ccc7DD7x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD7x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x0y93pqrEv();
extern void _ZN3ccc7DD7x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x0y93efgEv,_ZTv0_n16_N3ccc7DD7x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y93efgEv,_ZThn4_N3ccc7DD7x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x0y93pqrEv,_ZTv0_n20_N3ccc7DD7x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x0y93pqrEv,_ZThn4_N3ccc7DD7x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x0y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x0y93efgEv,_ZTv0_n16_N3ccc7DD7x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x0y93pqrEv,_ZTv0_n20_N3ccc7DD7x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x0y9E[] = {
  {&(_ZTVN3ccc7DD7x0y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x0y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x0y9E[];
static VTBL_ENTRY alt_thunk_names775[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x0y93pqrEv,_ZTv0_n20_N3ccc7DD7x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y93pqrEv,_ZThn4_N3ccc7DD7x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x0y93efgEv,_ZTv0_n16_N3ccc7DD7x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x0y93efgEv,_ZThn4_N3ccc7DD7x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x0y9E = {  "_ZN3ccc7DD7x0y9E", // class name
  bases__ZN3ccc7DD7x0y9E, 2,
  &(vtc__ZN3ccc7DD7x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x0y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x0y9E),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  CC7x0y10  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC7x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x0y103abcEv
  ~CC7x0y10(); // tgen
  CC7x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y10E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x0y103pqrEv");}
void  ccc::CC7x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x0y103abcEv");}
ccc::CC7x0y10 ::~CC7x0y10(){ note_dtor("_ZN3ccc8CC7x0y10E", this);} // tgen
ccc::CC7x0y10 ::CC7x0y10(){ note_ctor("_ZN3ccc8CC7x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x0y10E, buf);
    ::ccc::CC7x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x0y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC7x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x0y10E);
    dp->::ccc::CC7x0y10::~CC7x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x0y10E(Test__ZN3ccc8CC7x0y10E, "_ZN3ccc8CC7x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x0y10C1Ev();
extern void _ZN3ccc8CC7x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x0y10E[] = {
  NSPAIR(_ZN3ccc8CC7x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC7x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x0y10E[];
extern void _ZN3ccc8CC7x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC7x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x0y103abcEv,_ZTv0_n12_N3ccc8CC7x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y103abcEv,_ZThn4_N3ccc8CC7x0y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x0y103pqrEv,_ZTv0_n16_N3ccc8CC7x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y103pqrEv,_ZThn4_N3ccc8CC7x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x0y103abcEv,_ZTv0_n12_N3ccc8CC7x0y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x0y103pqrEv,_ZTv0_n16_N3ccc8CC7x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x0y10E[] = {
  {&(_ZTVN3ccc8CC7x0y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x0y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x0y10E[];
static VTBL_ENTRY alt_thunk_names776[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x0y103pqrEv,_ZTv0_n16_N3ccc8CC7x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x0y103pqrEv,_ZThn4_N3ccc8CC7x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x0y103abcEv,_ZTv0_n12_N3ccc8CC7x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x0y103abcEv,_ZThn4_N3ccc8CC7x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x0y10E = {  "_ZN3ccc8CC7x0y10E", // class name
  bases__ZN3ccc8CC7x0y10E, 2,
  &(vtc__ZN3ccc8CC7x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x0y10E),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  DD7x0y10  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD7x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x0y103abcEv
  ~DD7x0y10(); // tgen
  DD7x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x0y10E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x0y103pqrEv");}
void  ccc::DD7x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x0y103abcEv");}
ccc::DD7x0y10 ::~DD7x0y10(){ note_dtor("_ZN3ccc8DD7x0y10E", this);} // tgen
ccc::DD7x0y10 ::DD7x0y10(){ note_ctor("_ZN3ccc8DD7x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x0y10E, buf);
    ::ccc::DD7x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x0y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD7x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x0y10E);
    dp->::ccc::DD7x0y10::~DD7x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x0y10E(Test__ZN3ccc8DD7x0y10E, "_ZN3ccc8DD7x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x0y10C1Ev();
extern void _ZN3ccc8DD7x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x0y10E[] = {
  NSPAIR(_ZN3ccc8DD7x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD7x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y10E[];
extern void _ZN3ccc8DD7x0y103abcEv();
extern void _ZN3ccc8DD7x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x0y103abcEv,_ZTv0_n12_N3ccc8DD7x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y103abcEv,_ZThn4_N3ccc8DD7x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x0y103pqrEv,_ZTv0_n20_N3ccc8DD7x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y103pqrEv,_ZThn4_N3ccc8DD7x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x0y103abcEv,_ZTv0_n12_N3ccc8DD7x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x0y103pqrEv,_ZTv0_n20_N3ccc8DD7x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x0y10E[] = {
  {&(_ZTVN3ccc8DD7x0y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x0y10E[];
static VTBL_ENTRY alt_thunk_names777[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x0y103pqrEv,_ZTv0_n20_N3ccc8DD7x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y103pqrEv,_ZThn4_N3ccc8DD7x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x0y103abcEv,_ZTv0_n12_N3ccc8DD7x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y103abcEv,_ZThn4_N3ccc8DD7x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x0y10E = {  "_ZN3ccc8DD7x0y10E", // class name
  bases__ZN3ccc8DD7x0y10E, 2,
  &(vtc__ZN3ccc8DD7x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x0y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x0y10E),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  CC7x0y11  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC7x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x0y113efgEv
  ~CC7x0y11(); // tgen
  CC7x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y11E) C1{ VBC2{ v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x0y113pqrEv");}
void  ccc::CC7x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x0y113efgEv");}
ccc::CC7x0y11 ::~CC7x0y11(){ note_dtor("_ZN3ccc8CC7x0y11E", this);} // tgen
ccc::CC7x0y11 ::CC7x0y11(){ note_ctor("_ZN3ccc8CC7x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x0y11E, buf);
    ::ccc::CC7x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x0y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC7x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x0y11E);
    dp->::ccc::CC7x0y11::~CC7x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x0y11E(Test__ZN3ccc8CC7x0y11E, "_ZN3ccc8CC7x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x0y11C1Ev();
extern void _ZN3ccc8CC7x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x0y11E[] = {
  NSPAIR(_ZN3ccc8CC7x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC7x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC7x0y113efgEv();
extern void _ZN3ccc8CC7x0y113pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x0y113pqrEv,_ZTv0_n16_N3ccc8CC7x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y113pqrEv,_ZThn4_N3ccc8CC7x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x0y113pqrEv,_ZTv0_n16_N3ccc8CC7x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x0y11E[] = {
  {&(_ZTVN3ccc8CC7x0y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x0y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x0y11E[];
static VTBL_ENTRY alt_thunk_names778[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x0y113pqrEv,_ZTv0_n16_N3ccc8CC7x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x0y113pqrEv,_ZThn4_N3ccc8CC7x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x0y11E = {  "_ZN3ccc8CC7x0y11E", // class name
  bases__ZN3ccc8CC7x0y11E, 2,
  &(vtc__ZN3ccc8CC7x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x0y11E),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  DD7x0y11  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD7x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x0y113efgEv
  ~DD7x0y11(); // tgen
  DD7x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x0y11E) C1{ VBC2{ v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x0y113pqrEv");}
void  ccc::DD7x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x0y113efgEv");}
ccc::DD7x0y11 ::~DD7x0y11(){ note_dtor("_ZN3ccc8DD7x0y11E", this);} // tgen
ccc::DD7x0y11 ::DD7x0y11(){ note_ctor("_ZN3ccc8DD7x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x0y11E, buf);
    ::ccc::DD7x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x0y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD7x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x0y11E);
    dp->::ccc::DD7x0y11::~DD7x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x0y11E(Test__ZN3ccc8DD7x0y11E, "_ZN3ccc8DD7x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x0y11C1Ev();
extern void _ZN3ccc8DD7x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x0y11E[] = {
  NSPAIR(_ZN3ccc8DD7x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD7x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x0y113pqrEv();
extern void _ZN3ccc8DD7x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x0y113efgEv,_ZTv0_n16_N3ccc8DD7x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y113efgEv,_ZThn4_N3ccc8DD7x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x0y113pqrEv,_ZTv0_n20_N3ccc8DD7x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y113pqrEv,_ZThn4_N3ccc8DD7x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x0y113efgEv,_ZTv0_n16_N3ccc8DD7x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x0y113pqrEv,_ZTv0_n20_N3ccc8DD7x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x0y11E[] = {
  {&(_ZTVN3ccc8DD7x0y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x0y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x0y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x0y11E[];
static VTBL_ENTRY alt_thunk_names779[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x0y113pqrEv,_ZTv0_n20_N3ccc8DD7x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y113pqrEv,_ZThn4_N3ccc8DD7x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x0y113efgEv,_ZTv0_n16_N3ccc8DD7x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y113efgEv,_ZThn4_N3ccc8DD7x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x0y11E = {  "_ZN3ccc8DD7x0y11E", // class name
  bases__ZN3ccc8DD7x0y11E, 2,
  &(vtc__ZN3ccc8DD7x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x0y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x0y11E),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  CC7x0y12  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC7x0y123abcEv
  ~CC7x0y12(); // tgen
  CC7x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x0y123abcEv");}
ccc::CC7x0y12 ::~CC7x0y12(){ note_dtor("_ZN3ccc8CC7x0y12E", this);} // tgen
ccc::CC7x0y12 ::CC7x0y12(){ note_ctor("_ZN3ccc8CC7x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x0y12E, buf);
    ::ccc::CC7x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x0y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC7x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x0y12E);
    dp->::ccc::CC7x0y12::~CC7x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x0y12E(Test__ZN3ccc8CC7x0y12E, "_ZN3ccc8CC7x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x0y12C1Ev();
extern void _ZN3ccc8CC7x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x0y12E[] = {
  NSPAIR(_ZN3ccc8CC7x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC7x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x0y12E[];
extern void _ZN3ccc8CC7x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x0y123abcEv,_ZTv0_n12_N3ccc8CC7x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y123abcEv,_ZThn4_N3ccc8CC7x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x0y123abcEv,_ZTv0_n12_N3ccc8CC7x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x0y12E[] = {
  {&(_ZTVN3ccc8CC7x0y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x0y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x0y12E[];
static VTBL_ENTRY alt_thunk_names780[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x0y123abcEv,_ZTv0_n12_N3ccc8CC7x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x0y123abcEv,_ZThn4_N3ccc8CC7x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x0y12E = {  "_ZN3ccc8CC7x0y12E", // class name
  bases__ZN3ccc8CC7x0y12E, 2,
  &(vtc__ZN3ccc8CC7x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x0y12E),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  DD7x0y12  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD7x0y123abcEv
  ~DD7x0y12(); // tgen
  DD7x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x0y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x0y123abcEv");}
ccc::DD7x0y12 ::~DD7x0y12(){ note_dtor("_ZN3ccc8DD7x0y12E", this);} // tgen
ccc::DD7x0y12 ::DD7x0y12(){ note_ctor("_ZN3ccc8DD7x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x0y12E, buf);
    ::ccc::DD7x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x0y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD7x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x0y12E);
    dp->::ccc::DD7x0y12::~DD7x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x0y12E(Test__ZN3ccc8DD7x0y12E, "_ZN3ccc8DD7x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x0y12C1Ev();
extern void _ZN3ccc8DD7x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x0y12E[] = {
  NSPAIR(_ZN3ccc8DD7x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD7x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y12E[];
extern void _ZN3ccc8DD7x0y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x0y123abcEv,_ZTv0_n12_N3ccc8DD7x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y123abcEv,_ZThn4_N3ccc8DD7x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x0y123abcEv,_ZTv0_n12_N3ccc8DD7x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x0y12E[] = {
  {&(_ZTVN3ccc8DD7x0y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x0y12E[];
static VTBL_ENTRY alt_thunk_names781[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x0y123abcEv,_ZTv0_n12_N3ccc8DD7x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y123abcEv,_ZThn4_N3ccc8DD7x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x0y12E = {  "_ZN3ccc8DD7x0y12E", // class name
  bases__ZN3ccc8DD7x0y12E, 2,
  &(vtc__ZN3ccc8DD7x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x0y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x0y12E),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  CC7x0y13  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC7x0y133efgEv
  ~CC7x0y13(); // tgen
  CC7x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y13E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC7x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x0y133efgEv");}
ccc::CC7x0y13 ::~CC7x0y13(){ note_dtor("_ZN3ccc8CC7x0y13E", this);} // tgen
ccc::CC7x0y13 ::CC7x0y13(){ note_ctor("_ZN3ccc8CC7x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x0y13E, buf);
    ::ccc::CC7x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x0y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC7x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x0y13E);
    dp->::ccc::CC7x0y13::~CC7x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x0y13E(Test__ZN3ccc8CC7x0y13E, "_ZN3ccc8CC7x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x0y13C1Ev();
extern void _ZN3ccc8CC7x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x0y13E[] = {
  NSPAIR(_ZN3ccc8CC7x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC7x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC7x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x0y13E[] = {
  {&(_ZTVN3ccc8CC7x0y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x0y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x0y13E[];
Class_Descriptor cd__ZN3ccc8CC7x0y13E = {  "_ZN3ccc8CC7x0y13E", // class name
  bases__ZN3ccc8CC7x0y13E, 2,
  &(vtc__ZN3ccc8CC7x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x0y13E),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  DD7x0y13  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD7x0y133efgEv
  ~DD7x0y13(); // tgen
  DD7x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x0y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD7x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x0y133efgEv");}
ccc::DD7x0y13 ::~DD7x0y13(){ note_dtor("_ZN3ccc8DD7x0y13E", this);} // tgen
ccc::DD7x0y13 ::DD7x0y13(){ note_ctor("_ZN3ccc8DD7x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x0y13E, buf);
    ::ccc::DD7x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x0y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD7x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x0y13E);
    dp->::ccc::DD7x0y13::~DD7x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x0y13E(Test__ZN3ccc8DD7x0y13E, "_ZN3ccc8DD7x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x0y13C1Ev();
extern void _ZN3ccc8DD7x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x0y13E[] = {
  NSPAIR(_ZN3ccc8DD7x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD7x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x0y133efgEv,_ZTv0_n16_N3ccc8DD7x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y133efgEv,_ZThn4_N3ccc8DD7x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x0y133efgEv,_ZTv0_n16_N3ccc8DD7x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x0y13E[] = {
  {&(_ZTVN3ccc8DD7x0y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x0y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x0y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x0y13E[];
static VTBL_ENTRY alt_thunk_names782[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x0y133efgEv,_ZTv0_n16_N3ccc8DD7x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y133efgEv,_ZThn4_N3ccc8DD7x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x0y13E = {  "_ZN3ccc8DD7x0y13E", // class name
  bases__ZN3ccc8DD7x0y13E, 2,
  &(vtc__ZN3ccc8DD7x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x0y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x0y13E),3, //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  CC7x0y14  : virtual ::ccc::AA7 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC7x0y143pqrEv
  ~CC7x0y14(); // tgen
  CC7x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC7x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x0y143pqrEv");}
ccc::CC7x0y14 ::~CC7x0y14(){ note_dtor("_ZN3ccc8CC7x0y14E", this);} // tgen
ccc::CC7x0y14 ::CC7x0y14(){ note_ctor("_ZN3ccc8CC7x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x0y14E, buf);
    ::ccc::CC7x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x0y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC7x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x0y14E);
    dp->::ccc::CC7x0y14::~CC7x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x0y14E(Test__ZN3ccc8CC7x0y14E, "_ZN3ccc8CC7x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x0y14C1Ev();
extern void _ZN3ccc8CC7x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x0y14E[] = {
  NSPAIR(_ZN3ccc8CC7x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC7x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC7x0y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x0y143pqrEv,_ZTv0_n16_N3ccc8CC7x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x0y143pqrEv,_ZThn4_N3ccc8CC7x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x0y143pqrEv,_ZTv0_n16_N3ccc8CC7x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x0y14E[] = {
  {&(_ZTVN3ccc8CC7x0y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x0y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x0y14E[];
static VTBL_ENTRY alt_thunk_names783[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x0y143pqrEv,_ZTv0_n16_N3ccc8CC7x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x0y143pqrEv,_ZThn4_N3ccc8CC7x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x0y14E = {  "_ZN3ccc8CC7x0y14E", // class name
  bases__ZN3ccc8CC7x0y14E, 2,
  &(vtc__ZN3ccc8CC7x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x0y14E),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  DD7x0y14  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD7x0y143pqrEv
  ~DD7x0y14(); // tgen
  DD7x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x0y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD7x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x0y143pqrEv");}
ccc::DD7x0y14 ::~DD7x0y14(){ note_dtor("_ZN3ccc8DD7x0y14E", this);} // tgen
ccc::DD7x0y14 ::DD7x0y14(){ note_ctor("_ZN3ccc8DD7x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x0y14E, buf);
    ::ccc::DD7x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x0y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD7x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x0y14E);
    dp->::ccc::DD7x0y14::~DD7x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x0y14E(Test__ZN3ccc8DD7x0y14E, "_ZN3ccc8DD7x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x0y14C1Ev();
extern void _ZN3ccc8DD7x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x0y14E[] = {
  NSPAIR(_ZN3ccc8DD7x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD7x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x0y143pqrEv,_ZTv0_n20_N3ccc8DD7x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x0y143pqrEv,_ZThn4_N3ccc8DD7x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x0y143pqrEv,_ZTv0_n20_N3ccc8DD7x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x0y14E[] = {
  {&(_ZTVN3ccc8DD7x0y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x0y14E[];
static VTBL_ENTRY alt_thunk_names784[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x0y143pqrEv,_ZTv0_n20_N3ccc8DD7x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x0y143pqrEv,_ZThn4_N3ccc8DD7x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x0y14E = {  "_ZN3ccc8DD7x0y14E", // class name
  bases__ZN3ccc8DD7x0y14E, 2,
  &(vtc__ZN3ccc8DD7x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x0y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x0y14E),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  CC7x0y15  : virtual ::ccc::AA7 , ::ccc::BB0 {
  ~CC7x0y15(); // tgen
  CC7x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x0y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC7x0y15 ::~CC7x0y15(){ note_dtor("_ZN3ccc8CC7x0y15E", this);} // tgen
ccc::CC7x0y15 ::CC7x0y15(){ note_ctor("_ZN3ccc8CC7x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x0y15E, buf);
    ::ccc::CC7x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x0y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC7x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x0y15E);
    dp->::ccc::CC7x0y15::~CC7x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x0y15E(Test__ZN3ccc8CC7x0y15E, "_ZN3ccc8CC7x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x0y15C1Ev();
extern void _ZN3ccc8CC7x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x0y15E[] = {
  NSPAIR(_ZN3ccc8CC7x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC7x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x0y15E[] = {
  {&(_ZTVN3ccc8CC7x0y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x0y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x0y15E[];
Class_Descriptor cd__ZN3ccc8CC7x0y15E = {  "_ZN3ccc8CC7x0y15E", // class name
  bases__ZN3ccc8CC7x0y15E, 2,
  &(vtc__ZN3ccc8CC7x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x0y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x0y15E),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  DD7x0y15  : virtual ::ccc::AA7 , virtual ::ccc::BB0 {
  ~DD7x0y15(); // tgen
  DD7x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x0y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD7x0y15 ::~DD7x0y15(){ note_dtor("_ZN3ccc8DD7x0y15E", this);} // tgen
ccc::DD7x0y15 ::DD7x0y15(){ note_ctor("_ZN3ccc8DD7x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x0y15E, buf);
    ::ccc::DD7x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x0y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD7x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x0y15E);
    dp->::ccc::DD7x0y15::~DD7x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x0y15E(Test__ZN3ccc8DD7x0y15E, "_ZN3ccc8DD7x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x0y15C1Ev();
extern void _ZN3ccc8DD7x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x0y15E[] = {
  NSPAIR(_ZN3ccc8DD7x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD7x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x0y15E[] = {
  {&(_ZTVN3ccc8DD7x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x0y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x0y15E[];
Class_Descriptor cd__ZN3ccc8DD7x0y15E = {  "_ZN3ccc8DD7x0y15E", // class name
  bases__ZN3ccc8DD7x0y15E, 2,
  &(vtc__ZN3ccc8DD7x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x0y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x0y15E),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  CC7x1y0  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y03pqrEv
  ~CC7x1y0(); // tgen
  CC7x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y0E) C1{ VBC2{ v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y03abcEv");}
void  ccc::CC7x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y03efgEv");}
void  ccc::CC7x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y03pqrEv");}
ccc::CC7x1y0 ::~CC7x1y0(){ note_dtor("_ZN3ccc7CC7x1y0E", this);} // tgen
ccc::CC7x1y0 ::CC7x1y0(){ note_ctor("_ZN3ccc7CC7x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y0E, buf);
    ::ccc::CC7x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y0E);
    dp->::ccc::CC7x1y0::~CC7x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y0E(Test__ZN3ccc7CC7x1y0E, "_ZN3ccc7CC7x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y0C1Ev();
extern void _ZN3ccc7CC7x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y0E[] = {
  NSPAIR(_ZN3ccc7CC7x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y0E[];
extern void _ZN3ccc7CC7x1y03abcEv();
extern void _ZN3ccc7CC7x1y03pqrEv();
extern void _ZN3ccc7CC7x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y03abcEv,_ZTv0_n12_N3ccc7CC7x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y03abcEv,_ZThn4_N3ccc7CC7x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y03pqrEv,_ZTv0_n16_N3ccc7CC7x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y03pqrEv,_ZThn4_N3ccc7CC7x1y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y03abcEv,_ZTv0_n12_N3ccc7CC7x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y03pqrEv,_ZTv0_n16_N3ccc7CC7x1y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y0E[] = {
  {&(_ZTVN3ccc7CC7x1y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y0E[];
static VTBL_ENTRY alt_thunk_names785[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y03pqrEv,_ZTv0_n16_N3ccc7CC7x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y03pqrEv,_ZThn4_N3ccc7CC7x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y03abcEv,_ZTv0_n12_N3ccc7CC7x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y03abcEv,_ZThn4_N3ccc7CC7x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y0E = {  "_ZN3ccc7CC7x1y0E", // class name
  bases__ZN3ccc7CC7x1y0E, 2,
  &(vtc__ZN3ccc7CC7x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y0E),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  DD7x1y0  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD7x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x1y03pqrEv
  ~DD7x1y0(); // tgen
  DD7x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y0E) C1{ VBC2{ v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y03abcEv");}
void  ccc::DD7x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y03efgEv");}
void  ccc::DD7x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y03pqrEv");}
ccc::DD7x1y0 ::~DD7x1y0(){ note_dtor("_ZN3ccc7DD7x1y0E", this);} // tgen
ccc::DD7x1y0 ::DD7x1y0(){ note_ctor("_ZN3ccc7DD7x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y0E, buf);
    ::ccc::DD7x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y0E);
    dp->::ccc::DD7x1y0::~DD7x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y0E(Test__ZN3ccc7DD7x1y0E, "_ZN3ccc7DD7x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y0C1Ev();
extern void _ZN3ccc7DD7x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y0E[] = {
  NSPAIR(_ZN3ccc7DD7x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y0E[];
extern void _ZN3ccc7DD7x1y03abcEv();
extern void _ZN3ccc7DD7x1y03pqrEv();
extern void _ZN3ccc7DD7x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y03abcEv,_ZTv0_n12_N3ccc7DD7x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y03abcEv,_ZThn4_N3ccc7DD7x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y03pqrEv,_ZTv0_n16_N3ccc7DD7x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y03pqrEv,_ZThn4_N3ccc7DD7x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y03efgEv,_ZTv0_n20_N3ccc7DD7x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y03efgEv,_ZThn4_N3ccc7DD7x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y03abcEv,_ZTv0_n12_N3ccc7DD7x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y03pqrEv,_ZTv0_n16_N3ccc7DD7x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y03efgEv,_ZTv0_n20_N3ccc7DD7x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y0E[] = {
  {&(_ZTVN3ccc7DD7x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y0E[];
static VTBL_ENTRY alt_thunk_names786[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y03efgEv,_ZTv0_n20_N3ccc7DD7x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y03efgEv,_ZThn4_N3ccc7DD7x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y03pqrEv,_ZTv0_n16_N3ccc7DD7x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y03pqrEv,_ZThn4_N3ccc7DD7x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y03abcEv,_ZTv0_n12_N3ccc7DD7x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y03abcEv,_ZThn4_N3ccc7DD7x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y0E = {  "_ZN3ccc7DD7x1y0E", // class name
  bases__ZN3ccc7DD7x1y0E, 2,
  &(vtc__ZN3ccc7DD7x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y0E),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  CC7x1y1  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x1y13efgEv
  ~CC7x1y1(); // tgen
  CC7x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y1E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y13abcEv");}
void  ccc::CC7x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y13pqrEv");}
void  ccc::CC7x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y13efgEv");}
ccc::CC7x1y1 ::~CC7x1y1(){ note_dtor("_ZN3ccc7CC7x1y1E", this);} // tgen
ccc::CC7x1y1 ::CC7x1y1(){ note_ctor("_ZN3ccc7CC7x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y1E, buf);
    ::ccc::CC7x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y1E);
    dp->::ccc::CC7x1y1::~CC7x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y1E(Test__ZN3ccc7CC7x1y1E, "_ZN3ccc7CC7x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y1C1Ev();
extern void _ZN3ccc7CC7x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y1E[] = {
  NSPAIR(_ZN3ccc7CC7x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y1E[];
extern void _ZN3ccc7CC7x1y13abcEv();
extern void _ZN3ccc7CC7x1y13pqrEv();
extern void _ZN3ccc7CC7x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y13abcEv,_ZTv0_n12_N3ccc7CC7x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y13abcEv,_ZThn4_N3ccc7CC7x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y13pqrEv,_ZTv0_n16_N3ccc7CC7x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y13pqrEv,_ZThn4_N3ccc7CC7x1y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y13abcEv,_ZTv0_n12_N3ccc7CC7x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y13pqrEv,_ZTv0_n16_N3ccc7CC7x1y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y1E[] = {
  {&(_ZTVN3ccc7CC7x1y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y1E[];
static VTBL_ENTRY alt_thunk_names787[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y13pqrEv,_ZTv0_n16_N3ccc7CC7x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y13pqrEv,_ZThn4_N3ccc7CC7x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y13abcEv,_ZTv0_n12_N3ccc7CC7x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y13abcEv,_ZThn4_N3ccc7CC7x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y1E = {  "_ZN3ccc7CC7x1y1E", // class name
  bases__ZN3ccc7CC7x1y1E, 2,
  &(vtc__ZN3ccc7CC7x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y1E),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  DD7x1y1  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD7x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x1y13efgEv
  ~DD7x1y1(); // tgen
  DD7x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y1E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y13abcEv");}
void  ccc::DD7x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y13pqrEv");}
void  ccc::DD7x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y13efgEv");}
ccc::DD7x1y1 ::~DD7x1y1(){ note_dtor("_ZN3ccc7DD7x1y1E", this);} // tgen
ccc::DD7x1y1 ::DD7x1y1(){ note_ctor("_ZN3ccc7DD7x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y1E, buf);
    ::ccc::DD7x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y1E);
    dp->::ccc::DD7x1y1::~DD7x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y1E(Test__ZN3ccc7DD7x1y1E, "_ZN3ccc7DD7x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y1C1Ev();
extern void _ZN3ccc7DD7x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y1E[] = {
  NSPAIR(_ZN3ccc7DD7x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y1E[];
extern void _ZN3ccc7DD7x1y13abcEv();
extern void _ZN3ccc7DD7x1y13pqrEv();
extern void _ZN3ccc7DD7x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y13abcEv,_ZTv0_n12_N3ccc7DD7x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y13abcEv,_ZThn4_N3ccc7DD7x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y13pqrEv,_ZTv0_n16_N3ccc7DD7x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y13pqrEv,_ZThn4_N3ccc7DD7x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y13efgEv,_ZTv0_n20_N3ccc7DD7x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y13efgEv,_ZThn4_N3ccc7DD7x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y13abcEv,_ZTv0_n12_N3ccc7DD7x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y13pqrEv,_ZTv0_n16_N3ccc7DD7x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y13efgEv,_ZTv0_n20_N3ccc7DD7x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y1E[] = {
  {&(_ZTVN3ccc7DD7x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y1E[];
static VTBL_ENTRY alt_thunk_names788[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y13efgEv,_ZTv0_n20_N3ccc7DD7x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y13efgEv,_ZThn4_N3ccc7DD7x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y13pqrEv,_ZTv0_n16_N3ccc7DD7x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y13pqrEv,_ZThn4_N3ccc7DD7x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y13abcEv,_ZTv0_n12_N3ccc7DD7x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y13abcEv,_ZThn4_N3ccc7DD7x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y1E = {  "_ZN3ccc7DD7x1y1E", // class name
  bases__ZN3ccc7DD7x1y1E, 2,
  &(vtc__ZN3ccc7DD7x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y1E),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  CC7x1y2  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y23pqrEv
  ~CC7x1y2(); // tgen
  CC7x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y2E) C1{ VBC2{ v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y23efgEv");}
void  ccc::CC7x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y23abcEv");}
void  ccc::CC7x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y23pqrEv");}
ccc::CC7x1y2 ::~CC7x1y2(){ note_dtor("_ZN3ccc7CC7x1y2E", this);} // tgen
ccc::CC7x1y2 ::CC7x1y2(){ note_ctor("_ZN3ccc7CC7x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y2E, buf);
    ::ccc::CC7x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y2E);
    dp->::ccc::CC7x1y2::~CC7x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y2E(Test__ZN3ccc7CC7x1y2E, "_ZN3ccc7CC7x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y2C1Ev();
extern void _ZN3ccc7CC7x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y2E[] = {
  NSPAIR(_ZN3ccc7CC7x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y2E[];
extern void _ZN3ccc7CC7x1y23abcEv();
extern void _ZN3ccc7CC7x1y23pqrEv();
extern void _ZN3ccc7CC7x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y23abcEv,_ZTv0_n12_N3ccc7CC7x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y23abcEv,_ZThn4_N3ccc7CC7x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y23pqrEv,_ZTv0_n16_N3ccc7CC7x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y23pqrEv,_ZThn4_N3ccc7CC7x1y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y23abcEv,_ZTv0_n12_N3ccc7CC7x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y23pqrEv,_ZTv0_n16_N3ccc7CC7x1y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y2E[] = {
  {&(_ZTVN3ccc7CC7x1y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y2E[];
static VTBL_ENTRY alt_thunk_names789[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y23pqrEv,_ZTv0_n16_N3ccc7CC7x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y23pqrEv,_ZThn4_N3ccc7CC7x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y23abcEv,_ZTv0_n12_N3ccc7CC7x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y23abcEv,_ZThn4_N3ccc7CC7x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y2E = {  "_ZN3ccc7CC7x1y2E", // class name
  bases__ZN3ccc7CC7x1y2E, 2,
  &(vtc__ZN3ccc7CC7x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y2E),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  DD7x1y2  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD7x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x1y23pqrEv
  ~DD7x1y2(); // tgen
  DD7x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y2E) C1{ VBC2{ v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y23efgEv");}
void  ccc::DD7x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y23abcEv");}
void  ccc::DD7x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y23pqrEv");}
ccc::DD7x1y2 ::~DD7x1y2(){ note_dtor("_ZN3ccc7DD7x1y2E", this);} // tgen
ccc::DD7x1y2 ::DD7x1y2(){ note_ctor("_ZN3ccc7DD7x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y2E, buf);
    ::ccc::DD7x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y2E);
    dp->::ccc::DD7x1y2::~DD7x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y2E(Test__ZN3ccc7DD7x1y2E, "_ZN3ccc7DD7x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y2C1Ev();
extern void _ZN3ccc7DD7x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y2E[] = {
  NSPAIR(_ZN3ccc7DD7x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y2E[];
extern void _ZN3ccc7DD7x1y23abcEv();
extern void _ZN3ccc7DD7x1y23pqrEv();
extern void _ZN3ccc7DD7x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y23abcEv,_ZTv0_n12_N3ccc7DD7x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y23abcEv,_ZThn4_N3ccc7DD7x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y23pqrEv,_ZTv0_n16_N3ccc7DD7x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y23pqrEv,_ZThn4_N3ccc7DD7x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y23efgEv,_ZTv0_n20_N3ccc7DD7x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y23efgEv,_ZThn4_N3ccc7DD7x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y23abcEv,_ZTv0_n12_N3ccc7DD7x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y23pqrEv,_ZTv0_n16_N3ccc7DD7x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y23efgEv,_ZTv0_n20_N3ccc7DD7x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y2E[] = {
  {&(_ZTVN3ccc7DD7x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y2E[];
static VTBL_ENTRY alt_thunk_names790[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y23efgEv,_ZTv0_n20_N3ccc7DD7x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y23efgEv,_ZThn4_N3ccc7DD7x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y23pqrEv,_ZTv0_n16_N3ccc7DD7x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y23pqrEv,_ZThn4_N3ccc7DD7x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y23abcEv,_ZTv0_n12_N3ccc7DD7x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y23abcEv,_ZThn4_N3ccc7DD7x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y2E = {  "_ZN3ccc7DD7x1y2E", // class name
  bases__ZN3ccc7DD7x1y2E, 2,
  &(vtc__ZN3ccc7DD7x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y2E),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  CC7x1y3  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x1y33abcEv
  ~CC7x1y3(); // tgen
  CC7x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y3E) C1{ VBC2{ v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y33efgEv");}
void  ccc::CC7x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y33pqrEv");}
void  ccc::CC7x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y33abcEv");}
ccc::CC7x1y3 ::~CC7x1y3(){ note_dtor("_ZN3ccc7CC7x1y3E", this);} // tgen
ccc::CC7x1y3 ::CC7x1y3(){ note_ctor("_ZN3ccc7CC7x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y3E, buf);
    ::ccc::CC7x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y3E);
    dp->::ccc::CC7x1y3::~CC7x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y3E(Test__ZN3ccc7CC7x1y3E, "_ZN3ccc7CC7x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y3C1Ev();
extern void _ZN3ccc7CC7x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y3E[] = {
  NSPAIR(_ZN3ccc7CC7x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y3E[];
extern void _ZN3ccc7CC7x1y33abcEv();
extern void _ZN3ccc7CC7x1y33pqrEv();
extern void _ZN3ccc7CC7x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y33abcEv,_ZTv0_n12_N3ccc7CC7x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y33abcEv,_ZThn4_N3ccc7CC7x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y33pqrEv,_ZTv0_n16_N3ccc7CC7x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y33pqrEv,_ZThn4_N3ccc7CC7x1y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y33abcEv,_ZTv0_n12_N3ccc7CC7x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y33pqrEv,_ZTv0_n16_N3ccc7CC7x1y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y3E[] = {
  {&(_ZTVN3ccc7CC7x1y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y3E[];
static VTBL_ENTRY alt_thunk_names791[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y33pqrEv,_ZTv0_n16_N3ccc7CC7x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y33pqrEv,_ZThn4_N3ccc7CC7x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y33abcEv,_ZTv0_n12_N3ccc7CC7x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y33abcEv,_ZThn4_N3ccc7CC7x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y3E = {  "_ZN3ccc7CC7x1y3E", // class name
  bases__ZN3ccc7CC7x1y3E, 2,
  &(vtc__ZN3ccc7CC7x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y3E),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  DD7x1y3  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD7x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x1y33abcEv
  ~DD7x1y3(); // tgen
  DD7x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y3E) C1{ VBC2{ v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y33efgEv");}
void  ccc::DD7x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y33pqrEv");}
void  ccc::DD7x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y33abcEv");}
ccc::DD7x1y3 ::~DD7x1y3(){ note_dtor("_ZN3ccc7DD7x1y3E", this);} // tgen
ccc::DD7x1y3 ::DD7x1y3(){ note_ctor("_ZN3ccc7DD7x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y3E, buf);
    ::ccc::DD7x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y3E);
    dp->::ccc::DD7x1y3::~DD7x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y3E(Test__ZN3ccc7DD7x1y3E, "_ZN3ccc7DD7x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y3C1Ev();
extern void _ZN3ccc7DD7x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y3E[] = {
  NSPAIR(_ZN3ccc7DD7x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y3E[];
extern void _ZN3ccc7DD7x1y33abcEv();
extern void _ZN3ccc7DD7x1y33pqrEv();
extern void _ZN3ccc7DD7x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y33abcEv,_ZTv0_n12_N3ccc7DD7x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y33abcEv,_ZThn4_N3ccc7DD7x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y33pqrEv,_ZTv0_n16_N3ccc7DD7x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y33pqrEv,_ZThn4_N3ccc7DD7x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y33efgEv,_ZTv0_n20_N3ccc7DD7x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y33efgEv,_ZThn4_N3ccc7DD7x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y33abcEv,_ZTv0_n12_N3ccc7DD7x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y33pqrEv,_ZTv0_n16_N3ccc7DD7x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y33efgEv,_ZTv0_n20_N3ccc7DD7x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y3E[] = {
  {&(_ZTVN3ccc7DD7x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y3E[];
static VTBL_ENTRY alt_thunk_names792[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y33efgEv,_ZTv0_n20_N3ccc7DD7x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y33efgEv,_ZThn4_N3ccc7DD7x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y33pqrEv,_ZTv0_n16_N3ccc7DD7x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y33pqrEv,_ZThn4_N3ccc7DD7x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y33abcEv,_ZTv0_n12_N3ccc7DD7x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y33abcEv,_ZThn4_N3ccc7DD7x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y3E = {  "_ZN3ccc7DD7x1y3E", // class name
  bases__ZN3ccc7DD7x1y3E, 2,
  &(vtc__ZN3ccc7DD7x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y3E),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  CC7x1y4  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC7x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x1y43efgEv
  ~CC7x1y4(); // tgen
  CC7x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y4E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y43pqrEv");}
void  ccc::CC7x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y43abcEv");}
void  ccc::CC7x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y43efgEv");}
ccc::CC7x1y4 ::~CC7x1y4(){ note_dtor("_ZN3ccc7CC7x1y4E", this);} // tgen
ccc::CC7x1y4 ::CC7x1y4(){ note_ctor("_ZN3ccc7CC7x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y4E, buf);
    ::ccc::CC7x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y4E);
    dp->::ccc::CC7x1y4::~CC7x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y4E(Test__ZN3ccc7CC7x1y4E, "_ZN3ccc7CC7x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y4C1Ev();
extern void _ZN3ccc7CC7x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y4E[] = {
  NSPAIR(_ZN3ccc7CC7x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y4E[];
extern void _ZN3ccc7CC7x1y43abcEv();
extern void _ZN3ccc7CC7x1y43pqrEv();
extern void _ZN3ccc7CC7x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y43abcEv,_ZTv0_n12_N3ccc7CC7x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y43abcEv,_ZThn4_N3ccc7CC7x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y43pqrEv,_ZTv0_n16_N3ccc7CC7x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y43pqrEv,_ZThn4_N3ccc7CC7x1y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y43abcEv,_ZTv0_n12_N3ccc7CC7x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y43pqrEv,_ZTv0_n16_N3ccc7CC7x1y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y4E[] = {
  {&(_ZTVN3ccc7CC7x1y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y4E[];
static VTBL_ENTRY alt_thunk_names793[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y43pqrEv,_ZTv0_n16_N3ccc7CC7x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y43pqrEv,_ZThn4_N3ccc7CC7x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y43abcEv,_ZTv0_n12_N3ccc7CC7x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y43abcEv,_ZThn4_N3ccc7CC7x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y4E = {  "_ZN3ccc7CC7x1y4E", // class name
  bases__ZN3ccc7CC7x1y4E, 2,
  &(vtc__ZN3ccc7CC7x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y4E),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  DD7x1y4  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD7x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x1y43efgEv
  ~DD7x1y4(); // tgen
  DD7x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y4E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y43pqrEv");}
void  ccc::DD7x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y43abcEv");}
void  ccc::DD7x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y43efgEv");}
ccc::DD7x1y4 ::~DD7x1y4(){ note_dtor("_ZN3ccc7DD7x1y4E", this);} // tgen
ccc::DD7x1y4 ::DD7x1y4(){ note_ctor("_ZN3ccc7DD7x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y4E, buf);
    ::ccc::DD7x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y4E);
    dp->::ccc::DD7x1y4::~DD7x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y4E(Test__ZN3ccc7DD7x1y4E, "_ZN3ccc7DD7x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y4C1Ev();
extern void _ZN3ccc7DD7x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y4E[] = {
  NSPAIR(_ZN3ccc7DD7x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y4E[];
extern void _ZN3ccc7DD7x1y43abcEv();
extern void _ZN3ccc7DD7x1y43pqrEv();
extern void _ZN3ccc7DD7x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y43abcEv,_ZTv0_n12_N3ccc7DD7x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y43abcEv,_ZThn4_N3ccc7DD7x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y43pqrEv,_ZTv0_n16_N3ccc7DD7x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y43pqrEv,_ZThn4_N3ccc7DD7x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y43efgEv,_ZTv0_n20_N3ccc7DD7x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y43efgEv,_ZThn4_N3ccc7DD7x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y43abcEv,_ZTv0_n12_N3ccc7DD7x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y43pqrEv,_ZTv0_n16_N3ccc7DD7x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y43efgEv,_ZTv0_n20_N3ccc7DD7x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y4E[] = {
  {&(_ZTVN3ccc7DD7x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y4E[];
static VTBL_ENTRY alt_thunk_names794[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y43efgEv,_ZTv0_n20_N3ccc7DD7x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y43efgEv,_ZThn4_N3ccc7DD7x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y43pqrEv,_ZTv0_n16_N3ccc7DD7x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y43pqrEv,_ZThn4_N3ccc7DD7x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y43abcEv,_ZTv0_n12_N3ccc7DD7x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y43abcEv,_ZThn4_N3ccc7DD7x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y4E = {  "_ZN3ccc7DD7x1y4E", // class name
  bases__ZN3ccc7DD7x1y4E, 2,
  &(vtc__ZN3ccc7DD7x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y4E),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  CC7x1y5  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC7x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x1y53abcEv
  ~CC7x1y5(); // tgen
  CC7x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y5E) C1{ VBC2{ v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y53pqrEv");}
void  ccc::CC7x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y53efgEv");}
void  ccc::CC7x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y53abcEv");}
ccc::CC7x1y5 ::~CC7x1y5(){ note_dtor("_ZN3ccc7CC7x1y5E", this);} // tgen
ccc::CC7x1y5 ::CC7x1y5(){ note_ctor("_ZN3ccc7CC7x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y5E, buf);
    ::ccc::CC7x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y5E);
    dp->::ccc::CC7x1y5::~CC7x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y5E(Test__ZN3ccc7CC7x1y5E, "_ZN3ccc7CC7x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y5C1Ev();
extern void _ZN3ccc7CC7x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y5E[] = {
  NSPAIR(_ZN3ccc7CC7x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y5E[];
extern void _ZN3ccc7CC7x1y53abcEv();
extern void _ZN3ccc7CC7x1y53pqrEv();
extern void _ZN3ccc7CC7x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y53abcEv,_ZTv0_n12_N3ccc7CC7x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y53abcEv,_ZThn4_N3ccc7CC7x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y53pqrEv,_ZTv0_n16_N3ccc7CC7x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y53pqrEv,_ZThn4_N3ccc7CC7x1y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y53abcEv,_ZTv0_n12_N3ccc7CC7x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y53pqrEv,_ZTv0_n16_N3ccc7CC7x1y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y5E[] = {
  {&(_ZTVN3ccc7CC7x1y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y5E[];
static VTBL_ENTRY alt_thunk_names795[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y53pqrEv,_ZTv0_n16_N3ccc7CC7x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y53pqrEv,_ZThn4_N3ccc7CC7x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y53abcEv,_ZTv0_n12_N3ccc7CC7x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y53abcEv,_ZThn4_N3ccc7CC7x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y5E = {  "_ZN3ccc7CC7x1y5E", // class name
  bases__ZN3ccc7CC7x1y5E, 2,
  &(vtc__ZN3ccc7CC7x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y5E),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  DD7x1y5  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD7x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x1y53abcEv
  ~DD7x1y5(); // tgen
  DD7x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y5E) C1{ VBC2{ v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y53pqrEv");}
void  ccc::DD7x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y53efgEv");}
void  ccc::DD7x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y53abcEv");}
ccc::DD7x1y5 ::~DD7x1y5(){ note_dtor("_ZN3ccc7DD7x1y5E", this);} // tgen
ccc::DD7x1y5 ::DD7x1y5(){ note_ctor("_ZN3ccc7DD7x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y5E, buf);
    ::ccc::DD7x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y5E);
    dp->::ccc::DD7x1y5::~DD7x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y5E(Test__ZN3ccc7DD7x1y5E, "_ZN3ccc7DD7x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y5C1Ev();
extern void _ZN3ccc7DD7x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y5E[] = {
  NSPAIR(_ZN3ccc7DD7x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y5E[];
extern void _ZN3ccc7DD7x1y53abcEv();
extern void _ZN3ccc7DD7x1y53pqrEv();
extern void _ZN3ccc7DD7x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y53abcEv,_ZTv0_n12_N3ccc7DD7x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y53abcEv,_ZThn4_N3ccc7DD7x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y53pqrEv,_ZTv0_n16_N3ccc7DD7x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y53pqrEv,_ZThn4_N3ccc7DD7x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y53efgEv,_ZTv0_n20_N3ccc7DD7x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y53efgEv,_ZThn4_N3ccc7DD7x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y53abcEv,_ZTv0_n12_N3ccc7DD7x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y53pqrEv,_ZTv0_n16_N3ccc7DD7x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y53efgEv,_ZTv0_n20_N3ccc7DD7x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y5E[] = {
  {&(_ZTVN3ccc7DD7x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y5E[];
static VTBL_ENTRY alt_thunk_names796[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y53efgEv,_ZTv0_n20_N3ccc7DD7x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y53efgEv,_ZThn4_N3ccc7DD7x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y53pqrEv,_ZTv0_n16_N3ccc7DD7x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y53pqrEv,_ZThn4_N3ccc7DD7x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y53abcEv,_ZTv0_n12_N3ccc7DD7x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y53abcEv,_ZThn4_N3ccc7DD7x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y5E = {  "_ZN3ccc7DD7x1y5E", // class name
  bases__ZN3ccc7DD7x1y5E, 2,
  &(vtc__ZN3ccc7DD7x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y5E),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  CC7x1y6  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x1y63efgEv
  ~CC7x1y6(); // tgen
  CC7x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y6E) C1{ VBC2{ v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y63abcEv");}
void  ccc::CC7x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y63efgEv");}
ccc::CC7x1y6 ::~CC7x1y6(){ note_dtor("_ZN3ccc7CC7x1y6E", this);} // tgen
ccc::CC7x1y6 ::CC7x1y6(){ note_ctor("_ZN3ccc7CC7x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y6E, buf);
    ::ccc::CC7x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y6E);
    dp->::ccc::CC7x1y6::~CC7x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y6E(Test__ZN3ccc7CC7x1y6E, "_ZN3ccc7CC7x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y6C1Ev();
extern void _ZN3ccc7CC7x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y6E[] = {
  NSPAIR(_ZN3ccc7CC7x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y6E[];
extern void _ZN3ccc7CC7x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC7x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y63abcEv,_ZTv0_n12_N3ccc7CC7x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y63abcEv,_ZThn4_N3ccc7CC7x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y63abcEv,_ZTv0_n12_N3ccc7CC7x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y6E[] = {
  {&(_ZTVN3ccc7CC7x1y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y6E[];
static VTBL_ENTRY alt_thunk_names797[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y63abcEv,_ZTv0_n12_N3ccc7CC7x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y63abcEv,_ZThn4_N3ccc7CC7x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y6E = {  "_ZN3ccc7CC7x1y6E", // class name
  bases__ZN3ccc7CC7x1y6E, 2,
  &(vtc__ZN3ccc7CC7x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y6E),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  DD7x1y6  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD7x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x1y63efgEv
  ~DD7x1y6(); // tgen
  DD7x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y6E) C1{ VBC2{ v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y63abcEv");}
void  ccc::DD7x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y63efgEv");}
ccc::DD7x1y6 ::~DD7x1y6(){ note_dtor("_ZN3ccc7DD7x1y6E", this);} // tgen
ccc::DD7x1y6 ::DD7x1y6(){ note_ctor("_ZN3ccc7DD7x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y6E, buf);
    ::ccc::DD7x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y6E);
    dp->::ccc::DD7x1y6::~DD7x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y6E(Test__ZN3ccc7DD7x1y6E, "_ZN3ccc7DD7x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y6C1Ev();
extern void _ZN3ccc7DD7x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y6E[] = {
  NSPAIR(_ZN3ccc7DD7x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y6E[];
extern void _ZN3ccc7DD7x1y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y63abcEv,_ZTv0_n12_N3ccc7DD7x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y63abcEv,_ZThn4_N3ccc7DD7x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y63efgEv,_ZTv0_n20_N3ccc7DD7x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y63efgEv,_ZThn4_N3ccc7DD7x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y63abcEv,_ZTv0_n12_N3ccc7DD7x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y63efgEv,_ZTv0_n20_N3ccc7DD7x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y6E[] = {
  {&(_ZTVN3ccc7DD7x1y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y6E[];
static VTBL_ENTRY alt_thunk_names798[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y63efgEv,_ZTv0_n20_N3ccc7DD7x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y63efgEv,_ZThn4_N3ccc7DD7x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y63abcEv,_ZTv0_n12_N3ccc7DD7x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y63abcEv,_ZThn4_N3ccc7DD7x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y6E = {  "_ZN3ccc7DD7x1y6E", // class name
  bases__ZN3ccc7DD7x1y6E, 2,
  &(vtc__ZN3ccc7DD7x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y6E),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  CC7x1y7  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC7x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y73pqrEv
  ~CC7x1y7(); // tgen
  CC7x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y7E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y73abcEv");}
void  ccc::CC7x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y73pqrEv");}
ccc::CC7x1y7 ::~CC7x1y7(){ note_dtor("_ZN3ccc7CC7x1y7E", this);} // tgen
ccc::CC7x1y7 ::CC7x1y7(){ note_ctor("_ZN3ccc7CC7x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y7E, buf);
    ::ccc::CC7x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y7E);
    dp->::ccc::CC7x1y7::~CC7x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y7E(Test__ZN3ccc7CC7x1y7E, "_ZN3ccc7CC7x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y7C1Ev();
extern void _ZN3ccc7CC7x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y7E[] = {
  NSPAIR(_ZN3ccc7CC7x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y7E[];
extern void _ZN3ccc7CC7x1y73abcEv();
extern void _ZN3ccc7CC7x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y73abcEv,_ZTv0_n12_N3ccc7CC7x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y73abcEv,_ZThn4_N3ccc7CC7x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y73pqrEv,_ZTv0_n16_N3ccc7CC7x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y73pqrEv,_ZThn4_N3ccc7CC7x1y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y73abcEv,_ZTv0_n12_N3ccc7CC7x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y73pqrEv,_ZTv0_n16_N3ccc7CC7x1y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y7E[] = {
  {&(_ZTVN3ccc7CC7x1y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y7E[];
static VTBL_ENTRY alt_thunk_names799[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y73pqrEv,_ZTv0_n16_N3ccc7CC7x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y73pqrEv,_ZThn4_N3ccc7CC7x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y73abcEv,_ZTv0_n12_N3ccc7CC7x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y73abcEv,_ZThn4_N3ccc7CC7x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y7E = {  "_ZN3ccc7CC7x1y7E", // class name
  bases__ZN3ccc7CC7x1y7E, 2,
  &(vtc__ZN3ccc7CC7x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y7E),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  DD7x1y7  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD7x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x1y73pqrEv
  ~DD7x1y7(); // tgen
  DD7x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y7E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y73abcEv");}
void  ccc::DD7x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y73pqrEv");}
ccc::DD7x1y7 ::~DD7x1y7(){ note_dtor("_ZN3ccc7DD7x1y7E", this);} // tgen
ccc::DD7x1y7 ::DD7x1y7(){ note_ctor("_ZN3ccc7DD7x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y7E, buf);
    ::ccc::DD7x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y7E);
    dp->::ccc::DD7x1y7::~DD7x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y7E(Test__ZN3ccc7DD7x1y7E, "_ZN3ccc7DD7x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y7C1Ev();
extern void _ZN3ccc7DD7x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y7E[] = {
  NSPAIR(_ZN3ccc7DD7x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y7E[];
extern void _ZN3ccc7DD7x1y73abcEv();
extern void _ZN3ccc7DD7x1y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y73abcEv,_ZTv0_n12_N3ccc7DD7x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y73abcEv,_ZThn4_N3ccc7DD7x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y73pqrEv,_ZTv0_n16_N3ccc7DD7x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y73pqrEv,_ZThn4_N3ccc7DD7x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y73abcEv,_ZTv0_n12_N3ccc7DD7x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y73pqrEv,_ZTv0_n16_N3ccc7DD7x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y7E[] = {
  {&(_ZTVN3ccc7DD7x1y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x1y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x1y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y7E[];
static VTBL_ENTRY alt_thunk_names800[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y73pqrEv,_ZTv0_n16_N3ccc7DD7x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y73pqrEv,_ZThn4_N3ccc7DD7x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y73abcEv,_ZTv0_n12_N3ccc7DD7x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y73abcEv,_ZThn4_N3ccc7DD7x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y7E = {  "_ZN3ccc7DD7x1y7E", // class name
  bases__ZN3ccc7DD7x1y7E, 2,
  &(vtc__ZN3ccc7DD7x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y7E),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  CC7x1y8  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x1y83abcEv
  ~CC7x1y8(); // tgen
  CC7x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y8E) C1{ VBC2{ v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y83efgEv");}
void  ccc::CC7x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x1y83abcEv");}
ccc::CC7x1y8 ::~CC7x1y8(){ note_dtor("_ZN3ccc7CC7x1y8E", this);} // tgen
ccc::CC7x1y8 ::CC7x1y8(){ note_ctor("_ZN3ccc7CC7x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y8E, buf);
    ::ccc::CC7x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y8E);
    dp->::ccc::CC7x1y8::~CC7x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y8E(Test__ZN3ccc7CC7x1y8E, "_ZN3ccc7CC7x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y8C1Ev();
extern void _ZN3ccc7CC7x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y8E[] = {
  NSPAIR(_ZN3ccc7CC7x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y8E[];
extern void _ZN3ccc7CC7x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC7x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x1y83abcEv,_ZTv0_n12_N3ccc7CC7x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y83abcEv,_ZThn4_N3ccc7CC7x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x1y83abcEv,_ZTv0_n12_N3ccc7CC7x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y8E[] = {
  {&(_ZTVN3ccc7CC7x1y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y8E[];
static VTBL_ENTRY alt_thunk_names801[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x1y83abcEv,_ZTv0_n12_N3ccc7CC7x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y83abcEv,_ZThn4_N3ccc7CC7x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y8E = {  "_ZN3ccc7CC7x1y8E", // class name
  bases__ZN3ccc7CC7x1y8E, 2,
  &(vtc__ZN3ccc7CC7x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y8E),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  DD7x1y8  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD7x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x1y83abcEv
  ~DD7x1y8(); // tgen
  DD7x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y8E) C1{ VBC2{ v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y83efgEv");}
void  ccc::DD7x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x1y83abcEv");}
ccc::DD7x1y8 ::~DD7x1y8(){ note_dtor("_ZN3ccc7DD7x1y8E", this);} // tgen
ccc::DD7x1y8 ::DD7x1y8(){ note_ctor("_ZN3ccc7DD7x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y8E, buf);
    ::ccc::DD7x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y8E);
    dp->::ccc::DD7x1y8::~DD7x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y8E(Test__ZN3ccc7DD7x1y8E, "_ZN3ccc7DD7x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y8C1Ev();
extern void _ZN3ccc7DD7x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y8E[] = {
  NSPAIR(_ZN3ccc7DD7x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y8E[];
extern void _ZN3ccc7DD7x1y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x1y83abcEv,_ZTv0_n12_N3ccc7DD7x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y83abcEv,_ZThn4_N3ccc7DD7x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y83efgEv,_ZTv0_n20_N3ccc7DD7x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y83efgEv,_ZThn4_N3ccc7DD7x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x1y83abcEv,_ZTv0_n12_N3ccc7DD7x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y83efgEv,_ZTv0_n20_N3ccc7DD7x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y8E[] = {
  {&(_ZTVN3ccc7DD7x1y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y8E[];
static VTBL_ENTRY alt_thunk_names802[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y83efgEv,_ZTv0_n20_N3ccc7DD7x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y83efgEv,_ZThn4_N3ccc7DD7x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x1y83abcEv,_ZTv0_n12_N3ccc7DD7x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y83abcEv,_ZThn4_N3ccc7DD7x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y8E = {  "_ZN3ccc7DD7x1y8E", // class name
  bases__ZN3ccc7DD7x1y8E, 2,
  &(vtc__ZN3ccc7DD7x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y8E),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  CC7x1y9  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC7x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x1y93pqrEv
  ~CC7x1y9(); // tgen
  CC7x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x1y9E) C1{ VBC2{ v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x1y93efgEv");}
void  ccc::CC7x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x1y93pqrEv");}
ccc::CC7x1y9 ::~CC7x1y9(){ note_dtor("_ZN3ccc7CC7x1y9E", this);} // tgen
ccc::CC7x1y9 ::CC7x1y9(){ note_ctor("_ZN3ccc7CC7x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x1y9E, buf);
    ::ccc::CC7x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x1y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC7x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x1y9E);
    dp->::ccc::CC7x1y9::~CC7x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x1y9E(Test__ZN3ccc7CC7x1y9E, "_ZN3ccc7CC7x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x1y9C1Ev();
extern void _ZN3ccc7CC7x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x1y9E[] = {
  NSPAIR(_ZN3ccc7CC7x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC7x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC7x1y93pqrEv();
extern void _ZN3ccc7CC7x1y93efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x1y93pqrEv,_ZTv0_n16_N3ccc7CC7x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x1y93pqrEv,_ZThn4_N3ccc7CC7x1y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x1y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x1y93pqrEv,_ZTv0_n16_N3ccc7CC7x1y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x1y9E[] = {
  {&(_ZTVN3ccc7CC7x1y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x1y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x1y9E[];
static VTBL_ENTRY alt_thunk_names803[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x1y93pqrEv,_ZTv0_n16_N3ccc7CC7x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x1y93pqrEv,_ZThn4_N3ccc7CC7x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x1y9E = {  "_ZN3ccc7CC7x1y9E", // class name
  bases__ZN3ccc7CC7x1y9E, 2,
  &(vtc__ZN3ccc7CC7x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x1y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x1y9E),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  DD7x1y9  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD7x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x1y93pqrEv
  ~DD7x1y9(); // tgen
  DD7x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x1y9E) C1{ VBC2{ v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x1y93efgEv");}
void  ccc::DD7x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x1y93pqrEv");}
ccc::DD7x1y9 ::~DD7x1y9(){ note_dtor("_ZN3ccc7DD7x1y9E", this);} // tgen
ccc::DD7x1y9 ::DD7x1y9(){ note_ctor("_ZN3ccc7DD7x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x1y9E, buf);
    ::ccc::DD7x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x1y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD7x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x1y9E);
    dp->::ccc::DD7x1y9::~DD7x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x1y9E(Test__ZN3ccc7DD7x1y9E, "_ZN3ccc7DD7x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x1y9C1Ev();
extern void _ZN3ccc7DD7x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x1y9E[] = {
  NSPAIR(_ZN3ccc7DD7x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD7x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x1y93pqrEv();
extern void _ZN3ccc7DD7x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x1y93pqrEv,_ZTv0_n16_N3ccc7DD7x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y93pqrEv,_ZThn4_N3ccc7DD7x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x1y93efgEv,_ZTv0_n20_N3ccc7DD7x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x1y93efgEv,_ZThn4_N3ccc7DD7x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x1y93pqrEv,_ZTv0_n16_N3ccc7DD7x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x1y93efgEv,_ZTv0_n20_N3ccc7DD7x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x1y9E[] = {
  {&(_ZTVN3ccc7DD7x1y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x1y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x1y9E[];
static VTBL_ENTRY alt_thunk_names804[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x1y93efgEv,_ZTv0_n20_N3ccc7DD7x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y93efgEv,_ZThn4_N3ccc7DD7x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x1y93pqrEv,_ZTv0_n16_N3ccc7DD7x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x1y93pqrEv,_ZThn4_N3ccc7DD7x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x1y9E = {  "_ZN3ccc7DD7x1y9E", // class name
  bases__ZN3ccc7DD7x1y9E, 2,
  &(vtc__ZN3ccc7DD7x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x1y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x1y9E),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  CC7x1y10  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC7x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x1y103abcEv
  ~CC7x1y10(); // tgen
  CC7x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y10E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x1y103pqrEv");}
void  ccc::CC7x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x1y103abcEv");}
ccc::CC7x1y10 ::~CC7x1y10(){ note_dtor("_ZN3ccc8CC7x1y10E", this);} // tgen
ccc::CC7x1y10 ::CC7x1y10(){ note_ctor("_ZN3ccc8CC7x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x1y10E, buf);
    ::ccc::CC7x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x1y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC7x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x1y10E);
    dp->::ccc::CC7x1y10::~CC7x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x1y10E(Test__ZN3ccc8CC7x1y10E, "_ZN3ccc8CC7x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x1y10C1Ev();
extern void _ZN3ccc8CC7x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x1y10E[] = {
  NSPAIR(_ZN3ccc8CC7x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC7x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x1y10E[];
extern void _ZN3ccc8CC7x1y103abcEv();
extern void _ZN3ccc8CC7x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x1y103abcEv,_ZTv0_n12_N3ccc8CC7x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y103abcEv,_ZThn4_N3ccc8CC7x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x1y103pqrEv,_ZTv0_n16_N3ccc8CC7x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y103pqrEv,_ZThn4_N3ccc8CC7x1y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x1y103abcEv,_ZTv0_n12_N3ccc8CC7x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x1y103pqrEv,_ZTv0_n16_N3ccc8CC7x1y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x1y10E[] = {
  {&(_ZTVN3ccc8CC7x1y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x1y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x1y10E[];
static VTBL_ENTRY alt_thunk_names805[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x1y103pqrEv,_ZTv0_n16_N3ccc8CC7x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x1y103pqrEv,_ZThn4_N3ccc8CC7x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x1y103abcEv,_ZTv0_n12_N3ccc8CC7x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x1y103abcEv,_ZThn4_N3ccc8CC7x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x1y10E = {  "_ZN3ccc8CC7x1y10E", // class name
  bases__ZN3ccc8CC7x1y10E, 2,
  &(vtc__ZN3ccc8CC7x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x1y10E),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  DD7x1y10  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD7x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x1y103abcEv
  ~DD7x1y10(); // tgen
  DD7x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x1y10E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x1y103pqrEv");}
void  ccc::DD7x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x1y103abcEv");}
ccc::DD7x1y10 ::~DD7x1y10(){ note_dtor("_ZN3ccc8DD7x1y10E", this);} // tgen
ccc::DD7x1y10 ::DD7x1y10(){ note_ctor("_ZN3ccc8DD7x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x1y10E, buf);
    ::ccc::DD7x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x1y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD7x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x1y10E);
    dp->::ccc::DD7x1y10::~DD7x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x1y10E(Test__ZN3ccc8DD7x1y10E, "_ZN3ccc8DD7x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x1y10C1Ev();
extern void _ZN3ccc8DD7x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x1y10E[] = {
  NSPAIR(_ZN3ccc8DD7x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD7x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y10E[];
extern void _ZN3ccc8DD7x1y103abcEv();
extern void _ZN3ccc8DD7x1y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x1y103abcEv,_ZTv0_n12_N3ccc8DD7x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y103abcEv,_ZThn4_N3ccc8DD7x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x1y103pqrEv,_ZTv0_n16_N3ccc8DD7x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y103pqrEv,_ZThn4_N3ccc8DD7x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x1y103abcEv,_ZTv0_n12_N3ccc8DD7x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x1y103pqrEv,_ZTv0_n16_N3ccc8DD7x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x1y10E[] = {
  {&(_ZTVN3ccc8DD7x1y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x1y10E[];
static VTBL_ENTRY alt_thunk_names806[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x1y103pqrEv,_ZTv0_n16_N3ccc8DD7x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y103pqrEv,_ZThn4_N3ccc8DD7x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x1y103abcEv,_ZTv0_n12_N3ccc8DD7x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y103abcEv,_ZThn4_N3ccc8DD7x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x1y10E = {  "_ZN3ccc8DD7x1y10E", // class name
  bases__ZN3ccc8DD7x1y10E, 2,
  &(vtc__ZN3ccc8DD7x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x1y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x1y10E),3, //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  CC7x1y11  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC7x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x1y113efgEv
  ~CC7x1y11(); // tgen
  CC7x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y11E) C1{ VBC2{ v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x1y113pqrEv");}
void  ccc::CC7x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x1y113efgEv");}
ccc::CC7x1y11 ::~CC7x1y11(){ note_dtor("_ZN3ccc8CC7x1y11E", this);} // tgen
ccc::CC7x1y11 ::CC7x1y11(){ note_ctor("_ZN3ccc8CC7x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x1y11E, buf);
    ::ccc::CC7x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x1y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC7x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x1y11E);
    dp->::ccc::CC7x1y11::~CC7x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x1y11E(Test__ZN3ccc8CC7x1y11E, "_ZN3ccc8CC7x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x1y11C1Ev();
extern void _ZN3ccc8CC7x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x1y11E[] = {
  NSPAIR(_ZN3ccc8CC7x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC7x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC7x1y113pqrEv();
extern void _ZN3ccc8CC7x1y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x1y113pqrEv,_ZTv0_n16_N3ccc8CC7x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y113pqrEv,_ZThn4_N3ccc8CC7x1y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x1y113pqrEv,_ZTv0_n16_N3ccc8CC7x1y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x1y11E[] = {
  {&(_ZTVN3ccc8CC7x1y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x1y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x1y11E[];
static VTBL_ENTRY alt_thunk_names807[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x1y113pqrEv,_ZTv0_n16_N3ccc8CC7x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x1y113pqrEv,_ZThn4_N3ccc8CC7x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x1y11E = {  "_ZN3ccc8CC7x1y11E", // class name
  bases__ZN3ccc8CC7x1y11E, 2,
  &(vtc__ZN3ccc8CC7x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x1y11E),2, //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  DD7x1y11  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD7x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x1y113efgEv
  ~DD7x1y11(); // tgen
  DD7x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x1y11E) C1{ VBC2{ v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x1y113pqrEv");}
void  ccc::DD7x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x1y113efgEv");}
ccc::DD7x1y11 ::~DD7x1y11(){ note_dtor("_ZN3ccc8DD7x1y11E", this);} // tgen
ccc::DD7x1y11 ::DD7x1y11(){ note_ctor("_ZN3ccc8DD7x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x1y11E, buf);
    ::ccc::DD7x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x1y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD7x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x1y11E);
    dp->::ccc::DD7x1y11::~DD7x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x1y11E(Test__ZN3ccc8DD7x1y11E, "_ZN3ccc8DD7x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x1y11C1Ev();
extern void _ZN3ccc8DD7x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x1y11E[] = {
  NSPAIR(_ZN3ccc8DD7x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD7x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x1y113pqrEv();
extern void _ZN3ccc8DD7x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x1y113pqrEv,_ZTv0_n16_N3ccc8DD7x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y113pqrEv,_ZThn4_N3ccc8DD7x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x1y113efgEv,_ZTv0_n20_N3ccc8DD7x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y113efgEv,_ZThn4_N3ccc8DD7x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x1y113pqrEv,_ZTv0_n16_N3ccc8DD7x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x1y113efgEv,_ZTv0_n20_N3ccc8DD7x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x1y11E[] = {
  {&(_ZTVN3ccc8DD7x1y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x1y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x1y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x1y11E[];
static VTBL_ENTRY alt_thunk_names808[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x1y113efgEv,_ZTv0_n20_N3ccc8DD7x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y113efgEv,_ZThn4_N3ccc8DD7x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x1y113pqrEv,_ZTv0_n16_N3ccc8DD7x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y113pqrEv,_ZThn4_N3ccc8DD7x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x1y11E = {  "_ZN3ccc8DD7x1y11E", // class name
  bases__ZN3ccc8DD7x1y11E, 2,
  &(vtc__ZN3ccc8DD7x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x1y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x1y11E),3, //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  CC7x1y12  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC7x1y123abcEv
  ~CC7x1y12(); // tgen
  CC7x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x1y123abcEv");}
ccc::CC7x1y12 ::~CC7x1y12(){ note_dtor("_ZN3ccc8CC7x1y12E", this);} // tgen
ccc::CC7x1y12 ::CC7x1y12(){ note_ctor("_ZN3ccc8CC7x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x1y12E, buf);
    ::ccc::CC7x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x1y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC7x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x1y12E);
    dp->::ccc::CC7x1y12::~CC7x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x1y12E(Test__ZN3ccc8CC7x1y12E, "_ZN3ccc8CC7x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x1y12C1Ev();
extern void _ZN3ccc8CC7x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x1y12E[] = {
  NSPAIR(_ZN3ccc8CC7x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC7x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x1y12E[];
extern void _ZN3ccc8CC7x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x1y123abcEv,_ZTv0_n12_N3ccc8CC7x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y123abcEv,_ZThn4_N3ccc8CC7x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x1y123abcEv,_ZTv0_n12_N3ccc8CC7x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x1y12E[] = {
  {&(_ZTVN3ccc8CC7x1y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x1y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x1y12E[];
static VTBL_ENTRY alt_thunk_names809[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x1y123abcEv,_ZTv0_n12_N3ccc8CC7x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x1y123abcEv,_ZThn4_N3ccc8CC7x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x1y12E = {  "_ZN3ccc8CC7x1y12E", // class name
  bases__ZN3ccc8CC7x1y12E, 2,
  &(vtc__ZN3ccc8CC7x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x1y12E),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  DD7x1y12  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD7x1y123abcEv
  ~DD7x1y12(); // tgen
  DD7x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x1y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x1y123abcEv");}
ccc::DD7x1y12 ::~DD7x1y12(){ note_dtor("_ZN3ccc8DD7x1y12E", this);} // tgen
ccc::DD7x1y12 ::DD7x1y12(){ note_ctor("_ZN3ccc8DD7x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x1y12E, buf);
    ::ccc::DD7x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x1y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD7x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x1y12E);
    dp->::ccc::DD7x1y12::~DD7x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x1y12E(Test__ZN3ccc8DD7x1y12E, "_ZN3ccc8DD7x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x1y12C1Ev();
extern void _ZN3ccc8DD7x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x1y12E[] = {
  NSPAIR(_ZN3ccc8DD7x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD7x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y12E[];
extern void _ZN3ccc8DD7x1y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x1y123abcEv,_ZTv0_n12_N3ccc8DD7x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y123abcEv,_ZThn4_N3ccc8DD7x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x1y123abcEv,_ZTv0_n12_N3ccc8DD7x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x1y12E[] = {
  {&(_ZTVN3ccc8DD7x1y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x1y12E[];
static VTBL_ENTRY alt_thunk_names810[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x1y123abcEv,_ZTv0_n12_N3ccc8DD7x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y123abcEv,_ZThn4_N3ccc8DD7x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x1y12E = {  "_ZN3ccc8DD7x1y12E", // class name
  bases__ZN3ccc8DD7x1y12E, 2,
  &(vtc__ZN3ccc8DD7x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x1y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x1y12E),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  CC7x1y13  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC7x1y133efgEv
  ~CC7x1y13(); // tgen
  CC7x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y13E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC7x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x1y133efgEv");}
ccc::CC7x1y13 ::~CC7x1y13(){ note_dtor("_ZN3ccc8CC7x1y13E", this);} // tgen
ccc::CC7x1y13 ::CC7x1y13(){ note_ctor("_ZN3ccc8CC7x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x1y13E, buf);
    ::ccc::CC7x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x1y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC7x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x1y13E);
    dp->::ccc::CC7x1y13::~CC7x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x1y13E(Test__ZN3ccc8CC7x1y13E, "_ZN3ccc8CC7x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x1y13C1Ev();
extern void _ZN3ccc8CC7x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x1y13E[] = {
  NSPAIR(_ZN3ccc8CC7x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC7x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC7x1y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x1y13E[] = {
  {&(_ZTVN3ccc8CC7x1y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x1y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x1y13E[];
Class_Descriptor cd__ZN3ccc8CC7x1y13E = {  "_ZN3ccc8CC7x1y13E", // class name
  bases__ZN3ccc8CC7x1y13E, 2,
  &(vtc__ZN3ccc8CC7x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x1y13E),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  DD7x1y13  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD7x1y133efgEv
  ~DD7x1y13(); // tgen
  DD7x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x1y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD7x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x1y133efgEv");}
ccc::DD7x1y13 ::~DD7x1y13(){ note_dtor("_ZN3ccc8DD7x1y13E", this);} // tgen
ccc::DD7x1y13 ::DD7x1y13(){ note_ctor("_ZN3ccc8DD7x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x1y13E, buf);
    ::ccc::DD7x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x1y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD7x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x1y13E);
    dp->::ccc::DD7x1y13::~DD7x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x1y13E(Test__ZN3ccc8DD7x1y13E, "_ZN3ccc8DD7x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x1y13C1Ev();
extern void _ZN3ccc8DD7x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x1y13E[] = {
  NSPAIR(_ZN3ccc8DD7x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD7x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x1y133efgEv,_ZTv0_n20_N3ccc8DD7x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y133efgEv,_ZThn4_N3ccc8DD7x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x1y133efgEv,_ZTv0_n20_N3ccc8DD7x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x1y13E[] = {
  {&(_ZTVN3ccc8DD7x1y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x1y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x1y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x1y13E[];
static VTBL_ENTRY alt_thunk_names811[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x1y133efgEv,_ZTv0_n20_N3ccc8DD7x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y133efgEv,_ZThn4_N3ccc8DD7x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x1y13E = {  "_ZN3ccc8DD7x1y13E", // class name
  bases__ZN3ccc8DD7x1y13E, 2,
  &(vtc__ZN3ccc8DD7x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x1y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x1y13E),3, //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  CC7x1y14  : virtual ::ccc::AA7 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC7x1y143pqrEv
  ~CC7x1y14(); // tgen
  CC7x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC7x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x1y143pqrEv");}
ccc::CC7x1y14 ::~CC7x1y14(){ note_dtor("_ZN3ccc8CC7x1y14E", this);} // tgen
ccc::CC7x1y14 ::CC7x1y14(){ note_ctor("_ZN3ccc8CC7x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x1y14E, buf);
    ::ccc::CC7x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x1y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC7x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x1y14E);
    dp->::ccc::CC7x1y14::~CC7x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x1y14E(Test__ZN3ccc8CC7x1y14E, "_ZN3ccc8CC7x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x1y14C1Ev();
extern void _ZN3ccc8CC7x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x1y14E[] = {
  NSPAIR(_ZN3ccc8CC7x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC7x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC7x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x1y143pqrEv,_ZTv0_n16_N3ccc8CC7x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x1y143pqrEv,_ZThn4_N3ccc8CC7x1y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x1y143pqrEv,_ZTv0_n16_N3ccc8CC7x1y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x1y14E[] = {
  {&(_ZTVN3ccc8CC7x1y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x1y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x1y14E[];
static VTBL_ENTRY alt_thunk_names812[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x1y143pqrEv,_ZTv0_n16_N3ccc8CC7x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x1y143pqrEv,_ZThn4_N3ccc8CC7x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x1y14E = {  "_ZN3ccc8CC7x1y14E", // class name
  bases__ZN3ccc8CC7x1y14E, 2,
  &(vtc__ZN3ccc8CC7x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x1y14E),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  DD7x1y14  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD7x1y143pqrEv
  ~DD7x1y14(); // tgen
  DD7x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x1y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD7x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x1y143pqrEv");}
ccc::DD7x1y14 ::~DD7x1y14(){ note_dtor("_ZN3ccc8DD7x1y14E", this);} // tgen
ccc::DD7x1y14 ::DD7x1y14(){ note_ctor("_ZN3ccc8DD7x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x1y14E, buf);
    ::ccc::DD7x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x1y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD7x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x1y14E);
    dp->::ccc::DD7x1y14::~DD7x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x1y14E(Test__ZN3ccc8DD7x1y14E, "_ZN3ccc8DD7x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x1y14C1Ev();
extern void _ZN3ccc8DD7x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x1y14E[] = {
  NSPAIR(_ZN3ccc8DD7x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD7x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x1y143pqrEv,_ZTv0_n16_N3ccc8DD7x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x1y143pqrEv,_ZThn4_N3ccc8DD7x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x1y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x1y143pqrEv,_ZTv0_n16_N3ccc8DD7x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x1y14E[] = {
  {&(_ZTVN3ccc8DD7x1y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x1y14E[];
static VTBL_ENTRY alt_thunk_names813[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x1y143pqrEv,_ZTv0_n16_N3ccc8DD7x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x1y143pqrEv,_ZThn4_N3ccc8DD7x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x1y14E = {  "_ZN3ccc8DD7x1y14E", // class name
  bases__ZN3ccc8DD7x1y14E, 2,
  &(vtc__ZN3ccc8DD7x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x1y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x1y14E),3, //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  CC7x1y15  : virtual ::ccc::AA7 , ::ccc::BB1 {
  ~CC7x1y15(); // tgen
  CC7x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x1y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC7x1y15 ::~CC7x1y15(){ note_dtor("_ZN3ccc8CC7x1y15E", this);} // tgen
ccc::CC7x1y15 ::CC7x1y15(){ note_ctor("_ZN3ccc8CC7x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x1y15E, buf);
    ::ccc::CC7x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x1y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC7x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x1y15E);
    dp->::ccc::CC7x1y15::~CC7x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x1y15E(Test__ZN3ccc8CC7x1y15E, "_ZN3ccc8CC7x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x1y15C1Ev();
extern void _ZN3ccc8CC7x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x1y15E[] = {
  NSPAIR(_ZN3ccc8CC7x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC7x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x1y15E[] = {
  {&(_ZTVN3ccc8CC7x1y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x1y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x1y15E[];
Class_Descriptor cd__ZN3ccc8CC7x1y15E = {  "_ZN3ccc8CC7x1y15E", // class name
  bases__ZN3ccc8CC7x1y15E, 2,
  &(vtc__ZN3ccc8CC7x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x1y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x1y15E),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  DD7x1y15  : virtual ::ccc::AA7 , virtual ::ccc::BB1 {
  ~DD7x1y15(); // tgen
  DD7x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x1y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD7x1y15 ::~DD7x1y15(){ note_dtor("_ZN3ccc8DD7x1y15E", this);} // tgen
ccc::DD7x1y15 ::DD7x1y15(){ note_ctor("_ZN3ccc8DD7x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x1y15E, buf);
    ::ccc::DD7x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x1y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD7x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x1y15E);
    dp->::ccc::DD7x1y15::~DD7x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x1y15E(Test__ZN3ccc8DD7x1y15E, "_ZN3ccc8DD7x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x1y15C1Ev();
extern void _ZN3ccc8DD7x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x1y15E[] = {
  NSPAIR(_ZN3ccc8DD7x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD7x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x1y15E[] = {
  {&(_ZTVN3ccc8DD7x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x1y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x1y15E[];
Class_Descriptor cd__ZN3ccc8DD7x1y15E = {  "_ZN3ccc8DD7x1y15E", // class name
  bases__ZN3ccc8DD7x1y15E, 2,
  &(vtc__ZN3ccc8DD7x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x1y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x1y15E),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  CC7x2y0  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y03pqrEv
  ~CC7x2y0(); // tgen
  CC7x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y0E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y03abcEv");}
void  ccc::CC7x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y03efgEv");}
void  ccc::CC7x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y03pqrEv");}
ccc::CC7x2y0 ::~CC7x2y0(){ note_dtor("_ZN3ccc7CC7x2y0E", this);} // tgen
ccc::CC7x2y0 ::CC7x2y0(){ note_ctor("_ZN3ccc7CC7x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y0E, buf);
    ::ccc::CC7x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y0E);
    dp->::ccc::CC7x2y0::~CC7x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y0E(Test__ZN3ccc7CC7x2y0E, "_ZN3ccc7CC7x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y0C1Ev();
extern void _ZN3ccc7CC7x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y0E[] = {
  NSPAIR(_ZN3ccc7CC7x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y0E[];
extern void _ZN3ccc7CC7x2y03efgEv();
extern void _ZN3ccc7CC7x2y03abcEv();
extern void _ZN3ccc7CC7x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y03abcEv,_ZTv0_n12_N3ccc7CC7x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y03abcEv,_ZThn4_N3ccc7CC7x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y03pqrEv,_ZTv0_n16_N3ccc7CC7x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y03pqrEv,_ZThn4_N3ccc7CC7x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y03abcEv,_ZTv0_n12_N3ccc7CC7x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y03pqrEv,_ZTv0_n16_N3ccc7CC7x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y0E[] = {
  {&(_ZTVN3ccc7CC7x2y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y0E[];
static VTBL_ENTRY alt_thunk_names814[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y03pqrEv,_ZTv0_n16_N3ccc7CC7x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y03pqrEv,_ZThn4_N3ccc7CC7x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y03abcEv,_ZTv0_n12_N3ccc7CC7x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y03abcEv,_ZThn4_N3ccc7CC7x2y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y0E = {  "_ZN3ccc7CC7x2y0E", // class name
  bases__ZN3ccc7CC7x2y0E, 2,
  &(vtc__ZN3ccc7CC7x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y0E),2, //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  DD7x2y0  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD7x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x2y03pqrEv
  ~DD7x2y0(); // tgen
  DD7x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y0E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y03abcEv");}
void  ccc::DD7x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y03efgEv");}
void  ccc::DD7x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y03pqrEv");}
ccc::DD7x2y0 ::~DD7x2y0(){ note_dtor("_ZN3ccc7DD7x2y0E", this);} // tgen
ccc::DD7x2y0 ::DD7x2y0(){ note_ctor("_ZN3ccc7DD7x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y0E, buf);
    ::ccc::DD7x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y0E);
    dp->::ccc::DD7x2y0::~DD7x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y0E(Test__ZN3ccc7DD7x2y0E, "_ZN3ccc7DD7x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y0C1Ev();
extern void _ZN3ccc7DD7x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y0E[] = {
  NSPAIR(_ZN3ccc7DD7x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y0E[];
extern void _ZN3ccc7DD7x2y03abcEv();
extern void _ZN3ccc7DD7x2y03pqrEv();
extern void _ZN3ccc7DD7x2y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y03efgEv,_ZTv0_n12_N3ccc7DD7x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y03efgEv,_ZThn4_N3ccc7DD7x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y03abcEv,_ZTv0_n16_N3ccc7DD7x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y03abcEv,_ZThn4_N3ccc7DD7x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y03pqrEv,_ZTv0_n20_N3ccc7DD7x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y03pqrEv,_ZThn4_N3ccc7DD7x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y03efgEv,_ZTv0_n12_N3ccc7DD7x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y03abcEv,_ZTv0_n16_N3ccc7DD7x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y03pqrEv,_ZTv0_n20_N3ccc7DD7x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y0E[] = {
  {&(_ZTVN3ccc7DD7x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y0E[];
static VTBL_ENTRY alt_thunk_names815[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y03pqrEv,_ZTv0_n20_N3ccc7DD7x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y03pqrEv,_ZThn4_N3ccc7DD7x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y03abcEv,_ZTv0_n16_N3ccc7DD7x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y03abcEv,_ZThn4_N3ccc7DD7x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y03efgEv,_ZTv0_n12_N3ccc7DD7x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y03efgEv,_ZThn4_N3ccc7DD7x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y0E = {  "_ZN3ccc7DD7x2y0E", // class name
  bases__ZN3ccc7DD7x2y0E, 2,
  &(vtc__ZN3ccc7DD7x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y0E),3, //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  CC7x2y1  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x2y13efgEv
  ~CC7x2y1(); // tgen
  CC7x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y1E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y13abcEv");}
void  ccc::CC7x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y13pqrEv");}
void  ccc::CC7x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y13efgEv");}
ccc::CC7x2y1 ::~CC7x2y1(){ note_dtor("_ZN3ccc7CC7x2y1E", this);} // tgen
ccc::CC7x2y1 ::CC7x2y1(){ note_ctor("_ZN3ccc7CC7x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y1E, buf);
    ::ccc::CC7x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y1E);
    dp->::ccc::CC7x2y1::~CC7x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y1E(Test__ZN3ccc7CC7x2y1E, "_ZN3ccc7CC7x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y1C1Ev();
extern void _ZN3ccc7CC7x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y1E[] = {
  NSPAIR(_ZN3ccc7CC7x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y1E[];
extern void _ZN3ccc7CC7x2y13efgEv();
extern void _ZN3ccc7CC7x2y13abcEv();
extern void _ZN3ccc7CC7x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y13abcEv,_ZTv0_n12_N3ccc7CC7x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y13abcEv,_ZThn4_N3ccc7CC7x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y13pqrEv,_ZTv0_n16_N3ccc7CC7x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y13pqrEv,_ZThn4_N3ccc7CC7x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y13abcEv,_ZTv0_n12_N3ccc7CC7x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y13pqrEv,_ZTv0_n16_N3ccc7CC7x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y1E[] = {
  {&(_ZTVN3ccc7CC7x2y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y1E[];
static VTBL_ENTRY alt_thunk_names816[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y13pqrEv,_ZTv0_n16_N3ccc7CC7x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y13pqrEv,_ZThn4_N3ccc7CC7x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y13abcEv,_ZTv0_n12_N3ccc7CC7x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y13abcEv,_ZThn4_N3ccc7CC7x2y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y1E = {  "_ZN3ccc7CC7x2y1E", // class name
  bases__ZN3ccc7CC7x2y1E, 2,
  &(vtc__ZN3ccc7CC7x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y1E),2, //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  DD7x2y1  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD7x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x2y13efgEv
  ~DD7x2y1(); // tgen
  DD7x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y1E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y13abcEv");}
void  ccc::DD7x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y13pqrEv");}
void  ccc::DD7x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y13efgEv");}
ccc::DD7x2y1 ::~DD7x2y1(){ note_dtor("_ZN3ccc7DD7x2y1E", this);} // tgen
ccc::DD7x2y1 ::DD7x2y1(){ note_ctor("_ZN3ccc7DD7x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y1E, buf);
    ::ccc::DD7x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y1E);
    dp->::ccc::DD7x2y1::~DD7x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y1E(Test__ZN3ccc7DD7x2y1E, "_ZN3ccc7DD7x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y1C1Ev();
extern void _ZN3ccc7DD7x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y1E[] = {
  NSPAIR(_ZN3ccc7DD7x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y1E[];
extern void _ZN3ccc7DD7x2y13abcEv();
extern void _ZN3ccc7DD7x2y13pqrEv();
extern void _ZN3ccc7DD7x2y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y13efgEv,_ZTv0_n12_N3ccc7DD7x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y13efgEv,_ZThn4_N3ccc7DD7x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y13abcEv,_ZTv0_n16_N3ccc7DD7x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y13abcEv,_ZThn4_N3ccc7DD7x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y13pqrEv,_ZTv0_n20_N3ccc7DD7x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y13pqrEv,_ZThn4_N3ccc7DD7x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y13efgEv,_ZTv0_n12_N3ccc7DD7x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y13abcEv,_ZTv0_n16_N3ccc7DD7x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y13pqrEv,_ZTv0_n20_N3ccc7DD7x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y1E[] = {
  {&(_ZTVN3ccc7DD7x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y1E[];
static VTBL_ENTRY alt_thunk_names817[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y13pqrEv,_ZTv0_n20_N3ccc7DD7x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y13pqrEv,_ZThn4_N3ccc7DD7x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y13abcEv,_ZTv0_n16_N3ccc7DD7x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y13abcEv,_ZThn4_N3ccc7DD7x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y13efgEv,_ZTv0_n12_N3ccc7DD7x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y13efgEv,_ZThn4_N3ccc7DD7x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y1E = {  "_ZN3ccc7DD7x2y1E", // class name
  bases__ZN3ccc7DD7x2y1E, 2,
  &(vtc__ZN3ccc7DD7x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y1E),3, //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  CC7x2y2  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y23pqrEv
  ~CC7x2y2(); // tgen
  CC7x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y2E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y23efgEv");}
void  ccc::CC7x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y23abcEv");}
void  ccc::CC7x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y23pqrEv");}
ccc::CC7x2y2 ::~CC7x2y2(){ note_dtor("_ZN3ccc7CC7x2y2E", this);} // tgen
ccc::CC7x2y2 ::CC7x2y2(){ note_ctor("_ZN3ccc7CC7x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y2E, buf);
    ::ccc::CC7x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y2E);
    dp->::ccc::CC7x2y2::~CC7x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y2E(Test__ZN3ccc7CC7x2y2E, "_ZN3ccc7CC7x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y2C1Ev();
extern void _ZN3ccc7CC7x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y2E[] = {
  NSPAIR(_ZN3ccc7CC7x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y2E[];
extern void _ZN3ccc7CC7x2y23efgEv();
extern void _ZN3ccc7CC7x2y23abcEv();
extern void _ZN3ccc7CC7x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y23abcEv,_ZTv0_n12_N3ccc7CC7x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y23abcEv,_ZThn4_N3ccc7CC7x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y23pqrEv,_ZTv0_n16_N3ccc7CC7x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y23pqrEv,_ZThn4_N3ccc7CC7x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y23abcEv,_ZTv0_n12_N3ccc7CC7x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y23pqrEv,_ZTv0_n16_N3ccc7CC7x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y2E[] = {
  {&(_ZTVN3ccc7CC7x2y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y2E[];
static VTBL_ENTRY alt_thunk_names818[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y23pqrEv,_ZTv0_n16_N3ccc7CC7x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y23pqrEv,_ZThn4_N3ccc7CC7x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y23abcEv,_ZTv0_n12_N3ccc7CC7x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y23abcEv,_ZThn4_N3ccc7CC7x2y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y2E = {  "_ZN3ccc7CC7x2y2E", // class name
  bases__ZN3ccc7CC7x2y2E, 2,
  &(vtc__ZN3ccc7CC7x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y2E),2, //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  DD7x2y2  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD7x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x2y23pqrEv
  ~DD7x2y2(); // tgen
  DD7x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y2E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y23efgEv");}
void  ccc::DD7x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y23abcEv");}
void  ccc::DD7x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y23pqrEv");}
ccc::DD7x2y2 ::~DD7x2y2(){ note_dtor("_ZN3ccc7DD7x2y2E", this);} // tgen
ccc::DD7x2y2 ::DD7x2y2(){ note_ctor("_ZN3ccc7DD7x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y2E, buf);
    ::ccc::DD7x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y2E);
    dp->::ccc::DD7x2y2::~DD7x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y2E(Test__ZN3ccc7DD7x2y2E, "_ZN3ccc7DD7x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y2C1Ev();
extern void _ZN3ccc7DD7x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y2E[] = {
  NSPAIR(_ZN3ccc7DD7x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y2E[];
extern void _ZN3ccc7DD7x2y23abcEv();
extern void _ZN3ccc7DD7x2y23pqrEv();
extern void _ZN3ccc7DD7x2y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y23efgEv,_ZTv0_n12_N3ccc7DD7x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y23efgEv,_ZThn4_N3ccc7DD7x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y23abcEv,_ZTv0_n16_N3ccc7DD7x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y23abcEv,_ZThn4_N3ccc7DD7x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y23pqrEv,_ZTv0_n20_N3ccc7DD7x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y23pqrEv,_ZThn4_N3ccc7DD7x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y23efgEv,_ZTv0_n12_N3ccc7DD7x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y23abcEv,_ZTv0_n16_N3ccc7DD7x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y23pqrEv,_ZTv0_n20_N3ccc7DD7x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y2E[] = {
  {&(_ZTVN3ccc7DD7x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y2E[];
static VTBL_ENTRY alt_thunk_names819[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y23pqrEv,_ZTv0_n20_N3ccc7DD7x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y23pqrEv,_ZThn4_N3ccc7DD7x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y23abcEv,_ZTv0_n16_N3ccc7DD7x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y23abcEv,_ZThn4_N3ccc7DD7x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y23efgEv,_ZTv0_n12_N3ccc7DD7x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y23efgEv,_ZThn4_N3ccc7DD7x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y2E = {  "_ZN3ccc7DD7x2y2E", // class name
  bases__ZN3ccc7DD7x2y2E, 2,
  &(vtc__ZN3ccc7DD7x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y2E),3, //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  CC7x2y3  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x2y33abcEv
  ~CC7x2y3(); // tgen
  CC7x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y3E) C1{ VBC2{ v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y33efgEv");}
void  ccc::CC7x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y33pqrEv");}
void  ccc::CC7x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y33abcEv");}
ccc::CC7x2y3 ::~CC7x2y3(){ note_dtor("_ZN3ccc7CC7x2y3E", this);} // tgen
ccc::CC7x2y3 ::CC7x2y3(){ note_ctor("_ZN3ccc7CC7x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y3E, buf);
    ::ccc::CC7x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y3E);
    dp->::ccc::CC7x2y3::~CC7x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y3E(Test__ZN3ccc7CC7x2y3E, "_ZN3ccc7CC7x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y3C1Ev();
extern void _ZN3ccc7CC7x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y3E[] = {
  NSPAIR(_ZN3ccc7CC7x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y3E[];
extern void _ZN3ccc7CC7x2y33efgEv();
extern void _ZN3ccc7CC7x2y33abcEv();
extern void _ZN3ccc7CC7x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y33abcEv,_ZTv0_n12_N3ccc7CC7x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y33abcEv,_ZThn4_N3ccc7CC7x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y33pqrEv,_ZTv0_n16_N3ccc7CC7x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y33pqrEv,_ZThn4_N3ccc7CC7x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y33abcEv,_ZTv0_n12_N3ccc7CC7x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y33pqrEv,_ZTv0_n16_N3ccc7CC7x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y3E[] = {
  {&(_ZTVN3ccc7CC7x2y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y3E[];
static VTBL_ENTRY alt_thunk_names820[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y33pqrEv,_ZTv0_n16_N3ccc7CC7x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y33pqrEv,_ZThn4_N3ccc7CC7x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y33abcEv,_ZTv0_n12_N3ccc7CC7x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y33abcEv,_ZThn4_N3ccc7CC7x2y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y3E = {  "_ZN3ccc7CC7x2y3E", // class name
  bases__ZN3ccc7CC7x2y3E, 2,
  &(vtc__ZN3ccc7CC7x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y3E),2, //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  DD7x2y3  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD7x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x2y33abcEv
  ~DD7x2y3(); // tgen
  DD7x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y3E) C1{ VBC2{ v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y33efgEv");}
void  ccc::DD7x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y33pqrEv");}
void  ccc::DD7x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y33abcEv");}
ccc::DD7x2y3 ::~DD7x2y3(){ note_dtor("_ZN3ccc7DD7x2y3E", this);} // tgen
ccc::DD7x2y3 ::DD7x2y3(){ note_ctor("_ZN3ccc7DD7x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y3E, buf);
    ::ccc::DD7x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y3E);
    dp->::ccc::DD7x2y3::~DD7x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y3E(Test__ZN3ccc7DD7x2y3E, "_ZN3ccc7DD7x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y3C1Ev();
extern void _ZN3ccc7DD7x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y3E[] = {
  NSPAIR(_ZN3ccc7DD7x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y3E[];
extern void _ZN3ccc7DD7x2y33abcEv();
extern void _ZN3ccc7DD7x2y33pqrEv();
extern void _ZN3ccc7DD7x2y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y33efgEv,_ZTv0_n12_N3ccc7DD7x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y33efgEv,_ZThn4_N3ccc7DD7x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y33abcEv,_ZTv0_n16_N3ccc7DD7x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y33abcEv,_ZThn4_N3ccc7DD7x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y33pqrEv,_ZTv0_n20_N3ccc7DD7x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y33pqrEv,_ZThn4_N3ccc7DD7x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y33efgEv,_ZTv0_n12_N3ccc7DD7x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y33abcEv,_ZTv0_n16_N3ccc7DD7x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y33pqrEv,_ZTv0_n20_N3ccc7DD7x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y3E[] = {
  {&(_ZTVN3ccc7DD7x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y3E[];
static VTBL_ENTRY alt_thunk_names821[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y33pqrEv,_ZTv0_n20_N3ccc7DD7x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y33pqrEv,_ZThn4_N3ccc7DD7x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y33abcEv,_ZTv0_n16_N3ccc7DD7x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y33abcEv,_ZThn4_N3ccc7DD7x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y33efgEv,_ZTv0_n12_N3ccc7DD7x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y33efgEv,_ZThn4_N3ccc7DD7x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y3E = {  "_ZN3ccc7DD7x2y3E", // class name
  bases__ZN3ccc7DD7x2y3E, 2,
  &(vtc__ZN3ccc7DD7x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y3E),3, //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  CC7x2y4  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC7x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x2y43efgEv
  ~CC7x2y4(); // tgen
  CC7x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y4E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y43pqrEv");}
void  ccc::CC7x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y43abcEv");}
void  ccc::CC7x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y43efgEv");}
ccc::CC7x2y4 ::~CC7x2y4(){ note_dtor("_ZN3ccc7CC7x2y4E", this);} // tgen
ccc::CC7x2y4 ::CC7x2y4(){ note_ctor("_ZN3ccc7CC7x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y4E, buf);
    ::ccc::CC7x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y4E);
    dp->::ccc::CC7x2y4::~CC7x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y4E(Test__ZN3ccc7CC7x2y4E, "_ZN3ccc7CC7x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y4C1Ev();
extern void _ZN3ccc7CC7x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y4E[] = {
  NSPAIR(_ZN3ccc7CC7x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y4E[];
extern void _ZN3ccc7CC7x2y43efgEv();
extern void _ZN3ccc7CC7x2y43abcEv();
extern void _ZN3ccc7CC7x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y43abcEv,_ZTv0_n12_N3ccc7CC7x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y43abcEv,_ZThn4_N3ccc7CC7x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y43pqrEv,_ZTv0_n16_N3ccc7CC7x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y43pqrEv,_ZThn4_N3ccc7CC7x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y43abcEv,_ZTv0_n12_N3ccc7CC7x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y43pqrEv,_ZTv0_n16_N3ccc7CC7x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y4E[] = {
  {&(_ZTVN3ccc7CC7x2y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y4E[];
static VTBL_ENTRY alt_thunk_names822[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y43pqrEv,_ZTv0_n16_N3ccc7CC7x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y43pqrEv,_ZThn4_N3ccc7CC7x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y43abcEv,_ZTv0_n12_N3ccc7CC7x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y43abcEv,_ZThn4_N3ccc7CC7x2y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y4E = {  "_ZN3ccc7CC7x2y4E", // class name
  bases__ZN3ccc7CC7x2y4E, 2,
  &(vtc__ZN3ccc7CC7x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y4E),2, //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  DD7x2y4  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD7x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x2y43efgEv
  ~DD7x2y4(); // tgen
  DD7x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y4E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y43pqrEv");}
void  ccc::DD7x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y43abcEv");}
void  ccc::DD7x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y43efgEv");}
ccc::DD7x2y4 ::~DD7x2y4(){ note_dtor("_ZN3ccc7DD7x2y4E", this);} // tgen
ccc::DD7x2y4 ::DD7x2y4(){ note_ctor("_ZN3ccc7DD7x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y4E, buf);
    ::ccc::DD7x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y4E);
    dp->::ccc::DD7x2y4::~DD7x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y4E(Test__ZN3ccc7DD7x2y4E, "_ZN3ccc7DD7x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y4C1Ev();
extern void _ZN3ccc7DD7x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y4E[] = {
  NSPAIR(_ZN3ccc7DD7x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y4E[];
extern void _ZN3ccc7DD7x2y43abcEv();
extern void _ZN3ccc7DD7x2y43pqrEv();
extern void _ZN3ccc7DD7x2y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y43efgEv,_ZTv0_n12_N3ccc7DD7x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y43efgEv,_ZThn4_N3ccc7DD7x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y43abcEv,_ZTv0_n16_N3ccc7DD7x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y43abcEv,_ZThn4_N3ccc7DD7x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y43pqrEv,_ZTv0_n20_N3ccc7DD7x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y43pqrEv,_ZThn4_N3ccc7DD7x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y43efgEv,_ZTv0_n12_N3ccc7DD7x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y43abcEv,_ZTv0_n16_N3ccc7DD7x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y43pqrEv,_ZTv0_n20_N3ccc7DD7x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y4E[] = {
  {&(_ZTVN3ccc7DD7x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y4E[];
static VTBL_ENTRY alt_thunk_names823[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y43pqrEv,_ZTv0_n20_N3ccc7DD7x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y43pqrEv,_ZThn4_N3ccc7DD7x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y43abcEv,_ZTv0_n16_N3ccc7DD7x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y43abcEv,_ZThn4_N3ccc7DD7x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y43efgEv,_ZTv0_n12_N3ccc7DD7x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y43efgEv,_ZThn4_N3ccc7DD7x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y4E = {  "_ZN3ccc7DD7x2y4E", // class name
  bases__ZN3ccc7DD7x2y4E, 2,
  &(vtc__ZN3ccc7DD7x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y4E),3, //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  CC7x2y5  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC7x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x2y53abcEv
  ~CC7x2y5(); // tgen
  CC7x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y5E) C1{ VBC2{ v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y53pqrEv");}
void  ccc::CC7x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y53efgEv");}
void  ccc::CC7x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y53abcEv");}
ccc::CC7x2y5 ::~CC7x2y5(){ note_dtor("_ZN3ccc7CC7x2y5E", this);} // tgen
ccc::CC7x2y5 ::CC7x2y5(){ note_ctor("_ZN3ccc7CC7x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y5E, buf);
    ::ccc::CC7x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y5E);
    dp->::ccc::CC7x2y5::~CC7x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y5E(Test__ZN3ccc7CC7x2y5E, "_ZN3ccc7CC7x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y5C1Ev();
extern void _ZN3ccc7CC7x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y5E[] = {
  NSPAIR(_ZN3ccc7CC7x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y5E[];
extern void _ZN3ccc7CC7x2y53efgEv();
extern void _ZN3ccc7CC7x2y53abcEv();
extern void _ZN3ccc7CC7x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y53abcEv,_ZTv0_n12_N3ccc7CC7x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y53abcEv,_ZThn4_N3ccc7CC7x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y53pqrEv,_ZTv0_n16_N3ccc7CC7x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y53pqrEv,_ZThn4_N3ccc7CC7x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y53abcEv,_ZTv0_n12_N3ccc7CC7x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y53pqrEv,_ZTv0_n16_N3ccc7CC7x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y5E[] = {
  {&(_ZTVN3ccc7CC7x2y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y5E[];
static VTBL_ENTRY alt_thunk_names824[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y53pqrEv,_ZTv0_n16_N3ccc7CC7x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y53pqrEv,_ZThn4_N3ccc7CC7x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y53abcEv,_ZTv0_n12_N3ccc7CC7x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y53abcEv,_ZThn4_N3ccc7CC7x2y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y5E = {  "_ZN3ccc7CC7x2y5E", // class name
  bases__ZN3ccc7CC7x2y5E, 2,
  &(vtc__ZN3ccc7CC7x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y5E),2, //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  DD7x2y5  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD7x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x2y53abcEv
  ~DD7x2y5(); // tgen
  DD7x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y5E) C1{ VBC2{ v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y53pqrEv");}
void  ccc::DD7x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y53efgEv");}
void  ccc::DD7x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y53abcEv");}
ccc::DD7x2y5 ::~DD7x2y5(){ note_dtor("_ZN3ccc7DD7x2y5E", this);} // tgen
ccc::DD7x2y5 ::DD7x2y5(){ note_ctor("_ZN3ccc7DD7x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y5E, buf);
    ::ccc::DD7x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y5E);
    dp->::ccc::DD7x2y5::~DD7x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y5E(Test__ZN3ccc7DD7x2y5E, "_ZN3ccc7DD7x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y5C1Ev();
extern void _ZN3ccc7DD7x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y5E[] = {
  NSPAIR(_ZN3ccc7DD7x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y5E[];
extern void _ZN3ccc7DD7x2y53abcEv();
extern void _ZN3ccc7DD7x2y53pqrEv();
extern void _ZN3ccc7DD7x2y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y53efgEv,_ZTv0_n12_N3ccc7DD7x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y53efgEv,_ZThn4_N3ccc7DD7x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y53abcEv,_ZTv0_n16_N3ccc7DD7x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y53abcEv,_ZThn4_N3ccc7DD7x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y53pqrEv,_ZTv0_n20_N3ccc7DD7x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y53pqrEv,_ZThn4_N3ccc7DD7x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y53efgEv,_ZTv0_n12_N3ccc7DD7x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y53abcEv,_ZTv0_n16_N3ccc7DD7x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y53pqrEv,_ZTv0_n20_N3ccc7DD7x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y5E[] = {
  {&(_ZTVN3ccc7DD7x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y5E[];
static VTBL_ENTRY alt_thunk_names825[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y53pqrEv,_ZTv0_n20_N3ccc7DD7x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y53pqrEv,_ZThn4_N3ccc7DD7x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y53abcEv,_ZTv0_n16_N3ccc7DD7x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y53abcEv,_ZThn4_N3ccc7DD7x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y53efgEv,_ZTv0_n12_N3ccc7DD7x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y53efgEv,_ZThn4_N3ccc7DD7x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y5E = {  "_ZN3ccc7DD7x2y5E", // class name
  bases__ZN3ccc7DD7x2y5E, 2,
  &(vtc__ZN3ccc7DD7x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y5E),3, //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  CC7x2y6  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x2y63efgEv
  ~CC7x2y6(); // tgen
  CC7x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y6E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y63abcEv");}
void  ccc::CC7x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y63efgEv");}
ccc::CC7x2y6 ::~CC7x2y6(){ note_dtor("_ZN3ccc7CC7x2y6E", this);} // tgen
ccc::CC7x2y6 ::CC7x2y6(){ note_ctor("_ZN3ccc7CC7x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y6E, buf);
    ::ccc::CC7x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y6E);
    dp->::ccc::CC7x2y6::~CC7x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y6E(Test__ZN3ccc7CC7x2y6E, "_ZN3ccc7CC7x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y6C1Ev();
extern void _ZN3ccc7CC7x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y6E[] = {
  NSPAIR(_ZN3ccc7CC7x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y6E[];
extern void _ZN3ccc7CC7x2y63efgEv();
extern void _ZN3ccc7CC7x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y63abcEv,_ZTv0_n12_N3ccc7CC7x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y63abcEv,_ZThn4_N3ccc7CC7x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y63abcEv,_ZTv0_n12_N3ccc7CC7x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y6E[] = {
  {&(_ZTVN3ccc7CC7x2y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y6E[];
static VTBL_ENTRY alt_thunk_names826[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y63abcEv,_ZTv0_n12_N3ccc7CC7x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y63abcEv,_ZThn4_N3ccc7CC7x2y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y6E = {  "_ZN3ccc7CC7x2y6E", // class name
  bases__ZN3ccc7CC7x2y6E, 2,
  &(vtc__ZN3ccc7CC7x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y6E),2, //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  DD7x2y6  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD7x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x2y63efgEv
  ~DD7x2y6(); // tgen
  DD7x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y6E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y63abcEv");}
void  ccc::DD7x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y63efgEv");}
ccc::DD7x2y6 ::~DD7x2y6(){ note_dtor("_ZN3ccc7DD7x2y6E", this);} // tgen
ccc::DD7x2y6 ::DD7x2y6(){ note_ctor("_ZN3ccc7DD7x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y6E, buf);
    ::ccc::DD7x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y6E);
    dp->::ccc::DD7x2y6::~DD7x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y6E(Test__ZN3ccc7DD7x2y6E, "_ZN3ccc7DD7x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y6C1Ev();
extern void _ZN3ccc7DD7x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y6E[] = {
  NSPAIR(_ZN3ccc7DD7x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y6E[];
extern void _ZN3ccc7DD7x2y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x2y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y63efgEv,_ZTv0_n12_N3ccc7DD7x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y63efgEv,_ZThn4_N3ccc7DD7x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y63abcEv,_ZTv0_n16_N3ccc7DD7x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y63abcEv,_ZThn4_N3ccc7DD7x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y63efgEv,_ZTv0_n12_N3ccc7DD7x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y63abcEv,_ZTv0_n16_N3ccc7DD7x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y6E[] = {
  {&(_ZTVN3ccc7DD7x2y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y6E[];
static VTBL_ENTRY alt_thunk_names827[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y63abcEv,_ZTv0_n16_N3ccc7DD7x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y63abcEv,_ZThn4_N3ccc7DD7x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y63efgEv,_ZTv0_n12_N3ccc7DD7x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y63efgEv,_ZThn4_N3ccc7DD7x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y6E = {  "_ZN3ccc7DD7x2y6E", // class name
  bases__ZN3ccc7DD7x2y6E, 2,
  &(vtc__ZN3ccc7DD7x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y6E),3, //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  CC7x2y7  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC7x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y73pqrEv
  ~CC7x2y7(); // tgen
  CC7x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y7E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y73abcEv");}
void  ccc::CC7x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y73pqrEv");}
ccc::CC7x2y7 ::~CC7x2y7(){ note_dtor("_ZN3ccc7CC7x2y7E", this);} // tgen
ccc::CC7x2y7 ::CC7x2y7(){ note_ctor("_ZN3ccc7CC7x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y7E, buf);
    ::ccc::CC7x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y7E);
    dp->::ccc::CC7x2y7::~CC7x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y7E(Test__ZN3ccc7CC7x2y7E, "_ZN3ccc7CC7x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y7C1Ev();
extern void _ZN3ccc7CC7x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y7E[] = {
  NSPAIR(_ZN3ccc7CC7x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC7x2y73abcEv();
extern void _ZN3ccc7CC7x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y73abcEv,_ZTv0_n12_N3ccc7CC7x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y73abcEv,_ZThn4_N3ccc7CC7x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y73pqrEv,_ZTv0_n16_N3ccc7CC7x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y73pqrEv,_ZThn4_N3ccc7CC7x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y73abcEv,_ZTv0_n12_N3ccc7CC7x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y73pqrEv,_ZTv0_n16_N3ccc7CC7x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y7E[] = {
  {&(_ZTVN3ccc7CC7x2y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y7E[];
static VTBL_ENTRY alt_thunk_names828[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y73pqrEv,_ZTv0_n16_N3ccc7CC7x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y73pqrEv,_ZThn4_N3ccc7CC7x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y73abcEv,_ZTv0_n12_N3ccc7CC7x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y73abcEv,_ZThn4_N3ccc7CC7x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y7E = {  "_ZN3ccc7CC7x2y7E", // class name
  bases__ZN3ccc7CC7x2y7E, 2,
  &(vtc__ZN3ccc7CC7x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y7E),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  DD7x2y7  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD7x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x2y73pqrEv
  ~DD7x2y7(); // tgen
  DD7x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y7E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y73abcEv");}
void  ccc::DD7x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y73pqrEv");}
ccc::DD7x2y7 ::~DD7x2y7(){ note_dtor("_ZN3ccc7DD7x2y7E", this);} // tgen
ccc::DD7x2y7 ::DD7x2y7(){ note_ctor("_ZN3ccc7DD7x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y7E, buf);
    ::ccc::DD7x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y7E);
    dp->::ccc::DD7x2y7::~DD7x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y7E(Test__ZN3ccc7DD7x2y7E, "_ZN3ccc7DD7x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y7C1Ev();
extern void _ZN3ccc7DD7x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y7E[] = {
  NSPAIR(_ZN3ccc7DD7x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y7E[];
extern void _ZN3ccc7DD7x2y73abcEv();
extern void _ZN3ccc7DD7x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y73abcEv,_ZTv0_n16_N3ccc7DD7x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y73abcEv,_ZThn4_N3ccc7DD7x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y73pqrEv,_ZTv0_n20_N3ccc7DD7x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y73pqrEv,_ZThn4_N3ccc7DD7x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y73abcEv,_ZTv0_n16_N3ccc7DD7x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y73pqrEv,_ZTv0_n20_N3ccc7DD7x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y7E[] = {
  {&(_ZTVN3ccc7DD7x2y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x2y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x2y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y7E[];
static VTBL_ENTRY alt_thunk_names829[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y73pqrEv,_ZTv0_n20_N3ccc7DD7x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y73pqrEv,_ZThn4_N3ccc7DD7x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y73abcEv,_ZTv0_n16_N3ccc7DD7x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y73abcEv,_ZThn4_N3ccc7DD7x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y7E = {  "_ZN3ccc7DD7x2y7E", // class name
  bases__ZN3ccc7DD7x2y7E, 2,
  &(vtc__ZN3ccc7DD7x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y7E),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  CC7x2y8  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x2y83abcEv
  ~CC7x2y8(); // tgen
  CC7x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y8E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y83efgEv");}
void  ccc::CC7x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x2y83abcEv");}
ccc::CC7x2y8 ::~CC7x2y8(){ note_dtor("_ZN3ccc7CC7x2y8E", this);} // tgen
ccc::CC7x2y8 ::CC7x2y8(){ note_ctor("_ZN3ccc7CC7x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y8E, buf);
    ::ccc::CC7x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y8E);
    dp->::ccc::CC7x2y8::~CC7x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y8E(Test__ZN3ccc7CC7x2y8E, "_ZN3ccc7CC7x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y8C1Ev();
extern void _ZN3ccc7CC7x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y8E[] = {
  NSPAIR(_ZN3ccc7CC7x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y8E[];
extern void _ZN3ccc7CC7x2y83efgEv();
extern void _ZN3ccc7CC7x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x2y83abcEv,_ZTv0_n12_N3ccc7CC7x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y83abcEv,_ZThn4_N3ccc7CC7x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x2y83abcEv,_ZTv0_n12_N3ccc7CC7x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y8E[] = {
  {&(_ZTVN3ccc7CC7x2y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y8E[];
static VTBL_ENTRY alt_thunk_names830[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x2y83abcEv,_ZTv0_n12_N3ccc7CC7x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y83abcEv,_ZThn4_N3ccc7CC7x2y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y8E = {  "_ZN3ccc7CC7x2y8E", // class name
  bases__ZN3ccc7CC7x2y8E, 2,
  &(vtc__ZN3ccc7CC7x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y8E),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  DD7x2y8  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD7x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x2y83abcEv
  ~DD7x2y8(); // tgen
  DD7x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y8E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y83efgEv");}
void  ccc::DD7x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x2y83abcEv");}
ccc::DD7x2y8 ::~DD7x2y8(){ note_dtor("_ZN3ccc7DD7x2y8E", this);} // tgen
ccc::DD7x2y8 ::DD7x2y8(){ note_ctor("_ZN3ccc7DD7x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y8E, buf);
    ::ccc::DD7x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y8E);
    dp->::ccc::DD7x2y8::~DD7x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y8E(Test__ZN3ccc7DD7x2y8E, "_ZN3ccc7DD7x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y8C1Ev();
extern void _ZN3ccc7DD7x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y8E[] = {
  NSPAIR(_ZN3ccc7DD7x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y8E[];
extern void _ZN3ccc7DD7x2y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x2y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y83efgEv,_ZTv0_n12_N3ccc7DD7x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y83efgEv,_ZThn4_N3ccc7DD7x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x2y83abcEv,_ZTv0_n16_N3ccc7DD7x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y83abcEv,_ZThn4_N3ccc7DD7x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y83efgEv,_ZTv0_n12_N3ccc7DD7x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x2y83abcEv,_ZTv0_n16_N3ccc7DD7x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y8E[] = {
  {&(_ZTVN3ccc7DD7x2y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y8E[];
static VTBL_ENTRY alt_thunk_names831[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x2y83abcEv,_ZTv0_n16_N3ccc7DD7x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y83abcEv,_ZThn4_N3ccc7DD7x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y83efgEv,_ZTv0_n12_N3ccc7DD7x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y83efgEv,_ZThn4_N3ccc7DD7x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y8E = {  "_ZN3ccc7DD7x2y8E", // class name
  bases__ZN3ccc7DD7x2y8E, 2,
  &(vtc__ZN3ccc7DD7x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y8E),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  CC7x2y9  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC7x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x2y93pqrEv
  ~CC7x2y9(); // tgen
  CC7x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x2y9E) C1{ VBC2{ v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x2y93efgEv");}
void  ccc::CC7x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x2y93pqrEv");}
ccc::CC7x2y9 ::~CC7x2y9(){ note_dtor("_ZN3ccc7CC7x2y9E", this);} // tgen
ccc::CC7x2y9 ::CC7x2y9(){ note_ctor("_ZN3ccc7CC7x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x2y9E, buf);
    ::ccc::CC7x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x2y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC7x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x2y9E);
    dp->::ccc::CC7x2y9::~CC7x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x2y9E(Test__ZN3ccc7CC7x2y9E, "_ZN3ccc7CC7x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x2y9C1Ev();
extern void _ZN3ccc7CC7x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x2y9E[] = {
  NSPAIR(_ZN3ccc7CC7x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC7x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x2y9E[];
extern void _ZN3ccc7CC7x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC7x2y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x2y93pqrEv,_ZTv0_n16_N3ccc7CC7x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x2y93pqrEv,_ZThn4_N3ccc7CC7x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x2y93pqrEv,_ZTv0_n16_N3ccc7CC7x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x2y9E[] = {
  {&(_ZTVN3ccc7CC7x2y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x2y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x2y9E[];
static VTBL_ENTRY alt_thunk_names832[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x2y93pqrEv,_ZTv0_n16_N3ccc7CC7x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x2y93pqrEv,_ZThn4_N3ccc7CC7x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x2y9E = {  "_ZN3ccc7CC7x2y9E", // class name
  bases__ZN3ccc7CC7x2y9E, 2,
  &(vtc__ZN3ccc7CC7x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x2y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x2y9E),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  DD7x2y9  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD7x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x2y93pqrEv
  ~DD7x2y9(); // tgen
  DD7x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x2y9E) C1{ VBC2{ v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x2y93efgEv");}
void  ccc::DD7x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x2y93pqrEv");}
ccc::DD7x2y9 ::~DD7x2y9(){ note_dtor("_ZN3ccc7DD7x2y9E", this);} // tgen
ccc::DD7x2y9 ::DD7x2y9(){ note_ctor("_ZN3ccc7DD7x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x2y9E, buf);
    ::ccc::DD7x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x2y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD7x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x2y9E);
    dp->::ccc::DD7x2y9::~DD7x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x2y9E(Test__ZN3ccc7DD7x2y9E, "_ZN3ccc7DD7x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x2y9C1Ev();
extern void _ZN3ccc7DD7x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x2y9E[] = {
  NSPAIR(_ZN3ccc7DD7x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD7x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x2y93pqrEv();
extern void _ZN3ccc7DD7x2y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x2y93efgEv,_ZTv0_n12_N3ccc7DD7x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y93efgEv,_ZThn4_N3ccc7DD7x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x2y93pqrEv,_ZTv0_n20_N3ccc7DD7x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x2y93pqrEv,_ZThn4_N3ccc7DD7x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x2y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x2y93efgEv,_ZTv0_n12_N3ccc7DD7x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x2y93pqrEv,_ZTv0_n20_N3ccc7DD7x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x2y9E[] = {
  {&(_ZTVN3ccc7DD7x2y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x2y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x2y9E[];
static VTBL_ENTRY alt_thunk_names833[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x2y93pqrEv,_ZTv0_n20_N3ccc7DD7x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y93pqrEv,_ZThn4_N3ccc7DD7x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x2y93efgEv,_ZTv0_n12_N3ccc7DD7x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x2y93efgEv,_ZThn4_N3ccc7DD7x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x2y9E = {  "_ZN3ccc7DD7x2y9E", // class name
  bases__ZN3ccc7DD7x2y9E, 2,
  &(vtc__ZN3ccc7DD7x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x2y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x2y9E),3, //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  CC7x2y10  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC7x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x2y103abcEv
  ~CC7x2y10(); // tgen
  CC7x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y10E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x2y103pqrEv");}
void  ccc::CC7x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x2y103abcEv");}
ccc::CC7x2y10 ::~CC7x2y10(){ note_dtor("_ZN3ccc8CC7x2y10E", this);} // tgen
ccc::CC7x2y10 ::CC7x2y10(){ note_ctor("_ZN3ccc8CC7x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x2y10E, buf);
    ::ccc::CC7x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x2y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC7x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x2y10E);
    dp->::ccc::CC7x2y10::~CC7x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x2y10E(Test__ZN3ccc8CC7x2y10E, "_ZN3ccc8CC7x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x2y10C1Ev();
extern void _ZN3ccc8CC7x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x2y10E[] = {
  NSPAIR(_ZN3ccc8CC7x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC7x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC7x2y103abcEv();
extern void _ZN3ccc8CC7x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x2y103abcEv,_ZTv0_n12_N3ccc8CC7x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y103abcEv,_ZThn4_N3ccc8CC7x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x2y103pqrEv,_ZTv0_n16_N3ccc8CC7x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y103pqrEv,_ZThn4_N3ccc8CC7x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x2y103abcEv,_ZTv0_n12_N3ccc8CC7x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x2y103pqrEv,_ZTv0_n16_N3ccc8CC7x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x2y10E[] = {
  {&(_ZTVN3ccc8CC7x2y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x2y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x2y10E[];
static VTBL_ENTRY alt_thunk_names834[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x2y103pqrEv,_ZTv0_n16_N3ccc8CC7x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x2y103pqrEv,_ZThn4_N3ccc8CC7x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x2y103abcEv,_ZTv0_n12_N3ccc8CC7x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x2y103abcEv,_ZThn4_N3ccc8CC7x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x2y10E = {  "_ZN3ccc8CC7x2y10E", // class name
  bases__ZN3ccc8CC7x2y10E, 2,
  &(vtc__ZN3ccc8CC7x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x2y10E),2, //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  DD7x2y10  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD7x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x2y103abcEv
  ~DD7x2y10(); // tgen
  DD7x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x2y10E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x2y103pqrEv");}
void  ccc::DD7x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x2y103abcEv");}
ccc::DD7x2y10 ::~DD7x2y10(){ note_dtor("_ZN3ccc8DD7x2y10E", this);} // tgen
ccc::DD7x2y10 ::DD7x2y10(){ note_ctor("_ZN3ccc8DD7x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x2y10E, buf);
    ::ccc::DD7x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x2y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD7x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x2y10E);
    dp->::ccc::DD7x2y10::~DD7x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x2y10E(Test__ZN3ccc8DD7x2y10E, "_ZN3ccc8DD7x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x2y10C1Ev();
extern void _ZN3ccc8DD7x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x2y10E[] = {
  NSPAIR(_ZN3ccc8DD7x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD7x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y10E[];
extern void _ZN3ccc8DD7x2y103abcEv();
extern void _ZN3ccc8DD7x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x2y103abcEv,_ZTv0_n16_N3ccc8DD7x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y103abcEv,_ZThn4_N3ccc8DD7x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x2y103pqrEv,_ZTv0_n20_N3ccc8DD7x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y103pqrEv,_ZThn4_N3ccc8DD7x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x2y103abcEv,_ZTv0_n16_N3ccc8DD7x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x2y103pqrEv,_ZTv0_n20_N3ccc8DD7x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x2y10E[] = {
  {&(_ZTVN3ccc8DD7x2y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x2y10E[];
static VTBL_ENTRY alt_thunk_names835[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x2y103pqrEv,_ZTv0_n20_N3ccc8DD7x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y103pqrEv,_ZThn4_N3ccc8DD7x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x2y103abcEv,_ZTv0_n16_N3ccc8DD7x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y103abcEv,_ZThn4_N3ccc8DD7x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x2y10E = {  "_ZN3ccc8DD7x2y10E", // class name
  bases__ZN3ccc8DD7x2y10E, 2,
  &(vtc__ZN3ccc8DD7x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x2y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x2y10E),3, //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  CC7x2y11  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC7x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x2y113efgEv
  ~CC7x2y11(); // tgen
  CC7x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y11E) C1{ VBC2{ v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x2y113pqrEv");}
void  ccc::CC7x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x2y113efgEv");}
ccc::CC7x2y11 ::~CC7x2y11(){ note_dtor("_ZN3ccc8CC7x2y11E", this);} // tgen
ccc::CC7x2y11 ::CC7x2y11(){ note_ctor("_ZN3ccc8CC7x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x2y11E, buf);
    ::ccc::CC7x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x2y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC7x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x2y11E);
    dp->::ccc::CC7x2y11::~CC7x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x2y11E(Test__ZN3ccc8CC7x2y11E, "_ZN3ccc8CC7x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x2y11C1Ev();
extern void _ZN3ccc8CC7x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x2y11E[] = {
  NSPAIR(_ZN3ccc8CC7x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC7x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x2y11E[];
extern void _ZN3ccc8CC7x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC7x2y113pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x2y113pqrEv,_ZTv0_n16_N3ccc8CC7x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y113pqrEv,_ZThn4_N3ccc8CC7x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x2y113pqrEv,_ZTv0_n16_N3ccc8CC7x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x2y11E[] = {
  {&(_ZTVN3ccc8CC7x2y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x2y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x2y11E[];
static VTBL_ENTRY alt_thunk_names836[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x2y113pqrEv,_ZTv0_n16_N3ccc8CC7x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x2y113pqrEv,_ZThn4_N3ccc8CC7x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x2y11E = {  "_ZN3ccc8CC7x2y11E", // class name
  bases__ZN3ccc8CC7x2y11E, 2,
  &(vtc__ZN3ccc8CC7x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x2y11E),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  DD7x2y11  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD7x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x2y113efgEv
  ~DD7x2y11(); // tgen
  DD7x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x2y11E) C1{ VBC2{ v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x2y113pqrEv");}
void  ccc::DD7x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x2y113efgEv");}
ccc::DD7x2y11 ::~DD7x2y11(){ note_dtor("_ZN3ccc8DD7x2y11E", this);} // tgen
ccc::DD7x2y11 ::DD7x2y11(){ note_ctor("_ZN3ccc8DD7x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x2y11E, buf);
    ::ccc::DD7x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x2y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD7x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x2y11E);
    dp->::ccc::DD7x2y11::~DD7x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x2y11E(Test__ZN3ccc8DD7x2y11E, "_ZN3ccc8DD7x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x2y11C1Ev();
extern void _ZN3ccc8DD7x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x2y11E[] = {
  NSPAIR(_ZN3ccc8DD7x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD7x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x2y113pqrEv();
extern void _ZN3ccc8DD7x2y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x2y113efgEv,_ZTv0_n12_N3ccc8DD7x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y113efgEv,_ZThn4_N3ccc8DD7x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x2y113pqrEv,_ZTv0_n20_N3ccc8DD7x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y113pqrEv,_ZThn4_N3ccc8DD7x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x2y113efgEv,_ZTv0_n12_N3ccc8DD7x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x2y113pqrEv,_ZTv0_n20_N3ccc8DD7x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x2y11E[] = {
  {&(_ZTVN3ccc8DD7x2y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x2y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x2y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x2y11E[];
static VTBL_ENTRY alt_thunk_names837[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x2y113pqrEv,_ZTv0_n20_N3ccc8DD7x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y113pqrEv,_ZThn4_N3ccc8DD7x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x2y113efgEv,_ZTv0_n12_N3ccc8DD7x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y113efgEv,_ZThn4_N3ccc8DD7x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x2y11E = {  "_ZN3ccc8DD7x2y11E", // class name
  bases__ZN3ccc8DD7x2y11E, 2,
  &(vtc__ZN3ccc8DD7x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x2y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x2y11E),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  CC7x2y12  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC7x2y123abcEv
  ~CC7x2y12(); // tgen
  CC7x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC7x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x2y123abcEv");}
ccc::CC7x2y12 ::~CC7x2y12(){ note_dtor("_ZN3ccc8CC7x2y12E", this);} // tgen
ccc::CC7x2y12 ::CC7x2y12(){ note_ctor("_ZN3ccc8CC7x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x2y12E, buf);
    ::ccc::CC7x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x2y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC7x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x2y12E);
    dp->::ccc::CC7x2y12::~CC7x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x2y12E(Test__ZN3ccc8CC7x2y12E, "_ZN3ccc8CC7x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x2y12C1Ev();
extern void _ZN3ccc8CC7x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x2y12E[] = {
  NSPAIR(_ZN3ccc8CC7x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC7x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC7x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x2y123abcEv,_ZTv0_n12_N3ccc8CC7x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y123abcEv,_ZThn4_N3ccc8CC7x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x2y123abcEv,_ZTv0_n12_N3ccc8CC7x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x2y12E[] = {
  {&(_ZTVN3ccc8CC7x2y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x2y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x2y12E[];
static VTBL_ENTRY alt_thunk_names838[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x2y123abcEv,_ZTv0_n12_N3ccc8CC7x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x2y123abcEv,_ZThn4_N3ccc8CC7x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x2y12E = {  "_ZN3ccc8CC7x2y12E", // class name
  bases__ZN3ccc8CC7x2y12E, 2,
  &(vtc__ZN3ccc8CC7x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x2y12E),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  DD7x2y12  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD7x2y123abcEv
  ~DD7x2y12(); // tgen
  DD7x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x2y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD7x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x2y123abcEv");}
ccc::DD7x2y12 ::~DD7x2y12(){ note_dtor("_ZN3ccc8DD7x2y12E", this);} // tgen
ccc::DD7x2y12 ::DD7x2y12(){ note_ctor("_ZN3ccc8DD7x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x2y12E, buf);
    ::ccc::DD7x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x2y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD7x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x2y12E);
    dp->::ccc::DD7x2y12::~DD7x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x2y12E(Test__ZN3ccc8DD7x2y12E, "_ZN3ccc8DD7x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x2y12C1Ev();
extern void _ZN3ccc8DD7x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x2y12E[] = {
  NSPAIR(_ZN3ccc8DD7x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD7x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y12E[];
extern void _ZN3ccc8DD7x2y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x2y123abcEv,_ZTv0_n16_N3ccc8DD7x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y123abcEv,_ZThn4_N3ccc8DD7x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x2y123abcEv,_ZTv0_n16_N3ccc8DD7x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x2y12E[] = {
  {&(_ZTVN3ccc8DD7x2y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x2y12E[];
static VTBL_ENTRY alt_thunk_names839[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x2y123abcEv,_ZTv0_n16_N3ccc8DD7x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y123abcEv,_ZThn4_N3ccc8DD7x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x2y12E = {  "_ZN3ccc8DD7x2y12E", // class name
  bases__ZN3ccc8DD7x2y12E, 2,
  &(vtc__ZN3ccc8DD7x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x2y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x2y12E),3, //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  CC7x2y13  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC7x2y133efgEv
  ~CC7x2y13(); // tgen
  CC7x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y13E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC7x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x2y133efgEv");}
ccc::CC7x2y13 ::~CC7x2y13(){ note_dtor("_ZN3ccc8CC7x2y13E", this);} // tgen
ccc::CC7x2y13 ::CC7x2y13(){ note_ctor("_ZN3ccc8CC7x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x2y13E, buf);
    ::ccc::CC7x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x2y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC7x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x2y13E);
    dp->::ccc::CC7x2y13::~CC7x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x2y13E(Test__ZN3ccc8CC7x2y13E, "_ZN3ccc8CC7x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x2y13C1Ev();
extern void _ZN3ccc8CC7x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x2y13E[] = {
  NSPAIR(_ZN3ccc8CC7x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC7x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x2y13E[];
extern void _ZN3ccc8CC7x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x2y13E[] = {
  {&(_ZTVN3ccc8CC7x2y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x2y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x2y13E[];
Class_Descriptor cd__ZN3ccc8CC7x2y13E = {  "_ZN3ccc8CC7x2y13E", // class name
  bases__ZN3ccc8CC7x2y13E, 2,
  &(vtc__ZN3ccc8CC7x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x2y13E),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  DD7x2y13  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD7x2y133efgEv
  ~DD7x2y13(); // tgen
  DD7x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x2y13E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD7x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x2y133efgEv");}
ccc::DD7x2y13 ::~DD7x2y13(){ note_dtor("_ZN3ccc8DD7x2y13E", this);} // tgen
ccc::DD7x2y13 ::DD7x2y13(){ note_ctor("_ZN3ccc8DD7x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x2y13E, buf);
    ::ccc::DD7x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x2y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD7x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x2y13E);
    dp->::ccc::DD7x2y13::~DD7x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x2y13E(Test__ZN3ccc8DD7x2y13E, "_ZN3ccc8DD7x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x2y13C1Ev();
extern void _ZN3ccc8DD7x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x2y13E[] = {
  NSPAIR(_ZN3ccc8DD7x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD7x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x2y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x2y133efgEv,_ZTv0_n12_N3ccc8DD7x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y133efgEv,_ZThn4_N3ccc8DD7x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x2y133efgEv,_ZTv0_n12_N3ccc8DD7x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x2y13E[] = {
  {&(_ZTVN3ccc8DD7x2y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x2y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x2y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x2y13E[];
static VTBL_ENTRY alt_thunk_names840[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x2y133efgEv,_ZTv0_n12_N3ccc8DD7x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y133efgEv,_ZThn4_N3ccc8DD7x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x2y13E = {  "_ZN3ccc8DD7x2y13E", // class name
  bases__ZN3ccc8DD7x2y13E, 2,
  &(vtc__ZN3ccc8DD7x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x2y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x2y13E),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  CC7x2y14  : virtual ::ccc::AA7 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC7x2y143pqrEv
  ~CC7x2y14(); // tgen
  CC7x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC7x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x2y143pqrEv");}
ccc::CC7x2y14 ::~CC7x2y14(){ note_dtor("_ZN3ccc8CC7x2y14E", this);} // tgen
ccc::CC7x2y14 ::CC7x2y14(){ note_ctor("_ZN3ccc8CC7x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x2y14E, buf);
    ::ccc::CC7x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x2y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC7x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x2y14E);
    dp->::ccc::CC7x2y14::~CC7x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x2y14E(Test__ZN3ccc8CC7x2y14E, "_ZN3ccc8CC7x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x2y14C1Ev();
extern void _ZN3ccc8CC7x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x2y14E[] = {
  NSPAIR(_ZN3ccc8CC7x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC7x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC7x2y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x2y143pqrEv,_ZTv0_n16_N3ccc8CC7x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x2y143pqrEv,_ZThn4_N3ccc8CC7x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x2y143pqrEv,_ZTv0_n16_N3ccc8CC7x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x2y14E[] = {
  {&(_ZTVN3ccc8CC7x2y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x2y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x2y14E[];
static VTBL_ENTRY alt_thunk_names841[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x2y143pqrEv,_ZTv0_n16_N3ccc8CC7x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x2y143pqrEv,_ZThn4_N3ccc8CC7x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x2y14E = {  "_ZN3ccc8CC7x2y14E", // class name
  bases__ZN3ccc8CC7x2y14E, 2,
  &(vtc__ZN3ccc8CC7x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x2y14E),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  DD7x2y14  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD7x2y143pqrEv
  ~DD7x2y14(); // tgen
  DD7x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x2y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD7x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x2y143pqrEv");}
ccc::DD7x2y14 ::~DD7x2y14(){ note_dtor("_ZN3ccc8DD7x2y14E", this);} // tgen
ccc::DD7x2y14 ::DD7x2y14(){ note_ctor("_ZN3ccc8DD7x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x2y14E, buf);
    ::ccc::DD7x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x2y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD7x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x2y14E);
    dp->::ccc::DD7x2y14::~DD7x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x2y14E(Test__ZN3ccc8DD7x2y14E, "_ZN3ccc8DD7x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x2y14C1Ev();
extern void _ZN3ccc8DD7x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x2y14E[] = {
  NSPAIR(_ZN3ccc8DD7x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD7x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x2y143pqrEv,_ZTv0_n20_N3ccc8DD7x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x2y143pqrEv,_ZThn4_N3ccc8DD7x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x2y143pqrEv,_ZTv0_n20_N3ccc8DD7x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x2y14E[] = {
  {&(_ZTVN3ccc8DD7x2y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x2y14E[];
static VTBL_ENTRY alt_thunk_names842[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x2y143pqrEv,_ZTv0_n20_N3ccc8DD7x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x2y143pqrEv,_ZThn4_N3ccc8DD7x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x2y14E = {  "_ZN3ccc8DD7x2y14E", // class name
  bases__ZN3ccc8DD7x2y14E, 2,
  &(vtc__ZN3ccc8DD7x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x2y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x2y14E),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  CC7x2y15  : virtual ::ccc::AA7 , ::ccc::BB2 {
  ~CC7x2y15(); // tgen
  CC7x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x2y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC7x2y15 ::~CC7x2y15(){ note_dtor("_ZN3ccc8CC7x2y15E", this);} // tgen
ccc::CC7x2y15 ::CC7x2y15(){ note_ctor("_ZN3ccc8CC7x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x2y15E, buf);
    ::ccc::CC7x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x2y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC7x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x2y15E);
    dp->::ccc::CC7x2y15::~CC7x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x2y15E(Test__ZN3ccc8CC7x2y15E, "_ZN3ccc8CC7x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x2y15C1Ev();
extern void _ZN3ccc8CC7x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x2y15E[] = {
  NSPAIR(_ZN3ccc8CC7x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC7x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x2y15E[] = {
  {&(_ZTVN3ccc8CC7x2y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x2y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x2y15E[];
Class_Descriptor cd__ZN3ccc8CC7x2y15E = {  "_ZN3ccc8CC7x2y15E", // class name
  bases__ZN3ccc8CC7x2y15E, 2,
  &(vtc__ZN3ccc8CC7x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x2y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x2y15E),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  DD7x2y15  : virtual ::ccc::AA7 , virtual ::ccc::BB2 {
  ~DD7x2y15(); // tgen
  DD7x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x2y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD7x2y15 ::~DD7x2y15(){ note_dtor("_ZN3ccc8DD7x2y15E", this);} // tgen
ccc::DD7x2y15 ::DD7x2y15(){ note_ctor("_ZN3ccc8DD7x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x2y15E, buf);
    ::ccc::DD7x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x2y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD7x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x2y15E);
    dp->::ccc::DD7x2y15::~DD7x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x2y15E(Test__ZN3ccc8DD7x2y15E, "_ZN3ccc8DD7x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x2y15C1Ev();
extern void _ZN3ccc8DD7x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x2y15E[] = {
  NSPAIR(_ZN3ccc8DD7x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD7x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x2y15E[] = {
  {&(_ZTVN3ccc8DD7x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x2y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x2y15E[];
Class_Descriptor cd__ZN3ccc8DD7x2y15E = {  "_ZN3ccc8DD7x2y15E", // class name
  bases__ZN3ccc8DD7x2y15E, 2,
  &(vtc__ZN3ccc8DD7x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x2y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x2y15E),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  CC7x3y0  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y03pqrEv
  ~CC7x3y0(); // tgen
  CC7x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y0E) C1{ VBC2{ v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y03abcEv");}
void  ccc::CC7x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y03efgEv");}
void  ccc::CC7x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y03pqrEv");}
ccc::CC7x3y0 ::~CC7x3y0(){ note_dtor("_ZN3ccc7CC7x3y0E", this);} // tgen
ccc::CC7x3y0 ::CC7x3y0(){ note_ctor("_ZN3ccc7CC7x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y0E, buf);
    ::ccc::CC7x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y0E);
    dp->::ccc::CC7x3y0::~CC7x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y0E(Test__ZN3ccc7CC7x3y0E, "_ZN3ccc7CC7x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y0C1Ev();
extern void _ZN3ccc7CC7x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y0E[] = {
  NSPAIR(_ZN3ccc7CC7x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y0E[];
extern void _ZN3ccc7CC7x3y03efgEv();
extern void _ZN3ccc7CC7x3y03pqrEv();
extern void _ZN3ccc7CC7x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y03abcEv,_ZTv0_n12_N3ccc7CC7x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y03abcEv,_ZThn4_N3ccc7CC7x3y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y03pqrEv,_ZTv0_n16_N3ccc7CC7x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y03pqrEv,_ZThn4_N3ccc7CC7x3y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y03abcEv,_ZTv0_n12_N3ccc7CC7x3y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y03pqrEv,_ZTv0_n16_N3ccc7CC7x3y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y0E[] = {
  {&(_ZTVN3ccc7CC7x3y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y0E[];
static VTBL_ENTRY alt_thunk_names843[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y03pqrEv,_ZTv0_n16_N3ccc7CC7x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y03pqrEv,_ZThn4_N3ccc7CC7x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y03abcEv,_ZTv0_n12_N3ccc7CC7x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y03abcEv,_ZThn4_N3ccc7CC7x3y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y0E = {  "_ZN3ccc7CC7x3y0E", // class name
  bases__ZN3ccc7CC7x3y0E, 2,
  &(vtc__ZN3ccc7CC7x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y0E),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  DD7x3y0  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD7x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x3y03pqrEv
  ~DD7x3y0(); // tgen
  DD7x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y0E) C1{ VBC2{ v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y03abcEv");}
void  ccc::DD7x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y03efgEv");}
void  ccc::DD7x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y03pqrEv");}
ccc::DD7x3y0 ::~DD7x3y0(){ note_dtor("_ZN3ccc7DD7x3y0E", this);} // tgen
ccc::DD7x3y0 ::DD7x3y0(){ note_ctor("_ZN3ccc7DD7x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y0E, buf);
    ::ccc::DD7x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y0E);
    dp->::ccc::DD7x3y0::~DD7x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y0E(Test__ZN3ccc7DD7x3y0E, "_ZN3ccc7DD7x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y0C1Ev();
extern void _ZN3ccc7DD7x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y0E[] = {
  NSPAIR(_ZN3ccc7DD7x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y0E[];
extern void _ZN3ccc7DD7x3y03abcEv();
extern void _ZN3ccc7DD7x3y03pqrEv();
extern void _ZN3ccc7DD7x3y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y03efgEv,_ZTv0_n12_N3ccc7DD7x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y03efgEv,_ZThn4_N3ccc7DD7x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y03pqrEv,_ZTv0_n16_N3ccc7DD7x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y03pqrEv,_ZThn4_N3ccc7DD7x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y03abcEv,_ZTv0_n20_N3ccc7DD7x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y03abcEv,_ZThn4_N3ccc7DD7x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y03efgEv,_ZTv0_n12_N3ccc7DD7x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y03pqrEv,_ZTv0_n16_N3ccc7DD7x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y03abcEv,_ZTv0_n20_N3ccc7DD7x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y0E[] = {
  {&(_ZTVN3ccc7DD7x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y0E[];
static VTBL_ENTRY alt_thunk_names844[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y03abcEv,_ZTv0_n20_N3ccc7DD7x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y03abcEv,_ZThn4_N3ccc7DD7x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y03pqrEv,_ZTv0_n16_N3ccc7DD7x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y03pqrEv,_ZThn4_N3ccc7DD7x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y03efgEv,_ZTv0_n12_N3ccc7DD7x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y03efgEv,_ZThn4_N3ccc7DD7x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y0E = {  "_ZN3ccc7DD7x3y0E", // class name
  bases__ZN3ccc7DD7x3y0E, 2,
  &(vtc__ZN3ccc7DD7x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y0E),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  CC7x3y1  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x3y13efgEv
  ~CC7x3y1(); // tgen
  CC7x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y1E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y13abcEv");}
void  ccc::CC7x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y13pqrEv");}
void  ccc::CC7x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y13efgEv");}
ccc::CC7x3y1 ::~CC7x3y1(){ note_dtor("_ZN3ccc7CC7x3y1E", this);} // tgen
ccc::CC7x3y1 ::CC7x3y1(){ note_ctor("_ZN3ccc7CC7x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y1E, buf);
    ::ccc::CC7x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y1E);
    dp->::ccc::CC7x3y1::~CC7x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y1E(Test__ZN3ccc7CC7x3y1E, "_ZN3ccc7CC7x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y1C1Ev();
extern void _ZN3ccc7CC7x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y1E[] = {
  NSPAIR(_ZN3ccc7CC7x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y1E[];
extern void _ZN3ccc7CC7x3y13efgEv();
extern void _ZN3ccc7CC7x3y13pqrEv();
extern void _ZN3ccc7CC7x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y13abcEv,_ZTv0_n12_N3ccc7CC7x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y13abcEv,_ZThn4_N3ccc7CC7x3y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y13pqrEv,_ZTv0_n16_N3ccc7CC7x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y13pqrEv,_ZThn4_N3ccc7CC7x3y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y13abcEv,_ZTv0_n12_N3ccc7CC7x3y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y13pqrEv,_ZTv0_n16_N3ccc7CC7x3y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y1E[] = {
  {&(_ZTVN3ccc7CC7x3y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y1E[];
static VTBL_ENTRY alt_thunk_names845[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y13pqrEv,_ZTv0_n16_N3ccc7CC7x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y13pqrEv,_ZThn4_N3ccc7CC7x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y13abcEv,_ZTv0_n12_N3ccc7CC7x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y13abcEv,_ZThn4_N3ccc7CC7x3y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y1E = {  "_ZN3ccc7CC7x3y1E", // class name
  bases__ZN3ccc7CC7x3y1E, 2,
  &(vtc__ZN3ccc7CC7x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y1E),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  DD7x3y1  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD7x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x3y13efgEv
  ~DD7x3y1(); // tgen
  DD7x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y1E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y13abcEv");}
void  ccc::DD7x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y13pqrEv");}
void  ccc::DD7x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y13efgEv");}
ccc::DD7x3y1 ::~DD7x3y1(){ note_dtor("_ZN3ccc7DD7x3y1E", this);} // tgen
ccc::DD7x3y1 ::DD7x3y1(){ note_ctor("_ZN3ccc7DD7x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y1E, buf);
    ::ccc::DD7x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y1E);
    dp->::ccc::DD7x3y1::~DD7x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y1E(Test__ZN3ccc7DD7x3y1E, "_ZN3ccc7DD7x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y1C1Ev();
extern void _ZN3ccc7DD7x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y1E[] = {
  NSPAIR(_ZN3ccc7DD7x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y1E[];
extern void _ZN3ccc7DD7x3y13abcEv();
extern void _ZN3ccc7DD7x3y13pqrEv();
extern void _ZN3ccc7DD7x3y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y13efgEv,_ZTv0_n12_N3ccc7DD7x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y13efgEv,_ZThn4_N3ccc7DD7x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y13pqrEv,_ZTv0_n16_N3ccc7DD7x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y13pqrEv,_ZThn4_N3ccc7DD7x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y13abcEv,_ZTv0_n20_N3ccc7DD7x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y13abcEv,_ZThn4_N3ccc7DD7x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y13efgEv,_ZTv0_n12_N3ccc7DD7x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y13pqrEv,_ZTv0_n16_N3ccc7DD7x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y13abcEv,_ZTv0_n20_N3ccc7DD7x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y1E[] = {
  {&(_ZTVN3ccc7DD7x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y1E[];
static VTBL_ENTRY alt_thunk_names846[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y13abcEv,_ZTv0_n20_N3ccc7DD7x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y13abcEv,_ZThn4_N3ccc7DD7x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y13pqrEv,_ZTv0_n16_N3ccc7DD7x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y13pqrEv,_ZThn4_N3ccc7DD7x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y13efgEv,_ZTv0_n12_N3ccc7DD7x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y13efgEv,_ZThn4_N3ccc7DD7x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y1E = {  "_ZN3ccc7DD7x3y1E", // class name
  bases__ZN3ccc7DD7x3y1E, 2,
  &(vtc__ZN3ccc7DD7x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y1E),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  CC7x3y2  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y23pqrEv
  ~CC7x3y2(); // tgen
  CC7x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y2E) C1{ VBC2{ v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y23efgEv");}
void  ccc::CC7x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y23abcEv");}
void  ccc::CC7x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y23pqrEv");}
ccc::CC7x3y2 ::~CC7x3y2(){ note_dtor("_ZN3ccc7CC7x3y2E", this);} // tgen
ccc::CC7x3y2 ::CC7x3y2(){ note_ctor("_ZN3ccc7CC7x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y2E, buf);
    ::ccc::CC7x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y2E);
    dp->::ccc::CC7x3y2::~CC7x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y2E(Test__ZN3ccc7CC7x3y2E, "_ZN3ccc7CC7x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y2C1Ev();
extern void _ZN3ccc7CC7x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y2E[] = {
  NSPAIR(_ZN3ccc7CC7x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y2E[];
extern void _ZN3ccc7CC7x3y23efgEv();
extern void _ZN3ccc7CC7x3y23pqrEv();
extern void _ZN3ccc7CC7x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y23abcEv,_ZTv0_n12_N3ccc7CC7x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y23abcEv,_ZThn4_N3ccc7CC7x3y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y23pqrEv,_ZTv0_n16_N3ccc7CC7x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y23pqrEv,_ZThn4_N3ccc7CC7x3y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y23abcEv,_ZTv0_n12_N3ccc7CC7x3y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y23pqrEv,_ZTv0_n16_N3ccc7CC7x3y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y2E[] = {
  {&(_ZTVN3ccc7CC7x3y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y2E[];
static VTBL_ENTRY alt_thunk_names847[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y23pqrEv,_ZTv0_n16_N3ccc7CC7x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y23pqrEv,_ZThn4_N3ccc7CC7x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y23abcEv,_ZTv0_n12_N3ccc7CC7x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y23abcEv,_ZThn4_N3ccc7CC7x3y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y2E = {  "_ZN3ccc7CC7x3y2E", // class name
  bases__ZN3ccc7CC7x3y2E, 2,
  &(vtc__ZN3ccc7CC7x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y2E),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  DD7x3y2  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD7x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x3y23pqrEv
  ~DD7x3y2(); // tgen
  DD7x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y2E) C1{ VBC2{ v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y23efgEv");}
void  ccc::DD7x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y23abcEv");}
void  ccc::DD7x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y23pqrEv");}
ccc::DD7x3y2 ::~DD7x3y2(){ note_dtor("_ZN3ccc7DD7x3y2E", this);} // tgen
ccc::DD7x3y2 ::DD7x3y2(){ note_ctor("_ZN3ccc7DD7x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y2E, buf);
    ::ccc::DD7x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y2E);
    dp->::ccc::DD7x3y2::~DD7x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y2E(Test__ZN3ccc7DD7x3y2E, "_ZN3ccc7DD7x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y2C1Ev();
extern void _ZN3ccc7DD7x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y2E[] = {
  NSPAIR(_ZN3ccc7DD7x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y2E[];
extern void _ZN3ccc7DD7x3y23abcEv();
extern void _ZN3ccc7DD7x3y23pqrEv();
extern void _ZN3ccc7DD7x3y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y23efgEv,_ZTv0_n12_N3ccc7DD7x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y23efgEv,_ZThn4_N3ccc7DD7x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y23pqrEv,_ZTv0_n16_N3ccc7DD7x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y23pqrEv,_ZThn4_N3ccc7DD7x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y23abcEv,_ZTv0_n20_N3ccc7DD7x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y23abcEv,_ZThn4_N3ccc7DD7x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y23efgEv,_ZTv0_n12_N3ccc7DD7x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y23pqrEv,_ZTv0_n16_N3ccc7DD7x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y23abcEv,_ZTv0_n20_N3ccc7DD7x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y2E[] = {
  {&(_ZTVN3ccc7DD7x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y2E[];
static VTBL_ENTRY alt_thunk_names848[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y23abcEv,_ZTv0_n20_N3ccc7DD7x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y23abcEv,_ZThn4_N3ccc7DD7x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y23pqrEv,_ZTv0_n16_N3ccc7DD7x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y23pqrEv,_ZThn4_N3ccc7DD7x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y23efgEv,_ZTv0_n12_N3ccc7DD7x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y23efgEv,_ZThn4_N3ccc7DD7x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y2E = {  "_ZN3ccc7DD7x3y2E", // class name
  bases__ZN3ccc7DD7x3y2E, 2,
  &(vtc__ZN3ccc7DD7x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y2E),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  CC7x3y3  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x3y33abcEv
  ~CC7x3y3(); // tgen
  CC7x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y3E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y33efgEv");}
void  ccc::CC7x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y33pqrEv");}
void  ccc::CC7x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y33abcEv");}
ccc::CC7x3y3 ::~CC7x3y3(){ note_dtor("_ZN3ccc7CC7x3y3E", this);} // tgen
ccc::CC7x3y3 ::CC7x3y3(){ note_ctor("_ZN3ccc7CC7x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y3E, buf);
    ::ccc::CC7x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y3E);
    dp->::ccc::CC7x3y3::~CC7x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y3E(Test__ZN3ccc7CC7x3y3E, "_ZN3ccc7CC7x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y3C1Ev();
extern void _ZN3ccc7CC7x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y3E[] = {
  NSPAIR(_ZN3ccc7CC7x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y3E[];
extern void _ZN3ccc7CC7x3y33efgEv();
extern void _ZN3ccc7CC7x3y33pqrEv();
extern void _ZN3ccc7CC7x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y33abcEv,_ZTv0_n12_N3ccc7CC7x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y33abcEv,_ZThn4_N3ccc7CC7x3y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y33pqrEv,_ZTv0_n16_N3ccc7CC7x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y33pqrEv,_ZThn4_N3ccc7CC7x3y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y33abcEv,_ZTv0_n12_N3ccc7CC7x3y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y33pqrEv,_ZTv0_n16_N3ccc7CC7x3y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y3E[] = {
  {&(_ZTVN3ccc7CC7x3y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y3E[];
static VTBL_ENTRY alt_thunk_names849[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y33pqrEv,_ZTv0_n16_N3ccc7CC7x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y33pqrEv,_ZThn4_N3ccc7CC7x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y33abcEv,_ZTv0_n12_N3ccc7CC7x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y33abcEv,_ZThn4_N3ccc7CC7x3y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y3E = {  "_ZN3ccc7CC7x3y3E", // class name
  bases__ZN3ccc7CC7x3y3E, 2,
  &(vtc__ZN3ccc7CC7x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y3E),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  DD7x3y3  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD7x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x3y33abcEv
  ~DD7x3y3(); // tgen
  DD7x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y3E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y33efgEv");}
void  ccc::DD7x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y33pqrEv");}
void  ccc::DD7x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y33abcEv");}
ccc::DD7x3y3 ::~DD7x3y3(){ note_dtor("_ZN3ccc7DD7x3y3E", this);} // tgen
ccc::DD7x3y3 ::DD7x3y3(){ note_ctor("_ZN3ccc7DD7x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y3E, buf);
    ::ccc::DD7x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y3E);
    dp->::ccc::DD7x3y3::~DD7x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y3E(Test__ZN3ccc7DD7x3y3E, "_ZN3ccc7DD7x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y3C1Ev();
extern void _ZN3ccc7DD7x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y3E[] = {
  NSPAIR(_ZN3ccc7DD7x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y3E[];
extern void _ZN3ccc7DD7x3y33abcEv();
extern void _ZN3ccc7DD7x3y33pqrEv();
extern void _ZN3ccc7DD7x3y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y33efgEv,_ZTv0_n12_N3ccc7DD7x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y33efgEv,_ZThn4_N3ccc7DD7x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y33pqrEv,_ZTv0_n16_N3ccc7DD7x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y33pqrEv,_ZThn4_N3ccc7DD7x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y33abcEv,_ZTv0_n20_N3ccc7DD7x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y33abcEv,_ZThn4_N3ccc7DD7x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y33efgEv,_ZTv0_n12_N3ccc7DD7x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y33pqrEv,_ZTv0_n16_N3ccc7DD7x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y33abcEv,_ZTv0_n20_N3ccc7DD7x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y3E[] = {
  {&(_ZTVN3ccc7DD7x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y3E[];
static VTBL_ENTRY alt_thunk_names850[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y33abcEv,_ZTv0_n20_N3ccc7DD7x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y33abcEv,_ZThn4_N3ccc7DD7x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y33pqrEv,_ZTv0_n16_N3ccc7DD7x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y33pqrEv,_ZThn4_N3ccc7DD7x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y33efgEv,_ZTv0_n12_N3ccc7DD7x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y33efgEv,_ZThn4_N3ccc7DD7x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y3E = {  "_ZN3ccc7DD7x3y3E", // class name
  bases__ZN3ccc7DD7x3y3E, 2,
  &(vtc__ZN3ccc7DD7x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y3E),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  CC7x3y4  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC7x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x3y43efgEv
  ~CC7x3y4(); // tgen
  CC7x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y4E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y43pqrEv");}
void  ccc::CC7x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y43abcEv");}
void  ccc::CC7x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y43efgEv");}
ccc::CC7x3y4 ::~CC7x3y4(){ note_dtor("_ZN3ccc7CC7x3y4E", this);} // tgen
ccc::CC7x3y4 ::CC7x3y4(){ note_ctor("_ZN3ccc7CC7x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y4E, buf);
    ::ccc::CC7x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y4E);
    dp->::ccc::CC7x3y4::~CC7x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y4E(Test__ZN3ccc7CC7x3y4E, "_ZN3ccc7CC7x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y4C1Ev();
extern void _ZN3ccc7CC7x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y4E[] = {
  NSPAIR(_ZN3ccc7CC7x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y4E[];
extern void _ZN3ccc7CC7x3y43efgEv();
extern void _ZN3ccc7CC7x3y43pqrEv();
extern void _ZN3ccc7CC7x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y43abcEv,_ZTv0_n12_N3ccc7CC7x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y43abcEv,_ZThn4_N3ccc7CC7x3y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y43pqrEv,_ZTv0_n16_N3ccc7CC7x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y43pqrEv,_ZThn4_N3ccc7CC7x3y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y43abcEv,_ZTv0_n12_N3ccc7CC7x3y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y43pqrEv,_ZTv0_n16_N3ccc7CC7x3y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y4E[] = {
  {&(_ZTVN3ccc7CC7x3y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y4E[];
static VTBL_ENTRY alt_thunk_names851[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y43pqrEv,_ZTv0_n16_N3ccc7CC7x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y43pqrEv,_ZThn4_N3ccc7CC7x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y43abcEv,_ZTv0_n12_N3ccc7CC7x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y43abcEv,_ZThn4_N3ccc7CC7x3y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y4E = {  "_ZN3ccc7CC7x3y4E", // class name
  bases__ZN3ccc7CC7x3y4E, 2,
  &(vtc__ZN3ccc7CC7x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y4E),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  DD7x3y4  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD7x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x3y43efgEv
  ~DD7x3y4(); // tgen
  DD7x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y4E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y43pqrEv");}
void  ccc::DD7x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y43abcEv");}
void  ccc::DD7x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y43efgEv");}
ccc::DD7x3y4 ::~DD7x3y4(){ note_dtor("_ZN3ccc7DD7x3y4E", this);} // tgen
ccc::DD7x3y4 ::DD7x3y4(){ note_ctor("_ZN3ccc7DD7x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y4E, buf);
    ::ccc::DD7x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y4E);
    dp->::ccc::DD7x3y4::~DD7x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y4E(Test__ZN3ccc7DD7x3y4E, "_ZN3ccc7DD7x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y4C1Ev();
extern void _ZN3ccc7DD7x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y4E[] = {
  NSPAIR(_ZN3ccc7DD7x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y4E[];
extern void _ZN3ccc7DD7x3y43abcEv();
extern void _ZN3ccc7DD7x3y43pqrEv();
extern void _ZN3ccc7DD7x3y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y43efgEv,_ZTv0_n12_N3ccc7DD7x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y43efgEv,_ZThn4_N3ccc7DD7x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y43pqrEv,_ZTv0_n16_N3ccc7DD7x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y43pqrEv,_ZThn4_N3ccc7DD7x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y43abcEv,_ZTv0_n20_N3ccc7DD7x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y43abcEv,_ZThn4_N3ccc7DD7x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y43efgEv,_ZTv0_n12_N3ccc7DD7x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y43pqrEv,_ZTv0_n16_N3ccc7DD7x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y43abcEv,_ZTv0_n20_N3ccc7DD7x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y4E[] = {
  {&(_ZTVN3ccc7DD7x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y4E[];
static VTBL_ENTRY alt_thunk_names852[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y43abcEv,_ZTv0_n20_N3ccc7DD7x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y43abcEv,_ZThn4_N3ccc7DD7x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y43pqrEv,_ZTv0_n16_N3ccc7DD7x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y43pqrEv,_ZThn4_N3ccc7DD7x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y43efgEv,_ZTv0_n12_N3ccc7DD7x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y43efgEv,_ZThn4_N3ccc7DD7x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y4E = {  "_ZN3ccc7DD7x3y4E", // class name
  bases__ZN3ccc7DD7x3y4E, 2,
  &(vtc__ZN3ccc7DD7x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y4E),3, //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  CC7x3y5  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC7x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x3y53abcEv
  ~CC7x3y5(); // tgen
  CC7x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y5E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y53pqrEv");}
void  ccc::CC7x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y53efgEv");}
void  ccc::CC7x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y53abcEv");}
ccc::CC7x3y5 ::~CC7x3y5(){ note_dtor("_ZN3ccc7CC7x3y5E", this);} // tgen
ccc::CC7x3y5 ::CC7x3y5(){ note_ctor("_ZN3ccc7CC7x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y5E, buf);
    ::ccc::CC7x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y5E);
    dp->::ccc::CC7x3y5::~CC7x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y5E(Test__ZN3ccc7CC7x3y5E, "_ZN3ccc7CC7x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y5C1Ev();
extern void _ZN3ccc7CC7x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y5E[] = {
  NSPAIR(_ZN3ccc7CC7x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y5E[];
extern void _ZN3ccc7CC7x3y53efgEv();
extern void _ZN3ccc7CC7x3y53pqrEv();
extern void _ZN3ccc7CC7x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y53abcEv,_ZTv0_n12_N3ccc7CC7x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y53abcEv,_ZThn4_N3ccc7CC7x3y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y53pqrEv,_ZTv0_n16_N3ccc7CC7x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y53pqrEv,_ZThn4_N3ccc7CC7x3y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y53abcEv,_ZTv0_n12_N3ccc7CC7x3y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y53pqrEv,_ZTv0_n16_N3ccc7CC7x3y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y5E[] = {
  {&(_ZTVN3ccc7CC7x3y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y5E[];
static VTBL_ENTRY alt_thunk_names853[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y53pqrEv,_ZTv0_n16_N3ccc7CC7x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y53pqrEv,_ZThn4_N3ccc7CC7x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y53abcEv,_ZTv0_n12_N3ccc7CC7x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y53abcEv,_ZThn4_N3ccc7CC7x3y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y5E = {  "_ZN3ccc7CC7x3y5E", // class name
  bases__ZN3ccc7CC7x3y5E, 2,
  &(vtc__ZN3ccc7CC7x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y5E),2, //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  DD7x3y5  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD7x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x3y53abcEv
  ~DD7x3y5(); // tgen
  DD7x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y5E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y53pqrEv");}
void  ccc::DD7x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y53efgEv");}
void  ccc::DD7x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y53abcEv");}
ccc::DD7x3y5 ::~DD7x3y5(){ note_dtor("_ZN3ccc7DD7x3y5E", this);} // tgen
ccc::DD7x3y5 ::DD7x3y5(){ note_ctor("_ZN3ccc7DD7x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y5E, buf);
    ::ccc::DD7x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y5E);
    dp->::ccc::DD7x3y5::~DD7x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y5E(Test__ZN3ccc7DD7x3y5E, "_ZN3ccc7DD7x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y5C1Ev();
extern void _ZN3ccc7DD7x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y5E[] = {
  NSPAIR(_ZN3ccc7DD7x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y5E[];
extern void _ZN3ccc7DD7x3y53abcEv();
extern void _ZN3ccc7DD7x3y53pqrEv();
extern void _ZN3ccc7DD7x3y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y53efgEv,_ZTv0_n12_N3ccc7DD7x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y53efgEv,_ZThn4_N3ccc7DD7x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y53pqrEv,_ZTv0_n16_N3ccc7DD7x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y53pqrEv,_ZThn4_N3ccc7DD7x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y53abcEv,_ZTv0_n20_N3ccc7DD7x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y53abcEv,_ZThn4_N3ccc7DD7x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y53efgEv,_ZTv0_n12_N3ccc7DD7x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y53pqrEv,_ZTv0_n16_N3ccc7DD7x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y53abcEv,_ZTv0_n20_N3ccc7DD7x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y5E[] = {
  {&(_ZTVN3ccc7DD7x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y5E[];
static VTBL_ENTRY alt_thunk_names854[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y53abcEv,_ZTv0_n20_N3ccc7DD7x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y53abcEv,_ZThn4_N3ccc7DD7x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y53pqrEv,_ZTv0_n16_N3ccc7DD7x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y53pqrEv,_ZThn4_N3ccc7DD7x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y53efgEv,_ZTv0_n12_N3ccc7DD7x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y53efgEv,_ZThn4_N3ccc7DD7x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y5E = {  "_ZN3ccc7DD7x3y5E", // class name
  bases__ZN3ccc7DD7x3y5E, 2,
  &(vtc__ZN3ccc7DD7x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y5E),3, //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  CC7x3y6  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x3y63efgEv
  ~CC7x3y6(); // tgen
  CC7x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y6E) C1{ VBC2{ v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y63abcEv");}
void  ccc::CC7x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y63efgEv");}
ccc::CC7x3y6 ::~CC7x3y6(){ note_dtor("_ZN3ccc7CC7x3y6E", this);} // tgen
ccc::CC7x3y6 ::CC7x3y6(){ note_ctor("_ZN3ccc7CC7x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y6E, buf);
    ::ccc::CC7x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y6E);
    dp->::ccc::CC7x3y6::~CC7x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y6E(Test__ZN3ccc7CC7x3y6E, "_ZN3ccc7CC7x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y6C1Ev();
extern void _ZN3ccc7CC7x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y6E[] = {
  NSPAIR(_ZN3ccc7CC7x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y6E[];
extern void _ZN3ccc7CC7x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC7x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y63abcEv,_ZTv0_n12_N3ccc7CC7x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y63abcEv,_ZThn4_N3ccc7CC7x3y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y63abcEv,_ZTv0_n12_N3ccc7CC7x3y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y6E[] = {
  {&(_ZTVN3ccc7CC7x3y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y6E[];
static VTBL_ENTRY alt_thunk_names855[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y63abcEv,_ZTv0_n12_N3ccc7CC7x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y63abcEv,_ZThn4_N3ccc7CC7x3y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y6E = {  "_ZN3ccc7CC7x3y6E", // class name
  bases__ZN3ccc7CC7x3y6E, 2,
  &(vtc__ZN3ccc7CC7x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y6E),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  DD7x3y6  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD7x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x3y63efgEv
  ~DD7x3y6(); // tgen
  DD7x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y6E) C1{ VBC2{ v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y63abcEv");}
void  ccc::DD7x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y63efgEv");}
ccc::DD7x3y6 ::~DD7x3y6(){ note_dtor("_ZN3ccc7DD7x3y6E", this);} // tgen
ccc::DD7x3y6 ::DD7x3y6(){ note_ctor("_ZN3ccc7DD7x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y6E, buf);
    ::ccc::DD7x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y6E);
    dp->::ccc::DD7x3y6::~DD7x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y6E(Test__ZN3ccc7DD7x3y6E, "_ZN3ccc7DD7x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y6C1Ev();
extern void _ZN3ccc7DD7x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y6E[] = {
  NSPAIR(_ZN3ccc7DD7x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y6E[];
extern void _ZN3ccc7DD7x3y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x3y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y63efgEv,_ZTv0_n12_N3ccc7DD7x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y63efgEv,_ZThn4_N3ccc7DD7x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y63abcEv,_ZTv0_n20_N3ccc7DD7x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y63abcEv,_ZThn4_N3ccc7DD7x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y63efgEv,_ZTv0_n12_N3ccc7DD7x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y63abcEv,_ZTv0_n20_N3ccc7DD7x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y6E[] = {
  {&(_ZTVN3ccc7DD7x3y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y6E[];
static VTBL_ENTRY alt_thunk_names856[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y63abcEv,_ZTv0_n20_N3ccc7DD7x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y63abcEv,_ZThn4_N3ccc7DD7x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y63efgEv,_ZTv0_n12_N3ccc7DD7x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y63efgEv,_ZThn4_N3ccc7DD7x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y6E = {  "_ZN3ccc7DD7x3y6E", // class name
  bases__ZN3ccc7DD7x3y6E, 2,
  &(vtc__ZN3ccc7DD7x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y6E),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  CC7x3y7  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC7x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y73pqrEv
  ~CC7x3y7(); // tgen
  CC7x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y7E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y73abcEv");}
void  ccc::CC7x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y73pqrEv");}
ccc::CC7x3y7 ::~CC7x3y7(){ note_dtor("_ZN3ccc7CC7x3y7E", this);} // tgen
ccc::CC7x3y7 ::CC7x3y7(){ note_ctor("_ZN3ccc7CC7x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y7E, buf);
    ::ccc::CC7x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y7E);
    dp->::ccc::CC7x3y7::~CC7x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y7E(Test__ZN3ccc7CC7x3y7E, "_ZN3ccc7CC7x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y7C1Ev();
extern void _ZN3ccc7CC7x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y7E[] = {
  NSPAIR(_ZN3ccc7CC7x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC7x3y73pqrEv();
extern void _ZN3ccc7CC7x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y73abcEv,_ZTv0_n12_N3ccc7CC7x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y73abcEv,_ZThn4_N3ccc7CC7x3y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y73pqrEv,_ZTv0_n16_N3ccc7CC7x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y73pqrEv,_ZThn4_N3ccc7CC7x3y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y73abcEv,_ZTv0_n12_N3ccc7CC7x3y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y73pqrEv,_ZTv0_n16_N3ccc7CC7x3y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y7E[] = {
  {&(_ZTVN3ccc7CC7x3y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y7E[];
static VTBL_ENTRY alt_thunk_names857[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y73pqrEv,_ZTv0_n16_N3ccc7CC7x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y73pqrEv,_ZThn4_N3ccc7CC7x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y73abcEv,_ZTv0_n12_N3ccc7CC7x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y73abcEv,_ZThn4_N3ccc7CC7x3y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y7E = {  "_ZN3ccc7CC7x3y7E", // class name
  bases__ZN3ccc7CC7x3y7E, 2,
  &(vtc__ZN3ccc7CC7x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y7E),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  DD7x3y7  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD7x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x3y73pqrEv
  ~DD7x3y7(); // tgen
  DD7x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y7E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y73abcEv");}
void  ccc::DD7x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y73pqrEv");}
ccc::DD7x3y7 ::~DD7x3y7(){ note_dtor("_ZN3ccc7DD7x3y7E", this);} // tgen
ccc::DD7x3y7 ::DD7x3y7(){ note_ctor("_ZN3ccc7DD7x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y7E, buf);
    ::ccc::DD7x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y7E);
    dp->::ccc::DD7x3y7::~DD7x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y7E(Test__ZN3ccc7DD7x3y7E, "_ZN3ccc7DD7x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y7C1Ev();
extern void _ZN3ccc7DD7x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y7E[] = {
  NSPAIR(_ZN3ccc7DD7x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y7E[];
extern void _ZN3ccc7DD7x3y73abcEv();
extern void _ZN3ccc7DD7x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y73pqrEv,_ZTv0_n16_N3ccc7DD7x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y73pqrEv,_ZThn4_N3ccc7DD7x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y73abcEv,_ZTv0_n20_N3ccc7DD7x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y73abcEv,_ZThn4_N3ccc7DD7x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y73pqrEv,_ZTv0_n16_N3ccc7DD7x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y73abcEv,_ZTv0_n20_N3ccc7DD7x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y7E[] = {
  {&(_ZTVN3ccc7DD7x3y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x3y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x3y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y7E[];
static VTBL_ENTRY alt_thunk_names858[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y73abcEv,_ZTv0_n20_N3ccc7DD7x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y73abcEv,_ZThn4_N3ccc7DD7x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y73pqrEv,_ZTv0_n16_N3ccc7DD7x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y73pqrEv,_ZThn4_N3ccc7DD7x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y7E = {  "_ZN3ccc7DD7x3y7E", // class name
  bases__ZN3ccc7DD7x3y7E, 2,
  &(vtc__ZN3ccc7DD7x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y7E),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  CC7x3y8  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x3y83abcEv
  ~CC7x3y8(); // tgen
  CC7x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y8E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y83efgEv");}
void  ccc::CC7x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x3y83abcEv");}
ccc::CC7x3y8 ::~CC7x3y8(){ note_dtor("_ZN3ccc7CC7x3y8E", this);} // tgen
ccc::CC7x3y8 ::CC7x3y8(){ note_ctor("_ZN3ccc7CC7x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y8E, buf);
    ::ccc::CC7x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y8E);
    dp->::ccc::CC7x3y8::~CC7x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y8E(Test__ZN3ccc7CC7x3y8E, "_ZN3ccc7CC7x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y8C1Ev();
extern void _ZN3ccc7CC7x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y8E[] = {
  NSPAIR(_ZN3ccc7CC7x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y8E[];
extern void _ZN3ccc7CC7x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC7x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x3y83abcEv,_ZTv0_n12_N3ccc7CC7x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y83abcEv,_ZThn4_N3ccc7CC7x3y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x3y83abcEv,_ZTv0_n12_N3ccc7CC7x3y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y8E[] = {
  {&(_ZTVN3ccc7CC7x3y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y8E[];
static VTBL_ENTRY alt_thunk_names859[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x3y83abcEv,_ZTv0_n12_N3ccc7CC7x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y83abcEv,_ZThn4_N3ccc7CC7x3y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y8E = {  "_ZN3ccc7CC7x3y8E", // class name
  bases__ZN3ccc7CC7x3y8E, 2,
  &(vtc__ZN3ccc7CC7x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y8E),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  DD7x3y8  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD7x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x3y83abcEv
  ~DD7x3y8(); // tgen
  DD7x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y8E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y83efgEv");}
void  ccc::DD7x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x3y83abcEv");}
ccc::DD7x3y8 ::~DD7x3y8(){ note_dtor("_ZN3ccc7DD7x3y8E", this);} // tgen
ccc::DD7x3y8 ::DD7x3y8(){ note_ctor("_ZN3ccc7DD7x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y8E, buf);
    ::ccc::DD7x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y8E);
    dp->::ccc::DD7x3y8::~DD7x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y8E(Test__ZN3ccc7DD7x3y8E, "_ZN3ccc7DD7x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y8C1Ev();
extern void _ZN3ccc7DD7x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y8E[] = {
  NSPAIR(_ZN3ccc7DD7x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y8E[];
extern void _ZN3ccc7DD7x3y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x3y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y83efgEv,_ZTv0_n12_N3ccc7DD7x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y83efgEv,_ZThn4_N3ccc7DD7x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x3y83abcEv,_ZTv0_n20_N3ccc7DD7x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y83abcEv,_ZThn4_N3ccc7DD7x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y83efgEv,_ZTv0_n12_N3ccc7DD7x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x3y83abcEv,_ZTv0_n20_N3ccc7DD7x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y8E[] = {
  {&(_ZTVN3ccc7DD7x3y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y8E[];
static VTBL_ENTRY alt_thunk_names860[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x3y83abcEv,_ZTv0_n20_N3ccc7DD7x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y83abcEv,_ZThn4_N3ccc7DD7x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y83efgEv,_ZTv0_n12_N3ccc7DD7x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y83efgEv,_ZThn4_N3ccc7DD7x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y8E = {  "_ZN3ccc7DD7x3y8E", // class name
  bases__ZN3ccc7DD7x3y8E, 2,
  &(vtc__ZN3ccc7DD7x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y8E),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  CC7x3y9  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC7x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x3y93pqrEv
  ~CC7x3y9(); // tgen
  CC7x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x3y9E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x3y93efgEv");}
void  ccc::CC7x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x3y93pqrEv");}
ccc::CC7x3y9 ::~CC7x3y9(){ note_dtor("_ZN3ccc7CC7x3y9E", this);} // tgen
ccc::CC7x3y9 ::CC7x3y9(){ note_ctor("_ZN3ccc7CC7x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x3y9E, buf);
    ::ccc::CC7x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x3y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC7x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x3y9E);
    dp->::ccc::CC7x3y9::~CC7x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x3y9E(Test__ZN3ccc7CC7x3y9E, "_ZN3ccc7CC7x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x3y9C1Ev();
extern void _ZN3ccc7CC7x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x3y9E[] = {
  NSPAIR(_ZN3ccc7CC7x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC7x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x3y9E[];
extern void _ZN3ccc7CC7x3y93efgEv();
extern void _ZN3ccc7CC7x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x3y93pqrEv,_ZTv0_n16_N3ccc7CC7x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x3y93pqrEv,_ZThn4_N3ccc7CC7x3y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x3y93pqrEv,_ZTv0_n16_N3ccc7CC7x3y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x3y9E[] = {
  {&(_ZTVN3ccc7CC7x3y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x3y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x3y9E[];
static VTBL_ENTRY alt_thunk_names861[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x3y93pqrEv,_ZTv0_n16_N3ccc7CC7x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x3y93pqrEv,_ZThn4_N3ccc7CC7x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x3y9E = {  "_ZN3ccc7CC7x3y9E", // class name
  bases__ZN3ccc7CC7x3y9E, 2,
  &(vtc__ZN3ccc7CC7x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x3y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x3y9E),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  DD7x3y9  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD7x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x3y93pqrEv
  ~DD7x3y9(); // tgen
  DD7x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x3y9E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x3y93efgEv");}
void  ccc::DD7x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x3y93pqrEv");}
ccc::DD7x3y9 ::~DD7x3y9(){ note_dtor("_ZN3ccc7DD7x3y9E", this);} // tgen
ccc::DD7x3y9 ::DD7x3y9(){ note_ctor("_ZN3ccc7DD7x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x3y9E, buf);
    ::ccc::DD7x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x3y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD7x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x3y9E);
    dp->::ccc::DD7x3y9::~DD7x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x3y9E(Test__ZN3ccc7DD7x3y9E, "_ZN3ccc7DD7x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x3y9C1Ev();
extern void _ZN3ccc7DD7x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x3y9E[] = {
  NSPAIR(_ZN3ccc7DD7x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD7x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x3y93pqrEv();
extern void _ZN3ccc7DD7x3y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x3y93efgEv,_ZTv0_n12_N3ccc7DD7x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y93efgEv,_ZThn4_N3ccc7DD7x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x3y93pqrEv,_ZTv0_n16_N3ccc7DD7x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x3y93pqrEv,_ZThn4_N3ccc7DD7x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x3y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x3y93efgEv,_ZTv0_n12_N3ccc7DD7x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x3y93pqrEv,_ZTv0_n16_N3ccc7DD7x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x3y9E[] = {
  {&(_ZTVN3ccc7DD7x3y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x3y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x3y9E[];
static VTBL_ENTRY alt_thunk_names862[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x3y93pqrEv,_ZTv0_n16_N3ccc7DD7x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y93pqrEv,_ZThn4_N3ccc7DD7x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x3y93efgEv,_ZTv0_n12_N3ccc7DD7x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x3y93efgEv,_ZThn4_N3ccc7DD7x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x3y9E = {  "_ZN3ccc7DD7x3y9E", // class name
  bases__ZN3ccc7DD7x3y9E, 2,
  &(vtc__ZN3ccc7DD7x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x3y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x3y9E),3, //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  CC7x3y10  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC7x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x3y103abcEv
  ~CC7x3y10(); // tgen
  CC7x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y10E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x3y103pqrEv");}
void  ccc::CC7x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x3y103abcEv");}
ccc::CC7x3y10 ::~CC7x3y10(){ note_dtor("_ZN3ccc8CC7x3y10E", this);} // tgen
ccc::CC7x3y10 ::CC7x3y10(){ note_ctor("_ZN3ccc8CC7x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x3y10E, buf);
    ::ccc::CC7x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x3y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC7x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x3y10E);
    dp->::ccc::CC7x3y10::~CC7x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x3y10E(Test__ZN3ccc8CC7x3y10E, "_ZN3ccc8CC7x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x3y10C1Ev();
extern void _ZN3ccc8CC7x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x3y10E[] = {
  NSPAIR(_ZN3ccc8CC7x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC7x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC7x3y103pqrEv();
extern void _ZN3ccc8CC7x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x3y103abcEv,_ZTv0_n12_N3ccc8CC7x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y103abcEv,_ZThn4_N3ccc8CC7x3y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x3y103pqrEv,_ZTv0_n16_N3ccc8CC7x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y103pqrEv,_ZThn4_N3ccc8CC7x3y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x3y103abcEv,_ZTv0_n12_N3ccc8CC7x3y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x3y103pqrEv,_ZTv0_n16_N3ccc8CC7x3y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x3y10E[] = {
  {&(_ZTVN3ccc8CC7x3y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x3y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x3y10E[];
static VTBL_ENTRY alt_thunk_names863[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x3y103pqrEv,_ZTv0_n16_N3ccc8CC7x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x3y103pqrEv,_ZThn4_N3ccc8CC7x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x3y103abcEv,_ZTv0_n12_N3ccc8CC7x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x3y103abcEv,_ZThn4_N3ccc8CC7x3y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x3y10E = {  "_ZN3ccc8CC7x3y10E", // class name
  bases__ZN3ccc8CC7x3y10E, 2,
  &(vtc__ZN3ccc8CC7x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x3y10E),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  DD7x3y10  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD7x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x3y103abcEv
  ~DD7x3y10(); // tgen
  DD7x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x3y10E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x3y103pqrEv");}
void  ccc::DD7x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x3y103abcEv");}
ccc::DD7x3y10 ::~DD7x3y10(){ note_dtor("_ZN3ccc8DD7x3y10E", this);} // tgen
ccc::DD7x3y10 ::DD7x3y10(){ note_ctor("_ZN3ccc8DD7x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x3y10E, buf);
    ::ccc::DD7x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x3y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD7x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x3y10E);
    dp->::ccc::DD7x3y10::~DD7x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x3y10E(Test__ZN3ccc8DD7x3y10E, "_ZN3ccc8DD7x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x3y10C1Ev();
extern void _ZN3ccc8DD7x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x3y10E[] = {
  NSPAIR(_ZN3ccc8DD7x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD7x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y10E[];
extern void _ZN3ccc8DD7x3y103abcEv();
extern void _ZN3ccc8DD7x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x3y103pqrEv,_ZTv0_n16_N3ccc8DD7x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y103pqrEv,_ZThn4_N3ccc8DD7x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x3y103abcEv,_ZTv0_n20_N3ccc8DD7x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y103abcEv,_ZThn4_N3ccc8DD7x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x3y103pqrEv,_ZTv0_n16_N3ccc8DD7x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x3y103abcEv,_ZTv0_n20_N3ccc8DD7x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x3y10E[] = {
  {&(_ZTVN3ccc8DD7x3y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x3y10E[];
static VTBL_ENTRY alt_thunk_names864[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x3y103abcEv,_ZTv0_n20_N3ccc8DD7x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y103abcEv,_ZThn4_N3ccc8DD7x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x3y103pqrEv,_ZTv0_n16_N3ccc8DD7x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y103pqrEv,_ZThn4_N3ccc8DD7x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x3y10E = {  "_ZN3ccc8DD7x3y10E", // class name
  bases__ZN3ccc8DD7x3y10E, 2,
  &(vtc__ZN3ccc8DD7x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x3y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x3y10E),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  CC7x3y11  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC7x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x3y113efgEv
  ~CC7x3y11(); // tgen
  CC7x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y11E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x3y113pqrEv");}
void  ccc::CC7x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x3y113efgEv");}
ccc::CC7x3y11 ::~CC7x3y11(){ note_dtor("_ZN3ccc8CC7x3y11E", this);} // tgen
ccc::CC7x3y11 ::CC7x3y11(){ note_ctor("_ZN3ccc8CC7x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x3y11E, buf);
    ::ccc::CC7x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x3y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC7x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x3y11E);
    dp->::ccc::CC7x3y11::~CC7x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x3y11E(Test__ZN3ccc8CC7x3y11E, "_ZN3ccc8CC7x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x3y11C1Ev();
extern void _ZN3ccc8CC7x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x3y11E[] = {
  NSPAIR(_ZN3ccc8CC7x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC7x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x3y11E[];
extern void _ZN3ccc8CC7x3y113efgEv();
extern void _ZN3ccc8CC7x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x3y113pqrEv,_ZTv0_n16_N3ccc8CC7x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y113pqrEv,_ZThn4_N3ccc8CC7x3y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x3y113pqrEv,_ZTv0_n16_N3ccc8CC7x3y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x3y11E[] = {
  {&(_ZTVN3ccc8CC7x3y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x3y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x3y11E[];
static VTBL_ENTRY alt_thunk_names865[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x3y113pqrEv,_ZTv0_n16_N3ccc8CC7x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x3y113pqrEv,_ZThn4_N3ccc8CC7x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x3y11E = {  "_ZN3ccc8CC7x3y11E", // class name
  bases__ZN3ccc8CC7x3y11E, 2,
  &(vtc__ZN3ccc8CC7x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x3y11E),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  DD7x3y11  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD7x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x3y113efgEv
  ~DD7x3y11(); // tgen
  DD7x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x3y11E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x3y113pqrEv");}
void  ccc::DD7x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x3y113efgEv");}
ccc::DD7x3y11 ::~DD7x3y11(){ note_dtor("_ZN3ccc8DD7x3y11E", this);} // tgen
ccc::DD7x3y11 ::DD7x3y11(){ note_ctor("_ZN3ccc8DD7x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x3y11E, buf);
    ::ccc::DD7x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x3y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD7x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x3y11E);
    dp->::ccc::DD7x3y11::~DD7x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x3y11E(Test__ZN3ccc8DD7x3y11E, "_ZN3ccc8DD7x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x3y11C1Ev();
extern void _ZN3ccc8DD7x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x3y11E[] = {
  NSPAIR(_ZN3ccc8DD7x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD7x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x3y113pqrEv();
extern void _ZN3ccc8DD7x3y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x3y113efgEv,_ZTv0_n12_N3ccc8DD7x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y113efgEv,_ZThn4_N3ccc8DD7x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x3y113pqrEv,_ZTv0_n16_N3ccc8DD7x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y113pqrEv,_ZThn4_N3ccc8DD7x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x3y113efgEv,_ZTv0_n12_N3ccc8DD7x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x3y113pqrEv,_ZTv0_n16_N3ccc8DD7x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x3y11E[] = {
  {&(_ZTVN3ccc8DD7x3y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x3y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x3y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x3y11E[];
static VTBL_ENTRY alt_thunk_names866[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x3y113pqrEv,_ZTv0_n16_N3ccc8DD7x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y113pqrEv,_ZThn4_N3ccc8DD7x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x3y113efgEv,_ZTv0_n12_N3ccc8DD7x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y113efgEv,_ZThn4_N3ccc8DD7x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x3y11E = {  "_ZN3ccc8DD7x3y11E", // class name
  bases__ZN3ccc8DD7x3y11E, 2,
  &(vtc__ZN3ccc8DD7x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x3y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x3y11E),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  CC7x3y12  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC7x3y123abcEv
  ~CC7x3y12(); // tgen
  CC7x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC7x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x3y123abcEv");}
ccc::CC7x3y12 ::~CC7x3y12(){ note_dtor("_ZN3ccc8CC7x3y12E", this);} // tgen
ccc::CC7x3y12 ::CC7x3y12(){ note_ctor("_ZN3ccc8CC7x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x3y12E, buf);
    ::ccc::CC7x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x3y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC7x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x3y12E);
    dp->::ccc::CC7x3y12::~CC7x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x3y12E(Test__ZN3ccc8CC7x3y12E, "_ZN3ccc8CC7x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x3y12C1Ev();
extern void _ZN3ccc8CC7x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x3y12E[] = {
  NSPAIR(_ZN3ccc8CC7x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC7x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC7x3y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x3y123abcEv,_ZTv0_n12_N3ccc8CC7x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y123abcEv,_ZThn4_N3ccc8CC7x3y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x3y123abcEv,_ZTv0_n12_N3ccc8CC7x3y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x3y12E[] = {
  {&(_ZTVN3ccc8CC7x3y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x3y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x3y12E[];
static VTBL_ENTRY alt_thunk_names867[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x3y123abcEv,_ZTv0_n12_N3ccc8CC7x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x3y123abcEv,_ZThn4_N3ccc8CC7x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x3y12E = {  "_ZN3ccc8CC7x3y12E", // class name
  bases__ZN3ccc8CC7x3y12E, 2,
  &(vtc__ZN3ccc8CC7x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x3y12E),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  DD7x3y12  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD7x3y123abcEv
  ~DD7x3y12(); // tgen
  DD7x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x3y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD7x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x3y123abcEv");}
ccc::DD7x3y12 ::~DD7x3y12(){ note_dtor("_ZN3ccc8DD7x3y12E", this);} // tgen
ccc::DD7x3y12 ::DD7x3y12(){ note_ctor("_ZN3ccc8DD7x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x3y12E, buf);
    ::ccc::DD7x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x3y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD7x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x3y12E);
    dp->::ccc::DD7x3y12::~DD7x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x3y12E(Test__ZN3ccc8DD7x3y12E, "_ZN3ccc8DD7x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x3y12C1Ev();
extern void _ZN3ccc8DD7x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x3y12E[] = {
  NSPAIR(_ZN3ccc8DD7x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD7x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y12E[];
extern void _ZN3ccc8DD7x3y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x3y123abcEv,_ZTv0_n20_N3ccc8DD7x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y123abcEv,_ZThn4_N3ccc8DD7x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x3y123abcEv,_ZTv0_n20_N3ccc8DD7x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x3y12E[] = {
  {&(_ZTVN3ccc8DD7x3y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x3y12E[];
static VTBL_ENTRY alt_thunk_names868[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x3y123abcEv,_ZTv0_n20_N3ccc8DD7x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y123abcEv,_ZThn4_N3ccc8DD7x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x3y12E = {  "_ZN3ccc8DD7x3y12E", // class name
  bases__ZN3ccc8DD7x3y12E, 2,
  &(vtc__ZN3ccc8DD7x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x3y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x3y12E),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  CC7x3y13  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC7x3y133efgEv
  ~CC7x3y13(); // tgen
  CC7x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y13E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC7x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x3y133efgEv");}
ccc::CC7x3y13 ::~CC7x3y13(){ note_dtor("_ZN3ccc8CC7x3y13E", this);} // tgen
ccc::CC7x3y13 ::CC7x3y13(){ note_ctor("_ZN3ccc8CC7x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x3y13E, buf);
    ::ccc::CC7x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x3y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC7x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x3y13E);
    dp->::ccc::CC7x3y13::~CC7x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x3y13E(Test__ZN3ccc8CC7x3y13E, "_ZN3ccc8CC7x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x3y13C1Ev();
extern void _ZN3ccc8CC7x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x3y13E[] = {
  NSPAIR(_ZN3ccc8CC7x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC7x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x3y13E[];
extern void _ZN3ccc8CC7x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x3y13E[] = {
  {&(_ZTVN3ccc8CC7x3y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x3y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x3y13E[];
Class_Descriptor cd__ZN3ccc8CC7x3y13E = {  "_ZN3ccc8CC7x3y13E", // class name
  bases__ZN3ccc8CC7x3y13E, 2,
  &(vtc__ZN3ccc8CC7x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x3y13E),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  DD7x3y13  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD7x3y133efgEv
  ~DD7x3y13(); // tgen
  DD7x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x3y13E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD7x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x3y133efgEv");}
ccc::DD7x3y13 ::~DD7x3y13(){ note_dtor("_ZN3ccc8DD7x3y13E", this);} // tgen
ccc::DD7x3y13 ::DD7x3y13(){ note_ctor("_ZN3ccc8DD7x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x3y13E, buf);
    ::ccc::DD7x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x3y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD7x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x3y13E);
    dp->::ccc::DD7x3y13::~DD7x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x3y13E(Test__ZN3ccc8DD7x3y13E, "_ZN3ccc8DD7x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x3y13C1Ev();
extern void _ZN3ccc8DD7x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x3y13E[] = {
  NSPAIR(_ZN3ccc8DD7x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD7x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x3y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x3y133efgEv,_ZTv0_n12_N3ccc8DD7x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y133efgEv,_ZThn4_N3ccc8DD7x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x3y133efgEv,_ZTv0_n12_N3ccc8DD7x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x3y13E[] = {
  {&(_ZTVN3ccc8DD7x3y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x3y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x3y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x3y13E[];
static VTBL_ENTRY alt_thunk_names869[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x3y133efgEv,_ZTv0_n12_N3ccc8DD7x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y133efgEv,_ZThn4_N3ccc8DD7x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x3y13E = {  "_ZN3ccc8DD7x3y13E", // class name
  bases__ZN3ccc8DD7x3y13E, 2,
  &(vtc__ZN3ccc8DD7x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x3y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x3y13E),3, //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  CC7x3y14  : virtual ::ccc::AA7 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC7x3y143pqrEv
  ~CC7x3y14(); // tgen
  CC7x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC7x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x3y143pqrEv");}
ccc::CC7x3y14 ::~CC7x3y14(){ note_dtor("_ZN3ccc8CC7x3y14E", this);} // tgen
ccc::CC7x3y14 ::CC7x3y14(){ note_ctor("_ZN3ccc8CC7x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x3y14E, buf);
    ::ccc::CC7x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x3y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC7x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x3y14E);
    dp->::ccc::CC7x3y14::~CC7x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x3y14E(Test__ZN3ccc8CC7x3y14E, "_ZN3ccc8CC7x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x3y14C1Ev();
extern void _ZN3ccc8CC7x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x3y14E[] = {
  NSPAIR(_ZN3ccc8CC7x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC7x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC7x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x3y143pqrEv,_ZTv0_n16_N3ccc8CC7x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x3y143pqrEv,_ZThn4_N3ccc8CC7x3y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x3y143pqrEv,_ZTv0_n16_N3ccc8CC7x3y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x3y14E[] = {
  {&(_ZTVN3ccc8CC7x3y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x3y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x3y14E[];
static VTBL_ENTRY alt_thunk_names870[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x3y143pqrEv,_ZTv0_n16_N3ccc8CC7x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x3y143pqrEv,_ZThn4_N3ccc8CC7x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x3y14E = {  "_ZN3ccc8CC7x3y14E", // class name
  bases__ZN3ccc8CC7x3y14E, 2,
  &(vtc__ZN3ccc8CC7x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x3y14E),2, //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  DD7x3y14  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD7x3y143pqrEv
  ~DD7x3y14(); // tgen
  DD7x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x3y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD7x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x3y143pqrEv");}
ccc::DD7x3y14 ::~DD7x3y14(){ note_dtor("_ZN3ccc8DD7x3y14E", this);} // tgen
ccc::DD7x3y14 ::DD7x3y14(){ note_ctor("_ZN3ccc8DD7x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x3y14E, buf);
    ::ccc::DD7x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x3y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD7x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x3y14E);
    dp->::ccc::DD7x3y14::~DD7x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x3y14E(Test__ZN3ccc8DD7x3y14E, "_ZN3ccc8DD7x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x3y14C1Ev();
extern void _ZN3ccc8DD7x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x3y14E[] = {
  NSPAIR(_ZN3ccc8DD7x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD7x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x3y143pqrEv,_ZTv0_n16_N3ccc8DD7x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x3y143pqrEv,_ZThn4_N3ccc8DD7x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x3y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x3y143pqrEv,_ZTv0_n16_N3ccc8DD7x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x3y14E[] = {
  {&(_ZTVN3ccc8DD7x3y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x3y14E[];
static VTBL_ENTRY alt_thunk_names871[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x3y143pqrEv,_ZTv0_n16_N3ccc8DD7x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x3y143pqrEv,_ZThn4_N3ccc8DD7x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x3y14E = {  "_ZN3ccc8DD7x3y14E", // class name
  bases__ZN3ccc8DD7x3y14E, 2,
  &(vtc__ZN3ccc8DD7x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x3y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x3y14E),3, //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  CC7x3y15  : virtual ::ccc::AA7 , ::ccc::BB3 {
  ~CC7x3y15(); // tgen
  CC7x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x3y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC7x3y15 ::~CC7x3y15(){ note_dtor("_ZN3ccc8CC7x3y15E", this);} // tgen
ccc::CC7x3y15 ::CC7x3y15(){ note_ctor("_ZN3ccc8CC7x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x3y15E, buf);
    ::ccc::CC7x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x3y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC7x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x3y15E);
    dp->::ccc::CC7x3y15::~CC7x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x3y15E(Test__ZN3ccc8CC7x3y15E, "_ZN3ccc8CC7x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x3y15C1Ev();
extern void _ZN3ccc8CC7x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x3y15E[] = {
  NSPAIR(_ZN3ccc8CC7x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC7x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x3y15E[] = {
  {&(_ZTVN3ccc8CC7x3y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x3y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x3y15E[];
Class_Descriptor cd__ZN3ccc8CC7x3y15E = {  "_ZN3ccc8CC7x3y15E", // class name
  bases__ZN3ccc8CC7x3y15E, 2,
  &(vtc__ZN3ccc8CC7x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x3y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x3y15E),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  DD7x3y15  : virtual ::ccc::AA7 , virtual ::ccc::BB3 {
  ~DD7x3y15(); // tgen
  DD7x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x3y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD7x3y15 ::~DD7x3y15(){ note_dtor("_ZN3ccc8DD7x3y15E", this);} // tgen
ccc::DD7x3y15 ::DD7x3y15(){ note_ctor("_ZN3ccc8DD7x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x3y15E, buf);
    ::ccc::DD7x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x3y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD7x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x3y15E);
    dp->::ccc::DD7x3y15::~DD7x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x3y15E(Test__ZN3ccc8DD7x3y15E, "_ZN3ccc8DD7x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x3y15C1Ev();
extern void _ZN3ccc8DD7x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x3y15E[] = {
  NSPAIR(_ZN3ccc8DD7x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD7x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x3y15E[] = {
  {&(_ZTVN3ccc8DD7x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x3y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x3y15E[];
Class_Descriptor cd__ZN3ccc8DD7x3y15E = {  "_ZN3ccc8DD7x3y15E", // class name
  bases__ZN3ccc8DD7x3y15E, 2,
  &(vtc__ZN3ccc8DD7x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x3y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x3y15E),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  CC7x4y0  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y03pqrEv
  ~CC7x4y0(); // tgen
  CC7x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y0E) C1{ VBC2{ v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y03abcEv");}
void  ccc::CC7x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y03efgEv");}
void  ccc::CC7x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y03pqrEv");}
ccc::CC7x4y0 ::~CC7x4y0(){ note_dtor("_ZN3ccc7CC7x4y0E", this);} // tgen
ccc::CC7x4y0 ::CC7x4y0(){ note_ctor("_ZN3ccc7CC7x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y0E, buf);
    ::ccc::CC7x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y0E);
    dp->::ccc::CC7x4y0::~CC7x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y0E(Test__ZN3ccc7CC7x4y0E, "_ZN3ccc7CC7x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y0C1Ev();
extern void _ZN3ccc7CC7x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y0E[] = {
  NSPAIR(_ZN3ccc7CC7x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y0E[];
extern void _ZN3ccc7CC7x4y03pqrEv();
extern void _ZN3ccc7CC7x4y03abcEv();
extern void _ZN3ccc7CC7x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y03abcEv,_ZTv0_n12_N3ccc7CC7x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y03abcEv,_ZThn4_N3ccc7CC7x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y03pqrEv,_ZTv0_n16_N3ccc7CC7x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y03pqrEv,_ZThn4_N3ccc7CC7x4y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y03abcEv,_ZTv0_n12_N3ccc7CC7x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y03pqrEv,_ZTv0_n16_N3ccc7CC7x4y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y0E[] = {
  {&(_ZTVN3ccc7CC7x4y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y0E[];
static VTBL_ENTRY alt_thunk_names872[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y03pqrEv,_ZTv0_n16_N3ccc7CC7x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y03pqrEv,_ZThn4_N3ccc7CC7x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y03abcEv,_ZTv0_n12_N3ccc7CC7x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y03abcEv,_ZThn4_N3ccc7CC7x4y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y0E = {  "_ZN3ccc7CC7x4y0E", // class name
  bases__ZN3ccc7CC7x4y0E, 2,
  &(vtc__ZN3ccc7CC7x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y0E),2, //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  DD7x4y0  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD7x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x4y03pqrEv
  ~DD7x4y0(); // tgen
  DD7x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y0E) C1{ VBC2{ v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y03abcEv");}
void  ccc::DD7x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y03efgEv");}
void  ccc::DD7x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y03pqrEv");}
ccc::DD7x4y0 ::~DD7x4y0(){ note_dtor("_ZN3ccc7DD7x4y0E", this);} // tgen
ccc::DD7x4y0 ::DD7x4y0(){ note_ctor("_ZN3ccc7DD7x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y0E, buf);
    ::ccc::DD7x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y0E);
    dp->::ccc::DD7x4y0::~DD7x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y0E(Test__ZN3ccc7DD7x4y0E, "_ZN3ccc7DD7x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y0C1Ev();
extern void _ZN3ccc7DD7x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y0E[] = {
  NSPAIR(_ZN3ccc7DD7x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y0E[];
extern void _ZN3ccc7DD7x4y03abcEv();
extern void _ZN3ccc7DD7x4y03pqrEv();
extern void _ZN3ccc7DD7x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y03pqrEv,_ZTv0_n12_N3ccc7DD7x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y03pqrEv,_ZThn4_N3ccc7DD7x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y03abcEv,_ZTv0_n16_N3ccc7DD7x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y03abcEv,_ZThn4_N3ccc7DD7x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y03efgEv,_ZTv0_n20_N3ccc7DD7x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y03efgEv,_ZThn4_N3ccc7DD7x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y03pqrEv,_ZTv0_n12_N3ccc7DD7x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y03abcEv,_ZTv0_n16_N3ccc7DD7x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y03efgEv,_ZTv0_n20_N3ccc7DD7x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y0E[] = {
  {&(_ZTVN3ccc7DD7x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y0E[];
static VTBL_ENTRY alt_thunk_names873[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y03efgEv,_ZTv0_n20_N3ccc7DD7x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y03efgEv,_ZThn4_N3ccc7DD7x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y03abcEv,_ZTv0_n16_N3ccc7DD7x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y03abcEv,_ZThn4_N3ccc7DD7x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y03pqrEv,_ZTv0_n12_N3ccc7DD7x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y03pqrEv,_ZThn4_N3ccc7DD7x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y0E = {  "_ZN3ccc7DD7x4y0E", // class name
  bases__ZN3ccc7DD7x4y0E, 2,
  &(vtc__ZN3ccc7DD7x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y0E),3, //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  CC7x4y1  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x4y13efgEv
  ~CC7x4y1(); // tgen
  CC7x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y1E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y13abcEv");}
void  ccc::CC7x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y13pqrEv");}
void  ccc::CC7x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y13efgEv");}
ccc::CC7x4y1 ::~CC7x4y1(){ note_dtor("_ZN3ccc7CC7x4y1E", this);} // tgen
ccc::CC7x4y1 ::CC7x4y1(){ note_ctor("_ZN3ccc7CC7x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y1E, buf);
    ::ccc::CC7x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y1E);
    dp->::ccc::CC7x4y1::~CC7x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y1E(Test__ZN3ccc7CC7x4y1E, "_ZN3ccc7CC7x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y1C1Ev();
extern void _ZN3ccc7CC7x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y1E[] = {
  NSPAIR(_ZN3ccc7CC7x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y1E[];
extern void _ZN3ccc7CC7x4y13pqrEv();
extern void _ZN3ccc7CC7x4y13abcEv();
extern void _ZN3ccc7CC7x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y13abcEv,_ZTv0_n12_N3ccc7CC7x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y13abcEv,_ZThn4_N3ccc7CC7x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y13pqrEv,_ZTv0_n16_N3ccc7CC7x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y13pqrEv,_ZThn4_N3ccc7CC7x4y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y13abcEv,_ZTv0_n12_N3ccc7CC7x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y13pqrEv,_ZTv0_n16_N3ccc7CC7x4y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y1E[] = {
  {&(_ZTVN3ccc7CC7x4y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y1E[];
static VTBL_ENTRY alt_thunk_names874[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y13pqrEv,_ZTv0_n16_N3ccc7CC7x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y13pqrEv,_ZThn4_N3ccc7CC7x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y13abcEv,_ZTv0_n12_N3ccc7CC7x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y13abcEv,_ZThn4_N3ccc7CC7x4y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y1E = {  "_ZN3ccc7CC7x4y1E", // class name
  bases__ZN3ccc7CC7x4y1E, 2,
  &(vtc__ZN3ccc7CC7x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y1E),2, //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  DD7x4y1  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD7x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x4y13efgEv
  ~DD7x4y1(); // tgen
  DD7x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y1E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y13abcEv");}
void  ccc::DD7x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y13pqrEv");}
void  ccc::DD7x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y13efgEv");}
ccc::DD7x4y1 ::~DD7x4y1(){ note_dtor("_ZN3ccc7DD7x4y1E", this);} // tgen
ccc::DD7x4y1 ::DD7x4y1(){ note_ctor("_ZN3ccc7DD7x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y1E, buf);
    ::ccc::DD7x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y1E);
    dp->::ccc::DD7x4y1::~DD7x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y1E(Test__ZN3ccc7DD7x4y1E, "_ZN3ccc7DD7x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y1C1Ev();
extern void _ZN3ccc7DD7x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y1E[] = {
  NSPAIR(_ZN3ccc7DD7x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y1E[];
extern void _ZN3ccc7DD7x4y13abcEv();
extern void _ZN3ccc7DD7x4y13pqrEv();
extern void _ZN3ccc7DD7x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y13pqrEv,_ZTv0_n12_N3ccc7DD7x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y13pqrEv,_ZThn4_N3ccc7DD7x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y13abcEv,_ZTv0_n16_N3ccc7DD7x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y13abcEv,_ZThn4_N3ccc7DD7x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y13efgEv,_ZTv0_n20_N3ccc7DD7x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y13efgEv,_ZThn4_N3ccc7DD7x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y13pqrEv,_ZTv0_n12_N3ccc7DD7x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y13abcEv,_ZTv0_n16_N3ccc7DD7x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y13efgEv,_ZTv0_n20_N3ccc7DD7x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y1E[] = {
  {&(_ZTVN3ccc7DD7x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y1E[];
static VTBL_ENTRY alt_thunk_names875[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y13efgEv,_ZTv0_n20_N3ccc7DD7x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y13efgEv,_ZThn4_N3ccc7DD7x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y13abcEv,_ZTv0_n16_N3ccc7DD7x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y13abcEv,_ZThn4_N3ccc7DD7x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y13pqrEv,_ZTv0_n12_N3ccc7DD7x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y13pqrEv,_ZThn4_N3ccc7DD7x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y1E = {  "_ZN3ccc7DD7x4y1E", // class name
  bases__ZN3ccc7DD7x4y1E, 2,
  &(vtc__ZN3ccc7DD7x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y1E),3, //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  CC7x4y2  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y23pqrEv
  ~CC7x4y2(); // tgen
  CC7x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y2E) C1{ VBC2{ v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y23efgEv");}
void  ccc::CC7x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y23abcEv");}
void  ccc::CC7x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y23pqrEv");}
ccc::CC7x4y2 ::~CC7x4y2(){ note_dtor("_ZN3ccc7CC7x4y2E", this);} // tgen
ccc::CC7x4y2 ::CC7x4y2(){ note_ctor("_ZN3ccc7CC7x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y2E, buf);
    ::ccc::CC7x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y2E);
    dp->::ccc::CC7x4y2::~CC7x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y2E(Test__ZN3ccc7CC7x4y2E, "_ZN3ccc7CC7x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y2C1Ev();
extern void _ZN3ccc7CC7x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y2E[] = {
  NSPAIR(_ZN3ccc7CC7x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y2E[];
extern void _ZN3ccc7CC7x4y23pqrEv();
extern void _ZN3ccc7CC7x4y23abcEv();
extern void _ZN3ccc7CC7x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y23abcEv,_ZTv0_n12_N3ccc7CC7x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y23abcEv,_ZThn4_N3ccc7CC7x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y23pqrEv,_ZTv0_n16_N3ccc7CC7x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y23pqrEv,_ZThn4_N3ccc7CC7x4y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y23abcEv,_ZTv0_n12_N3ccc7CC7x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y23pqrEv,_ZTv0_n16_N3ccc7CC7x4y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y2E[] = {
  {&(_ZTVN3ccc7CC7x4y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y2E[];
static VTBL_ENTRY alt_thunk_names876[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y23pqrEv,_ZTv0_n16_N3ccc7CC7x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y23pqrEv,_ZThn4_N3ccc7CC7x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y23abcEv,_ZTv0_n12_N3ccc7CC7x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y23abcEv,_ZThn4_N3ccc7CC7x4y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y2E = {  "_ZN3ccc7CC7x4y2E", // class name
  bases__ZN3ccc7CC7x4y2E, 2,
  &(vtc__ZN3ccc7CC7x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y2E),2, //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  DD7x4y2  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD7x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x4y23pqrEv
  ~DD7x4y2(); // tgen
  DD7x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y2E) C1{ VBC2{ v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y23efgEv");}
void  ccc::DD7x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y23abcEv");}
void  ccc::DD7x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y23pqrEv");}
ccc::DD7x4y2 ::~DD7x4y2(){ note_dtor("_ZN3ccc7DD7x4y2E", this);} // tgen
ccc::DD7x4y2 ::DD7x4y2(){ note_ctor("_ZN3ccc7DD7x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y2E, buf);
    ::ccc::DD7x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y2E);
    dp->::ccc::DD7x4y2::~DD7x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y2E(Test__ZN3ccc7DD7x4y2E, "_ZN3ccc7DD7x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y2C1Ev();
extern void _ZN3ccc7DD7x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y2E[] = {
  NSPAIR(_ZN3ccc7DD7x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y2E[];
extern void _ZN3ccc7DD7x4y23abcEv();
extern void _ZN3ccc7DD7x4y23pqrEv();
extern void _ZN3ccc7DD7x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y23pqrEv,_ZTv0_n12_N3ccc7DD7x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y23pqrEv,_ZThn4_N3ccc7DD7x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y23abcEv,_ZTv0_n16_N3ccc7DD7x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y23abcEv,_ZThn4_N3ccc7DD7x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y23efgEv,_ZTv0_n20_N3ccc7DD7x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y23efgEv,_ZThn4_N3ccc7DD7x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y23pqrEv,_ZTv0_n12_N3ccc7DD7x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y23abcEv,_ZTv0_n16_N3ccc7DD7x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y23efgEv,_ZTv0_n20_N3ccc7DD7x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y2E[] = {
  {&(_ZTVN3ccc7DD7x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y2E[];
static VTBL_ENTRY alt_thunk_names877[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y23efgEv,_ZTv0_n20_N3ccc7DD7x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y23efgEv,_ZThn4_N3ccc7DD7x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y23abcEv,_ZTv0_n16_N3ccc7DD7x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y23abcEv,_ZThn4_N3ccc7DD7x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y23pqrEv,_ZTv0_n12_N3ccc7DD7x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y23pqrEv,_ZThn4_N3ccc7DD7x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y2E = {  "_ZN3ccc7DD7x4y2E", // class name
  bases__ZN3ccc7DD7x4y2E, 2,
  &(vtc__ZN3ccc7DD7x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y2E),3, //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  CC7x4y3  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x4y33abcEv
  ~CC7x4y3(); // tgen
  CC7x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y3E) C1{ VBC2{ v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y33efgEv");}
void  ccc::CC7x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y33pqrEv");}
void  ccc::CC7x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y33abcEv");}
ccc::CC7x4y3 ::~CC7x4y3(){ note_dtor("_ZN3ccc7CC7x4y3E", this);} // tgen
ccc::CC7x4y3 ::CC7x4y3(){ note_ctor("_ZN3ccc7CC7x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y3E, buf);
    ::ccc::CC7x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y3E);
    dp->::ccc::CC7x4y3::~CC7x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y3E(Test__ZN3ccc7CC7x4y3E, "_ZN3ccc7CC7x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y3C1Ev();
extern void _ZN3ccc7CC7x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y3E[] = {
  NSPAIR(_ZN3ccc7CC7x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y3E[];
extern void _ZN3ccc7CC7x4y33pqrEv();
extern void _ZN3ccc7CC7x4y33abcEv();
extern void _ZN3ccc7CC7x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y33abcEv,_ZTv0_n12_N3ccc7CC7x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y33abcEv,_ZThn4_N3ccc7CC7x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y33pqrEv,_ZTv0_n16_N3ccc7CC7x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y33pqrEv,_ZThn4_N3ccc7CC7x4y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y33abcEv,_ZTv0_n12_N3ccc7CC7x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y33pqrEv,_ZTv0_n16_N3ccc7CC7x4y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y3E[] = {
  {&(_ZTVN3ccc7CC7x4y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y3E[];
static VTBL_ENTRY alt_thunk_names878[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y33pqrEv,_ZTv0_n16_N3ccc7CC7x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y33pqrEv,_ZThn4_N3ccc7CC7x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y33abcEv,_ZTv0_n12_N3ccc7CC7x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y33abcEv,_ZThn4_N3ccc7CC7x4y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y3E = {  "_ZN3ccc7CC7x4y3E", // class name
  bases__ZN3ccc7CC7x4y3E, 2,
  &(vtc__ZN3ccc7CC7x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y3E),2, //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  DD7x4y3  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD7x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x4y33abcEv
  ~DD7x4y3(); // tgen
  DD7x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y3E) C1{ VBC2{ v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y33efgEv");}
void  ccc::DD7x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y33pqrEv");}
void  ccc::DD7x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y33abcEv");}
ccc::DD7x4y3 ::~DD7x4y3(){ note_dtor("_ZN3ccc7DD7x4y3E", this);} // tgen
ccc::DD7x4y3 ::DD7x4y3(){ note_ctor("_ZN3ccc7DD7x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y3E, buf);
    ::ccc::DD7x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y3E);
    dp->::ccc::DD7x4y3::~DD7x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y3E(Test__ZN3ccc7DD7x4y3E, "_ZN3ccc7DD7x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y3C1Ev();
extern void _ZN3ccc7DD7x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y3E[] = {
  NSPAIR(_ZN3ccc7DD7x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y3E[];
extern void _ZN3ccc7DD7x4y33abcEv();
extern void _ZN3ccc7DD7x4y33pqrEv();
extern void _ZN3ccc7DD7x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y33pqrEv,_ZTv0_n12_N3ccc7DD7x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y33pqrEv,_ZThn4_N3ccc7DD7x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y33abcEv,_ZTv0_n16_N3ccc7DD7x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y33abcEv,_ZThn4_N3ccc7DD7x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y33efgEv,_ZTv0_n20_N3ccc7DD7x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y33efgEv,_ZThn4_N3ccc7DD7x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y33pqrEv,_ZTv0_n12_N3ccc7DD7x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y33abcEv,_ZTv0_n16_N3ccc7DD7x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y33efgEv,_ZTv0_n20_N3ccc7DD7x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y3E[] = {
  {&(_ZTVN3ccc7DD7x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y3E[];
static VTBL_ENTRY alt_thunk_names879[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y33efgEv,_ZTv0_n20_N3ccc7DD7x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y33efgEv,_ZThn4_N3ccc7DD7x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y33abcEv,_ZTv0_n16_N3ccc7DD7x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y33abcEv,_ZThn4_N3ccc7DD7x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y33pqrEv,_ZTv0_n12_N3ccc7DD7x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y33pqrEv,_ZThn4_N3ccc7DD7x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y3E = {  "_ZN3ccc7DD7x4y3E", // class name
  bases__ZN3ccc7DD7x4y3E, 2,
  &(vtc__ZN3ccc7DD7x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y3E),3, //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  CC7x4y4  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC7x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x4y43efgEv
  ~CC7x4y4(); // tgen
  CC7x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y4E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y43pqrEv");}
void  ccc::CC7x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y43abcEv");}
void  ccc::CC7x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y43efgEv");}
ccc::CC7x4y4 ::~CC7x4y4(){ note_dtor("_ZN3ccc7CC7x4y4E", this);} // tgen
ccc::CC7x4y4 ::CC7x4y4(){ note_ctor("_ZN3ccc7CC7x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y4E, buf);
    ::ccc::CC7x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y4E);
    dp->::ccc::CC7x4y4::~CC7x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y4E(Test__ZN3ccc7CC7x4y4E, "_ZN3ccc7CC7x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y4C1Ev();
extern void _ZN3ccc7CC7x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y4E[] = {
  NSPAIR(_ZN3ccc7CC7x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y4E[];
extern void _ZN3ccc7CC7x4y43pqrEv();
extern void _ZN3ccc7CC7x4y43abcEv();
extern void _ZN3ccc7CC7x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y43abcEv,_ZTv0_n12_N3ccc7CC7x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y43abcEv,_ZThn4_N3ccc7CC7x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y43pqrEv,_ZTv0_n16_N3ccc7CC7x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y43pqrEv,_ZThn4_N3ccc7CC7x4y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y43abcEv,_ZTv0_n12_N3ccc7CC7x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y43pqrEv,_ZTv0_n16_N3ccc7CC7x4y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y4E[] = {
  {&(_ZTVN3ccc7CC7x4y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y4E[];
static VTBL_ENTRY alt_thunk_names880[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y43pqrEv,_ZTv0_n16_N3ccc7CC7x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y43pqrEv,_ZThn4_N3ccc7CC7x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y43abcEv,_ZTv0_n12_N3ccc7CC7x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y43abcEv,_ZThn4_N3ccc7CC7x4y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y4E = {  "_ZN3ccc7CC7x4y4E", // class name
  bases__ZN3ccc7CC7x4y4E, 2,
  &(vtc__ZN3ccc7CC7x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y4E),2, //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  DD7x4y4  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD7x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x4y43efgEv
  ~DD7x4y4(); // tgen
  DD7x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y4E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y43pqrEv");}
void  ccc::DD7x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y43abcEv");}
void  ccc::DD7x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y43efgEv");}
ccc::DD7x4y4 ::~DD7x4y4(){ note_dtor("_ZN3ccc7DD7x4y4E", this);} // tgen
ccc::DD7x4y4 ::DD7x4y4(){ note_ctor("_ZN3ccc7DD7x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y4E, buf);
    ::ccc::DD7x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y4E);
    dp->::ccc::DD7x4y4::~DD7x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y4E(Test__ZN3ccc7DD7x4y4E, "_ZN3ccc7DD7x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y4C1Ev();
extern void _ZN3ccc7DD7x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y4E[] = {
  NSPAIR(_ZN3ccc7DD7x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y4E[];
extern void _ZN3ccc7DD7x4y43abcEv();
extern void _ZN3ccc7DD7x4y43pqrEv();
extern void _ZN3ccc7DD7x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y43pqrEv,_ZTv0_n12_N3ccc7DD7x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y43pqrEv,_ZThn4_N3ccc7DD7x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y43abcEv,_ZTv0_n16_N3ccc7DD7x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y43abcEv,_ZThn4_N3ccc7DD7x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y43efgEv,_ZTv0_n20_N3ccc7DD7x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y43efgEv,_ZThn4_N3ccc7DD7x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y43pqrEv,_ZTv0_n12_N3ccc7DD7x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y43abcEv,_ZTv0_n16_N3ccc7DD7x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y43efgEv,_ZTv0_n20_N3ccc7DD7x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y4E[] = {
  {&(_ZTVN3ccc7DD7x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y4E[];
static VTBL_ENTRY alt_thunk_names881[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y43efgEv,_ZTv0_n20_N3ccc7DD7x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y43efgEv,_ZThn4_N3ccc7DD7x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y43abcEv,_ZTv0_n16_N3ccc7DD7x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y43abcEv,_ZThn4_N3ccc7DD7x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y43pqrEv,_ZTv0_n12_N3ccc7DD7x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y43pqrEv,_ZThn4_N3ccc7DD7x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y4E = {  "_ZN3ccc7DD7x4y4E", // class name
  bases__ZN3ccc7DD7x4y4E, 2,
  &(vtc__ZN3ccc7DD7x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y4E),3, //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  CC7x4y5  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC7x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x4y53abcEv
  ~CC7x4y5(); // tgen
  CC7x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y5E) C1{ VBC2{ v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y53pqrEv");}
void  ccc::CC7x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y53efgEv");}
void  ccc::CC7x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y53abcEv");}
ccc::CC7x4y5 ::~CC7x4y5(){ note_dtor("_ZN3ccc7CC7x4y5E", this);} // tgen
ccc::CC7x4y5 ::CC7x4y5(){ note_ctor("_ZN3ccc7CC7x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y5E, buf);
    ::ccc::CC7x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y5E);
    dp->::ccc::CC7x4y5::~CC7x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y5E(Test__ZN3ccc7CC7x4y5E, "_ZN3ccc7CC7x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y5C1Ev();
extern void _ZN3ccc7CC7x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y5E[] = {
  NSPAIR(_ZN3ccc7CC7x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y5E[];
extern void _ZN3ccc7CC7x4y53pqrEv();
extern void _ZN3ccc7CC7x4y53abcEv();
extern void _ZN3ccc7CC7x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y53abcEv,_ZTv0_n12_N3ccc7CC7x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y53abcEv,_ZThn4_N3ccc7CC7x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y53pqrEv,_ZTv0_n16_N3ccc7CC7x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y53pqrEv,_ZThn4_N3ccc7CC7x4y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y53abcEv,_ZTv0_n12_N3ccc7CC7x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y53pqrEv,_ZTv0_n16_N3ccc7CC7x4y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y5E[] = {
  {&(_ZTVN3ccc7CC7x4y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y5E[];
static VTBL_ENTRY alt_thunk_names882[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y53pqrEv,_ZTv0_n16_N3ccc7CC7x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y53pqrEv,_ZThn4_N3ccc7CC7x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y53abcEv,_ZTv0_n12_N3ccc7CC7x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y53abcEv,_ZThn4_N3ccc7CC7x4y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y5E = {  "_ZN3ccc7CC7x4y5E", // class name
  bases__ZN3ccc7CC7x4y5E, 2,
  &(vtc__ZN3ccc7CC7x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y5E),2, //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  DD7x4y5  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD7x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x4y53abcEv
  ~DD7x4y5(); // tgen
  DD7x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y5E) C1{ VBC2{ v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y53pqrEv");}
void  ccc::DD7x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y53efgEv");}
void  ccc::DD7x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y53abcEv");}
ccc::DD7x4y5 ::~DD7x4y5(){ note_dtor("_ZN3ccc7DD7x4y5E", this);} // tgen
ccc::DD7x4y5 ::DD7x4y5(){ note_ctor("_ZN3ccc7DD7x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y5E, buf);
    ::ccc::DD7x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y5E);
    dp->::ccc::DD7x4y5::~DD7x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y5E(Test__ZN3ccc7DD7x4y5E, "_ZN3ccc7DD7x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y5C1Ev();
extern void _ZN3ccc7DD7x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y5E[] = {
  NSPAIR(_ZN3ccc7DD7x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y5E[];
extern void _ZN3ccc7DD7x4y53abcEv();
extern void _ZN3ccc7DD7x4y53pqrEv();
extern void _ZN3ccc7DD7x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y53pqrEv,_ZTv0_n12_N3ccc7DD7x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y53pqrEv,_ZThn4_N3ccc7DD7x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y53abcEv,_ZTv0_n16_N3ccc7DD7x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y53abcEv,_ZThn4_N3ccc7DD7x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y53efgEv,_ZTv0_n20_N3ccc7DD7x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y53efgEv,_ZThn4_N3ccc7DD7x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y53pqrEv,_ZTv0_n12_N3ccc7DD7x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y53abcEv,_ZTv0_n16_N3ccc7DD7x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y53efgEv,_ZTv0_n20_N3ccc7DD7x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y5E[] = {
  {&(_ZTVN3ccc7DD7x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y5E[];
static VTBL_ENTRY alt_thunk_names883[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y53efgEv,_ZTv0_n20_N3ccc7DD7x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y53efgEv,_ZThn4_N3ccc7DD7x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y53abcEv,_ZTv0_n16_N3ccc7DD7x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y53abcEv,_ZThn4_N3ccc7DD7x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y53pqrEv,_ZTv0_n12_N3ccc7DD7x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y53pqrEv,_ZThn4_N3ccc7DD7x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y5E = {  "_ZN3ccc7DD7x4y5E", // class name
  bases__ZN3ccc7DD7x4y5E, 2,
  &(vtc__ZN3ccc7DD7x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y5E),3, //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  CC7x4y6  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x4y63efgEv
  ~CC7x4y6(); // tgen
  CC7x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y6E) C1{ VBC2{ v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y63abcEv");}
void  ccc::CC7x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y63efgEv");}
ccc::CC7x4y6 ::~CC7x4y6(){ note_dtor("_ZN3ccc7CC7x4y6E", this);} // tgen
ccc::CC7x4y6 ::CC7x4y6(){ note_ctor("_ZN3ccc7CC7x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y6E, buf);
    ::ccc::CC7x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y6E);
    dp->::ccc::CC7x4y6::~CC7x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y6E(Test__ZN3ccc7CC7x4y6E, "_ZN3ccc7CC7x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y6C1Ev();
extern void _ZN3ccc7CC7x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y6E[] = {
  NSPAIR(_ZN3ccc7CC7x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC7x4y63abcEv();
extern void _ZN3ccc7CC7x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y63abcEv,_ZTv0_n12_N3ccc7CC7x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y63abcEv,_ZThn4_N3ccc7CC7x4y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y63abcEv,_ZTv0_n12_N3ccc7CC7x4y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y6E[] = {
  {&(_ZTVN3ccc7CC7x4y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y6E[];
static VTBL_ENTRY alt_thunk_names884[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y63abcEv,_ZTv0_n12_N3ccc7CC7x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y63abcEv,_ZThn4_N3ccc7CC7x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y6E = {  "_ZN3ccc7CC7x4y6E", // class name
  bases__ZN3ccc7CC7x4y6E, 2,
  &(vtc__ZN3ccc7CC7x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y6E),2, //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  DD7x4y6  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD7x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x4y63efgEv
  ~DD7x4y6(); // tgen
  DD7x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y6E) C1{ VBC2{ v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y63abcEv");}
void  ccc::DD7x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y63efgEv");}
ccc::DD7x4y6 ::~DD7x4y6(){ note_dtor("_ZN3ccc7DD7x4y6E", this);} // tgen
ccc::DD7x4y6 ::DD7x4y6(){ note_ctor("_ZN3ccc7DD7x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y6E, buf);
    ::ccc::DD7x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y6E);
    dp->::ccc::DD7x4y6::~DD7x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y6E(Test__ZN3ccc7DD7x4y6E, "_ZN3ccc7DD7x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y6C1Ev();
extern void _ZN3ccc7DD7x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y6E[] = {
  NSPAIR(_ZN3ccc7DD7x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y6E[];
extern void _ZN3ccc7DD7x4y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y63abcEv,_ZTv0_n16_N3ccc7DD7x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y63abcEv,_ZThn4_N3ccc7DD7x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y63efgEv,_ZTv0_n20_N3ccc7DD7x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y63efgEv,_ZThn4_N3ccc7DD7x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y63abcEv,_ZTv0_n16_N3ccc7DD7x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y63efgEv,_ZTv0_n20_N3ccc7DD7x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y6E[] = {
  {&(_ZTVN3ccc7DD7x4y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y6E[];
static VTBL_ENTRY alt_thunk_names885[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y63efgEv,_ZTv0_n20_N3ccc7DD7x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y63efgEv,_ZThn4_N3ccc7DD7x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y63abcEv,_ZTv0_n16_N3ccc7DD7x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y63abcEv,_ZThn4_N3ccc7DD7x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y6E = {  "_ZN3ccc7DD7x4y6E", // class name
  bases__ZN3ccc7DD7x4y6E, 2,
  &(vtc__ZN3ccc7DD7x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y6E),3, //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  CC7x4y7  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC7x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y73pqrEv
  ~CC7x4y7(); // tgen
  CC7x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y7E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y73abcEv");}
void  ccc::CC7x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y73pqrEv");}
ccc::CC7x4y7 ::~CC7x4y7(){ note_dtor("_ZN3ccc7CC7x4y7E", this);} // tgen
ccc::CC7x4y7 ::CC7x4y7(){ note_ctor("_ZN3ccc7CC7x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y7E, buf);
    ::ccc::CC7x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y7E);
    dp->::ccc::CC7x4y7::~CC7x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y7E(Test__ZN3ccc7CC7x4y7E, "_ZN3ccc7CC7x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y7C1Ev();
extern void _ZN3ccc7CC7x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y7E[] = {
  NSPAIR(_ZN3ccc7CC7x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y7E[];
extern void _ZN3ccc7CC7x4y73pqrEv();
extern void _ZN3ccc7CC7x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y73abcEv,_ZTv0_n12_N3ccc7CC7x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y73abcEv,_ZThn4_N3ccc7CC7x4y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y73pqrEv,_ZTv0_n16_N3ccc7CC7x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y73pqrEv,_ZThn4_N3ccc7CC7x4y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y73abcEv,_ZTv0_n12_N3ccc7CC7x4y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y73pqrEv,_ZTv0_n16_N3ccc7CC7x4y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y7E[] = {
  {&(_ZTVN3ccc7CC7x4y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y7E[];
static VTBL_ENTRY alt_thunk_names886[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y73pqrEv,_ZTv0_n16_N3ccc7CC7x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y73pqrEv,_ZThn4_N3ccc7CC7x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y73abcEv,_ZTv0_n12_N3ccc7CC7x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y73abcEv,_ZThn4_N3ccc7CC7x4y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y7E = {  "_ZN3ccc7CC7x4y7E", // class name
  bases__ZN3ccc7CC7x4y7E, 2,
  &(vtc__ZN3ccc7CC7x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y7E),2, //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  DD7x4y7  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD7x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x4y73pqrEv
  ~DD7x4y7(); // tgen
  DD7x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y7E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y73abcEv");}
void  ccc::DD7x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y73pqrEv");}
ccc::DD7x4y7 ::~DD7x4y7(){ note_dtor("_ZN3ccc7DD7x4y7E", this);} // tgen
ccc::DD7x4y7 ::DD7x4y7(){ note_ctor("_ZN3ccc7DD7x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y7E, buf);
    ::ccc::DD7x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y7E);
    dp->::ccc::DD7x4y7::~DD7x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y7E(Test__ZN3ccc7DD7x4y7E, "_ZN3ccc7DD7x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y7C1Ev();
extern void _ZN3ccc7DD7x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y7E[] = {
  NSPAIR(_ZN3ccc7DD7x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y7E[];
extern void _ZN3ccc7DD7x4y73abcEv();
extern void _ZN3ccc7DD7x4y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y73pqrEv,_ZTv0_n12_N3ccc7DD7x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y73pqrEv,_ZThn4_N3ccc7DD7x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y73abcEv,_ZTv0_n16_N3ccc7DD7x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y73abcEv,_ZThn4_N3ccc7DD7x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y73pqrEv,_ZTv0_n12_N3ccc7DD7x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y73abcEv,_ZTv0_n16_N3ccc7DD7x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y7E[] = {
  {&(_ZTVN3ccc7DD7x4y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x4y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x4y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y7E[];
static VTBL_ENTRY alt_thunk_names887[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y73abcEv,_ZTv0_n16_N3ccc7DD7x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y73abcEv,_ZThn4_N3ccc7DD7x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y73pqrEv,_ZTv0_n12_N3ccc7DD7x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y73pqrEv,_ZThn4_N3ccc7DD7x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y7E = {  "_ZN3ccc7DD7x4y7E", // class name
  bases__ZN3ccc7DD7x4y7E, 2,
  &(vtc__ZN3ccc7DD7x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y7E),3, //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  CC7x4y8  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x4y83abcEv
  ~CC7x4y8(); // tgen
  CC7x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y8E) C1{ VBC2{ v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y83efgEv");}
void  ccc::CC7x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x4y83abcEv");}
ccc::CC7x4y8 ::~CC7x4y8(){ note_dtor("_ZN3ccc7CC7x4y8E", this);} // tgen
ccc::CC7x4y8 ::CC7x4y8(){ note_ctor("_ZN3ccc7CC7x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y8E, buf);
    ::ccc::CC7x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y8E);
    dp->::ccc::CC7x4y8::~CC7x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y8E(Test__ZN3ccc7CC7x4y8E, "_ZN3ccc7CC7x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y8C1Ev();
extern void _ZN3ccc7CC7x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y8E[] = {
  NSPAIR(_ZN3ccc7CC7x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC7x4y83abcEv();
extern void _ZN3ccc7CC7x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x4y83abcEv,_ZTv0_n12_N3ccc7CC7x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y83abcEv,_ZThn4_N3ccc7CC7x4y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x4y83abcEv,_ZTv0_n12_N3ccc7CC7x4y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y8E[] = {
  {&(_ZTVN3ccc7CC7x4y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y8E[];
static VTBL_ENTRY alt_thunk_names888[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x4y83abcEv,_ZTv0_n12_N3ccc7CC7x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y83abcEv,_ZThn4_N3ccc7CC7x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y8E = {  "_ZN3ccc7CC7x4y8E", // class name
  bases__ZN3ccc7CC7x4y8E, 2,
  &(vtc__ZN3ccc7CC7x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y8E),2, //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  DD7x4y8  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD7x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x4y83abcEv
  ~DD7x4y8(); // tgen
  DD7x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y8E) C1{ VBC2{ v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y83efgEv");}
void  ccc::DD7x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x4y83abcEv");}
ccc::DD7x4y8 ::~DD7x4y8(){ note_dtor("_ZN3ccc7DD7x4y8E", this);} // tgen
ccc::DD7x4y8 ::DD7x4y8(){ note_ctor("_ZN3ccc7DD7x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y8E, buf);
    ::ccc::DD7x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y8E);
    dp->::ccc::DD7x4y8::~DD7x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y8E(Test__ZN3ccc7DD7x4y8E, "_ZN3ccc7DD7x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y8C1Ev();
extern void _ZN3ccc7DD7x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y8E[] = {
  NSPAIR(_ZN3ccc7DD7x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y8E[];
extern void _ZN3ccc7DD7x4y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x4y83abcEv,_ZTv0_n16_N3ccc7DD7x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y83abcEv,_ZThn4_N3ccc7DD7x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y83efgEv,_ZTv0_n20_N3ccc7DD7x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y83efgEv,_ZThn4_N3ccc7DD7x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x4y83abcEv,_ZTv0_n16_N3ccc7DD7x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y83efgEv,_ZTv0_n20_N3ccc7DD7x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y8E[] = {
  {&(_ZTVN3ccc7DD7x4y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y8E[];
static VTBL_ENTRY alt_thunk_names889[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y83efgEv,_ZTv0_n20_N3ccc7DD7x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y83efgEv,_ZThn4_N3ccc7DD7x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x4y83abcEv,_ZTv0_n16_N3ccc7DD7x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y83abcEv,_ZThn4_N3ccc7DD7x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y8E = {  "_ZN3ccc7DD7x4y8E", // class name
  bases__ZN3ccc7DD7x4y8E, 2,
  &(vtc__ZN3ccc7DD7x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y8E),3, //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  CC7x4y9  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC7x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x4y93pqrEv
  ~CC7x4y9(); // tgen
  CC7x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x4y9E) C1{ VBC2{ v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x4y93efgEv");}
void  ccc::CC7x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x4y93pqrEv");}
ccc::CC7x4y9 ::~CC7x4y9(){ note_dtor("_ZN3ccc7CC7x4y9E", this);} // tgen
ccc::CC7x4y9 ::CC7x4y9(){ note_ctor("_ZN3ccc7CC7x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x4y9E, buf);
    ::ccc::CC7x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x4y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC7x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x4y9E);
    dp->::ccc::CC7x4y9::~CC7x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x4y9E(Test__ZN3ccc7CC7x4y9E, "_ZN3ccc7CC7x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x4y9C1Ev();
extern void _ZN3ccc7CC7x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x4y9E[] = {
  NSPAIR(_ZN3ccc7CC7x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC7x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x4y9E[];
extern void _ZN3ccc7CC7x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC7x4y93efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x4y93pqrEv,_ZTv0_n16_N3ccc7CC7x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x4y93pqrEv,_ZThn4_N3ccc7CC7x4y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x4y93pqrEv,_ZTv0_n16_N3ccc7CC7x4y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x4y9E[] = {
  {&(_ZTVN3ccc7CC7x4y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x4y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x4y9E[];
static VTBL_ENTRY alt_thunk_names890[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x4y93pqrEv,_ZTv0_n16_N3ccc7CC7x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x4y93pqrEv,_ZThn4_N3ccc7CC7x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x4y9E = {  "_ZN3ccc7CC7x4y9E", // class name
  bases__ZN3ccc7CC7x4y9E, 2,
  &(vtc__ZN3ccc7CC7x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x4y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x4y9E),2, //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  DD7x4y9  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD7x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x4y93pqrEv
  ~DD7x4y9(); // tgen
  DD7x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x4y9E) C1{ VBC2{ v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x4y93efgEv");}
void  ccc::DD7x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x4y93pqrEv");}
ccc::DD7x4y9 ::~DD7x4y9(){ note_dtor("_ZN3ccc7DD7x4y9E", this);} // tgen
ccc::DD7x4y9 ::DD7x4y9(){ note_ctor("_ZN3ccc7DD7x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x4y9E, buf);
    ::ccc::DD7x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x4y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD7x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x4y9E);
    dp->::ccc::DD7x4y9::~DD7x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x4y9E(Test__ZN3ccc7DD7x4y9E, "_ZN3ccc7DD7x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x4y9C1Ev();
extern void _ZN3ccc7DD7x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x4y9E[] = {
  NSPAIR(_ZN3ccc7DD7x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD7x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x4y93pqrEv();
extern void _ZN3ccc7DD7x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x4y93pqrEv,_ZTv0_n12_N3ccc7DD7x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y93pqrEv,_ZThn4_N3ccc7DD7x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x4y93efgEv,_ZTv0_n20_N3ccc7DD7x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x4y93efgEv,_ZThn4_N3ccc7DD7x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x4y93pqrEv,_ZTv0_n12_N3ccc7DD7x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x4y93efgEv,_ZTv0_n20_N3ccc7DD7x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x4y9E[] = {
  {&(_ZTVN3ccc7DD7x4y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x4y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x4y9E[];
static VTBL_ENTRY alt_thunk_names891[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x4y93efgEv,_ZTv0_n20_N3ccc7DD7x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y93efgEv,_ZThn4_N3ccc7DD7x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x4y93pqrEv,_ZTv0_n12_N3ccc7DD7x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x4y93pqrEv,_ZThn4_N3ccc7DD7x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x4y9E = {  "_ZN3ccc7DD7x4y9E", // class name
  bases__ZN3ccc7DD7x4y9E, 2,
  &(vtc__ZN3ccc7DD7x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x4y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x4y9E),3, //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  CC7x4y10  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC7x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x4y103abcEv
  ~CC7x4y10(); // tgen
  CC7x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y10E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x4y103pqrEv");}
void  ccc::CC7x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x4y103abcEv");}
ccc::CC7x4y10 ::~CC7x4y10(){ note_dtor("_ZN3ccc8CC7x4y10E", this);} // tgen
ccc::CC7x4y10 ::CC7x4y10(){ note_ctor("_ZN3ccc8CC7x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x4y10E, buf);
    ::ccc::CC7x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x4y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC7x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x4y10E);
    dp->::ccc::CC7x4y10::~CC7x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x4y10E(Test__ZN3ccc8CC7x4y10E, "_ZN3ccc8CC7x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x4y10C1Ev();
extern void _ZN3ccc8CC7x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x4y10E[] = {
  NSPAIR(_ZN3ccc8CC7x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC7x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x4y10E[];
extern void _ZN3ccc8CC7x4y103pqrEv();
extern void _ZN3ccc8CC7x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x4y103abcEv,_ZTv0_n12_N3ccc8CC7x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y103abcEv,_ZThn4_N3ccc8CC7x4y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x4y103pqrEv,_ZTv0_n16_N3ccc8CC7x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y103pqrEv,_ZThn4_N3ccc8CC7x4y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x4y103abcEv,_ZTv0_n12_N3ccc8CC7x4y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x4y103pqrEv,_ZTv0_n16_N3ccc8CC7x4y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x4y10E[] = {
  {&(_ZTVN3ccc8CC7x4y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x4y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x4y10E[];
static VTBL_ENTRY alt_thunk_names892[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x4y103pqrEv,_ZTv0_n16_N3ccc8CC7x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x4y103pqrEv,_ZThn4_N3ccc8CC7x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x4y103abcEv,_ZTv0_n12_N3ccc8CC7x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x4y103abcEv,_ZThn4_N3ccc8CC7x4y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x4y10E = {  "_ZN3ccc8CC7x4y10E", // class name
  bases__ZN3ccc8CC7x4y10E, 2,
  &(vtc__ZN3ccc8CC7x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x4y10E),2, //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  DD7x4y10  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD7x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x4y103abcEv
  ~DD7x4y10(); // tgen
  DD7x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x4y10E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x4y103pqrEv");}
void  ccc::DD7x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x4y103abcEv");}
ccc::DD7x4y10 ::~DD7x4y10(){ note_dtor("_ZN3ccc8DD7x4y10E", this);} // tgen
ccc::DD7x4y10 ::DD7x4y10(){ note_ctor("_ZN3ccc8DD7x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x4y10E, buf);
    ::ccc::DD7x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x4y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD7x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x4y10E);
    dp->::ccc::DD7x4y10::~DD7x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x4y10E(Test__ZN3ccc8DD7x4y10E, "_ZN3ccc8DD7x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x4y10C1Ev();
extern void _ZN3ccc8DD7x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x4y10E[] = {
  NSPAIR(_ZN3ccc8DD7x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD7x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y10E[];
extern void _ZN3ccc8DD7x4y103abcEv();
extern void _ZN3ccc8DD7x4y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x4y103pqrEv,_ZTv0_n12_N3ccc8DD7x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y103pqrEv,_ZThn4_N3ccc8DD7x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x4y103abcEv,_ZTv0_n16_N3ccc8DD7x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y103abcEv,_ZThn4_N3ccc8DD7x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x4y103pqrEv,_ZTv0_n12_N3ccc8DD7x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x4y103abcEv,_ZTv0_n16_N3ccc8DD7x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x4y10E[] = {
  {&(_ZTVN3ccc8DD7x4y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x4y10E[];
static VTBL_ENTRY alt_thunk_names893[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x4y103abcEv,_ZTv0_n16_N3ccc8DD7x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y103abcEv,_ZThn4_N3ccc8DD7x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x4y103pqrEv,_ZTv0_n12_N3ccc8DD7x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y103pqrEv,_ZThn4_N3ccc8DD7x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x4y10E = {  "_ZN3ccc8DD7x4y10E", // class name
  bases__ZN3ccc8DD7x4y10E, 2,
  &(vtc__ZN3ccc8DD7x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x4y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x4y10E),3, //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  CC7x4y11  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC7x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x4y113efgEv
  ~CC7x4y11(); // tgen
  CC7x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y11E) C1{ VBC2{ v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x4y113pqrEv");}
void  ccc::CC7x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x4y113efgEv");}
ccc::CC7x4y11 ::~CC7x4y11(){ note_dtor("_ZN3ccc8CC7x4y11E", this);} // tgen
ccc::CC7x4y11 ::CC7x4y11(){ note_ctor("_ZN3ccc8CC7x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x4y11E, buf);
    ::ccc::CC7x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x4y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC7x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x4y11E);
    dp->::ccc::CC7x4y11::~CC7x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x4y11E(Test__ZN3ccc8CC7x4y11E, "_ZN3ccc8CC7x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x4y11C1Ev();
extern void _ZN3ccc8CC7x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x4y11E[] = {
  NSPAIR(_ZN3ccc8CC7x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC7x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x4y11E[];
extern void _ZN3ccc8CC7x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC7x4y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x4y113pqrEv,_ZTv0_n16_N3ccc8CC7x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y113pqrEv,_ZThn4_N3ccc8CC7x4y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x4y113pqrEv,_ZTv0_n16_N3ccc8CC7x4y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x4y11E[] = {
  {&(_ZTVN3ccc8CC7x4y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x4y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x4y11E[];
static VTBL_ENTRY alt_thunk_names894[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x4y113pqrEv,_ZTv0_n16_N3ccc8CC7x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x4y113pqrEv,_ZThn4_N3ccc8CC7x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x4y11E = {  "_ZN3ccc8CC7x4y11E", // class name
  bases__ZN3ccc8CC7x4y11E, 2,
  &(vtc__ZN3ccc8CC7x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x4y11E),2, //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  DD7x4y11  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD7x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x4y113efgEv
  ~DD7x4y11(); // tgen
  DD7x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x4y11E) C1{ VBC2{ v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x4y113pqrEv");}
void  ccc::DD7x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x4y113efgEv");}
ccc::DD7x4y11 ::~DD7x4y11(){ note_dtor("_ZN3ccc8DD7x4y11E", this);} // tgen
ccc::DD7x4y11 ::DD7x4y11(){ note_ctor("_ZN3ccc8DD7x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x4y11E, buf);
    ::ccc::DD7x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x4y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD7x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x4y11E);
    dp->::ccc::DD7x4y11::~DD7x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x4y11E(Test__ZN3ccc8DD7x4y11E, "_ZN3ccc8DD7x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x4y11C1Ev();
extern void _ZN3ccc8DD7x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x4y11E[] = {
  NSPAIR(_ZN3ccc8DD7x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD7x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x4y113pqrEv();
extern void _ZN3ccc8DD7x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x4y113pqrEv,_ZTv0_n12_N3ccc8DD7x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y113pqrEv,_ZThn4_N3ccc8DD7x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x4y113efgEv,_ZTv0_n20_N3ccc8DD7x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y113efgEv,_ZThn4_N3ccc8DD7x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x4y113pqrEv,_ZTv0_n12_N3ccc8DD7x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x4y113efgEv,_ZTv0_n20_N3ccc8DD7x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x4y11E[] = {
  {&(_ZTVN3ccc8DD7x4y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x4y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x4y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x4y11E[];
static VTBL_ENTRY alt_thunk_names895[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x4y113efgEv,_ZTv0_n20_N3ccc8DD7x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y113efgEv,_ZThn4_N3ccc8DD7x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x4y113pqrEv,_ZTv0_n12_N3ccc8DD7x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y113pqrEv,_ZThn4_N3ccc8DD7x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x4y11E = {  "_ZN3ccc8DD7x4y11E", // class name
  bases__ZN3ccc8DD7x4y11E, 2,
  &(vtc__ZN3ccc8DD7x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x4y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x4y11E),3, //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  CC7x4y12  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC7x4y123abcEv
  ~CC7x4y12(); // tgen
  CC7x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC7x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x4y123abcEv");}
ccc::CC7x4y12 ::~CC7x4y12(){ note_dtor("_ZN3ccc8CC7x4y12E", this);} // tgen
ccc::CC7x4y12 ::CC7x4y12(){ note_ctor("_ZN3ccc8CC7x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x4y12E, buf);
    ::ccc::CC7x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x4y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC7x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x4y12E);
    dp->::ccc::CC7x4y12::~CC7x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x4y12E(Test__ZN3ccc8CC7x4y12E, "_ZN3ccc8CC7x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x4y12C1Ev();
extern void _ZN3ccc8CC7x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x4y12E[] = {
  NSPAIR(_ZN3ccc8CC7x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC7x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC7x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x4y123abcEv,_ZTv0_n12_N3ccc8CC7x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y123abcEv,_ZThn4_N3ccc8CC7x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x4y123abcEv,_ZTv0_n12_N3ccc8CC7x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x4y12E[] = {
  {&(_ZTVN3ccc8CC7x4y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x4y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x4y12E[];
static VTBL_ENTRY alt_thunk_names896[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x4y123abcEv,_ZTv0_n12_N3ccc8CC7x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x4y123abcEv,_ZThn4_N3ccc8CC7x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x4y12E = {  "_ZN3ccc8CC7x4y12E", // class name
  bases__ZN3ccc8CC7x4y12E, 2,
  &(vtc__ZN3ccc8CC7x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x4y12E),2, //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  DD7x4y12  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD7x4y123abcEv
  ~DD7x4y12(); // tgen
  DD7x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x4y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD7x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x4y123abcEv");}
ccc::DD7x4y12 ::~DD7x4y12(){ note_dtor("_ZN3ccc8DD7x4y12E", this);} // tgen
ccc::DD7x4y12 ::DD7x4y12(){ note_ctor("_ZN3ccc8DD7x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x4y12E, buf);
    ::ccc::DD7x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x4y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD7x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x4y12E);
    dp->::ccc::DD7x4y12::~DD7x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x4y12E(Test__ZN3ccc8DD7x4y12E, "_ZN3ccc8DD7x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x4y12C1Ev();
extern void _ZN3ccc8DD7x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x4y12E[] = {
  NSPAIR(_ZN3ccc8DD7x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD7x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y12E[];
extern void _ZN3ccc8DD7x4y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x4y123abcEv,_ZTv0_n16_N3ccc8DD7x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y123abcEv,_ZThn4_N3ccc8DD7x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x4y123abcEv,_ZTv0_n16_N3ccc8DD7x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x4y12E[] = {
  {&(_ZTVN3ccc8DD7x4y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x4y12E[];
static VTBL_ENTRY alt_thunk_names897[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x4y123abcEv,_ZTv0_n16_N3ccc8DD7x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y123abcEv,_ZThn4_N3ccc8DD7x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x4y12E = {  "_ZN3ccc8DD7x4y12E", // class name
  bases__ZN3ccc8DD7x4y12E, 2,
  &(vtc__ZN3ccc8DD7x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x4y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x4y12E),3, //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  CC7x4y13  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC7x4y133efgEv
  ~CC7x4y13(); // tgen
  CC7x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y13E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC7x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x4y133efgEv");}
ccc::CC7x4y13 ::~CC7x4y13(){ note_dtor("_ZN3ccc8CC7x4y13E", this);} // tgen
ccc::CC7x4y13 ::CC7x4y13(){ note_ctor("_ZN3ccc8CC7x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x4y13E, buf);
    ::ccc::CC7x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x4y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC7x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x4y13E);
    dp->::ccc::CC7x4y13::~CC7x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x4y13E(Test__ZN3ccc8CC7x4y13E, "_ZN3ccc8CC7x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x4y13C1Ev();
extern void _ZN3ccc8CC7x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x4y13E[] = {
  NSPAIR(_ZN3ccc8CC7x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC7x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC7x4y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x4y13E[] = {
  {&(_ZTVN3ccc8CC7x4y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x4y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x4y13E[];
Class_Descriptor cd__ZN3ccc8CC7x4y13E = {  "_ZN3ccc8CC7x4y13E", // class name
  bases__ZN3ccc8CC7x4y13E, 2,
  &(vtc__ZN3ccc8CC7x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x4y13E),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  DD7x4y13  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD7x4y133efgEv
  ~DD7x4y13(); // tgen
  DD7x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x4y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD7x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x4y133efgEv");}
ccc::DD7x4y13 ::~DD7x4y13(){ note_dtor("_ZN3ccc8DD7x4y13E", this);} // tgen
ccc::DD7x4y13 ::DD7x4y13(){ note_ctor("_ZN3ccc8DD7x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x4y13E, buf);
    ::ccc::DD7x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x4y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD7x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x4y13E);
    dp->::ccc::DD7x4y13::~DD7x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x4y13E(Test__ZN3ccc8DD7x4y13E, "_ZN3ccc8DD7x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x4y13C1Ev();
extern void _ZN3ccc8DD7x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x4y13E[] = {
  NSPAIR(_ZN3ccc8DD7x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD7x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x4y133efgEv,_ZTv0_n20_N3ccc8DD7x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y133efgEv,_ZThn4_N3ccc8DD7x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x4y133efgEv,_ZTv0_n20_N3ccc8DD7x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x4y13E[] = {
  {&(_ZTVN3ccc8DD7x4y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x4y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x4y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x4y13E[];
static VTBL_ENTRY alt_thunk_names898[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x4y133efgEv,_ZTv0_n20_N3ccc8DD7x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y133efgEv,_ZThn4_N3ccc8DD7x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x4y13E = {  "_ZN3ccc8DD7x4y13E", // class name
  bases__ZN3ccc8DD7x4y13E, 2,
  &(vtc__ZN3ccc8DD7x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x4y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x4y13E),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  CC7x4y14  : virtual ::ccc::AA7 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC7x4y143pqrEv
  ~CC7x4y14(); // tgen
  CC7x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x4y143pqrEv");}
ccc::CC7x4y14 ::~CC7x4y14(){ note_dtor("_ZN3ccc8CC7x4y14E", this);} // tgen
ccc::CC7x4y14 ::CC7x4y14(){ note_ctor("_ZN3ccc8CC7x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x4y14E, buf);
    ::ccc::CC7x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x4y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC7x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x4y14E);
    dp->::ccc::CC7x4y14::~CC7x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x4y14E(Test__ZN3ccc8CC7x4y14E, "_ZN3ccc8CC7x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x4y14C1Ev();
extern void _ZN3ccc8CC7x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x4y14E[] = {
  NSPAIR(_ZN3ccc8CC7x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC7x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x4y14E[];
extern void _ZN3ccc8CC7x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x4y143pqrEv,_ZTv0_n16_N3ccc8CC7x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x4y143pqrEv,_ZThn4_N3ccc8CC7x4y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x4y143pqrEv,_ZTv0_n16_N3ccc8CC7x4y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x4y14E[] = {
  {&(_ZTVN3ccc8CC7x4y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x4y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x4y14E[];
static VTBL_ENTRY alt_thunk_names899[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x4y143pqrEv,_ZTv0_n16_N3ccc8CC7x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x4y143pqrEv,_ZThn4_N3ccc8CC7x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x4y14E = {  "_ZN3ccc8CC7x4y14E", // class name
  bases__ZN3ccc8CC7x4y14E, 2,
  &(vtc__ZN3ccc8CC7x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x4y14E),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  DD7x4y14  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD7x4y143pqrEv
  ~DD7x4y14(); // tgen
  DD7x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x4y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x4y143pqrEv");}
ccc::DD7x4y14 ::~DD7x4y14(){ note_dtor("_ZN3ccc8DD7x4y14E", this);} // tgen
ccc::DD7x4y14 ::DD7x4y14(){ note_ctor("_ZN3ccc8DD7x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x4y14E, buf);
    ::ccc::DD7x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x4y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD7x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x4y14E);
    dp->::ccc::DD7x4y14::~DD7x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x4y14E(Test__ZN3ccc8DD7x4y14E, "_ZN3ccc8DD7x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x4y14C1Ev();
extern void _ZN3ccc8DD7x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x4y14E[] = {
  NSPAIR(_ZN3ccc8DD7x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD7x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x4y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x4y143pqrEv,_ZTv0_n12_N3ccc8DD7x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x4y143pqrEv,_ZThn4_N3ccc8DD7x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x4y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x4y143pqrEv,_ZTv0_n12_N3ccc8DD7x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x4y14E[] = {
  {&(_ZTVN3ccc8DD7x4y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x4y14E[];
static VTBL_ENTRY alt_thunk_names900[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x4y143pqrEv,_ZTv0_n12_N3ccc8DD7x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x4y143pqrEv,_ZThn4_N3ccc8DD7x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x4y14E = {  "_ZN3ccc8DD7x4y14E", // class name
  bases__ZN3ccc8DD7x4y14E, 2,
  &(vtc__ZN3ccc8DD7x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x4y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x4y14E),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  CC7x4y15  : virtual ::ccc::AA7 , ::ccc::BB4 {
  ~CC7x4y15(); // tgen
  CC7x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x4y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC7x4y15 ::~CC7x4y15(){ note_dtor("_ZN3ccc8CC7x4y15E", this);} // tgen
ccc::CC7x4y15 ::CC7x4y15(){ note_ctor("_ZN3ccc8CC7x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x4y15E, buf);
    ::ccc::CC7x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x4y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC7x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x4y15E);
    dp->::ccc::CC7x4y15::~CC7x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x4y15E(Test__ZN3ccc8CC7x4y15E, "_ZN3ccc8CC7x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x4y15C1Ev();
extern void _ZN3ccc8CC7x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x4y15E[] = {
  NSPAIR(_ZN3ccc8CC7x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC7x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x4y15E[] = {
  {&(_ZTVN3ccc8CC7x4y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x4y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x4y15E[];
Class_Descriptor cd__ZN3ccc8CC7x4y15E = {  "_ZN3ccc8CC7x4y15E", // class name
  bases__ZN3ccc8CC7x4y15E, 2,
  &(vtc__ZN3ccc8CC7x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x4y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x4y15E),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  DD7x4y15  : virtual ::ccc::AA7 , virtual ::ccc::BB4 {
  ~DD7x4y15(); // tgen
  DD7x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x4y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD7x4y15 ::~DD7x4y15(){ note_dtor("_ZN3ccc8DD7x4y15E", this);} // tgen
ccc::DD7x4y15 ::DD7x4y15(){ note_ctor("_ZN3ccc8DD7x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x4y15E, buf);
    ::ccc::DD7x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x4y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD7x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x4y15E);
    dp->::ccc::DD7x4y15::~DD7x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x4y15E(Test__ZN3ccc8DD7x4y15E, "_ZN3ccc8DD7x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x4y15C1Ev();
extern void _ZN3ccc8DD7x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x4y15E[] = {
  NSPAIR(_ZN3ccc8DD7x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD7x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x4y15E[] = {
  {&(_ZTVN3ccc8DD7x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x4y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x4y15E[];
Class_Descriptor cd__ZN3ccc8DD7x4y15E = {  "_ZN3ccc8DD7x4y15E", // class name
  bases__ZN3ccc8DD7x4y15E, 2,
  &(vtc__ZN3ccc8DD7x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x4y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x4y15E),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  CC7x5y0  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y03pqrEv
  ~CC7x5y0(); // tgen
  CC7x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y0E) C1{ VBC2{ v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y03abcEv");}
void  ccc::CC7x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y03efgEv");}
void  ccc::CC7x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y03pqrEv");}
ccc::CC7x5y0 ::~CC7x5y0(){ note_dtor("_ZN3ccc7CC7x5y0E", this);} // tgen
ccc::CC7x5y0 ::CC7x5y0(){ note_ctor("_ZN3ccc7CC7x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y0E, buf);
    ::ccc::CC7x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y0E);
    dp->::ccc::CC7x5y0::~CC7x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y0E(Test__ZN3ccc7CC7x5y0E, "_ZN3ccc7CC7x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y0C1Ev();
extern void _ZN3ccc7CC7x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y0E[] = {
  NSPAIR(_ZN3ccc7CC7x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y0E[];
extern void _ZN3ccc7CC7x5y03pqrEv();
extern void _ZN3ccc7CC7x5y03efgEv();
extern void _ZN3ccc7CC7x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y03abcEv,_ZTv0_n12_N3ccc7CC7x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y03abcEv,_ZThn4_N3ccc7CC7x5y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y03pqrEv,_ZTv0_n16_N3ccc7CC7x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y03pqrEv,_ZThn4_N3ccc7CC7x5y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y03abcEv,_ZTv0_n12_N3ccc7CC7x5y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y03pqrEv,_ZTv0_n16_N3ccc7CC7x5y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y0E[] = {
  {&(_ZTVN3ccc7CC7x5y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y0E[];
static VTBL_ENTRY alt_thunk_names901[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y03pqrEv,_ZTv0_n16_N3ccc7CC7x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y03pqrEv,_ZThn4_N3ccc7CC7x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y03abcEv,_ZTv0_n12_N3ccc7CC7x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y03abcEv,_ZThn4_N3ccc7CC7x5y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y0E = {  "_ZN3ccc7CC7x5y0E", // class name
  bases__ZN3ccc7CC7x5y0E, 2,
  &(vtc__ZN3ccc7CC7x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y0E),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  DD7x5y0  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD7x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x5y03pqrEv
  ~DD7x5y0(); // tgen
  DD7x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y0E) C1{ VBC2{ v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y03abcEv");}
void  ccc::DD7x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y03efgEv");}
void  ccc::DD7x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y03pqrEv");}
ccc::DD7x5y0 ::~DD7x5y0(){ note_dtor("_ZN3ccc7DD7x5y0E", this);} // tgen
ccc::DD7x5y0 ::DD7x5y0(){ note_ctor("_ZN3ccc7DD7x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y0E, buf);
    ::ccc::DD7x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y0E);
    dp->::ccc::DD7x5y0::~DD7x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y0E(Test__ZN3ccc7DD7x5y0E, "_ZN3ccc7DD7x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y0C1Ev();
extern void _ZN3ccc7DD7x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y0E[] = {
  NSPAIR(_ZN3ccc7DD7x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y0E[];
extern void _ZN3ccc7DD7x5y03abcEv();
extern void _ZN3ccc7DD7x5y03pqrEv();
extern void _ZN3ccc7DD7x5y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y03pqrEv,_ZTv0_n12_N3ccc7DD7x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y03pqrEv,_ZThn4_N3ccc7DD7x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y03efgEv,_ZTv0_n16_N3ccc7DD7x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y03efgEv,_ZThn4_N3ccc7DD7x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y03abcEv,_ZTv0_n20_N3ccc7DD7x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y03abcEv,_ZThn4_N3ccc7DD7x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y03pqrEv,_ZTv0_n12_N3ccc7DD7x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y03efgEv,_ZTv0_n16_N3ccc7DD7x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y03abcEv,_ZTv0_n20_N3ccc7DD7x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y0E[] = {
  {&(_ZTVN3ccc7DD7x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y0E[];
static VTBL_ENTRY alt_thunk_names902[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y03abcEv,_ZTv0_n20_N3ccc7DD7x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y03abcEv,_ZThn4_N3ccc7DD7x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y03efgEv,_ZTv0_n16_N3ccc7DD7x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y03efgEv,_ZThn4_N3ccc7DD7x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y03pqrEv,_ZTv0_n12_N3ccc7DD7x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y03pqrEv,_ZThn4_N3ccc7DD7x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y0E = {  "_ZN3ccc7DD7x5y0E", // class name
  bases__ZN3ccc7DD7x5y0E, 2,
  &(vtc__ZN3ccc7DD7x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y0E),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  CC7x5y1  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x5y13efgEv
  ~CC7x5y1(); // tgen
  CC7x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y1E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y13abcEv");}
void  ccc::CC7x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y13pqrEv");}
void  ccc::CC7x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y13efgEv");}
ccc::CC7x5y1 ::~CC7x5y1(){ note_dtor("_ZN3ccc7CC7x5y1E", this);} // tgen
ccc::CC7x5y1 ::CC7x5y1(){ note_ctor("_ZN3ccc7CC7x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y1E, buf);
    ::ccc::CC7x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y1E);
    dp->::ccc::CC7x5y1::~CC7x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y1E(Test__ZN3ccc7CC7x5y1E, "_ZN3ccc7CC7x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y1C1Ev();
extern void _ZN3ccc7CC7x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y1E[] = {
  NSPAIR(_ZN3ccc7CC7x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y1E[];
extern void _ZN3ccc7CC7x5y13pqrEv();
extern void _ZN3ccc7CC7x5y13efgEv();
extern void _ZN3ccc7CC7x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y13abcEv,_ZTv0_n12_N3ccc7CC7x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y13abcEv,_ZThn4_N3ccc7CC7x5y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y13pqrEv,_ZTv0_n16_N3ccc7CC7x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y13pqrEv,_ZThn4_N3ccc7CC7x5y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y13abcEv,_ZTv0_n12_N3ccc7CC7x5y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y13pqrEv,_ZTv0_n16_N3ccc7CC7x5y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y1E[] = {
  {&(_ZTVN3ccc7CC7x5y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y1E[];
static VTBL_ENTRY alt_thunk_names903[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y13pqrEv,_ZTv0_n16_N3ccc7CC7x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y13pqrEv,_ZThn4_N3ccc7CC7x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y13abcEv,_ZTv0_n12_N3ccc7CC7x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y13abcEv,_ZThn4_N3ccc7CC7x5y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y1E = {  "_ZN3ccc7CC7x5y1E", // class name
  bases__ZN3ccc7CC7x5y1E, 2,
  &(vtc__ZN3ccc7CC7x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y1E),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  DD7x5y1  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD7x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x5y13efgEv
  ~DD7x5y1(); // tgen
  DD7x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y1E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y13abcEv");}
void  ccc::DD7x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y13pqrEv");}
void  ccc::DD7x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y13efgEv");}
ccc::DD7x5y1 ::~DD7x5y1(){ note_dtor("_ZN3ccc7DD7x5y1E", this);} // tgen
ccc::DD7x5y1 ::DD7x5y1(){ note_ctor("_ZN3ccc7DD7x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y1E, buf);
    ::ccc::DD7x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y1E);
    dp->::ccc::DD7x5y1::~DD7x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y1E(Test__ZN3ccc7DD7x5y1E, "_ZN3ccc7DD7x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y1C1Ev();
extern void _ZN3ccc7DD7x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y1E[] = {
  NSPAIR(_ZN3ccc7DD7x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y1E[];
extern void _ZN3ccc7DD7x5y13abcEv();
extern void _ZN3ccc7DD7x5y13pqrEv();
extern void _ZN3ccc7DD7x5y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y13pqrEv,_ZTv0_n12_N3ccc7DD7x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y13pqrEv,_ZThn4_N3ccc7DD7x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y13efgEv,_ZTv0_n16_N3ccc7DD7x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y13efgEv,_ZThn4_N3ccc7DD7x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y13abcEv,_ZTv0_n20_N3ccc7DD7x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y13abcEv,_ZThn4_N3ccc7DD7x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y13pqrEv,_ZTv0_n12_N3ccc7DD7x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y13efgEv,_ZTv0_n16_N3ccc7DD7x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y13abcEv,_ZTv0_n20_N3ccc7DD7x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y1E[] = {
  {&(_ZTVN3ccc7DD7x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y1E[];
static VTBL_ENTRY alt_thunk_names904[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y13abcEv,_ZTv0_n20_N3ccc7DD7x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y13abcEv,_ZThn4_N3ccc7DD7x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y13efgEv,_ZTv0_n16_N3ccc7DD7x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y13efgEv,_ZThn4_N3ccc7DD7x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y13pqrEv,_ZTv0_n12_N3ccc7DD7x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y13pqrEv,_ZThn4_N3ccc7DD7x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y1E = {  "_ZN3ccc7DD7x5y1E", // class name
  bases__ZN3ccc7DD7x5y1E, 2,
  &(vtc__ZN3ccc7DD7x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y1E),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  CC7x5y2  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y23pqrEv
  ~CC7x5y2(); // tgen
  CC7x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y2E) C1{ VBC2{ v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y23efgEv");}
void  ccc::CC7x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y23abcEv");}
void  ccc::CC7x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y23pqrEv");}
ccc::CC7x5y2 ::~CC7x5y2(){ note_dtor("_ZN3ccc7CC7x5y2E", this);} // tgen
ccc::CC7x5y2 ::CC7x5y2(){ note_ctor("_ZN3ccc7CC7x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y2E, buf);
    ::ccc::CC7x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y2E);
    dp->::ccc::CC7x5y2::~CC7x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y2E(Test__ZN3ccc7CC7x5y2E, "_ZN3ccc7CC7x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y2C1Ev();
extern void _ZN3ccc7CC7x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y2E[] = {
  NSPAIR(_ZN3ccc7CC7x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y2E[];
extern void _ZN3ccc7CC7x5y23pqrEv();
extern void _ZN3ccc7CC7x5y23efgEv();
extern void _ZN3ccc7CC7x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y23abcEv,_ZTv0_n12_N3ccc7CC7x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y23abcEv,_ZThn4_N3ccc7CC7x5y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y23pqrEv,_ZTv0_n16_N3ccc7CC7x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y23pqrEv,_ZThn4_N3ccc7CC7x5y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y23abcEv,_ZTv0_n12_N3ccc7CC7x5y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y23pqrEv,_ZTv0_n16_N3ccc7CC7x5y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y2E[] = {
  {&(_ZTVN3ccc7CC7x5y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y2E[];
static VTBL_ENTRY alt_thunk_names905[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y23pqrEv,_ZTv0_n16_N3ccc7CC7x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y23pqrEv,_ZThn4_N3ccc7CC7x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y23abcEv,_ZTv0_n12_N3ccc7CC7x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y23abcEv,_ZThn4_N3ccc7CC7x5y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y2E = {  "_ZN3ccc7CC7x5y2E", // class name
  bases__ZN3ccc7CC7x5y2E, 2,
  &(vtc__ZN3ccc7CC7x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y2E),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  DD7x5y2  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD7x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x5y23pqrEv
  ~DD7x5y2(); // tgen
  DD7x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y2E) C1{ VBC2{ v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y23efgEv");}
void  ccc::DD7x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y23abcEv");}
void  ccc::DD7x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y23pqrEv");}
ccc::DD7x5y2 ::~DD7x5y2(){ note_dtor("_ZN3ccc7DD7x5y2E", this);} // tgen
ccc::DD7x5y2 ::DD7x5y2(){ note_ctor("_ZN3ccc7DD7x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y2E, buf);
    ::ccc::DD7x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y2E);
    dp->::ccc::DD7x5y2::~DD7x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y2E(Test__ZN3ccc7DD7x5y2E, "_ZN3ccc7DD7x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y2C1Ev();
extern void _ZN3ccc7DD7x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y2E[] = {
  NSPAIR(_ZN3ccc7DD7x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y2E[];
extern void _ZN3ccc7DD7x5y23abcEv();
extern void _ZN3ccc7DD7x5y23pqrEv();
extern void _ZN3ccc7DD7x5y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y23pqrEv,_ZTv0_n12_N3ccc7DD7x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y23pqrEv,_ZThn4_N3ccc7DD7x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y23efgEv,_ZTv0_n16_N3ccc7DD7x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y23efgEv,_ZThn4_N3ccc7DD7x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y23abcEv,_ZTv0_n20_N3ccc7DD7x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y23abcEv,_ZThn4_N3ccc7DD7x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y23pqrEv,_ZTv0_n12_N3ccc7DD7x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y23efgEv,_ZTv0_n16_N3ccc7DD7x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y23abcEv,_ZTv0_n20_N3ccc7DD7x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y2E[] = {
  {&(_ZTVN3ccc7DD7x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y2E[];
static VTBL_ENTRY alt_thunk_names906[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y23abcEv,_ZTv0_n20_N3ccc7DD7x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y23abcEv,_ZThn4_N3ccc7DD7x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y23efgEv,_ZTv0_n16_N3ccc7DD7x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y23efgEv,_ZThn4_N3ccc7DD7x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y23pqrEv,_ZTv0_n12_N3ccc7DD7x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y23pqrEv,_ZThn4_N3ccc7DD7x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y2E = {  "_ZN3ccc7DD7x5y2E", // class name
  bases__ZN3ccc7DD7x5y2E, 2,
  &(vtc__ZN3ccc7DD7x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y2E),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  CC7x5y3  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x5y33abcEv
  ~CC7x5y3(); // tgen
  CC7x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y3E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y33efgEv");}
void  ccc::CC7x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y33pqrEv");}
void  ccc::CC7x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y33abcEv");}
ccc::CC7x5y3 ::~CC7x5y3(){ note_dtor("_ZN3ccc7CC7x5y3E", this);} // tgen
ccc::CC7x5y3 ::CC7x5y3(){ note_ctor("_ZN3ccc7CC7x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y3E, buf);
    ::ccc::CC7x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y3E);
    dp->::ccc::CC7x5y3::~CC7x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y3E(Test__ZN3ccc7CC7x5y3E, "_ZN3ccc7CC7x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y3C1Ev();
extern void _ZN3ccc7CC7x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y3E[] = {
  NSPAIR(_ZN3ccc7CC7x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y3E[];
extern void _ZN3ccc7CC7x5y33pqrEv();
extern void _ZN3ccc7CC7x5y33efgEv();
extern void _ZN3ccc7CC7x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y33abcEv,_ZTv0_n12_N3ccc7CC7x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y33abcEv,_ZThn4_N3ccc7CC7x5y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y33pqrEv,_ZTv0_n16_N3ccc7CC7x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y33pqrEv,_ZThn4_N3ccc7CC7x5y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y33abcEv,_ZTv0_n12_N3ccc7CC7x5y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y33pqrEv,_ZTv0_n16_N3ccc7CC7x5y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y3E[] = {
  {&(_ZTVN3ccc7CC7x5y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y3E[];
static VTBL_ENTRY alt_thunk_names907[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y33pqrEv,_ZTv0_n16_N3ccc7CC7x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y33pqrEv,_ZThn4_N3ccc7CC7x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y33abcEv,_ZTv0_n12_N3ccc7CC7x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y33abcEv,_ZThn4_N3ccc7CC7x5y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y3E = {  "_ZN3ccc7CC7x5y3E", // class name
  bases__ZN3ccc7CC7x5y3E, 2,
  &(vtc__ZN3ccc7CC7x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y3E),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  DD7x5y3  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD7x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x5y33abcEv
  ~DD7x5y3(); // tgen
  DD7x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y3E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y33efgEv");}
void  ccc::DD7x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y33pqrEv");}
void  ccc::DD7x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y33abcEv");}
ccc::DD7x5y3 ::~DD7x5y3(){ note_dtor("_ZN3ccc7DD7x5y3E", this);} // tgen
ccc::DD7x5y3 ::DD7x5y3(){ note_ctor("_ZN3ccc7DD7x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y3E, buf);
    ::ccc::DD7x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y3E);
    dp->::ccc::DD7x5y3::~DD7x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y3E(Test__ZN3ccc7DD7x5y3E, "_ZN3ccc7DD7x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y3C1Ev();
extern void _ZN3ccc7DD7x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y3E[] = {
  NSPAIR(_ZN3ccc7DD7x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y3E[];
extern void _ZN3ccc7DD7x5y33abcEv();
extern void _ZN3ccc7DD7x5y33pqrEv();
extern void _ZN3ccc7DD7x5y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y33pqrEv,_ZTv0_n12_N3ccc7DD7x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y33pqrEv,_ZThn4_N3ccc7DD7x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y33efgEv,_ZTv0_n16_N3ccc7DD7x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y33efgEv,_ZThn4_N3ccc7DD7x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y33abcEv,_ZTv0_n20_N3ccc7DD7x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y33abcEv,_ZThn4_N3ccc7DD7x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y33pqrEv,_ZTv0_n12_N3ccc7DD7x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y33efgEv,_ZTv0_n16_N3ccc7DD7x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y33abcEv,_ZTv0_n20_N3ccc7DD7x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y3E[] = {
  {&(_ZTVN3ccc7DD7x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y3E[];
static VTBL_ENTRY alt_thunk_names908[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y33abcEv,_ZTv0_n20_N3ccc7DD7x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y33abcEv,_ZThn4_N3ccc7DD7x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y33efgEv,_ZTv0_n16_N3ccc7DD7x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y33efgEv,_ZThn4_N3ccc7DD7x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y33pqrEv,_ZTv0_n12_N3ccc7DD7x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y33pqrEv,_ZThn4_N3ccc7DD7x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y3E = {  "_ZN3ccc7DD7x5y3E", // class name
  bases__ZN3ccc7DD7x5y3E, 2,
  &(vtc__ZN3ccc7DD7x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y3E),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  CC7x5y4  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC7x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x5y43efgEv
  ~CC7x5y4(); // tgen
  CC7x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y4E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y43pqrEv");}
void  ccc::CC7x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y43abcEv");}
void  ccc::CC7x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y43efgEv");}
ccc::CC7x5y4 ::~CC7x5y4(){ note_dtor("_ZN3ccc7CC7x5y4E", this);} // tgen
ccc::CC7x5y4 ::CC7x5y4(){ note_ctor("_ZN3ccc7CC7x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y4E, buf);
    ::ccc::CC7x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y4E);
    dp->::ccc::CC7x5y4::~CC7x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y4E(Test__ZN3ccc7CC7x5y4E, "_ZN3ccc7CC7x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y4C1Ev();
extern void _ZN3ccc7CC7x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y4E[] = {
  NSPAIR(_ZN3ccc7CC7x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y4E[];
extern void _ZN3ccc7CC7x5y43pqrEv();
extern void _ZN3ccc7CC7x5y43efgEv();
extern void _ZN3ccc7CC7x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y43abcEv,_ZTv0_n12_N3ccc7CC7x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y43abcEv,_ZThn4_N3ccc7CC7x5y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y43pqrEv,_ZTv0_n16_N3ccc7CC7x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y43pqrEv,_ZThn4_N3ccc7CC7x5y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y43abcEv,_ZTv0_n12_N3ccc7CC7x5y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y43pqrEv,_ZTv0_n16_N3ccc7CC7x5y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y4E[] = {
  {&(_ZTVN3ccc7CC7x5y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y4E[];
static VTBL_ENTRY alt_thunk_names909[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y43pqrEv,_ZTv0_n16_N3ccc7CC7x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y43pqrEv,_ZThn4_N3ccc7CC7x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y43abcEv,_ZTv0_n12_N3ccc7CC7x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y43abcEv,_ZThn4_N3ccc7CC7x5y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y4E = {  "_ZN3ccc7CC7x5y4E", // class name
  bases__ZN3ccc7CC7x5y4E, 2,
  &(vtc__ZN3ccc7CC7x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y4E),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  DD7x5y4  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD7x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x5y43efgEv
  ~DD7x5y4(); // tgen
  DD7x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y4E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y43pqrEv");}
void  ccc::DD7x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y43abcEv");}
void  ccc::DD7x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y43efgEv");}
ccc::DD7x5y4 ::~DD7x5y4(){ note_dtor("_ZN3ccc7DD7x5y4E", this);} // tgen
ccc::DD7x5y4 ::DD7x5y4(){ note_ctor("_ZN3ccc7DD7x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y4E, buf);
    ::ccc::DD7x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y4E);
    dp->::ccc::DD7x5y4::~DD7x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y4E(Test__ZN3ccc7DD7x5y4E, "_ZN3ccc7DD7x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y4C1Ev();
extern void _ZN3ccc7DD7x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y4E[] = {
  NSPAIR(_ZN3ccc7DD7x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y4E[];
extern void _ZN3ccc7DD7x5y43abcEv();
extern void _ZN3ccc7DD7x5y43pqrEv();
extern void _ZN3ccc7DD7x5y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y43pqrEv,_ZTv0_n12_N3ccc7DD7x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y43pqrEv,_ZThn4_N3ccc7DD7x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y43efgEv,_ZTv0_n16_N3ccc7DD7x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y43efgEv,_ZThn4_N3ccc7DD7x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y43abcEv,_ZTv0_n20_N3ccc7DD7x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y43abcEv,_ZThn4_N3ccc7DD7x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y43pqrEv,_ZTv0_n12_N3ccc7DD7x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y43efgEv,_ZTv0_n16_N3ccc7DD7x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y43abcEv,_ZTv0_n20_N3ccc7DD7x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y4E[] = {
  {&(_ZTVN3ccc7DD7x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y4E[];
static VTBL_ENTRY alt_thunk_names910[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y43abcEv,_ZTv0_n20_N3ccc7DD7x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y43abcEv,_ZThn4_N3ccc7DD7x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y43efgEv,_ZTv0_n16_N3ccc7DD7x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y43efgEv,_ZThn4_N3ccc7DD7x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y43pqrEv,_ZTv0_n12_N3ccc7DD7x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y43pqrEv,_ZThn4_N3ccc7DD7x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y4E = {  "_ZN3ccc7DD7x5y4E", // class name
  bases__ZN3ccc7DD7x5y4E, 2,
  &(vtc__ZN3ccc7DD7x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y4E),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  CC7x5y5  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC7x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x5y53abcEv
  ~CC7x5y5(); // tgen
  CC7x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y5E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y53pqrEv");}
void  ccc::CC7x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y53efgEv");}
void  ccc::CC7x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y53abcEv");}
ccc::CC7x5y5 ::~CC7x5y5(){ note_dtor("_ZN3ccc7CC7x5y5E", this);} // tgen
ccc::CC7x5y5 ::CC7x5y5(){ note_ctor("_ZN3ccc7CC7x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y5E, buf);
    ::ccc::CC7x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y5E);
    dp->::ccc::CC7x5y5::~CC7x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y5E(Test__ZN3ccc7CC7x5y5E, "_ZN3ccc7CC7x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y5C1Ev();
extern void _ZN3ccc7CC7x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y5E[] = {
  NSPAIR(_ZN3ccc7CC7x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y5E[];
extern void _ZN3ccc7CC7x5y53pqrEv();
extern void _ZN3ccc7CC7x5y53efgEv();
extern void _ZN3ccc7CC7x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y53abcEv,_ZTv0_n12_N3ccc7CC7x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y53abcEv,_ZThn4_N3ccc7CC7x5y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y53pqrEv,_ZTv0_n16_N3ccc7CC7x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y53pqrEv,_ZThn4_N3ccc7CC7x5y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y53abcEv,_ZTv0_n12_N3ccc7CC7x5y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y53pqrEv,_ZTv0_n16_N3ccc7CC7x5y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y5E[] = {
  {&(_ZTVN3ccc7CC7x5y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y5E[];
static VTBL_ENTRY alt_thunk_names911[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y53pqrEv,_ZTv0_n16_N3ccc7CC7x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y53pqrEv,_ZThn4_N3ccc7CC7x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y53abcEv,_ZTv0_n12_N3ccc7CC7x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y53abcEv,_ZThn4_N3ccc7CC7x5y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y5E = {  "_ZN3ccc7CC7x5y5E", // class name
  bases__ZN3ccc7CC7x5y5E, 2,
  &(vtc__ZN3ccc7CC7x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y5E),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  DD7x5y5  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD7x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x5y53abcEv
  ~DD7x5y5(); // tgen
  DD7x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y5E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y53pqrEv");}
void  ccc::DD7x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y53efgEv");}
void  ccc::DD7x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y53abcEv");}
ccc::DD7x5y5 ::~DD7x5y5(){ note_dtor("_ZN3ccc7DD7x5y5E", this);} // tgen
ccc::DD7x5y5 ::DD7x5y5(){ note_ctor("_ZN3ccc7DD7x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y5E, buf);
    ::ccc::DD7x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y5E);
    dp->::ccc::DD7x5y5::~DD7x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y5E(Test__ZN3ccc7DD7x5y5E, "_ZN3ccc7DD7x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y5C1Ev();
extern void _ZN3ccc7DD7x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y5E[] = {
  NSPAIR(_ZN3ccc7DD7x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y5E[];
extern void _ZN3ccc7DD7x5y53abcEv();
extern void _ZN3ccc7DD7x5y53pqrEv();
extern void _ZN3ccc7DD7x5y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y53pqrEv,_ZTv0_n12_N3ccc7DD7x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y53pqrEv,_ZThn4_N3ccc7DD7x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y53efgEv,_ZTv0_n16_N3ccc7DD7x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y53efgEv,_ZThn4_N3ccc7DD7x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y53abcEv,_ZTv0_n20_N3ccc7DD7x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y53abcEv,_ZThn4_N3ccc7DD7x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y53pqrEv,_ZTv0_n12_N3ccc7DD7x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y53efgEv,_ZTv0_n16_N3ccc7DD7x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y53abcEv,_ZTv0_n20_N3ccc7DD7x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y5E[] = {
  {&(_ZTVN3ccc7DD7x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y5E[];
static VTBL_ENTRY alt_thunk_names912[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y53abcEv,_ZTv0_n20_N3ccc7DD7x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y53abcEv,_ZThn4_N3ccc7DD7x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y53efgEv,_ZTv0_n16_N3ccc7DD7x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y53efgEv,_ZThn4_N3ccc7DD7x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y53pqrEv,_ZTv0_n12_N3ccc7DD7x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y53pqrEv,_ZThn4_N3ccc7DD7x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y5E = {  "_ZN3ccc7DD7x5y5E", // class name
  bases__ZN3ccc7DD7x5y5E, 2,
  &(vtc__ZN3ccc7DD7x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y5E),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  CC7x5y6  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x5y63efgEv
  ~CC7x5y6(); // tgen
  CC7x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y6E) C1{ VBC2{ v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y63abcEv");}
void  ccc::CC7x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y63efgEv");}
ccc::CC7x5y6 ::~CC7x5y6(){ note_dtor("_ZN3ccc7CC7x5y6E", this);} // tgen
ccc::CC7x5y6 ::CC7x5y6(){ note_ctor("_ZN3ccc7CC7x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y6E, buf);
    ::ccc::CC7x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y6E);
    dp->::ccc::CC7x5y6::~CC7x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y6E(Test__ZN3ccc7CC7x5y6E, "_ZN3ccc7CC7x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y6C1Ev();
extern void _ZN3ccc7CC7x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y6E[] = {
  NSPAIR(_ZN3ccc7CC7x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC7x5y63efgEv();
extern void _ZN3ccc7CC7x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y63abcEv,_ZTv0_n12_N3ccc7CC7x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y63abcEv,_ZThn4_N3ccc7CC7x5y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y63abcEv,_ZTv0_n12_N3ccc7CC7x5y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y6E[] = {
  {&(_ZTVN3ccc7CC7x5y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y6E[];
static VTBL_ENTRY alt_thunk_names913[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y63abcEv,_ZTv0_n12_N3ccc7CC7x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y63abcEv,_ZThn4_N3ccc7CC7x5y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y6E = {  "_ZN3ccc7CC7x5y6E", // class name
  bases__ZN3ccc7CC7x5y6E, 2,
  &(vtc__ZN3ccc7CC7x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y6E),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  DD7x5y6  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD7x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x5y63efgEv
  ~DD7x5y6(); // tgen
  DD7x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y6E) C1{ VBC2{ v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y63abcEv");}
void  ccc::DD7x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y63efgEv");}
ccc::DD7x5y6 ::~DD7x5y6(){ note_dtor("_ZN3ccc7DD7x5y6E", this);} // tgen
ccc::DD7x5y6 ::DD7x5y6(){ note_ctor("_ZN3ccc7DD7x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y6E, buf);
    ::ccc::DD7x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y6E);
    dp->::ccc::DD7x5y6::~DD7x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y6E(Test__ZN3ccc7DD7x5y6E, "_ZN3ccc7DD7x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y6C1Ev();
extern void _ZN3ccc7DD7x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y6E[] = {
  NSPAIR(_ZN3ccc7DD7x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y6E[];
extern void _ZN3ccc7DD7x5y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y63efgEv,_ZTv0_n16_N3ccc7DD7x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y63efgEv,_ZThn4_N3ccc7DD7x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y63abcEv,_ZTv0_n20_N3ccc7DD7x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y63abcEv,_ZThn4_N3ccc7DD7x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y63efgEv,_ZTv0_n16_N3ccc7DD7x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y63abcEv,_ZTv0_n20_N3ccc7DD7x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y6E[] = {
  {&(_ZTVN3ccc7DD7x5y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y6E[];
static VTBL_ENTRY alt_thunk_names914[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y63abcEv,_ZTv0_n20_N3ccc7DD7x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y63abcEv,_ZThn4_N3ccc7DD7x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y63efgEv,_ZTv0_n16_N3ccc7DD7x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y63efgEv,_ZThn4_N3ccc7DD7x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y6E = {  "_ZN3ccc7DD7x5y6E", // class name
  bases__ZN3ccc7DD7x5y6E, 2,
  &(vtc__ZN3ccc7DD7x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y6E),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  CC7x5y7  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC7x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y73pqrEv
  ~CC7x5y7(); // tgen
  CC7x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y7E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y73abcEv");}
void  ccc::CC7x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y73pqrEv");}
ccc::CC7x5y7 ::~CC7x5y7(){ note_dtor("_ZN3ccc7CC7x5y7E", this);} // tgen
ccc::CC7x5y7 ::CC7x5y7(){ note_ctor("_ZN3ccc7CC7x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y7E, buf);
    ::ccc::CC7x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y7E);
    dp->::ccc::CC7x5y7::~CC7x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y7E(Test__ZN3ccc7CC7x5y7E, "_ZN3ccc7CC7x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y7C1Ev();
extern void _ZN3ccc7CC7x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y7E[] = {
  NSPAIR(_ZN3ccc7CC7x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y7E[];
extern void _ZN3ccc7CC7x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC7x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y73abcEv,_ZTv0_n12_N3ccc7CC7x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y73abcEv,_ZThn4_N3ccc7CC7x5y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y73pqrEv,_ZTv0_n16_N3ccc7CC7x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y73pqrEv,_ZThn4_N3ccc7CC7x5y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y73abcEv,_ZTv0_n12_N3ccc7CC7x5y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y73pqrEv,_ZTv0_n16_N3ccc7CC7x5y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y7E[] = {
  {&(_ZTVN3ccc7CC7x5y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y7E[];
static VTBL_ENTRY alt_thunk_names915[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y73pqrEv,_ZTv0_n16_N3ccc7CC7x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y73pqrEv,_ZThn4_N3ccc7CC7x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y73abcEv,_ZTv0_n12_N3ccc7CC7x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y73abcEv,_ZThn4_N3ccc7CC7x5y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y7E = {  "_ZN3ccc7CC7x5y7E", // class name
  bases__ZN3ccc7CC7x5y7E, 2,
  &(vtc__ZN3ccc7CC7x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y7E),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  DD7x5y7  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD7x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x5y73pqrEv
  ~DD7x5y7(); // tgen
  DD7x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y7E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y73abcEv");}
void  ccc::DD7x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y73pqrEv");}
ccc::DD7x5y7 ::~DD7x5y7(){ note_dtor("_ZN3ccc7DD7x5y7E", this);} // tgen
ccc::DD7x5y7 ::DD7x5y7(){ note_ctor("_ZN3ccc7DD7x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y7E, buf);
    ::ccc::DD7x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y7E);
    dp->::ccc::DD7x5y7::~DD7x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y7E(Test__ZN3ccc7DD7x5y7E, "_ZN3ccc7DD7x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y7C1Ev();
extern void _ZN3ccc7DD7x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y7E[] = {
  NSPAIR(_ZN3ccc7DD7x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y7E[];
extern void _ZN3ccc7DD7x5y73abcEv();
extern void _ZN3ccc7DD7x5y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y73pqrEv,_ZTv0_n12_N3ccc7DD7x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y73pqrEv,_ZThn4_N3ccc7DD7x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y73abcEv,_ZTv0_n20_N3ccc7DD7x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y73abcEv,_ZThn4_N3ccc7DD7x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y73pqrEv,_ZTv0_n12_N3ccc7DD7x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y73abcEv,_ZTv0_n20_N3ccc7DD7x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y7E[] = {
  {&(_ZTVN3ccc7DD7x5y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x5y7E[6]),  6,16},
  {&(_ZTVN3ccc7DD7x5y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y7E[];
static VTBL_ENTRY alt_thunk_names916[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y73abcEv,_ZTv0_n20_N3ccc7DD7x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y73abcEv,_ZThn4_N3ccc7DD7x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y73pqrEv,_ZTv0_n12_N3ccc7DD7x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y73pqrEv,_ZThn4_N3ccc7DD7x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y7E = {  "_ZN3ccc7DD7x5y7E", // class name
  bases__ZN3ccc7DD7x5y7E, 2,
  &(vtc__ZN3ccc7DD7x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y7E),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  CC7x5y8  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x5y83abcEv
  ~CC7x5y8(); // tgen
  CC7x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y8E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y83efgEv");}
void  ccc::CC7x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x5y83abcEv");}
ccc::CC7x5y8 ::~CC7x5y8(){ note_dtor("_ZN3ccc7CC7x5y8E", this);} // tgen
ccc::CC7x5y8 ::CC7x5y8(){ note_ctor("_ZN3ccc7CC7x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y8E, buf);
    ::ccc::CC7x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y8E);
    dp->::ccc::CC7x5y8::~CC7x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y8E(Test__ZN3ccc7CC7x5y8E, "_ZN3ccc7CC7x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y8C1Ev();
extern void _ZN3ccc7CC7x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y8E[] = {
  NSPAIR(_ZN3ccc7CC7x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC7x5y83efgEv();
extern void _ZN3ccc7CC7x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x5y83abcEv,_ZTv0_n12_N3ccc7CC7x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y83abcEv,_ZThn4_N3ccc7CC7x5y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x5y83abcEv,_ZTv0_n12_N3ccc7CC7x5y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y8E[] = {
  {&(_ZTVN3ccc7CC7x5y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y8E[];
static VTBL_ENTRY alt_thunk_names917[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x5y83abcEv,_ZTv0_n12_N3ccc7CC7x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y83abcEv,_ZThn4_N3ccc7CC7x5y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y8E = {  "_ZN3ccc7CC7x5y8E", // class name
  bases__ZN3ccc7CC7x5y8E, 2,
  &(vtc__ZN3ccc7CC7x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y8E),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  DD7x5y8  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD7x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x5y83abcEv
  ~DD7x5y8(); // tgen
  DD7x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y8E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y83efgEv");}
void  ccc::DD7x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x5y83abcEv");}
ccc::DD7x5y8 ::~DD7x5y8(){ note_dtor("_ZN3ccc7DD7x5y8E", this);} // tgen
ccc::DD7x5y8 ::DD7x5y8(){ note_ctor("_ZN3ccc7DD7x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y8E, buf);
    ::ccc::DD7x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y8E);
    dp->::ccc::DD7x5y8::~DD7x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y8E(Test__ZN3ccc7DD7x5y8E, "_ZN3ccc7DD7x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y8C1Ev();
extern void _ZN3ccc7DD7x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y8E[] = {
  NSPAIR(_ZN3ccc7DD7x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y8E[];
extern void _ZN3ccc7DD7x5y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y83efgEv,_ZTv0_n16_N3ccc7DD7x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y83efgEv,_ZThn4_N3ccc7DD7x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD7x5y83abcEv,_ZTv0_n20_N3ccc7DD7x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y83abcEv,_ZThn4_N3ccc7DD7x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y83efgEv,_ZTv0_n16_N3ccc7DD7x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD7x5y83abcEv,_ZTv0_n20_N3ccc7DD7x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y8E[] = {
  {&(_ZTVN3ccc7DD7x5y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y8E[];
static VTBL_ENTRY alt_thunk_names918[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD7x5y83abcEv,_ZTv0_n20_N3ccc7DD7x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y83abcEv,_ZThn4_N3ccc7DD7x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y83efgEv,_ZTv0_n16_N3ccc7DD7x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y83efgEv,_ZThn4_N3ccc7DD7x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y8E = {  "_ZN3ccc7DD7x5y8E", // class name
  bases__ZN3ccc7DD7x5y8E, 2,
  &(vtc__ZN3ccc7DD7x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y8E),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  CC7x5y9  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC7x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x5y93pqrEv
  ~CC7x5y9(); // tgen
  CC7x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x5y9E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x5y93efgEv");}
void  ccc::CC7x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x5y93pqrEv");}
ccc::CC7x5y9 ::~CC7x5y9(){ note_dtor("_ZN3ccc7CC7x5y9E", this);} // tgen
ccc::CC7x5y9 ::CC7x5y9(){ note_ctor("_ZN3ccc7CC7x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x5y9E, buf);
    ::ccc::CC7x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x5y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC7x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x5y9E);
    dp->::ccc::CC7x5y9::~CC7x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x5y9E(Test__ZN3ccc7CC7x5y9E, "_ZN3ccc7CC7x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x5y9C1Ev();
extern void _ZN3ccc7CC7x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x5y9E[] = {
  NSPAIR(_ZN3ccc7CC7x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC7x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x5y9E[];
extern void _ZN3ccc7CC7x5y93pqrEv();
extern void _ZN3ccc7CC7x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x5y93pqrEv,_ZTv0_n16_N3ccc7CC7x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x5y93pqrEv,_ZThn4_N3ccc7CC7x5y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x5y93pqrEv,_ZTv0_n16_N3ccc7CC7x5y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x5y9E[] = {
  {&(_ZTVN3ccc7CC7x5y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x5y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x5y9E[];
static VTBL_ENTRY alt_thunk_names919[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x5y93pqrEv,_ZTv0_n16_N3ccc7CC7x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x5y93pqrEv,_ZThn4_N3ccc7CC7x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x5y9E = {  "_ZN3ccc7CC7x5y9E", // class name
  bases__ZN3ccc7CC7x5y9E, 2,
  &(vtc__ZN3ccc7CC7x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x5y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x5y9E),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  DD7x5y9  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD7x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x5y93pqrEv
  ~DD7x5y9(); // tgen
  DD7x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x5y9E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x5y93efgEv");}
void  ccc::DD7x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x5y93pqrEv");}
ccc::DD7x5y9 ::~DD7x5y9(){ note_dtor("_ZN3ccc7DD7x5y9E", this);} // tgen
ccc::DD7x5y9 ::DD7x5y9(){ note_ctor("_ZN3ccc7DD7x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x5y9E, buf);
    ::ccc::DD7x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x5y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD7x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x5y9E);
    dp->::ccc::DD7x5y9::~DD7x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x5y9E(Test__ZN3ccc7DD7x5y9E, "_ZN3ccc7DD7x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x5y9C1Ev();
extern void _ZN3ccc7DD7x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x5y9E[] = {
  NSPAIR(_ZN3ccc7DD7x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD7x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x5y93pqrEv();
extern void _ZN3ccc7DD7x5y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x5y93pqrEv,_ZTv0_n12_N3ccc7DD7x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y93pqrEv,_ZThn4_N3ccc7DD7x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x5y93efgEv,_ZTv0_n16_N3ccc7DD7x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x5y93efgEv,_ZThn4_N3ccc7DD7x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x5y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x5y93pqrEv,_ZTv0_n12_N3ccc7DD7x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x5y93efgEv,_ZTv0_n16_N3ccc7DD7x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x5y9E[] = {
  {&(_ZTVN3ccc7DD7x5y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD7x5y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x5y9E[];
static VTBL_ENTRY alt_thunk_names920[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x5y93efgEv,_ZTv0_n16_N3ccc7DD7x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y93efgEv,_ZThn4_N3ccc7DD7x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x5y93pqrEv,_ZTv0_n12_N3ccc7DD7x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x5y93pqrEv,_ZThn4_N3ccc7DD7x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x5y9E = {  "_ZN3ccc7DD7x5y9E", // class name
  bases__ZN3ccc7DD7x5y9E, 2,
  &(vtc__ZN3ccc7DD7x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x5y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x5y9E),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  CC7x5y10  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC7x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x5y103abcEv
  ~CC7x5y10(); // tgen
  CC7x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y10E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x5y103pqrEv");}
void  ccc::CC7x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x5y103abcEv");}
ccc::CC7x5y10 ::~CC7x5y10(){ note_dtor("_ZN3ccc8CC7x5y10E", this);} // tgen
ccc::CC7x5y10 ::CC7x5y10(){ note_ctor("_ZN3ccc8CC7x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x5y10E, buf);
    ::ccc::CC7x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x5y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC7x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x5y10E);
    dp->::ccc::CC7x5y10::~CC7x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x5y10E(Test__ZN3ccc8CC7x5y10E, "_ZN3ccc8CC7x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x5y10C1Ev();
extern void _ZN3ccc8CC7x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x5y10E[] = {
  NSPAIR(_ZN3ccc8CC7x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC7x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x5y10E[];
extern void _ZN3ccc8CC7x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC7x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x5y103abcEv,_ZTv0_n12_N3ccc8CC7x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y103abcEv,_ZThn4_N3ccc8CC7x5y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x5y103pqrEv,_ZTv0_n16_N3ccc8CC7x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y103pqrEv,_ZThn4_N3ccc8CC7x5y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x5y103abcEv,_ZTv0_n12_N3ccc8CC7x5y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x5y103pqrEv,_ZTv0_n16_N3ccc8CC7x5y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x5y10E[] = {
  {&(_ZTVN3ccc8CC7x5y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x5y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x5y10E[];
static VTBL_ENTRY alt_thunk_names921[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x5y103pqrEv,_ZTv0_n16_N3ccc8CC7x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x5y103pqrEv,_ZThn4_N3ccc8CC7x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x5y103abcEv,_ZTv0_n12_N3ccc8CC7x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x5y103abcEv,_ZThn4_N3ccc8CC7x5y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x5y10E = {  "_ZN3ccc8CC7x5y10E", // class name
  bases__ZN3ccc8CC7x5y10E, 2,
  &(vtc__ZN3ccc8CC7x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x5y10E),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  DD7x5y10  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD7x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x5y103abcEv
  ~DD7x5y10(); // tgen
  DD7x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x5y10E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x5y103pqrEv");}
void  ccc::DD7x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x5y103abcEv");}
ccc::DD7x5y10 ::~DD7x5y10(){ note_dtor("_ZN3ccc8DD7x5y10E", this);} // tgen
ccc::DD7x5y10 ::DD7x5y10(){ note_ctor("_ZN3ccc8DD7x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x5y10E, buf);
    ::ccc::DD7x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x5y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD7x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x5y10E);
    dp->::ccc::DD7x5y10::~DD7x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x5y10E(Test__ZN3ccc8DD7x5y10E, "_ZN3ccc8DD7x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x5y10C1Ev();
extern void _ZN3ccc8DD7x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x5y10E[] = {
  NSPAIR(_ZN3ccc8DD7x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD7x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y10E[];
extern void _ZN3ccc8DD7x5y103abcEv();
extern void _ZN3ccc8DD7x5y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x5y103pqrEv,_ZTv0_n12_N3ccc8DD7x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y103pqrEv,_ZThn4_N3ccc8DD7x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x5y103abcEv,_ZTv0_n20_N3ccc8DD7x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y103abcEv,_ZThn4_N3ccc8DD7x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x5y103pqrEv,_ZTv0_n12_N3ccc8DD7x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x5y103abcEv,_ZTv0_n20_N3ccc8DD7x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x5y10E[] = {
  {&(_ZTVN3ccc8DD7x5y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y10E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x5y10E[];
static VTBL_ENTRY alt_thunk_names922[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x5y103abcEv,_ZTv0_n20_N3ccc8DD7x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y103abcEv,_ZThn4_N3ccc8DD7x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x5y103pqrEv,_ZTv0_n12_N3ccc8DD7x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y103pqrEv,_ZThn4_N3ccc8DD7x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x5y10E = {  "_ZN3ccc8DD7x5y10E", // class name
  bases__ZN3ccc8DD7x5y10E, 2,
  &(vtc__ZN3ccc8DD7x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x5y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x5y10E),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  CC7x5y11  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC7x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x5y113efgEv
  ~CC7x5y11(); // tgen
  CC7x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y11E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x5y113pqrEv");}
void  ccc::CC7x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x5y113efgEv");}
ccc::CC7x5y11 ::~CC7x5y11(){ note_dtor("_ZN3ccc8CC7x5y11E", this);} // tgen
ccc::CC7x5y11 ::CC7x5y11(){ note_ctor("_ZN3ccc8CC7x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x5y11E, buf);
    ::ccc::CC7x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x5y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC7x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x5y11E);
    dp->::ccc::CC7x5y11::~CC7x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x5y11E(Test__ZN3ccc8CC7x5y11E, "_ZN3ccc8CC7x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x5y11C1Ev();
extern void _ZN3ccc8CC7x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x5y11E[] = {
  NSPAIR(_ZN3ccc8CC7x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC7x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x5y11E[];
extern void _ZN3ccc8CC7x5y113pqrEv();
extern void _ZN3ccc8CC7x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x5y113pqrEv,_ZTv0_n16_N3ccc8CC7x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y113pqrEv,_ZThn4_N3ccc8CC7x5y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x5y113pqrEv,_ZTv0_n16_N3ccc8CC7x5y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x5y11E[] = {
  {&(_ZTVN3ccc8CC7x5y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x5y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x5y11E[];
static VTBL_ENTRY alt_thunk_names923[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x5y113pqrEv,_ZTv0_n16_N3ccc8CC7x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x5y113pqrEv,_ZThn4_N3ccc8CC7x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x5y11E = {  "_ZN3ccc8CC7x5y11E", // class name
  bases__ZN3ccc8CC7x5y11E, 2,
  &(vtc__ZN3ccc8CC7x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x5y11E),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  DD7x5y11  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD7x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x5y113efgEv
  ~DD7x5y11(); // tgen
  DD7x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x5y11E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x5y113pqrEv");}
void  ccc::DD7x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x5y113efgEv");}
ccc::DD7x5y11 ::~DD7x5y11(){ note_dtor("_ZN3ccc8DD7x5y11E", this);} // tgen
ccc::DD7x5y11 ::DD7x5y11(){ note_ctor("_ZN3ccc8DD7x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x5y11E, buf);
    ::ccc::DD7x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x5y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD7x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x5y11E);
    dp->::ccc::DD7x5y11::~DD7x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x5y11E(Test__ZN3ccc8DD7x5y11E, "_ZN3ccc8DD7x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x5y11C1Ev();
extern void _ZN3ccc8DD7x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x5y11E[] = {
  NSPAIR(_ZN3ccc8DD7x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD7x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x5y113pqrEv();
extern void _ZN3ccc8DD7x5y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x5y113pqrEv,_ZTv0_n12_N3ccc8DD7x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y113pqrEv,_ZThn4_N3ccc8DD7x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x5y113efgEv,_ZTv0_n16_N3ccc8DD7x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y113efgEv,_ZThn4_N3ccc8DD7x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x5y113pqrEv,_ZTv0_n12_N3ccc8DD7x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x5y113efgEv,_ZTv0_n16_N3ccc8DD7x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x5y11E[] = {
  {&(_ZTVN3ccc8DD7x5y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x5y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x5y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x5y11E[];
static VTBL_ENTRY alt_thunk_names924[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x5y113efgEv,_ZTv0_n16_N3ccc8DD7x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y113efgEv,_ZThn4_N3ccc8DD7x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x5y113pqrEv,_ZTv0_n12_N3ccc8DD7x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y113pqrEv,_ZThn4_N3ccc8DD7x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x5y11E = {  "_ZN3ccc8DD7x5y11E", // class name
  bases__ZN3ccc8DD7x5y11E, 2,
  &(vtc__ZN3ccc8DD7x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x5y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x5y11E),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  CC7x5y12  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC7x5y123abcEv
  ~CC7x5y12(); // tgen
  CC7x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC7x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x5y123abcEv");}
ccc::CC7x5y12 ::~CC7x5y12(){ note_dtor("_ZN3ccc8CC7x5y12E", this);} // tgen
ccc::CC7x5y12 ::CC7x5y12(){ note_ctor("_ZN3ccc8CC7x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x5y12E, buf);
    ::ccc::CC7x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x5y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC7x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x5y12E);
    dp->::ccc::CC7x5y12::~CC7x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x5y12E(Test__ZN3ccc8CC7x5y12E, "_ZN3ccc8CC7x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x5y12C1Ev();
extern void _ZN3ccc8CC7x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x5y12E[] = {
  NSPAIR(_ZN3ccc8CC7x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC7x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC7x5y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x5y123abcEv,_ZTv0_n12_N3ccc8CC7x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y123abcEv,_ZThn4_N3ccc8CC7x5y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x5y123abcEv,_ZTv0_n12_N3ccc8CC7x5y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x5y12E[] = {
  {&(_ZTVN3ccc8CC7x5y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x5y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x5y12E[];
static VTBL_ENTRY alt_thunk_names925[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x5y123abcEv,_ZTv0_n12_N3ccc8CC7x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x5y123abcEv,_ZThn4_N3ccc8CC7x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x5y12E = {  "_ZN3ccc8CC7x5y12E", // class name
  bases__ZN3ccc8CC7x5y12E, 2,
  &(vtc__ZN3ccc8CC7x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x5y12E),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  DD7x5y12  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD7x5y123abcEv
  ~DD7x5y12(); // tgen
  DD7x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x5y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD7x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x5y123abcEv");}
ccc::DD7x5y12 ::~DD7x5y12(){ note_dtor("_ZN3ccc8DD7x5y12E", this);} // tgen
ccc::DD7x5y12 ::DD7x5y12(){ note_ctor("_ZN3ccc8DD7x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x5y12E, buf);
    ::ccc::DD7x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x5y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD7x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x5y12E);
    dp->::ccc::DD7x5y12::~DD7x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x5y12E(Test__ZN3ccc8DD7x5y12E, "_ZN3ccc8DD7x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x5y12C1Ev();
extern void _ZN3ccc8DD7x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x5y12E[] = {
  NSPAIR(_ZN3ccc8DD7x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD7x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y12E[];
extern void _ZN3ccc8DD7x5y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD7x5y123abcEv,_ZTv0_n20_N3ccc8DD7x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y123abcEv,_ZThn4_N3ccc8DD7x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD7x5y123abcEv,_ZTv0_n20_N3ccc8DD7x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x5y12E[] = {
  {&(_ZTVN3ccc8DD7x5y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x5y12E[];
static VTBL_ENTRY alt_thunk_names926[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD7x5y123abcEv,_ZTv0_n20_N3ccc8DD7x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y123abcEv,_ZThn4_N3ccc8DD7x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x5y12E = {  "_ZN3ccc8DD7x5y12E", // class name
  bases__ZN3ccc8DD7x5y12E, 2,
  &(vtc__ZN3ccc8DD7x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x5y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x5y12E),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  CC7x5y13  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC7x5y133efgEv
  ~CC7x5y13(); // tgen
  CC7x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y13E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC7x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x5y133efgEv");}
ccc::CC7x5y13 ::~CC7x5y13(){ note_dtor("_ZN3ccc8CC7x5y13E", this);} // tgen
ccc::CC7x5y13 ::CC7x5y13(){ note_ctor("_ZN3ccc8CC7x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x5y13E, buf);
    ::ccc::CC7x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x5y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC7x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x5y13E);
    dp->::ccc::CC7x5y13::~CC7x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x5y13E(Test__ZN3ccc8CC7x5y13E, "_ZN3ccc8CC7x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x5y13C1Ev();
extern void _ZN3ccc8CC7x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x5y13E[] = {
  NSPAIR(_ZN3ccc8CC7x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC7x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC7x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x5y13E[] = {
  {&(_ZTVN3ccc8CC7x5y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x5y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x5y13E[];
Class_Descriptor cd__ZN3ccc8CC7x5y13E = {  "_ZN3ccc8CC7x5y13E", // class name
  bases__ZN3ccc8CC7x5y13E, 2,
  &(vtc__ZN3ccc8CC7x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x5y13E),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  DD7x5y13  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD7x5y133efgEv
  ~DD7x5y13(); // tgen
  DD7x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x5y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD7x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x5y133efgEv");}
ccc::DD7x5y13 ::~DD7x5y13(){ note_dtor("_ZN3ccc8DD7x5y13E", this);} // tgen
ccc::DD7x5y13 ::DD7x5y13(){ note_ctor("_ZN3ccc8DD7x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x5y13E, buf);
    ::ccc::DD7x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x5y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD7x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x5y13E);
    dp->::ccc::DD7x5y13::~DD7x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x5y13E(Test__ZN3ccc8DD7x5y13E, "_ZN3ccc8DD7x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x5y13C1Ev();
extern void _ZN3ccc8DD7x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x5y13E[] = {
  NSPAIR(_ZN3ccc8DD7x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD7x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x5y133efgEv,_ZTv0_n16_N3ccc8DD7x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y133efgEv,_ZThn4_N3ccc8DD7x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x5y133efgEv,_ZTv0_n16_N3ccc8DD7x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x5y13E[] = {
  {&(_ZTVN3ccc8DD7x5y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x5y13E[6]),  6,17},
  {&(_ZTVN3ccc8DD7x5y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x5y13E[];
static VTBL_ENTRY alt_thunk_names927[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x5y133efgEv,_ZTv0_n16_N3ccc8DD7x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y133efgEv,_ZThn4_N3ccc8DD7x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x5y13E = {  "_ZN3ccc8DD7x5y13E", // class name
  bases__ZN3ccc8DD7x5y13E, 2,
  &(vtc__ZN3ccc8DD7x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x5y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x5y13E),3, //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  CC7x5y14  : virtual ::ccc::AA7 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC7x5y143pqrEv
  ~CC7x5y14(); // tgen
  CC7x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x5y143pqrEv");}
ccc::CC7x5y14 ::~CC7x5y14(){ note_dtor("_ZN3ccc8CC7x5y14E", this);} // tgen
ccc::CC7x5y14 ::CC7x5y14(){ note_ctor("_ZN3ccc8CC7x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x5y14E, buf);
    ::ccc::CC7x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x5y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC7x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x5y14E);
    dp->::ccc::CC7x5y14::~CC7x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x5y14E(Test__ZN3ccc8CC7x5y14E, "_ZN3ccc8CC7x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x5y14C1Ev();
extern void _ZN3ccc8CC7x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x5y14E[] = {
  NSPAIR(_ZN3ccc8CC7x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC7x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x5y14E[];
extern void _ZN3ccc8CC7x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x5y143pqrEv,_ZTv0_n16_N3ccc8CC7x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x5y143pqrEv,_ZThn4_N3ccc8CC7x5y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x5y143pqrEv,_ZTv0_n16_N3ccc8CC7x5y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x5y14E[] = {
  {&(_ZTVN3ccc8CC7x5y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x5y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x5y14E[];
static VTBL_ENTRY alt_thunk_names928[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x5y143pqrEv,_ZTv0_n16_N3ccc8CC7x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x5y143pqrEv,_ZThn4_N3ccc8CC7x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x5y14E = {  "_ZN3ccc8CC7x5y14E", // class name
  bases__ZN3ccc8CC7x5y14E, 2,
  &(vtc__ZN3ccc8CC7x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x5y14E),2, //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  DD7x5y14  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD7x5y143pqrEv
  ~DD7x5y14(); // tgen
  DD7x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x5y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x5y143pqrEv");}
ccc::DD7x5y14 ::~DD7x5y14(){ note_dtor("_ZN3ccc8DD7x5y14E", this);} // tgen
ccc::DD7x5y14 ::DD7x5y14(){ note_ctor("_ZN3ccc8DD7x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x5y14E, buf);
    ::ccc::DD7x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x5y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD7x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x5y14E);
    dp->::ccc::DD7x5y14::~DD7x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x5y14E(Test__ZN3ccc8DD7x5y14E, "_ZN3ccc8DD7x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x5y14C1Ev();
extern void _ZN3ccc8DD7x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x5y14E[] = {
  NSPAIR(_ZN3ccc8DD7x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD7x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x5y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x5y143pqrEv,_ZTv0_n12_N3ccc8DD7x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x5y143pqrEv,_ZThn4_N3ccc8DD7x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x5y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x5y143pqrEv,_ZTv0_n12_N3ccc8DD7x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x5y14E[] = {
  {&(_ZTVN3ccc8DD7x5y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x5y14E[];
static VTBL_ENTRY alt_thunk_names929[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x5y143pqrEv,_ZTv0_n12_N3ccc8DD7x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x5y143pqrEv,_ZThn4_N3ccc8DD7x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x5y14E = {  "_ZN3ccc8DD7x5y14E", // class name
  bases__ZN3ccc8DD7x5y14E, 2,
  &(vtc__ZN3ccc8DD7x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x5y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x5y14E),3, //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  CC7x5y15  : virtual ::ccc::AA7 , ::ccc::BB5 {
  ~CC7x5y15(); // tgen
  CC7x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x5y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC7x5y15 ::~CC7x5y15(){ note_dtor("_ZN3ccc8CC7x5y15E", this);} // tgen
ccc::CC7x5y15 ::CC7x5y15(){ note_ctor("_ZN3ccc8CC7x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x5y15E, buf);
    ::ccc::CC7x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x5y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC7x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x5y15E);
    dp->::ccc::CC7x5y15::~CC7x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x5y15E(Test__ZN3ccc8CC7x5y15E, "_ZN3ccc8CC7x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x5y15C1Ev();
extern void _ZN3ccc8CC7x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x5y15E[] = {
  NSPAIR(_ZN3ccc8CC7x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC7x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x5y15E[] = {
  {&(_ZTVN3ccc8CC7x5y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x5y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x5y15E[];
Class_Descriptor cd__ZN3ccc8CC7x5y15E = {  "_ZN3ccc8CC7x5y15E", // class name
  bases__ZN3ccc8CC7x5y15E, 2,
  &(vtc__ZN3ccc8CC7x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x5y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x5y15E),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  DD7x5y15  : virtual ::ccc::AA7 , virtual ::ccc::BB5 {
  ~DD7x5y15(); // tgen
  DD7x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x5y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD7x5y15 ::~DD7x5y15(){ note_dtor("_ZN3ccc8DD7x5y15E", this);} // tgen
ccc::DD7x5y15 ::DD7x5y15(){ note_ctor("_ZN3ccc8DD7x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x5y15E, buf);
    ::ccc::DD7x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x5y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD7x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x5y15E);
    dp->::ccc::DD7x5y15::~DD7x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x5y15E(Test__ZN3ccc8DD7x5y15E, "_ZN3ccc8DD7x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x5y15C1Ev();
extern void _ZN3ccc8DD7x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x5y15E[] = {
  NSPAIR(_ZN3ccc8DD7x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD7x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x5y15E[] = {
  {&(_ZTVN3ccc8DD7x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD7x5y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x5y15E[];
Class_Descriptor cd__ZN3ccc8DD7x5y15E = {  "_ZN3ccc8DD7x5y15E", // class name
  bases__ZN3ccc8DD7x5y15E, 2,
  &(vtc__ZN3ccc8DD7x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x5y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x5y15E),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  CC7x6y0  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y03pqrEv
  ~CC7x6y0(); // tgen
  CC7x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y0E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y03abcEv");}
void  ccc::CC7x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y03efgEv");}
void  ccc::CC7x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y03pqrEv");}
ccc::CC7x6y0 ::~CC7x6y0(){ note_dtor("_ZN3ccc7CC7x6y0E", this);} // tgen
ccc::CC7x6y0 ::CC7x6y0(){ note_ctor("_ZN3ccc7CC7x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y0E, buf);
    ::ccc::CC7x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y0E);
    dp->::ccc::CC7x6y0::~CC7x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y0E(Test__ZN3ccc7CC7x6y0E, "_ZN3ccc7CC7x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y0C1Ev();
extern void _ZN3ccc7CC7x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y0E[] = {
  NSPAIR(_ZN3ccc7CC7x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y0E[];
extern void _ZN3ccc7CC7x6y03abcEv();
extern void _ZN3ccc7CC7x6y03efgEv();
extern void _ZN3ccc7CC7x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y03abcEv,_ZTv0_n12_N3ccc7CC7x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y03abcEv,_ZThn4_N3ccc7CC7x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y03pqrEv,_ZTv0_n16_N3ccc7CC7x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y03pqrEv,_ZThn4_N3ccc7CC7x6y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y03abcEv,_ZTv0_n12_N3ccc7CC7x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y03pqrEv,_ZTv0_n16_N3ccc7CC7x6y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y0E[] = {
  {&(_ZTVN3ccc7CC7x6y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y0E[];
static VTBL_ENTRY alt_thunk_names930[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y03pqrEv,_ZTv0_n16_N3ccc7CC7x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y03pqrEv,_ZThn4_N3ccc7CC7x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y03abcEv,_ZTv0_n12_N3ccc7CC7x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y03abcEv,_ZThn4_N3ccc7CC7x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y0E = {  "_ZN3ccc7CC7x6y0E", // class name
  bases__ZN3ccc7CC7x6y0E, 2,
  &(vtc__ZN3ccc7CC7x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y0E),2, //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  DD7x6y0  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD7x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x6y03pqrEv
  ~DD7x6y0(); // tgen
  DD7x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y0E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y03abcEv");}
void  ccc::DD7x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y03efgEv");}
void  ccc::DD7x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y03pqrEv");}
ccc::DD7x6y0 ::~DD7x6y0(){ note_dtor("_ZN3ccc7DD7x6y0E", this);} // tgen
ccc::DD7x6y0 ::DD7x6y0(){ note_ctor("_ZN3ccc7DD7x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y0E, buf);
    ::ccc::DD7x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y0E);
    dp->::ccc::DD7x6y0::~DD7x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y0E(Test__ZN3ccc7DD7x6y0E, "_ZN3ccc7DD7x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y0C1Ev();
extern void _ZN3ccc7DD7x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y0E[] = {
  NSPAIR(_ZN3ccc7DD7x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y0E[];
extern void _ZN3ccc7DD7x6y03abcEv();
extern void _ZN3ccc7DD7x6y03pqrEv();
extern void _ZN3ccc7DD7x6y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y03abcEv,_ZTv0_n12_N3ccc7DD7x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y03abcEv,_ZThn4_N3ccc7DD7x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y03efgEv,_ZTv0_n16_N3ccc7DD7x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y03efgEv,_ZThn4_N3ccc7DD7x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y03abcEv,_ZTv0_n12_N3ccc7DD7x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y03efgEv,_ZTv0_n16_N3ccc7DD7x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y0E[] = {
  {&(_ZTVN3ccc7DD7x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y0E[];
static VTBL_ENTRY alt_thunk_names931[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y03efgEv,_ZTv0_n16_N3ccc7DD7x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y03efgEv,_ZThn4_N3ccc7DD7x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y03abcEv,_ZTv0_n12_N3ccc7DD7x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y03abcEv,_ZThn4_N3ccc7DD7x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y0E = {  "_ZN3ccc7DD7x6y0E", // class name
  bases__ZN3ccc7DD7x6y0E, 2,
  &(vtc__ZN3ccc7DD7x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y0E),3, //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  CC7x6y1  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x6y13efgEv
  ~CC7x6y1(); // tgen
  CC7x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y1E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y13abcEv");}
void  ccc::CC7x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y13pqrEv");}
void  ccc::CC7x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y13efgEv");}
ccc::CC7x6y1 ::~CC7x6y1(){ note_dtor("_ZN3ccc7CC7x6y1E", this);} // tgen
ccc::CC7x6y1 ::CC7x6y1(){ note_ctor("_ZN3ccc7CC7x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y1E, buf);
    ::ccc::CC7x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y1E);
    dp->::ccc::CC7x6y1::~CC7x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y1E(Test__ZN3ccc7CC7x6y1E, "_ZN3ccc7CC7x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y1C1Ev();
extern void _ZN3ccc7CC7x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y1E[] = {
  NSPAIR(_ZN3ccc7CC7x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y1E[];
extern void _ZN3ccc7CC7x6y13abcEv();
extern void _ZN3ccc7CC7x6y13efgEv();
extern void _ZN3ccc7CC7x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y13abcEv,_ZTv0_n12_N3ccc7CC7x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y13abcEv,_ZThn4_N3ccc7CC7x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y13pqrEv,_ZTv0_n16_N3ccc7CC7x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y13pqrEv,_ZThn4_N3ccc7CC7x6y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y13abcEv,_ZTv0_n12_N3ccc7CC7x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y13pqrEv,_ZTv0_n16_N3ccc7CC7x6y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y1E[] = {
  {&(_ZTVN3ccc7CC7x6y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y1E[];
static VTBL_ENTRY alt_thunk_names932[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y13pqrEv,_ZTv0_n16_N3ccc7CC7x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y13pqrEv,_ZThn4_N3ccc7CC7x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y13abcEv,_ZTv0_n12_N3ccc7CC7x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y13abcEv,_ZThn4_N3ccc7CC7x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y1E = {  "_ZN3ccc7CC7x6y1E", // class name
  bases__ZN3ccc7CC7x6y1E, 2,
  &(vtc__ZN3ccc7CC7x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y1E),2, //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  DD7x6y1  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD7x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x6y13efgEv
  ~DD7x6y1(); // tgen
  DD7x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y1E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y13abcEv");}
void  ccc::DD7x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y13pqrEv");}
void  ccc::DD7x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y13efgEv");}
ccc::DD7x6y1 ::~DD7x6y1(){ note_dtor("_ZN3ccc7DD7x6y1E", this);} // tgen
ccc::DD7x6y1 ::DD7x6y1(){ note_ctor("_ZN3ccc7DD7x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y1E, buf);
    ::ccc::DD7x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y1E);
    dp->::ccc::DD7x6y1::~DD7x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y1E(Test__ZN3ccc7DD7x6y1E, "_ZN3ccc7DD7x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y1C1Ev();
extern void _ZN3ccc7DD7x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y1E[] = {
  NSPAIR(_ZN3ccc7DD7x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y1E[];
extern void _ZN3ccc7DD7x6y13abcEv();
extern void _ZN3ccc7DD7x6y13pqrEv();
extern void _ZN3ccc7DD7x6y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y13abcEv,_ZTv0_n12_N3ccc7DD7x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y13abcEv,_ZThn4_N3ccc7DD7x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y13efgEv,_ZTv0_n16_N3ccc7DD7x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y13efgEv,_ZThn4_N3ccc7DD7x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y13abcEv,_ZTv0_n12_N3ccc7DD7x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y13efgEv,_ZTv0_n16_N3ccc7DD7x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y1E[] = {
  {&(_ZTVN3ccc7DD7x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y1E[];
static VTBL_ENTRY alt_thunk_names933[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y13efgEv,_ZTv0_n16_N3ccc7DD7x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y13efgEv,_ZThn4_N3ccc7DD7x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y13abcEv,_ZTv0_n12_N3ccc7DD7x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y13abcEv,_ZThn4_N3ccc7DD7x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y1E = {  "_ZN3ccc7DD7x6y1E", // class name
  bases__ZN3ccc7DD7x6y1E, 2,
  &(vtc__ZN3ccc7DD7x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y1E),3, //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  CC7x6y2  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y23pqrEv
  ~CC7x6y2(); // tgen
  CC7x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y2E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y23efgEv");}
void  ccc::CC7x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y23abcEv");}
void  ccc::CC7x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y23pqrEv");}
ccc::CC7x6y2 ::~CC7x6y2(){ note_dtor("_ZN3ccc7CC7x6y2E", this);} // tgen
ccc::CC7x6y2 ::CC7x6y2(){ note_ctor("_ZN3ccc7CC7x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y2E, buf);
    ::ccc::CC7x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y2E);
    dp->::ccc::CC7x6y2::~CC7x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y2E(Test__ZN3ccc7CC7x6y2E, "_ZN3ccc7CC7x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y2C1Ev();
extern void _ZN3ccc7CC7x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y2E[] = {
  NSPAIR(_ZN3ccc7CC7x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y2E[];
extern void _ZN3ccc7CC7x6y23abcEv();
extern void _ZN3ccc7CC7x6y23efgEv();
extern void _ZN3ccc7CC7x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y23abcEv,_ZTv0_n12_N3ccc7CC7x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y23abcEv,_ZThn4_N3ccc7CC7x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y23pqrEv,_ZTv0_n16_N3ccc7CC7x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y23pqrEv,_ZThn4_N3ccc7CC7x6y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y23abcEv,_ZTv0_n12_N3ccc7CC7x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y23pqrEv,_ZTv0_n16_N3ccc7CC7x6y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y2E[] = {
  {&(_ZTVN3ccc7CC7x6y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y2E[];
static VTBL_ENTRY alt_thunk_names934[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y23pqrEv,_ZTv0_n16_N3ccc7CC7x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y23pqrEv,_ZThn4_N3ccc7CC7x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y23abcEv,_ZTv0_n12_N3ccc7CC7x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y23abcEv,_ZThn4_N3ccc7CC7x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y2E = {  "_ZN3ccc7CC7x6y2E", // class name
  bases__ZN3ccc7CC7x6y2E, 2,
  &(vtc__ZN3ccc7CC7x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y2E),2, //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  DD7x6y2  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD7x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x6y23pqrEv
  ~DD7x6y2(); // tgen
  DD7x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y2E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y23efgEv");}
void  ccc::DD7x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y23abcEv");}
void  ccc::DD7x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y23pqrEv");}
ccc::DD7x6y2 ::~DD7x6y2(){ note_dtor("_ZN3ccc7DD7x6y2E", this);} // tgen
ccc::DD7x6y2 ::DD7x6y2(){ note_ctor("_ZN3ccc7DD7x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y2E, buf);
    ::ccc::DD7x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y2E);
    dp->::ccc::DD7x6y2::~DD7x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y2E(Test__ZN3ccc7DD7x6y2E, "_ZN3ccc7DD7x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y2C1Ev();
extern void _ZN3ccc7DD7x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y2E[] = {
  NSPAIR(_ZN3ccc7DD7x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y2E[];
extern void _ZN3ccc7DD7x6y23abcEv();
extern void _ZN3ccc7DD7x6y23pqrEv();
extern void _ZN3ccc7DD7x6y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y23abcEv,_ZTv0_n12_N3ccc7DD7x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y23abcEv,_ZThn4_N3ccc7DD7x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y23efgEv,_ZTv0_n16_N3ccc7DD7x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y23efgEv,_ZThn4_N3ccc7DD7x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y23abcEv,_ZTv0_n12_N3ccc7DD7x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y23efgEv,_ZTv0_n16_N3ccc7DD7x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y2E[] = {
  {&(_ZTVN3ccc7DD7x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y2E[];
static VTBL_ENTRY alt_thunk_names935[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y23efgEv,_ZTv0_n16_N3ccc7DD7x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y23efgEv,_ZThn4_N3ccc7DD7x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y23abcEv,_ZTv0_n12_N3ccc7DD7x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y23abcEv,_ZThn4_N3ccc7DD7x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y2E = {  "_ZN3ccc7DD7x6y2E", // class name
  bases__ZN3ccc7DD7x6y2E, 2,
  &(vtc__ZN3ccc7DD7x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y2E),3, //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  CC7x6y3  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x6y33abcEv
  ~CC7x6y3(); // tgen
  CC7x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y3E) C1{ VBC2{ v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y33efgEv");}
void  ccc::CC7x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y33pqrEv");}
void  ccc::CC7x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y33abcEv");}
ccc::CC7x6y3 ::~CC7x6y3(){ note_dtor("_ZN3ccc7CC7x6y3E", this);} // tgen
ccc::CC7x6y3 ::CC7x6y3(){ note_ctor("_ZN3ccc7CC7x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y3E, buf);
    ::ccc::CC7x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y3E);
    dp->::ccc::CC7x6y3::~CC7x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y3E(Test__ZN3ccc7CC7x6y3E, "_ZN3ccc7CC7x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y3C1Ev();
extern void _ZN3ccc7CC7x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y3E[] = {
  NSPAIR(_ZN3ccc7CC7x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y3E[];
extern void _ZN3ccc7CC7x6y33abcEv();
extern void _ZN3ccc7CC7x6y33efgEv();
extern void _ZN3ccc7CC7x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y33abcEv,_ZTv0_n12_N3ccc7CC7x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y33abcEv,_ZThn4_N3ccc7CC7x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y33pqrEv,_ZTv0_n16_N3ccc7CC7x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y33pqrEv,_ZThn4_N3ccc7CC7x6y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y33abcEv,_ZTv0_n12_N3ccc7CC7x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y33pqrEv,_ZTv0_n16_N3ccc7CC7x6y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y3E[] = {
  {&(_ZTVN3ccc7CC7x6y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y3E[];
static VTBL_ENTRY alt_thunk_names936[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y33pqrEv,_ZTv0_n16_N3ccc7CC7x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y33pqrEv,_ZThn4_N3ccc7CC7x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y33abcEv,_ZTv0_n12_N3ccc7CC7x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y33abcEv,_ZThn4_N3ccc7CC7x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y3E = {  "_ZN3ccc7CC7x6y3E", // class name
  bases__ZN3ccc7CC7x6y3E, 2,
  &(vtc__ZN3ccc7CC7x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y3E),2, //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  DD7x6y3  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD7x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x6y33abcEv
  ~DD7x6y3(); // tgen
  DD7x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y3E) C1{ VBC2{ v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y33efgEv");}
void  ccc::DD7x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y33pqrEv");}
void  ccc::DD7x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y33abcEv");}
ccc::DD7x6y3 ::~DD7x6y3(){ note_dtor("_ZN3ccc7DD7x6y3E", this);} // tgen
ccc::DD7x6y3 ::DD7x6y3(){ note_ctor("_ZN3ccc7DD7x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y3E, buf);
    ::ccc::DD7x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y3E);
    dp->::ccc::DD7x6y3::~DD7x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y3E(Test__ZN3ccc7DD7x6y3E, "_ZN3ccc7DD7x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y3C1Ev();
extern void _ZN3ccc7DD7x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y3E[] = {
  NSPAIR(_ZN3ccc7DD7x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y3E[];
extern void _ZN3ccc7DD7x6y33abcEv();
extern void _ZN3ccc7DD7x6y33pqrEv();
extern void _ZN3ccc7DD7x6y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y33abcEv,_ZTv0_n12_N3ccc7DD7x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y33abcEv,_ZThn4_N3ccc7DD7x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y33efgEv,_ZTv0_n16_N3ccc7DD7x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y33efgEv,_ZThn4_N3ccc7DD7x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y33abcEv,_ZTv0_n12_N3ccc7DD7x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y33efgEv,_ZTv0_n16_N3ccc7DD7x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y3E[] = {
  {&(_ZTVN3ccc7DD7x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y3E[];
static VTBL_ENTRY alt_thunk_names937[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y33efgEv,_ZTv0_n16_N3ccc7DD7x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y33efgEv,_ZThn4_N3ccc7DD7x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y33abcEv,_ZTv0_n12_N3ccc7DD7x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y33abcEv,_ZThn4_N3ccc7DD7x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y3E = {  "_ZN3ccc7DD7x6y3E", // class name
  bases__ZN3ccc7DD7x6y3E, 2,
  &(vtc__ZN3ccc7DD7x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y3E),3, //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  CC7x6y4  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC7x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x6y43efgEv
  ~CC7x6y4(); // tgen
  CC7x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y4E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y43pqrEv");}
void  ccc::CC7x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y43abcEv");}
void  ccc::CC7x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y43efgEv");}
ccc::CC7x6y4 ::~CC7x6y4(){ note_dtor("_ZN3ccc7CC7x6y4E", this);} // tgen
ccc::CC7x6y4 ::CC7x6y4(){ note_ctor("_ZN3ccc7CC7x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y4E, buf);
    ::ccc::CC7x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y4E);
    dp->::ccc::CC7x6y4::~CC7x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y4E(Test__ZN3ccc7CC7x6y4E, "_ZN3ccc7CC7x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y4C1Ev();
extern void _ZN3ccc7CC7x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y4E[] = {
  NSPAIR(_ZN3ccc7CC7x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y4E[];
extern void _ZN3ccc7CC7x6y43abcEv();
extern void _ZN3ccc7CC7x6y43efgEv();
extern void _ZN3ccc7CC7x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y43abcEv,_ZTv0_n12_N3ccc7CC7x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y43abcEv,_ZThn4_N3ccc7CC7x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y43pqrEv,_ZTv0_n16_N3ccc7CC7x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y43pqrEv,_ZThn4_N3ccc7CC7x6y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y43abcEv,_ZTv0_n12_N3ccc7CC7x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y43pqrEv,_ZTv0_n16_N3ccc7CC7x6y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y4E[] = {
  {&(_ZTVN3ccc7CC7x6y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y4E[];
static VTBL_ENTRY alt_thunk_names938[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y43pqrEv,_ZTv0_n16_N3ccc7CC7x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y43pqrEv,_ZThn4_N3ccc7CC7x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y43abcEv,_ZTv0_n12_N3ccc7CC7x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y43abcEv,_ZThn4_N3ccc7CC7x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y4E = {  "_ZN3ccc7CC7x6y4E", // class name
  bases__ZN3ccc7CC7x6y4E, 2,
  &(vtc__ZN3ccc7CC7x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y4E),2, //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  DD7x6y4  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD7x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x6y43efgEv
  ~DD7x6y4(); // tgen
  DD7x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y4E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y43pqrEv");}
void  ccc::DD7x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y43abcEv");}
void  ccc::DD7x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y43efgEv");}
ccc::DD7x6y4 ::~DD7x6y4(){ note_dtor("_ZN3ccc7DD7x6y4E", this);} // tgen
ccc::DD7x6y4 ::DD7x6y4(){ note_ctor("_ZN3ccc7DD7x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y4E, buf);
    ::ccc::DD7x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y4E);
    dp->::ccc::DD7x6y4::~DD7x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y4E(Test__ZN3ccc7DD7x6y4E, "_ZN3ccc7DD7x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y4C1Ev();
extern void _ZN3ccc7DD7x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y4E[] = {
  NSPAIR(_ZN3ccc7DD7x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y4E[];
extern void _ZN3ccc7DD7x6y43abcEv();
extern void _ZN3ccc7DD7x6y43pqrEv();
extern void _ZN3ccc7DD7x6y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y43abcEv,_ZTv0_n12_N3ccc7DD7x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y43abcEv,_ZThn4_N3ccc7DD7x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y43efgEv,_ZTv0_n16_N3ccc7DD7x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y43efgEv,_ZThn4_N3ccc7DD7x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y43abcEv,_ZTv0_n12_N3ccc7DD7x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y43efgEv,_ZTv0_n16_N3ccc7DD7x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y4E[] = {
  {&(_ZTVN3ccc7DD7x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y4E[];
static VTBL_ENTRY alt_thunk_names939[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y43efgEv,_ZTv0_n16_N3ccc7DD7x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y43efgEv,_ZThn4_N3ccc7DD7x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y43abcEv,_ZTv0_n12_N3ccc7DD7x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y43abcEv,_ZThn4_N3ccc7DD7x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y4E = {  "_ZN3ccc7DD7x6y4E", // class name
  bases__ZN3ccc7DD7x6y4E, 2,
  &(vtc__ZN3ccc7DD7x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y4E),3, //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  CC7x6y5  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC7x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x6y53abcEv
  ~CC7x6y5(); // tgen
  CC7x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y5E) C1{ VBC2{ v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y53pqrEv");}
void  ccc::CC7x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y53efgEv");}
void  ccc::CC7x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y53abcEv");}
ccc::CC7x6y5 ::~CC7x6y5(){ note_dtor("_ZN3ccc7CC7x6y5E", this);} // tgen
ccc::CC7x6y5 ::CC7x6y5(){ note_ctor("_ZN3ccc7CC7x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y5E, buf);
    ::ccc::CC7x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y5E);
    dp->::ccc::CC7x6y5::~CC7x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y5E(Test__ZN3ccc7CC7x6y5E, "_ZN3ccc7CC7x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y5C1Ev();
extern void _ZN3ccc7CC7x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y5E[] = {
  NSPAIR(_ZN3ccc7CC7x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y5E[];
extern void _ZN3ccc7CC7x6y53abcEv();
extern void _ZN3ccc7CC7x6y53efgEv();
extern void _ZN3ccc7CC7x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y53abcEv,_ZTv0_n12_N3ccc7CC7x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y53abcEv,_ZThn4_N3ccc7CC7x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y53pqrEv,_ZTv0_n16_N3ccc7CC7x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y53pqrEv,_ZThn4_N3ccc7CC7x6y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y53abcEv,_ZTv0_n12_N3ccc7CC7x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y53pqrEv,_ZTv0_n16_N3ccc7CC7x6y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y5E[] = {
  {&(_ZTVN3ccc7CC7x6y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y5E[];
static VTBL_ENTRY alt_thunk_names940[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y53pqrEv,_ZTv0_n16_N3ccc7CC7x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y53pqrEv,_ZThn4_N3ccc7CC7x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y53abcEv,_ZTv0_n12_N3ccc7CC7x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y53abcEv,_ZThn4_N3ccc7CC7x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y5E = {  "_ZN3ccc7CC7x6y5E", // class name
  bases__ZN3ccc7CC7x6y5E, 2,
  &(vtc__ZN3ccc7CC7x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y5E),2, //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  DD7x6y5  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD7x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x6y53abcEv
  ~DD7x6y5(); // tgen
  DD7x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y5E) C1{ VBC2{ v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y53pqrEv");}
void  ccc::DD7x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y53efgEv");}
void  ccc::DD7x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y53abcEv");}
ccc::DD7x6y5 ::~DD7x6y5(){ note_dtor("_ZN3ccc7DD7x6y5E", this);} // tgen
ccc::DD7x6y5 ::DD7x6y5(){ note_ctor("_ZN3ccc7DD7x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y5E, buf);
    ::ccc::DD7x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y5E);
    dp->::ccc::DD7x6y5::~DD7x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y5E(Test__ZN3ccc7DD7x6y5E, "_ZN3ccc7DD7x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y5C1Ev();
extern void _ZN3ccc7DD7x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y5E[] = {
  NSPAIR(_ZN3ccc7DD7x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y5E[];
extern void _ZN3ccc7DD7x6y53abcEv();
extern void _ZN3ccc7DD7x6y53pqrEv();
extern void _ZN3ccc7DD7x6y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y53abcEv,_ZTv0_n12_N3ccc7DD7x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y53abcEv,_ZThn4_N3ccc7DD7x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y53efgEv,_ZTv0_n16_N3ccc7DD7x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y53efgEv,_ZThn4_N3ccc7DD7x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y53abcEv,_ZTv0_n12_N3ccc7DD7x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y53efgEv,_ZTv0_n16_N3ccc7DD7x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y5E[] = {
  {&(_ZTVN3ccc7DD7x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y5E[];
static VTBL_ENTRY alt_thunk_names941[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y53efgEv,_ZTv0_n16_N3ccc7DD7x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y53efgEv,_ZThn4_N3ccc7DD7x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y53abcEv,_ZTv0_n12_N3ccc7DD7x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y53abcEv,_ZThn4_N3ccc7DD7x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y5E = {  "_ZN3ccc7DD7x6y5E", // class name
  bases__ZN3ccc7DD7x6y5E, 2,
  &(vtc__ZN3ccc7DD7x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y5E),3, //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  CC7x6y6  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x6y63efgEv
  ~CC7x6y6(); // tgen
  CC7x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y6E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y63abcEv");}
void  ccc::CC7x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y63efgEv");}
ccc::CC7x6y6 ::~CC7x6y6(){ note_dtor("_ZN3ccc7CC7x6y6E", this);} // tgen
ccc::CC7x6y6 ::CC7x6y6(){ note_ctor("_ZN3ccc7CC7x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y6E, buf);
    ::ccc::CC7x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y6E);
    dp->::ccc::CC7x6y6::~CC7x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y6E(Test__ZN3ccc7CC7x6y6E, "_ZN3ccc7CC7x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y6C1Ev();
extern void _ZN3ccc7CC7x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y6E[] = {
  NSPAIR(_ZN3ccc7CC7x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y6E[];
extern void _ZN3ccc7CC7x6y63abcEv();
extern void _ZN3ccc7CC7x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y63abcEv,_ZTv0_n12_N3ccc7CC7x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y63abcEv,_ZThn4_N3ccc7CC7x6y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y63abcEv,_ZTv0_n12_N3ccc7CC7x6y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y6E[] = {
  {&(_ZTVN3ccc7CC7x6y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC7x6y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y6E[];
static VTBL_ENTRY alt_thunk_names942[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y63abcEv,_ZTv0_n12_N3ccc7CC7x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y63abcEv,_ZThn4_N3ccc7CC7x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y6E = {  "_ZN3ccc7CC7x6y6E", // class name
  bases__ZN3ccc7CC7x6y6E, 2,
  &(vtc__ZN3ccc7CC7x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y6E),2, //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  DD7x6y6  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD7x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x6y63efgEv
  ~DD7x6y6(); // tgen
  DD7x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y6E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y63abcEv");}
void  ccc::DD7x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y63efgEv");}
ccc::DD7x6y6 ::~DD7x6y6(){ note_dtor("_ZN3ccc7DD7x6y6E", this);} // tgen
ccc::DD7x6y6 ::DD7x6y6(){ note_ctor("_ZN3ccc7DD7x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y6E, buf);
    ::ccc::DD7x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y6E);
    dp->::ccc::DD7x6y6::~DD7x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y6E(Test__ZN3ccc7DD7x6y6E, "_ZN3ccc7DD7x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y6C1Ev();
extern void _ZN3ccc7DD7x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y6E[] = {
  NSPAIR(_ZN3ccc7DD7x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y6E[];
extern void _ZN3ccc7DD7x6y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y63abcEv,_ZTv0_n12_N3ccc7DD7x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y63abcEv,_ZThn4_N3ccc7DD7x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y63efgEv,_ZTv0_n16_N3ccc7DD7x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y63efgEv,_ZThn4_N3ccc7DD7x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y63abcEv,_ZTv0_n12_N3ccc7DD7x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y63efgEv,_ZTv0_n16_N3ccc7DD7x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y6E[] = {
  {&(_ZTVN3ccc7DD7x6y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y6E[];
static VTBL_ENTRY alt_thunk_names943[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y63efgEv,_ZTv0_n16_N3ccc7DD7x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y63efgEv,_ZThn4_N3ccc7DD7x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y63abcEv,_ZTv0_n12_N3ccc7DD7x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y63abcEv,_ZThn4_N3ccc7DD7x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y6E = {  "_ZN3ccc7DD7x6y6E", // class name
  bases__ZN3ccc7DD7x6y6E, 2,
  &(vtc__ZN3ccc7DD7x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y6E),3, //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  CC7x6y7  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC7x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y73pqrEv
  ~CC7x6y7(); // tgen
  CC7x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y7E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y73abcEv");}
void  ccc::CC7x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y73pqrEv");}
ccc::CC7x6y7 ::~CC7x6y7(){ note_dtor("_ZN3ccc7CC7x6y7E", this);} // tgen
ccc::CC7x6y7 ::CC7x6y7(){ note_ctor("_ZN3ccc7CC7x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y7E, buf);
    ::ccc::CC7x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y7E);
    dp->::ccc::CC7x6y7::~CC7x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y7E(Test__ZN3ccc7CC7x6y7E, "_ZN3ccc7CC7x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y7C1Ev();
extern void _ZN3ccc7CC7x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y7E[] = {
  NSPAIR(_ZN3ccc7CC7x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y7E[];
extern void _ZN3ccc7CC7x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC7x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y73abcEv,_ZTv0_n12_N3ccc7CC7x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y73abcEv,_ZThn4_N3ccc7CC7x6y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y73pqrEv,_ZTv0_n16_N3ccc7CC7x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y73pqrEv,_ZThn4_N3ccc7CC7x6y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y73abcEv,_ZTv0_n12_N3ccc7CC7x6y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y73pqrEv,_ZTv0_n16_N3ccc7CC7x6y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y7E[] = {
  {&(_ZTVN3ccc7CC7x6y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y7E[];
static VTBL_ENTRY alt_thunk_names944[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y73pqrEv,_ZTv0_n16_N3ccc7CC7x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y73pqrEv,_ZThn4_N3ccc7CC7x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y73abcEv,_ZTv0_n12_N3ccc7CC7x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y73abcEv,_ZThn4_N3ccc7CC7x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y7E = {  "_ZN3ccc7CC7x6y7E", // class name
  bases__ZN3ccc7CC7x6y7E, 2,
  &(vtc__ZN3ccc7CC7x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y7E),2, //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  DD7x6y7  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD7x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x6y73pqrEv
  ~DD7x6y7(); // tgen
  DD7x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y7E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y73abcEv");}
void  ccc::DD7x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y73pqrEv");}
ccc::DD7x6y7 ::~DD7x6y7(){ note_dtor("_ZN3ccc7DD7x6y7E", this);} // tgen
ccc::DD7x6y7 ::DD7x6y7(){ note_ctor("_ZN3ccc7DD7x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y7E, buf);
    ::ccc::DD7x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y7E);
    dp->::ccc::DD7x6y7::~DD7x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y7E(Test__ZN3ccc7DD7x6y7E, "_ZN3ccc7DD7x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y7C1Ev();
extern void _ZN3ccc7DD7x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y7E[] = {
  NSPAIR(_ZN3ccc7DD7x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y7E[];
extern void _ZN3ccc7DD7x6y73abcEv();
extern void _ZN3ccc7DD7x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y73abcEv,_ZTv0_n12_N3ccc7DD7x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y73abcEv,_ZThn4_N3ccc7DD7x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y73abcEv,_ZTv0_n12_N3ccc7DD7x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y7E[] = {
  {&(_ZTVN3ccc7DD7x6y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x6y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x6y7E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y7E[];
static VTBL_ENTRY alt_thunk_names945[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y73abcEv,_ZTv0_n12_N3ccc7DD7x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y73abcEv,_ZThn4_N3ccc7DD7x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y7E = {  "_ZN3ccc7DD7x6y7E", // class name
  bases__ZN3ccc7DD7x6y7E, 2,
  &(vtc__ZN3ccc7DD7x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y7E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y7E),3, //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  CC7x6y8  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x6y83abcEv
  ~CC7x6y8(); // tgen
  CC7x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y8E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y83efgEv");}
void  ccc::CC7x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x6y83abcEv");}
ccc::CC7x6y8 ::~CC7x6y8(){ note_dtor("_ZN3ccc7CC7x6y8E", this);} // tgen
ccc::CC7x6y8 ::CC7x6y8(){ note_ctor("_ZN3ccc7CC7x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y8E, buf);
    ::ccc::CC7x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y8E);
    dp->::ccc::CC7x6y8::~CC7x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y8E(Test__ZN3ccc7CC7x6y8E, "_ZN3ccc7CC7x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y8C1Ev();
extern void _ZN3ccc7CC7x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y8E[] = {
  NSPAIR(_ZN3ccc7CC7x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y8E[];
extern void _ZN3ccc7CC7x6y83abcEv();
extern void _ZN3ccc7CC7x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x6y83abcEv,_ZTv0_n12_N3ccc7CC7x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y83abcEv,_ZThn4_N3ccc7CC7x6y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x6y83abcEv,_ZTv0_n12_N3ccc7CC7x6y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y8E[] = {
  {&(_ZTVN3ccc7CC7x6y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC7x6y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y8E[];
static VTBL_ENTRY alt_thunk_names946[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x6y83abcEv,_ZTv0_n12_N3ccc7CC7x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y83abcEv,_ZThn4_N3ccc7CC7x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y8E = {  "_ZN3ccc7CC7x6y8E", // class name
  bases__ZN3ccc7CC7x6y8E, 2,
  &(vtc__ZN3ccc7CC7x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y8E),2, //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  DD7x6y8  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD7x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x6y83abcEv
  ~DD7x6y8(); // tgen
  DD7x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y8E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y83efgEv");}
void  ccc::DD7x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x6y83abcEv");}
ccc::DD7x6y8 ::~DD7x6y8(){ note_dtor("_ZN3ccc7DD7x6y8E", this);} // tgen
ccc::DD7x6y8 ::DD7x6y8(){ note_ctor("_ZN3ccc7DD7x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y8E, buf);
    ::ccc::DD7x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y8E);
    dp->::ccc::DD7x6y8::~DD7x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y8E(Test__ZN3ccc7DD7x6y8E, "_ZN3ccc7DD7x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y8C1Ev();
extern void _ZN3ccc7DD7x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y8E[] = {
  NSPAIR(_ZN3ccc7DD7x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y8E[];
extern void _ZN3ccc7DD7x6y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x6y83abcEv,_ZTv0_n12_N3ccc7DD7x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y83abcEv,_ZThn4_N3ccc7DD7x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y83efgEv,_ZTv0_n16_N3ccc7DD7x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y83efgEv,_ZThn4_N3ccc7DD7x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x6y83abcEv,_ZTv0_n12_N3ccc7DD7x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y83efgEv,_ZTv0_n16_N3ccc7DD7x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y8E[] = {
  {&(_ZTVN3ccc7DD7x6y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y8E[];
static VTBL_ENTRY alt_thunk_names947[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y83efgEv,_ZTv0_n16_N3ccc7DD7x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y83efgEv,_ZThn4_N3ccc7DD7x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x6y83abcEv,_ZTv0_n12_N3ccc7DD7x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y83abcEv,_ZThn4_N3ccc7DD7x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y8E = {  "_ZN3ccc7DD7x6y8E", // class name
  bases__ZN3ccc7DD7x6y8E, 2,
  &(vtc__ZN3ccc7DD7x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y8E),3, //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  CC7x6y9  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC7x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x6y93pqrEv
  ~CC7x6y9(); // tgen
  CC7x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x6y9E) C1{ VBC2{ v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x6y93efgEv");}
void  ccc::CC7x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x6y93pqrEv");}
ccc::CC7x6y9 ::~CC7x6y9(){ note_dtor("_ZN3ccc7CC7x6y9E", this);} // tgen
ccc::CC7x6y9 ::CC7x6y9(){ note_ctor("_ZN3ccc7CC7x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x6y9E, buf);
    ::ccc::CC7x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x6y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC7x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x6y9E);
    dp->::ccc::CC7x6y9::~CC7x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x6y9E(Test__ZN3ccc7CC7x6y9E, "_ZN3ccc7CC7x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x6y9C1Ev();
extern void _ZN3ccc7CC7x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x6y9E[] = {
  NSPAIR(_ZN3ccc7CC7x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC7x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC7x6y93efgEv();
extern void _ZN3ccc7CC7x6y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x6y93pqrEv,_ZTv0_n16_N3ccc7CC7x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x6y93pqrEv,_ZThn4_N3ccc7CC7x6y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x6y93pqrEv,_ZTv0_n16_N3ccc7CC7x6y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x6y9E[] = {
  {&(_ZTVN3ccc7CC7x6y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x6y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x6y9E[];
static VTBL_ENTRY alt_thunk_names948[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x6y93pqrEv,_ZTv0_n16_N3ccc7CC7x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x6y93pqrEv,_ZThn4_N3ccc7CC7x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x6y9E = {  "_ZN3ccc7CC7x6y9E", // class name
  bases__ZN3ccc7CC7x6y9E, 2,
  &(vtc__ZN3ccc7CC7x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x6y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x6y9E),2, //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  DD7x6y9  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD7x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x6y93pqrEv
  ~DD7x6y9(); // tgen
  DD7x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x6y9E) C1{ VBC2{ v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x6y93efgEv");}
void  ccc::DD7x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x6y93pqrEv");}
ccc::DD7x6y9 ::~DD7x6y9(){ note_dtor("_ZN3ccc7DD7x6y9E", this);} // tgen
ccc::DD7x6y9 ::DD7x6y9(){ note_ctor("_ZN3ccc7DD7x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x6y9E, buf);
    ::ccc::DD7x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x6y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD7x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x6y9E);
    dp->::ccc::DD7x6y9::~DD7x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x6y9E(Test__ZN3ccc7DD7x6y9E, "_ZN3ccc7DD7x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x6y9C1Ev();
extern void _ZN3ccc7DD7x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x6y9E[] = {
  NSPAIR(_ZN3ccc7DD7x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD7x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x6y93pqrEv();
extern void _ZN3ccc7DD7x6y93efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x6y93efgEv,_ZTv0_n16_N3ccc7DD7x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x6y93efgEv,_ZThn4_N3ccc7DD7x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x6y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x6y93efgEv,_ZTv0_n16_N3ccc7DD7x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x6y9E[] = {
  {&(_ZTVN3ccc7DD7x6y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x6y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x6y9E[];
static VTBL_ENTRY alt_thunk_names949[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x6y93efgEv,_ZTv0_n16_N3ccc7DD7x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x6y93efgEv,_ZThn4_N3ccc7DD7x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x6y9E = {  "_ZN3ccc7DD7x6y9E", // class name
  bases__ZN3ccc7DD7x6y9E, 2,
  &(vtc__ZN3ccc7DD7x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x6y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x6y9E),3, //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  CC7x6y10  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC7x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x6y103abcEv
  ~CC7x6y10(); // tgen
  CC7x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y10E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x6y103pqrEv");}
void  ccc::CC7x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x6y103abcEv");}
ccc::CC7x6y10 ::~CC7x6y10(){ note_dtor("_ZN3ccc8CC7x6y10E", this);} // tgen
ccc::CC7x6y10 ::CC7x6y10(){ note_ctor("_ZN3ccc8CC7x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x6y10E, buf);
    ::ccc::CC7x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x6y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC7x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x6y10E);
    dp->::ccc::CC7x6y10::~CC7x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x6y10E(Test__ZN3ccc8CC7x6y10E, "_ZN3ccc8CC7x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x6y10C1Ev();
extern void _ZN3ccc8CC7x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x6y10E[] = {
  NSPAIR(_ZN3ccc8CC7x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC7x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x6y10E[];
extern void _ZN3ccc8CC7x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC7x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x6y103abcEv,_ZTv0_n12_N3ccc8CC7x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y103abcEv,_ZThn4_N3ccc8CC7x6y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x6y103pqrEv,_ZTv0_n16_N3ccc8CC7x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y103pqrEv,_ZThn4_N3ccc8CC7x6y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x6y103abcEv,_ZTv0_n12_N3ccc8CC7x6y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x6y103pqrEv,_ZTv0_n16_N3ccc8CC7x6y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x6y10E[] = {
  {&(_ZTVN3ccc8CC7x6y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x6y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x6y10E[];
static VTBL_ENTRY alt_thunk_names950[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x6y103pqrEv,_ZTv0_n16_N3ccc8CC7x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x6y103pqrEv,_ZThn4_N3ccc8CC7x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x6y103abcEv,_ZTv0_n12_N3ccc8CC7x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x6y103abcEv,_ZThn4_N3ccc8CC7x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x6y10E = {  "_ZN3ccc8CC7x6y10E", // class name
  bases__ZN3ccc8CC7x6y10E, 2,
  &(vtc__ZN3ccc8CC7x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x6y10E),2, //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  DD7x6y10  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD7x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x6y103abcEv
  ~DD7x6y10(); // tgen
  DD7x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x6y10E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x6y103pqrEv");}
void  ccc::DD7x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x6y103abcEv");}
ccc::DD7x6y10 ::~DD7x6y10(){ note_dtor("_ZN3ccc8DD7x6y10E", this);} // tgen
ccc::DD7x6y10 ::DD7x6y10(){ note_ctor("_ZN3ccc8DD7x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x6y10E, buf);
    ::ccc::DD7x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x6y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD7x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x6y10E);
    dp->::ccc::DD7x6y10::~DD7x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x6y10E(Test__ZN3ccc8DD7x6y10E, "_ZN3ccc8DD7x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x6y10C1Ev();
extern void _ZN3ccc8DD7x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x6y10E[] = {
  NSPAIR(_ZN3ccc8DD7x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD7x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y10E[];
extern void _ZN3ccc8DD7x6y103abcEv();
extern void _ZN3ccc8DD7x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x6y103abcEv,_ZTv0_n12_N3ccc8DD7x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x6y103abcEv,_ZThn4_N3ccc8DD7x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x6y103abcEv,_ZTv0_n12_N3ccc8DD7x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x6y10E[] = {
  {&(_ZTVN3ccc8DD7x6y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y10E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x6y10E[];
static VTBL_ENTRY alt_thunk_names951[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x6y103abcEv,_ZTv0_n12_N3ccc8DD7x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x6y103abcEv,_ZThn4_N3ccc8DD7x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x6y10E = {  "_ZN3ccc8DD7x6y10E", // class name
  bases__ZN3ccc8DD7x6y10E, 2,
  &(vtc__ZN3ccc8DD7x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x6y10E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x6y10E),3, //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  CC7x6y11  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC7x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x6y113efgEv
  ~CC7x6y11(); // tgen
  CC7x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y11E) C1{ VBC2{ v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x6y113pqrEv");}
void  ccc::CC7x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x6y113efgEv");}
ccc::CC7x6y11 ::~CC7x6y11(){ note_dtor("_ZN3ccc8CC7x6y11E", this);} // tgen
ccc::CC7x6y11 ::CC7x6y11(){ note_ctor("_ZN3ccc8CC7x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x6y11E, buf);
    ::ccc::CC7x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x6y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC7x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x6y11E);
    dp->::ccc::CC7x6y11::~CC7x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x6y11E(Test__ZN3ccc8CC7x6y11E, "_ZN3ccc8CC7x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x6y11C1Ev();
extern void _ZN3ccc8CC7x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x6y11E[] = {
  NSPAIR(_ZN3ccc8CC7x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC7x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC7x6y113efgEv();
extern void _ZN3ccc8CC7x6y113pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x6y113pqrEv,_ZTv0_n16_N3ccc8CC7x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y113pqrEv,_ZThn4_N3ccc8CC7x6y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x6y113pqrEv,_ZTv0_n16_N3ccc8CC7x6y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x6y11E[] = {
  {&(_ZTVN3ccc8CC7x6y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x6y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x6y11E[];
static VTBL_ENTRY alt_thunk_names952[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x6y113pqrEv,_ZTv0_n16_N3ccc8CC7x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x6y113pqrEv,_ZThn4_N3ccc8CC7x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x6y11E = {  "_ZN3ccc8CC7x6y11E", // class name
  bases__ZN3ccc8CC7x6y11E, 2,
  &(vtc__ZN3ccc8CC7x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x6y11E),2, //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  DD7x6y11  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD7x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x6y113efgEv
  ~DD7x6y11(); // tgen
  DD7x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x6y11E) C1{ VBC2{ v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x6y113pqrEv");}
void  ccc::DD7x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x6y113efgEv");}
ccc::DD7x6y11 ::~DD7x6y11(){ note_dtor("_ZN3ccc8DD7x6y11E", this);} // tgen
ccc::DD7x6y11 ::DD7x6y11(){ note_ctor("_ZN3ccc8DD7x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x6y11E, buf);
    ::ccc::DD7x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x6y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD7x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x6y11E);
    dp->::ccc::DD7x6y11::~DD7x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x6y11E(Test__ZN3ccc8DD7x6y11E, "_ZN3ccc8DD7x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x6y11C1Ev();
extern void _ZN3ccc8DD7x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x6y11E[] = {
  NSPAIR(_ZN3ccc8DD7x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD7x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x6y113pqrEv();
extern void _ZN3ccc8DD7x6y113efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x6y113efgEv,_ZTv0_n16_N3ccc8DD7x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x6y113efgEv,_ZThn4_N3ccc8DD7x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x6y113efgEv,_ZTv0_n16_N3ccc8DD7x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x6y11E[] = {
  {&(_ZTVN3ccc8DD7x6y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x6y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x6y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x6y11E[];
static VTBL_ENTRY alt_thunk_names953[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x6y113efgEv,_ZTv0_n16_N3ccc8DD7x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x6y113efgEv,_ZThn4_N3ccc8DD7x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x6y11E = {  "_ZN3ccc8DD7x6y11E", // class name
  bases__ZN3ccc8DD7x6y11E, 2,
  &(vtc__ZN3ccc8DD7x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x6y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x6y11E),3, //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  CC7x6y12  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC7x6y123abcEv
  ~CC7x6y12(); // tgen
  CC7x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC7x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x6y123abcEv");}
ccc::CC7x6y12 ::~CC7x6y12(){ note_dtor("_ZN3ccc8CC7x6y12E", this);} // tgen
ccc::CC7x6y12 ::CC7x6y12(){ note_ctor("_ZN3ccc8CC7x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x6y12E, buf);
    ::ccc::CC7x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x6y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC7x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x6y12E);
    dp->::ccc::CC7x6y12::~CC7x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x6y12E(Test__ZN3ccc8CC7x6y12E, "_ZN3ccc8CC7x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x6y12C1Ev();
extern void _ZN3ccc8CC7x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x6y12E[] = {
  NSPAIR(_ZN3ccc8CC7x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC7x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x6y12E[];
extern void _ZN3ccc8CC7x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x6y123abcEv,_ZTv0_n12_N3ccc8CC7x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y123abcEv,_ZThn4_N3ccc8CC7x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x6y123abcEv,_ZTv0_n12_N3ccc8CC7x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x6y12E[] = {
  {&(_ZTVN3ccc8CC7x6y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x6y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x6y12E[];
static VTBL_ENTRY alt_thunk_names954[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x6y123abcEv,_ZTv0_n12_N3ccc8CC7x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x6y123abcEv,_ZThn4_N3ccc8CC7x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x6y12E = {  "_ZN3ccc8CC7x6y12E", // class name
  bases__ZN3ccc8CC7x6y12E, 2,
  &(vtc__ZN3ccc8CC7x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x6y12E),2, //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  DD7x6y12  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD7x6y123abcEv
  ~DD7x6y12(); // tgen
  DD7x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x6y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD7x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x6y123abcEv");}
ccc::DD7x6y12 ::~DD7x6y12(){ note_dtor("_ZN3ccc8DD7x6y12E", this);} // tgen
ccc::DD7x6y12 ::DD7x6y12(){ note_ctor("_ZN3ccc8DD7x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x6y12E, buf);
    ::ccc::DD7x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x6y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD7x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x6y12E);
    dp->::ccc::DD7x6y12::~DD7x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x6y12E(Test__ZN3ccc8DD7x6y12E, "_ZN3ccc8DD7x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x6y12C1Ev();
extern void _ZN3ccc8DD7x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x6y12E[] = {
  NSPAIR(_ZN3ccc8DD7x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD7x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y12E[];
extern void _ZN3ccc8DD7x6y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x6y123abcEv,_ZTv0_n12_N3ccc8DD7x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x6y123abcEv,_ZThn4_N3ccc8DD7x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x6y123abcEv,_ZTv0_n12_N3ccc8DD7x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x6y12E[] = {
  {&(_ZTVN3ccc8DD7x6y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x6y12E[];
static VTBL_ENTRY alt_thunk_names955[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x6y123abcEv,_ZTv0_n12_N3ccc8DD7x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x6y123abcEv,_ZThn4_N3ccc8DD7x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x6y12E = {  "_ZN3ccc8DD7x6y12E", // class name
  bases__ZN3ccc8DD7x6y12E, 2,
  &(vtc__ZN3ccc8DD7x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x6y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x6y12E),3, //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  CC7x6y13  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC7x6y133efgEv
  ~CC7x6y13(); // tgen
  CC7x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y13E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC7x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x6y133efgEv");}
ccc::CC7x6y13 ::~CC7x6y13(){ note_dtor("_ZN3ccc8CC7x6y13E", this);} // tgen
ccc::CC7x6y13 ::CC7x6y13(){ note_ctor("_ZN3ccc8CC7x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x6y13E, buf);
    ::ccc::CC7x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x6y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC7x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x6y13E);
    dp->::ccc::CC7x6y13::~CC7x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x6y13E(Test__ZN3ccc8CC7x6y13E, "_ZN3ccc8CC7x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x6y13C1Ev();
extern void _ZN3ccc8CC7x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x6y13E[] = {
  NSPAIR(_ZN3ccc8CC7x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC7x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC7x6y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x6y13E[] = {
  {&(_ZTVN3ccc8CC7x6y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x6y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x6y13E[];
Class_Descriptor cd__ZN3ccc8CC7x6y13E = {  "_ZN3ccc8CC7x6y13E", // class name
  bases__ZN3ccc8CC7x6y13E, 2,
  &(vtc__ZN3ccc8CC7x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x6y13E),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  DD7x6y13  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD7x6y133efgEv
  ~DD7x6y13(); // tgen
  DD7x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x6y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD7x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x6y133efgEv");}
ccc::DD7x6y13 ::~DD7x6y13(){ note_dtor("_ZN3ccc8DD7x6y13E", this);} // tgen
ccc::DD7x6y13 ::DD7x6y13(){ note_ctor("_ZN3ccc8DD7x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x6y13E, buf);
    ::ccc::DD7x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x6y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD7x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x6y13E);
    dp->::ccc::DD7x6y13::~DD7x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x6y13E(Test__ZN3ccc8DD7x6y13E, "_ZN3ccc8DD7x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x6y13C1Ev();
extern void _ZN3ccc8DD7x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x6y13E[] = {
  NSPAIR(_ZN3ccc8DD7x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD7x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x6y133efgEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x6y133efgEv,_ZTv0_n16_N3ccc8DD7x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x6y133efgEv,_ZThn4_N3ccc8DD7x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x6y133efgEv,_ZTv0_n16_N3ccc8DD7x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x6y13E[] = {
  {&(_ZTVN3ccc8DD7x6y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x6y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x6y13E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x6y13E[];
static VTBL_ENTRY alt_thunk_names956[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x6y133efgEv,_ZTv0_n16_N3ccc8DD7x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x6y133efgEv,_ZThn4_N3ccc8DD7x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x6y13E = {  "_ZN3ccc8DD7x6y13E", // class name
  bases__ZN3ccc8DD7x6y13E, 2,
  &(vtc__ZN3ccc8DD7x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x6y13E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x6y13E),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  CC7x6y14  : virtual ::ccc::AA7 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC7x6y143pqrEv
  ~CC7x6y14(); // tgen
  CC7x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x6y143pqrEv");}
ccc::CC7x6y14 ::~CC7x6y14(){ note_dtor("_ZN3ccc8CC7x6y14E", this);} // tgen
ccc::CC7x6y14 ::CC7x6y14(){ note_ctor("_ZN3ccc8CC7x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x6y14E, buf);
    ::ccc::CC7x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x6y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC7x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x6y14E);
    dp->::ccc::CC7x6y14::~CC7x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x6y14E(Test__ZN3ccc8CC7x6y14E, "_ZN3ccc8CC7x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x6y14C1Ev();
extern void _ZN3ccc8CC7x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x6y14E[] = {
  NSPAIR(_ZN3ccc8CC7x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC7x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC7x6y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x6y143pqrEv,_ZTv0_n16_N3ccc8CC7x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x6y143pqrEv,_ZThn4_N3ccc8CC7x6y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x6y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x6y143pqrEv,_ZTv0_n16_N3ccc8CC7x6y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x6y14E[] = {
  {&(_ZTVN3ccc8CC7x6y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x6y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x6y14E[];
static VTBL_ENTRY alt_thunk_names957[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x6y143pqrEv,_ZTv0_n16_N3ccc8CC7x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x6y143pqrEv,_ZThn4_N3ccc8CC7x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x6y14E = {  "_ZN3ccc8CC7x6y14E", // class name
  bases__ZN3ccc8CC7x6y14E, 2,
  &(vtc__ZN3ccc8CC7x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x6y14E),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  DD7x6y14  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD7x6y143pqrEv
  ~DD7x6y14(); // tgen
  DD7x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x6y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x6y143pqrEv");}
ccc::DD7x6y14 ::~DD7x6y14(){ note_dtor("_ZN3ccc8DD7x6y14E", this);} // tgen
ccc::DD7x6y14 ::DD7x6y14(){ note_ctor("_ZN3ccc8DD7x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x6y14E, buf);
    ::ccc::DD7x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x6y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD7x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x6y14E);
    dp->::ccc::DD7x6y14::~DD7x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x6y14E(Test__ZN3ccc8DD7x6y14E, "_ZN3ccc8DD7x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x6y14C1Ev();
extern void _ZN3ccc8DD7x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x6y14E[] = {
  NSPAIR(_ZN3ccc8DD7x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD7x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x6y14E[] = {
  {&(_ZTVN3ccc8DD7x6y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x6y14E[];
Class_Descriptor cd__ZN3ccc8DD7x6y14E = {  "_ZN3ccc8DD7x6y14E", // class name
  bases__ZN3ccc8DD7x6y14E, 2,
  &(vtc__ZN3ccc8DD7x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x6y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x6y14E),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  CC7x6y15  : virtual ::ccc::AA7 , ::ccc::BB6 {
  ~CC7x6y15(); // tgen
  CC7x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x6y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC7x6y15 ::~CC7x6y15(){ note_dtor("_ZN3ccc8CC7x6y15E", this);} // tgen
ccc::CC7x6y15 ::CC7x6y15(){ note_ctor("_ZN3ccc8CC7x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x6y15E, buf);
    ::ccc::CC7x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x6y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC7x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x6y15E);
    dp->::ccc::CC7x6y15::~CC7x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x6y15E(Test__ZN3ccc8CC7x6y15E, "_ZN3ccc8CC7x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x6y15C1Ev();
extern void _ZN3ccc8CC7x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x6y15E[] = {
  NSPAIR(_ZN3ccc8CC7x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC7x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x6y15E[] = {
  {&(_ZTVN3ccc8CC7x6y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x6y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x6y15E[];
Class_Descriptor cd__ZN3ccc8CC7x6y15E = {  "_ZN3ccc8CC7x6y15E", // class name
  bases__ZN3ccc8CC7x6y15E, 2,
  &(vtc__ZN3ccc8CC7x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x6y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x6y15E),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  DD7x6y15  : virtual ::ccc::AA7 , virtual ::ccc::BB6 {
  ~DD7x6y15(); // tgen
  DD7x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x6y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD7x6y15 ::~DD7x6y15(){ note_dtor("_ZN3ccc8DD7x6y15E", this);} // tgen
ccc::DD7x6y15 ::DD7x6y15(){ note_ctor("_ZN3ccc8DD7x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x6y15E, buf);
    ::ccc::DD7x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x6y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD7x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x6y15E);
    dp->::ccc::DD7x6y15::~DD7x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x6y15E(Test__ZN3ccc8DD7x6y15E, "_ZN3ccc8DD7x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x6y15C1Ev();
extern void _ZN3ccc8DD7x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x6y15E[] = {
  NSPAIR(_ZN3ccc8DD7x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD7x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x6y15E[] = {
  {&(_ZTVN3ccc8DD7x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x6y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x6y15E[];
Class_Descriptor cd__ZN3ccc8DD7x6y15E = {  "_ZN3ccc8DD7x6y15E", // class name
  bases__ZN3ccc8DD7x6y15E, 2,
  &(vtc__ZN3ccc8DD7x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x6y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x6y15E),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  CC7x7y0  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y03pqrEv
  ~CC7x7y0(); // tgen
  CC7x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y0E) C1{ VBC2{ v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y03abcEv");}
void  ccc::CC7x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y03efgEv");}
void  ccc::CC7x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y03pqrEv");}
ccc::CC7x7y0 ::~CC7x7y0(){ note_dtor("_ZN3ccc7CC7x7y0E", this);} // tgen
ccc::CC7x7y0 ::CC7x7y0(){ note_ctor("_ZN3ccc7CC7x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y0E, buf);
    ::ccc::CC7x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y0E);
    dp->::ccc::CC7x7y0::~CC7x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y0E(Test__ZN3ccc7CC7x7y0E, "_ZN3ccc7CC7x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y0C1Ev();
extern void _ZN3ccc7CC7x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y0E[] = {
  NSPAIR(_ZN3ccc7CC7x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y0E[];
extern void _ZN3ccc7CC7x7y03abcEv();
extern void _ZN3ccc7CC7x7y03pqrEv();
extern void _ZN3ccc7CC7x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y03abcEv,_ZTv0_n12_N3ccc7CC7x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y03abcEv,_ZThn4_N3ccc7CC7x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y03pqrEv,_ZTv0_n16_N3ccc7CC7x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y03pqrEv,_ZThn4_N3ccc7CC7x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y03abcEv,_ZTv0_n12_N3ccc7CC7x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y03pqrEv,_ZTv0_n16_N3ccc7CC7x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y0E[] = {
  {&(_ZTVN3ccc7CC7x7y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y0E[];
static VTBL_ENTRY alt_thunk_names958[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y03pqrEv,_ZTv0_n16_N3ccc7CC7x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y03pqrEv,_ZThn4_N3ccc7CC7x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y03abcEv,_ZTv0_n12_N3ccc7CC7x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y03abcEv,_ZThn4_N3ccc7CC7x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y0E = {  "_ZN3ccc7CC7x7y0E", // class name
  bases__ZN3ccc7CC7x7y0E, 2,
  &(vtc__ZN3ccc7CC7x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y0E),2, //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  DD7x7y0  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD7x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x7y03pqrEv
  ~DD7x7y0(); // tgen
  DD7x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y0E) C1{ VBC2{ v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y03abcEv");}
void  ccc::DD7x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y03efgEv");}
void  ccc::DD7x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y03pqrEv");}
ccc::DD7x7y0 ::~DD7x7y0(){ note_dtor("_ZN3ccc7DD7x7y0E", this);} // tgen
ccc::DD7x7y0 ::DD7x7y0(){ note_ctor("_ZN3ccc7DD7x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y0E, buf);
    ::ccc::DD7x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y0E);
    dp->::ccc::DD7x7y0::~DD7x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y0E(Test__ZN3ccc7DD7x7y0E, "_ZN3ccc7DD7x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y0C1Ev();
extern void _ZN3ccc7DD7x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y0E[] = {
  NSPAIR(_ZN3ccc7DD7x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y0E[];
extern void _ZN3ccc7DD7x7y03abcEv();
extern void _ZN3ccc7DD7x7y03pqrEv();
extern void _ZN3ccc7DD7x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y03abcEv,_ZTv0_n12_N3ccc7DD7x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y03abcEv,_ZThn4_N3ccc7DD7x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y03pqrEv,_ZTv0_n16_N3ccc7DD7x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y03pqrEv,_ZThn4_N3ccc7DD7x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y03abcEv,_ZTv0_n12_N3ccc7DD7x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y03pqrEv,_ZTv0_n16_N3ccc7DD7x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y0E[] = {
  {&(_ZTVN3ccc7DD7x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y0E[];
static VTBL_ENTRY alt_thunk_names959[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y03pqrEv,_ZTv0_n16_N3ccc7DD7x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y03pqrEv,_ZThn4_N3ccc7DD7x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y03abcEv,_ZTv0_n12_N3ccc7DD7x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y03abcEv,_ZThn4_N3ccc7DD7x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y0E = {  "_ZN3ccc7DD7x7y0E", // class name
  bases__ZN3ccc7DD7x7y0E, 2,
  &(vtc__ZN3ccc7DD7x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y0E),3, //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  CC7x7y1  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x7y13efgEv
  ~CC7x7y1(); // tgen
  CC7x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y1E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y13abcEv");}
void  ccc::CC7x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y13pqrEv");}
void  ccc::CC7x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y13efgEv");}
ccc::CC7x7y1 ::~CC7x7y1(){ note_dtor("_ZN3ccc7CC7x7y1E", this);} // tgen
ccc::CC7x7y1 ::CC7x7y1(){ note_ctor("_ZN3ccc7CC7x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y1E, buf);
    ::ccc::CC7x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y1E);
    dp->::ccc::CC7x7y1::~CC7x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y1E(Test__ZN3ccc7CC7x7y1E, "_ZN3ccc7CC7x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y1C1Ev();
extern void _ZN3ccc7CC7x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y1E[] = {
  NSPAIR(_ZN3ccc7CC7x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y1E[];
extern void _ZN3ccc7CC7x7y13abcEv();
extern void _ZN3ccc7CC7x7y13pqrEv();
extern void _ZN3ccc7CC7x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y13abcEv,_ZTv0_n12_N3ccc7CC7x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y13abcEv,_ZThn4_N3ccc7CC7x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y13pqrEv,_ZTv0_n16_N3ccc7CC7x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y13pqrEv,_ZThn4_N3ccc7CC7x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y13abcEv,_ZTv0_n12_N3ccc7CC7x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y13pqrEv,_ZTv0_n16_N3ccc7CC7x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y1E[] = {
  {&(_ZTVN3ccc7CC7x7y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y1E[];
static VTBL_ENTRY alt_thunk_names960[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y13pqrEv,_ZTv0_n16_N3ccc7CC7x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y13pqrEv,_ZThn4_N3ccc7CC7x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y13abcEv,_ZTv0_n12_N3ccc7CC7x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y13abcEv,_ZThn4_N3ccc7CC7x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y1E = {  "_ZN3ccc7CC7x7y1E", // class name
  bases__ZN3ccc7CC7x7y1E, 2,
  &(vtc__ZN3ccc7CC7x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y1E),2, //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  DD7x7y1  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD7x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x7y13efgEv
  ~DD7x7y1(); // tgen
  DD7x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y1E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y13abcEv");}
void  ccc::DD7x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y13pqrEv");}
void  ccc::DD7x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y13efgEv");}
ccc::DD7x7y1 ::~DD7x7y1(){ note_dtor("_ZN3ccc7DD7x7y1E", this);} // tgen
ccc::DD7x7y1 ::DD7x7y1(){ note_ctor("_ZN3ccc7DD7x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y1E, buf);
    ::ccc::DD7x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y1E);
    dp->::ccc::DD7x7y1::~DD7x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y1E(Test__ZN3ccc7DD7x7y1E, "_ZN3ccc7DD7x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y1C1Ev();
extern void _ZN3ccc7DD7x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y1E[] = {
  NSPAIR(_ZN3ccc7DD7x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y1E[];
extern void _ZN3ccc7DD7x7y13abcEv();
extern void _ZN3ccc7DD7x7y13pqrEv();
extern void _ZN3ccc7DD7x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y13abcEv,_ZTv0_n12_N3ccc7DD7x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y13abcEv,_ZThn4_N3ccc7DD7x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y13pqrEv,_ZTv0_n16_N3ccc7DD7x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y13pqrEv,_ZThn4_N3ccc7DD7x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y13abcEv,_ZTv0_n12_N3ccc7DD7x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y13pqrEv,_ZTv0_n16_N3ccc7DD7x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y1E[] = {
  {&(_ZTVN3ccc7DD7x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y1E[];
static VTBL_ENTRY alt_thunk_names961[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y13pqrEv,_ZTv0_n16_N3ccc7DD7x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y13pqrEv,_ZThn4_N3ccc7DD7x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y13abcEv,_ZTv0_n12_N3ccc7DD7x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y13abcEv,_ZThn4_N3ccc7DD7x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y1E = {  "_ZN3ccc7DD7x7y1E", // class name
  bases__ZN3ccc7DD7x7y1E, 2,
  &(vtc__ZN3ccc7DD7x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y1E),3, //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  CC7x7y2  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y23pqrEv
  ~CC7x7y2(); // tgen
  CC7x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y2E) C1{ VBC2{ v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y23efgEv");}
void  ccc::CC7x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y23abcEv");}
void  ccc::CC7x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y23pqrEv");}
ccc::CC7x7y2 ::~CC7x7y2(){ note_dtor("_ZN3ccc7CC7x7y2E", this);} // tgen
ccc::CC7x7y2 ::CC7x7y2(){ note_ctor("_ZN3ccc7CC7x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y2E, buf);
    ::ccc::CC7x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y2E);
    dp->::ccc::CC7x7y2::~CC7x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y2E(Test__ZN3ccc7CC7x7y2E, "_ZN3ccc7CC7x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y2C1Ev();
extern void _ZN3ccc7CC7x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y2E[] = {
  NSPAIR(_ZN3ccc7CC7x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y2E[];
extern void _ZN3ccc7CC7x7y23abcEv();
extern void _ZN3ccc7CC7x7y23pqrEv();
extern void _ZN3ccc7CC7x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y23abcEv,_ZTv0_n12_N3ccc7CC7x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y23abcEv,_ZThn4_N3ccc7CC7x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y23pqrEv,_ZTv0_n16_N3ccc7CC7x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y23pqrEv,_ZThn4_N3ccc7CC7x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y23abcEv,_ZTv0_n12_N3ccc7CC7x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y23pqrEv,_ZTv0_n16_N3ccc7CC7x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y2E[] = {
  {&(_ZTVN3ccc7CC7x7y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y2E[];
static VTBL_ENTRY alt_thunk_names962[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y23pqrEv,_ZTv0_n16_N3ccc7CC7x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y23pqrEv,_ZThn4_N3ccc7CC7x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y23abcEv,_ZTv0_n12_N3ccc7CC7x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y23abcEv,_ZThn4_N3ccc7CC7x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y2E = {  "_ZN3ccc7CC7x7y2E", // class name
  bases__ZN3ccc7CC7x7y2E, 2,
  &(vtc__ZN3ccc7CC7x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y2E),2, //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  DD7x7y2  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD7x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x7y23pqrEv
  ~DD7x7y2(); // tgen
  DD7x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y2E) C1{ VBC2{ v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y23efgEv");}
void  ccc::DD7x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y23abcEv");}
void  ccc::DD7x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y23pqrEv");}
ccc::DD7x7y2 ::~DD7x7y2(){ note_dtor("_ZN3ccc7DD7x7y2E", this);} // tgen
ccc::DD7x7y2 ::DD7x7y2(){ note_ctor("_ZN3ccc7DD7x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y2E, buf);
    ::ccc::DD7x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y2E);
    dp->::ccc::DD7x7y2::~DD7x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y2E(Test__ZN3ccc7DD7x7y2E, "_ZN3ccc7DD7x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y2C1Ev();
extern void _ZN3ccc7DD7x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y2E[] = {
  NSPAIR(_ZN3ccc7DD7x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y2E[];
extern void _ZN3ccc7DD7x7y23abcEv();
extern void _ZN3ccc7DD7x7y23pqrEv();
extern void _ZN3ccc7DD7x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y23abcEv,_ZTv0_n12_N3ccc7DD7x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y23abcEv,_ZThn4_N3ccc7DD7x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y23pqrEv,_ZTv0_n16_N3ccc7DD7x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y23pqrEv,_ZThn4_N3ccc7DD7x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y23abcEv,_ZTv0_n12_N3ccc7DD7x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y23pqrEv,_ZTv0_n16_N3ccc7DD7x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y2E[] = {
  {&(_ZTVN3ccc7DD7x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y2E[];
static VTBL_ENTRY alt_thunk_names963[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y23pqrEv,_ZTv0_n16_N3ccc7DD7x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y23pqrEv,_ZThn4_N3ccc7DD7x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y23abcEv,_ZTv0_n12_N3ccc7DD7x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y23abcEv,_ZThn4_N3ccc7DD7x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y2E = {  "_ZN3ccc7DD7x7y2E", // class name
  bases__ZN3ccc7DD7x7y2E, 2,
  &(vtc__ZN3ccc7DD7x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y2E),3, //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  CC7x7y3  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x7y33abcEv
  ~CC7x7y3(); // tgen
  CC7x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y3E) C1{ VBC2{ v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y33efgEv");}
void  ccc::CC7x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y33pqrEv");}
void  ccc::CC7x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y33abcEv");}
ccc::CC7x7y3 ::~CC7x7y3(){ note_dtor("_ZN3ccc7CC7x7y3E", this);} // tgen
ccc::CC7x7y3 ::CC7x7y3(){ note_ctor("_ZN3ccc7CC7x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y3E, buf);
    ::ccc::CC7x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y3E);
    dp->::ccc::CC7x7y3::~CC7x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y3E(Test__ZN3ccc7CC7x7y3E, "_ZN3ccc7CC7x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y3C1Ev();
extern void _ZN3ccc7CC7x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y3E[] = {
  NSPAIR(_ZN3ccc7CC7x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y3E[];
extern void _ZN3ccc7CC7x7y33abcEv();
extern void _ZN3ccc7CC7x7y33pqrEv();
extern void _ZN3ccc7CC7x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y33abcEv,_ZTv0_n12_N3ccc7CC7x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y33abcEv,_ZThn4_N3ccc7CC7x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y33pqrEv,_ZTv0_n16_N3ccc7CC7x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y33pqrEv,_ZThn4_N3ccc7CC7x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y33abcEv,_ZTv0_n12_N3ccc7CC7x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y33pqrEv,_ZTv0_n16_N3ccc7CC7x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y3E[] = {
  {&(_ZTVN3ccc7CC7x7y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y3E[];
static VTBL_ENTRY alt_thunk_names964[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y33pqrEv,_ZTv0_n16_N3ccc7CC7x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y33pqrEv,_ZThn4_N3ccc7CC7x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y33abcEv,_ZTv0_n12_N3ccc7CC7x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y33abcEv,_ZThn4_N3ccc7CC7x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y3E = {  "_ZN3ccc7CC7x7y3E", // class name
  bases__ZN3ccc7CC7x7y3E, 2,
  &(vtc__ZN3ccc7CC7x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y3E),2, //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  DD7x7y3  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD7x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x7y33abcEv
  ~DD7x7y3(); // tgen
  DD7x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y3E) C1{ VBC2{ v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y33efgEv");}
void  ccc::DD7x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y33pqrEv");}
void  ccc::DD7x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y33abcEv");}
ccc::DD7x7y3 ::~DD7x7y3(){ note_dtor("_ZN3ccc7DD7x7y3E", this);} // tgen
ccc::DD7x7y3 ::DD7x7y3(){ note_ctor("_ZN3ccc7DD7x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y3E, buf);
    ::ccc::DD7x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y3E);
    dp->::ccc::DD7x7y3::~DD7x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y3E(Test__ZN3ccc7DD7x7y3E, "_ZN3ccc7DD7x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y3C1Ev();
extern void _ZN3ccc7DD7x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y3E[] = {
  NSPAIR(_ZN3ccc7DD7x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y3E[];
extern void _ZN3ccc7DD7x7y33abcEv();
extern void _ZN3ccc7DD7x7y33pqrEv();
extern void _ZN3ccc7DD7x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y33abcEv,_ZTv0_n12_N3ccc7DD7x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y33abcEv,_ZThn4_N3ccc7DD7x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y33pqrEv,_ZTv0_n16_N3ccc7DD7x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y33pqrEv,_ZThn4_N3ccc7DD7x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y33abcEv,_ZTv0_n12_N3ccc7DD7x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y33pqrEv,_ZTv0_n16_N3ccc7DD7x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y3E[] = {
  {&(_ZTVN3ccc7DD7x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y3E[];
static VTBL_ENTRY alt_thunk_names965[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y33pqrEv,_ZTv0_n16_N3ccc7DD7x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y33pqrEv,_ZThn4_N3ccc7DD7x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y33abcEv,_ZTv0_n12_N3ccc7DD7x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y33abcEv,_ZThn4_N3ccc7DD7x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y3E = {  "_ZN3ccc7DD7x7y3E", // class name
  bases__ZN3ccc7DD7x7y3E, 2,
  &(vtc__ZN3ccc7DD7x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y3E),3, //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  CC7x7y4  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC7x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x7y43efgEv
  ~CC7x7y4(); // tgen
  CC7x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y4E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y43pqrEv");}
void  ccc::CC7x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y43abcEv");}
void  ccc::CC7x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y43efgEv");}
ccc::CC7x7y4 ::~CC7x7y4(){ note_dtor("_ZN3ccc7CC7x7y4E", this);} // tgen
ccc::CC7x7y4 ::CC7x7y4(){ note_ctor("_ZN3ccc7CC7x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y4E, buf);
    ::ccc::CC7x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y4E);
    dp->::ccc::CC7x7y4::~CC7x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y4E(Test__ZN3ccc7CC7x7y4E, "_ZN3ccc7CC7x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y4C1Ev();
extern void _ZN3ccc7CC7x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y4E[] = {
  NSPAIR(_ZN3ccc7CC7x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y4E[];
extern void _ZN3ccc7CC7x7y43abcEv();
extern void _ZN3ccc7CC7x7y43pqrEv();
extern void _ZN3ccc7CC7x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y43abcEv,_ZTv0_n12_N3ccc7CC7x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y43abcEv,_ZThn4_N3ccc7CC7x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y43pqrEv,_ZTv0_n16_N3ccc7CC7x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y43pqrEv,_ZThn4_N3ccc7CC7x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y43abcEv,_ZTv0_n12_N3ccc7CC7x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y43pqrEv,_ZTv0_n16_N3ccc7CC7x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y4E[] = {
  {&(_ZTVN3ccc7CC7x7y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y4E[];
static VTBL_ENTRY alt_thunk_names966[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y43pqrEv,_ZTv0_n16_N3ccc7CC7x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y43pqrEv,_ZThn4_N3ccc7CC7x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y43abcEv,_ZTv0_n12_N3ccc7CC7x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y43abcEv,_ZThn4_N3ccc7CC7x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y4E = {  "_ZN3ccc7CC7x7y4E", // class name
  bases__ZN3ccc7CC7x7y4E, 2,
  &(vtc__ZN3ccc7CC7x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y4E),2, //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  DD7x7y4  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD7x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x7y43efgEv
  ~DD7x7y4(); // tgen
  DD7x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y4E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y43pqrEv");}
void  ccc::DD7x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y43abcEv");}
void  ccc::DD7x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y43efgEv");}
ccc::DD7x7y4 ::~DD7x7y4(){ note_dtor("_ZN3ccc7DD7x7y4E", this);} // tgen
ccc::DD7x7y4 ::DD7x7y4(){ note_ctor("_ZN3ccc7DD7x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y4E, buf);
    ::ccc::DD7x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y4E);
    dp->::ccc::DD7x7y4::~DD7x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y4E(Test__ZN3ccc7DD7x7y4E, "_ZN3ccc7DD7x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y4C1Ev();
extern void _ZN3ccc7DD7x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y4E[] = {
  NSPAIR(_ZN3ccc7DD7x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y4E[];
extern void _ZN3ccc7DD7x7y43abcEv();
extern void _ZN3ccc7DD7x7y43pqrEv();
extern void _ZN3ccc7DD7x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y43abcEv,_ZTv0_n12_N3ccc7DD7x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y43abcEv,_ZThn4_N3ccc7DD7x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y43pqrEv,_ZTv0_n16_N3ccc7DD7x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y43pqrEv,_ZThn4_N3ccc7DD7x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y43abcEv,_ZTv0_n12_N3ccc7DD7x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y43pqrEv,_ZTv0_n16_N3ccc7DD7x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y4E[] = {
  {&(_ZTVN3ccc7DD7x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y4E[];
static VTBL_ENTRY alt_thunk_names967[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y43pqrEv,_ZTv0_n16_N3ccc7DD7x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y43pqrEv,_ZThn4_N3ccc7DD7x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y43abcEv,_ZTv0_n12_N3ccc7DD7x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y43abcEv,_ZThn4_N3ccc7DD7x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y4E = {  "_ZN3ccc7DD7x7y4E", // class name
  bases__ZN3ccc7DD7x7y4E, 2,
  &(vtc__ZN3ccc7DD7x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y4E),3, //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  CC7x7y5  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC7x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x7y53abcEv
  ~CC7x7y5(); // tgen
  CC7x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y5E) C1{ VBC2{ v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y53pqrEv");}
void  ccc::CC7x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y53efgEv");}
void  ccc::CC7x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y53abcEv");}
ccc::CC7x7y5 ::~CC7x7y5(){ note_dtor("_ZN3ccc7CC7x7y5E", this);} // tgen
ccc::CC7x7y5 ::CC7x7y5(){ note_ctor("_ZN3ccc7CC7x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y5E, buf);
    ::ccc::CC7x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y5E);
    dp->::ccc::CC7x7y5::~CC7x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y5E(Test__ZN3ccc7CC7x7y5E, "_ZN3ccc7CC7x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y5C1Ev();
extern void _ZN3ccc7CC7x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y5E[] = {
  NSPAIR(_ZN3ccc7CC7x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y5E[];
extern void _ZN3ccc7CC7x7y53abcEv();
extern void _ZN3ccc7CC7x7y53pqrEv();
extern void _ZN3ccc7CC7x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y53abcEv,_ZTv0_n12_N3ccc7CC7x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y53abcEv,_ZThn4_N3ccc7CC7x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y53pqrEv,_ZTv0_n16_N3ccc7CC7x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y53pqrEv,_ZThn4_N3ccc7CC7x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y53abcEv,_ZTv0_n12_N3ccc7CC7x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y53pqrEv,_ZTv0_n16_N3ccc7CC7x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y5E[] = {
  {&(_ZTVN3ccc7CC7x7y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y5E[];
static VTBL_ENTRY alt_thunk_names968[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y53pqrEv,_ZTv0_n16_N3ccc7CC7x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y53pqrEv,_ZThn4_N3ccc7CC7x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y53abcEv,_ZTv0_n12_N3ccc7CC7x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y53abcEv,_ZThn4_N3ccc7CC7x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y5E = {  "_ZN3ccc7CC7x7y5E", // class name
  bases__ZN3ccc7CC7x7y5E, 2,
  &(vtc__ZN3ccc7CC7x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y5E),2, //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  DD7x7y5  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD7x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x7y53abcEv
  ~DD7x7y5(); // tgen
  DD7x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y5E) C1{ VBC2{ v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y53pqrEv");}
void  ccc::DD7x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y53efgEv");}
void  ccc::DD7x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y53abcEv");}
ccc::DD7x7y5 ::~DD7x7y5(){ note_dtor("_ZN3ccc7DD7x7y5E", this);} // tgen
ccc::DD7x7y5 ::DD7x7y5(){ note_ctor("_ZN3ccc7DD7x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y5E, buf);
    ::ccc::DD7x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y5E);
    dp->::ccc::DD7x7y5::~DD7x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y5E(Test__ZN3ccc7DD7x7y5E, "_ZN3ccc7DD7x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y5C1Ev();
extern void _ZN3ccc7DD7x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y5E[] = {
  NSPAIR(_ZN3ccc7DD7x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y5E[];
extern void _ZN3ccc7DD7x7y53abcEv();
extern void _ZN3ccc7DD7x7y53pqrEv();
extern void _ZN3ccc7DD7x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y53abcEv,_ZTv0_n12_N3ccc7DD7x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y53abcEv,_ZThn4_N3ccc7DD7x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y53pqrEv,_ZTv0_n16_N3ccc7DD7x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y53pqrEv,_ZThn4_N3ccc7DD7x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y53abcEv,_ZTv0_n12_N3ccc7DD7x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y53pqrEv,_ZTv0_n16_N3ccc7DD7x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y5E[] = {
  {&(_ZTVN3ccc7DD7x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y5E[];
static VTBL_ENTRY alt_thunk_names969[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y53pqrEv,_ZTv0_n16_N3ccc7DD7x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y53pqrEv,_ZThn4_N3ccc7DD7x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y53abcEv,_ZTv0_n12_N3ccc7DD7x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y53abcEv,_ZThn4_N3ccc7DD7x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y5E = {  "_ZN3ccc7DD7x7y5E", // class name
  bases__ZN3ccc7DD7x7y5E, 2,
  &(vtc__ZN3ccc7DD7x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y5E),3, //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  CC7x7y6  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x7y63efgEv
  ~CC7x7y6(); // tgen
  CC7x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y6E) C1{ VBC2{ v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y63abcEv");}
void  ccc::CC7x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y63efgEv");}
ccc::CC7x7y6 ::~CC7x7y6(){ note_dtor("_ZN3ccc7CC7x7y6E", this);} // tgen
ccc::CC7x7y6 ::CC7x7y6(){ note_ctor("_ZN3ccc7CC7x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y6E, buf);
    ::ccc::CC7x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y6E);
    dp->::ccc::CC7x7y6::~CC7x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y6E(Test__ZN3ccc7CC7x7y6E, "_ZN3ccc7CC7x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y6C1Ev();
extern void _ZN3ccc7CC7x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y6E[] = {
  NSPAIR(_ZN3ccc7CC7x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y6E[];
extern void _ZN3ccc7CC7x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC7x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y63abcEv,_ZTv0_n12_N3ccc7CC7x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y63abcEv,_ZThn4_N3ccc7CC7x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y63abcEv,_ZTv0_n12_N3ccc7CC7x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y6E[] = {
  {&(_ZTVN3ccc7CC7x7y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y6E[];
static VTBL_ENTRY alt_thunk_names970[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y63abcEv,_ZTv0_n12_N3ccc7CC7x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y63abcEv,_ZThn4_N3ccc7CC7x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y6E = {  "_ZN3ccc7CC7x7y6E", // class name
  bases__ZN3ccc7CC7x7y6E, 2,
  &(vtc__ZN3ccc7CC7x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y6E),2, //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  DD7x7y6  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD7x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x7y63efgEv
  ~DD7x7y6(); // tgen
  DD7x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y6E) C1{ VBC2{ v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y63abcEv");}
void  ccc::DD7x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y63efgEv");}
ccc::DD7x7y6 ::~DD7x7y6(){ note_dtor("_ZN3ccc7DD7x7y6E", this);} // tgen
ccc::DD7x7y6 ::DD7x7y6(){ note_ctor("_ZN3ccc7DD7x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y6E, buf);
    ::ccc::DD7x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y6E);
    dp->::ccc::DD7x7y6::~DD7x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y6E(Test__ZN3ccc7DD7x7y6E, "_ZN3ccc7DD7x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y6C1Ev();
extern void _ZN3ccc7DD7x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y6E[] = {
  NSPAIR(_ZN3ccc7DD7x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y6E[];
extern void _ZN3ccc7DD7x7y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y63abcEv,_ZTv0_n12_N3ccc7DD7x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y63abcEv,_ZThn4_N3ccc7DD7x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y63abcEv,_ZTv0_n12_N3ccc7DD7x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y6E[] = {
  {&(_ZTVN3ccc7DD7x7y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y6E[];
static VTBL_ENTRY alt_thunk_names971[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y63abcEv,_ZTv0_n12_N3ccc7DD7x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y63abcEv,_ZThn4_N3ccc7DD7x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y6E = {  "_ZN3ccc7DD7x7y6E", // class name
  bases__ZN3ccc7DD7x7y6E, 2,
  &(vtc__ZN3ccc7DD7x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y6E),3, //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  CC7x7y7  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC7x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y73pqrEv
  ~CC7x7y7(); // tgen
  CC7x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y7E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y73abcEv");}
void  ccc::CC7x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y73pqrEv");}
ccc::CC7x7y7 ::~CC7x7y7(){ note_dtor("_ZN3ccc7CC7x7y7E", this);} // tgen
ccc::CC7x7y7 ::CC7x7y7(){ note_ctor("_ZN3ccc7CC7x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y7E, buf);
    ::ccc::CC7x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y7E);
    dp->::ccc::CC7x7y7::~CC7x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y7E(Test__ZN3ccc7CC7x7y7E, "_ZN3ccc7CC7x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y7C1Ev();
extern void _ZN3ccc7CC7x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y7E[] = {
  NSPAIR(_ZN3ccc7CC7x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y7E[];
extern void _ZN3ccc7CC7x7y73abcEv();
extern void _ZN3ccc7CC7x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y73abcEv,_ZTv0_n12_N3ccc7CC7x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y73abcEv,_ZThn4_N3ccc7CC7x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y73pqrEv,_ZTv0_n16_N3ccc7CC7x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y73pqrEv,_ZThn4_N3ccc7CC7x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y73abcEv,_ZTv0_n12_N3ccc7CC7x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y73pqrEv,_ZTv0_n16_N3ccc7CC7x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y7E[] = {
  {&(_ZTVN3ccc7CC7x7y7E[3]),  3,11},
  {&(_ZTVN3ccc7CC7x7y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y7E[];
static VTBL_ENTRY alt_thunk_names972[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y73pqrEv,_ZTv0_n16_N3ccc7CC7x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y73pqrEv,_ZThn4_N3ccc7CC7x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y73abcEv,_ZTv0_n12_N3ccc7CC7x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y73abcEv,_ZThn4_N3ccc7CC7x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y7E = {  "_ZN3ccc7CC7x7y7E", // class name
  bases__ZN3ccc7CC7x7y7E, 2,
  &(vtc__ZN3ccc7CC7x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y7E),2, //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  DD7x7y7  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD7x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x7y73pqrEv
  ~DD7x7y7(); // tgen
  DD7x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y7E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y73abcEv");}
void  ccc::DD7x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y73pqrEv");}
ccc::DD7x7y7 ::~DD7x7y7(){ note_dtor("_ZN3ccc7DD7x7y7E", this);} // tgen
ccc::DD7x7y7 ::DD7x7y7(){ note_ctor("_ZN3ccc7DD7x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y7E, buf);
    ::ccc::DD7x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y7E);
    dp->::ccc::DD7x7y7::~DD7x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y7E(Test__ZN3ccc7DD7x7y7E, "_ZN3ccc7DD7x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y7C1Ev();
extern void _ZN3ccc7DD7x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y7E[] = {
  NSPAIR(_ZN3ccc7DD7x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y7E[];
extern void _ZN3ccc7DD7x7y73abcEv();
extern void _ZN3ccc7DD7x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y73abcEv,_ZTv0_n12_N3ccc7DD7x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y73abcEv,_ZThn4_N3ccc7DD7x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y73pqrEv,_ZTv0_n16_N3ccc7DD7x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y73pqrEv,_ZThn4_N3ccc7DD7x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y73abcEv,_ZTv0_n12_N3ccc7DD7x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y73pqrEv,_ZTv0_n16_N3ccc7DD7x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y7E[] = {
  {&(_ZTVN3ccc7DD7x7y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x7y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x7y7E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y7E[];
static VTBL_ENTRY alt_thunk_names973[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y73pqrEv,_ZTv0_n16_N3ccc7DD7x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y73pqrEv,_ZThn4_N3ccc7DD7x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y73abcEv,_ZTv0_n12_N3ccc7DD7x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y73abcEv,_ZThn4_N3ccc7DD7x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y7E = {  "_ZN3ccc7DD7x7y7E", // class name
  bases__ZN3ccc7DD7x7y7E, 2,
  &(vtc__ZN3ccc7DD7x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y7E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y7E),3, //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  CC7x7y8  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x7y83abcEv
  ~CC7x7y8(); // tgen
  CC7x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y8E) C1{ VBC2{ v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y83efgEv");}
void  ccc::CC7x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x7y83abcEv");}
ccc::CC7x7y8 ::~CC7x7y8(){ note_dtor("_ZN3ccc7CC7x7y8E", this);} // tgen
ccc::CC7x7y8 ::CC7x7y8(){ note_ctor("_ZN3ccc7CC7x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y8E, buf);
    ::ccc::CC7x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y8E);
    dp->::ccc::CC7x7y8::~CC7x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y8E(Test__ZN3ccc7CC7x7y8E, "_ZN3ccc7CC7x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y8C1Ev();
extern void _ZN3ccc7CC7x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y8E[] = {
  NSPAIR(_ZN3ccc7CC7x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y8E[];
extern void _ZN3ccc7CC7x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC7x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x7y83abcEv,_ZTv0_n12_N3ccc7CC7x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y83abcEv,_ZThn4_N3ccc7CC7x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x7y83abcEv,_ZTv0_n12_N3ccc7CC7x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y8E[] = {
  {&(_ZTVN3ccc7CC7x7y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y8E[];
static VTBL_ENTRY alt_thunk_names974[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x7y83abcEv,_ZTv0_n12_N3ccc7CC7x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y83abcEv,_ZThn4_N3ccc7CC7x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y8E = {  "_ZN3ccc7CC7x7y8E", // class name
  bases__ZN3ccc7CC7x7y8E, 2,
  &(vtc__ZN3ccc7CC7x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y8E),2, //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  DD7x7y8  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD7x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x7y83abcEv
  ~DD7x7y8(); // tgen
  DD7x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y8E) C1{ VBC2{ v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y83efgEv");}
void  ccc::DD7x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x7y83abcEv");}
ccc::DD7x7y8 ::~DD7x7y8(){ note_dtor("_ZN3ccc7DD7x7y8E", this);} // tgen
ccc::DD7x7y8 ::DD7x7y8(){ note_ctor("_ZN3ccc7DD7x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y8E, buf);
    ::ccc::DD7x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y8E);
    dp->::ccc::DD7x7y8::~DD7x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y8E(Test__ZN3ccc7DD7x7y8E, "_ZN3ccc7DD7x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y8C1Ev();
extern void _ZN3ccc7DD7x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y8E[] = {
  NSPAIR(_ZN3ccc7DD7x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y8E[];
extern void _ZN3ccc7DD7x7y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x7y83abcEv,_ZTv0_n12_N3ccc7DD7x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y83abcEv,_ZThn4_N3ccc7DD7x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x7y83abcEv,_ZTv0_n12_N3ccc7DD7x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y8E[] = {
  {&(_ZTVN3ccc7DD7x7y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y8E[];
static VTBL_ENTRY alt_thunk_names975[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x7y83abcEv,_ZTv0_n12_N3ccc7DD7x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y83abcEv,_ZThn4_N3ccc7DD7x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y8E = {  "_ZN3ccc7DD7x7y8E", // class name
  bases__ZN3ccc7DD7x7y8E, 2,
  &(vtc__ZN3ccc7DD7x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y8E),3, //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  CC7x7y9  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC7x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x7y93pqrEv
  ~CC7x7y9(); // tgen
  CC7x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x7y9E) C1{ VBC2{ v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x7y93efgEv");}
void  ccc::CC7x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x7y93pqrEv");}
ccc::CC7x7y9 ::~CC7x7y9(){ note_dtor("_ZN3ccc7CC7x7y9E", this);} // tgen
ccc::CC7x7y9 ::CC7x7y9(){ note_ctor("_ZN3ccc7CC7x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x7y9E, buf);
    ::ccc::CC7x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x7y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC7x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x7y9E);
    dp->::ccc::CC7x7y9::~CC7x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x7y9E(Test__ZN3ccc7CC7x7y9E, "_ZN3ccc7CC7x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x7y9C1Ev();
extern void _ZN3ccc7CC7x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x7y9E[] = {
  NSPAIR(_ZN3ccc7CC7x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC7x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC7x7y93pqrEv();
extern void _ZN3ccc7CC7x7y93efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x7y93pqrEv,_ZTv0_n16_N3ccc7CC7x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x7y93pqrEv,_ZThn4_N3ccc7CC7x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x7y93pqrEv,_ZTv0_n16_N3ccc7CC7x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x7y9E[] = {
  {&(_ZTVN3ccc7CC7x7y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x7y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x7y9E[];
static VTBL_ENTRY alt_thunk_names976[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x7y93pqrEv,_ZTv0_n16_N3ccc7CC7x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x7y93pqrEv,_ZThn4_N3ccc7CC7x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x7y9E = {  "_ZN3ccc7CC7x7y9E", // class name
  bases__ZN3ccc7CC7x7y9E, 2,
  &(vtc__ZN3ccc7CC7x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x7y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x7y9E),2, //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  DD7x7y9  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD7x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x7y93pqrEv
  ~DD7x7y9(); // tgen
  DD7x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x7y9E) C1{ VBC2{ v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x7y93efgEv");}
void  ccc::DD7x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x7y93pqrEv");}
ccc::DD7x7y9 ::~DD7x7y9(){ note_dtor("_ZN3ccc7DD7x7y9E", this);} // tgen
ccc::DD7x7y9 ::DD7x7y9(){ note_ctor("_ZN3ccc7DD7x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x7y9E, buf);
    ::ccc::DD7x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x7y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD7x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x7y9E);
    dp->::ccc::DD7x7y9::~DD7x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x7y9E(Test__ZN3ccc7DD7x7y9E, "_ZN3ccc7DD7x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x7y9C1Ev();
extern void _ZN3ccc7DD7x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x7y9E[] = {
  NSPAIR(_ZN3ccc7DD7x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD7x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x7y93pqrEv();
extern void _ZN3ccc7DD7x7y93efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x7y93pqrEv,_ZTv0_n16_N3ccc7DD7x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x7y93pqrEv,_ZThn4_N3ccc7DD7x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x7y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x7y93pqrEv,_ZTv0_n16_N3ccc7DD7x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x7y9E[] = {
  {&(_ZTVN3ccc7DD7x7y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x7y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x7y9E[];
static VTBL_ENTRY alt_thunk_names977[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x7y93pqrEv,_ZTv0_n16_N3ccc7DD7x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x7y93pqrEv,_ZThn4_N3ccc7DD7x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x7y9E = {  "_ZN3ccc7DD7x7y9E", // class name
  bases__ZN3ccc7DD7x7y9E, 2,
  &(vtc__ZN3ccc7DD7x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x7y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x7y9E),3, //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  CC7x7y10  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC7x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x7y103abcEv
  ~CC7x7y10(); // tgen
  CC7x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y10E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x7y103pqrEv");}
void  ccc::CC7x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x7y103abcEv");}
ccc::CC7x7y10 ::~CC7x7y10(){ note_dtor("_ZN3ccc8CC7x7y10E", this);} // tgen
ccc::CC7x7y10 ::CC7x7y10(){ note_ctor("_ZN3ccc8CC7x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x7y10E, buf);
    ::ccc::CC7x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x7y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC7x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x7y10E);
    dp->::ccc::CC7x7y10::~CC7x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x7y10E(Test__ZN3ccc8CC7x7y10E, "_ZN3ccc8CC7x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x7y10C1Ev();
extern void _ZN3ccc8CC7x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x7y10E[] = {
  NSPAIR(_ZN3ccc8CC7x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC7x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x7y10E[];
extern void _ZN3ccc8CC7x7y103abcEv();
extern void _ZN3ccc8CC7x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x7y103abcEv,_ZTv0_n12_N3ccc8CC7x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y103abcEv,_ZThn4_N3ccc8CC7x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x7y103pqrEv,_ZTv0_n16_N3ccc8CC7x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y103pqrEv,_ZThn4_N3ccc8CC7x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x7y103abcEv,_ZTv0_n12_N3ccc8CC7x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x7y103pqrEv,_ZTv0_n16_N3ccc8CC7x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x7y10E[] = {
  {&(_ZTVN3ccc8CC7x7y10E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x7y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x7y10E[];
static VTBL_ENTRY alt_thunk_names978[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x7y103pqrEv,_ZTv0_n16_N3ccc8CC7x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x7y103pqrEv,_ZThn4_N3ccc8CC7x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x7y103abcEv,_ZTv0_n12_N3ccc8CC7x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x7y103abcEv,_ZThn4_N3ccc8CC7x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x7y10E = {  "_ZN3ccc8CC7x7y10E", // class name
  bases__ZN3ccc8CC7x7y10E, 2,
  &(vtc__ZN3ccc8CC7x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x7y10E),2, //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  DD7x7y10  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD7x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x7y103abcEv
  ~DD7x7y10(); // tgen
  DD7x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x7y10E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x7y103pqrEv");}
void  ccc::DD7x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x7y103abcEv");}
ccc::DD7x7y10 ::~DD7x7y10(){ note_dtor("_ZN3ccc8DD7x7y10E", this);} // tgen
ccc::DD7x7y10 ::DD7x7y10(){ note_ctor("_ZN3ccc8DD7x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x7y10E, buf);
    ::ccc::DD7x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x7y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD7x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x7y10E);
    dp->::ccc::DD7x7y10::~DD7x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x7y10E(Test__ZN3ccc8DD7x7y10E, "_ZN3ccc8DD7x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x7y10C1Ev();
extern void _ZN3ccc8DD7x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x7y10E[] = {
  NSPAIR(_ZN3ccc8DD7x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD7x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y10E[];
extern void _ZN3ccc8DD7x7y103abcEv();
extern void _ZN3ccc8DD7x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x7y103abcEv,_ZTv0_n12_N3ccc8DD7x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x7y103abcEv,_ZThn4_N3ccc8DD7x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x7y103pqrEv,_ZTv0_n16_N3ccc8DD7x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x7y103pqrEv,_ZThn4_N3ccc8DD7x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x7y103abcEv,_ZTv0_n12_N3ccc8DD7x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x7y103pqrEv,_ZTv0_n16_N3ccc8DD7x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x7y10E[] = {
  {&(_ZTVN3ccc8DD7x7y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y10E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x7y10E[];
static VTBL_ENTRY alt_thunk_names979[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x7y103pqrEv,_ZTv0_n16_N3ccc8DD7x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x7y103pqrEv,_ZThn4_N3ccc8DD7x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x7y103abcEv,_ZTv0_n12_N3ccc8DD7x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x7y103abcEv,_ZThn4_N3ccc8DD7x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x7y10E = {  "_ZN3ccc8DD7x7y10E", // class name
  bases__ZN3ccc8DD7x7y10E, 2,
  &(vtc__ZN3ccc8DD7x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x7y10E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x7y10E),3, //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  CC7x7y11  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC7x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x7y113efgEv
  ~CC7x7y11(); // tgen
  CC7x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y11E) C1{ VBC2{ v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x7y113pqrEv");}
void  ccc::CC7x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x7y113efgEv");}
ccc::CC7x7y11 ::~CC7x7y11(){ note_dtor("_ZN3ccc8CC7x7y11E", this);} // tgen
ccc::CC7x7y11 ::CC7x7y11(){ note_ctor("_ZN3ccc8CC7x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x7y11E, buf);
    ::ccc::CC7x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x7y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC7x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x7y11E);
    dp->::ccc::CC7x7y11::~CC7x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x7y11E(Test__ZN3ccc8CC7x7y11E, "_ZN3ccc8CC7x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x7y11C1Ev();
extern void _ZN3ccc8CC7x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x7y11E[] = {
  NSPAIR(_ZN3ccc8CC7x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC7x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC7x7y113pqrEv();
extern void _ZN3ccc8CC7x7y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x7y113pqrEv,_ZTv0_n16_N3ccc8CC7x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y113pqrEv,_ZThn4_N3ccc8CC7x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x7y113pqrEv,_ZTv0_n16_N3ccc8CC7x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x7y11E[] = {
  {&(_ZTVN3ccc8CC7x7y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x7y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x7y11E[];
static VTBL_ENTRY alt_thunk_names980[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x7y113pqrEv,_ZTv0_n16_N3ccc8CC7x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x7y113pqrEv,_ZThn4_N3ccc8CC7x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x7y11E = {  "_ZN3ccc8CC7x7y11E", // class name
  bases__ZN3ccc8CC7x7y11E, 2,
  &(vtc__ZN3ccc8CC7x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x7y11E),2, //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  DD7x7y11  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD7x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x7y113efgEv
  ~DD7x7y11(); // tgen
  DD7x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x7y11E) C1{ VBC2{ v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x7y113pqrEv");}
void  ccc::DD7x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x7y113efgEv");}
ccc::DD7x7y11 ::~DD7x7y11(){ note_dtor("_ZN3ccc8DD7x7y11E", this);} // tgen
ccc::DD7x7y11 ::DD7x7y11(){ note_ctor("_ZN3ccc8DD7x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x7y11E, buf);
    ::ccc::DD7x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x7y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD7x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x7y11E);
    dp->::ccc::DD7x7y11::~DD7x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x7y11E(Test__ZN3ccc8DD7x7y11E, "_ZN3ccc8DD7x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x7y11C1Ev();
extern void _ZN3ccc8DD7x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x7y11E[] = {
  NSPAIR(_ZN3ccc8DD7x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD7x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x7y113pqrEv();
extern void _ZN3ccc8DD7x7y113efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x7y113pqrEv,_ZTv0_n16_N3ccc8DD7x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x7y113pqrEv,_ZThn4_N3ccc8DD7x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x7y113pqrEv,_ZTv0_n16_N3ccc8DD7x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x7y11E[] = {
  {&(_ZTVN3ccc8DD7x7y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x7y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x7y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x7y11E[];
static VTBL_ENTRY alt_thunk_names981[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x7y113pqrEv,_ZTv0_n16_N3ccc8DD7x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x7y113pqrEv,_ZThn4_N3ccc8DD7x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x7y11E = {  "_ZN3ccc8DD7x7y11E", // class name
  bases__ZN3ccc8DD7x7y11E, 2,
  &(vtc__ZN3ccc8DD7x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x7y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x7y11E),3, //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  CC7x7y12  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC7x7y123abcEv
  ~CC7x7y12(); // tgen
  CC7x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y12E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC7x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x7y123abcEv");}
ccc::CC7x7y12 ::~CC7x7y12(){ note_dtor("_ZN3ccc8CC7x7y12E", this);} // tgen
ccc::CC7x7y12 ::CC7x7y12(){ note_ctor("_ZN3ccc8CC7x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x7y12E, buf);
    ::ccc::CC7x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x7y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC7x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x7y12E);
    dp->::ccc::CC7x7y12::~CC7x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x7y12E(Test__ZN3ccc8CC7x7y12E, "_ZN3ccc8CC7x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x7y12C1Ev();
extern void _ZN3ccc8CC7x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x7y12E[] = {
  NSPAIR(_ZN3ccc8CC7x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC7x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x7y12E[];
extern void _ZN3ccc8CC7x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x7y123abcEv,_ZTv0_n12_N3ccc8CC7x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y123abcEv,_ZThn4_N3ccc8CC7x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x7y123abcEv,_ZTv0_n12_N3ccc8CC7x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x7y12E[] = {
  {&(_ZTVN3ccc8CC7x7y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x7y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x7y12E[];
static VTBL_ENTRY alt_thunk_names982[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x7y123abcEv,_ZTv0_n12_N3ccc8CC7x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x7y123abcEv,_ZThn4_N3ccc8CC7x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x7y12E = {  "_ZN3ccc8CC7x7y12E", // class name
  bases__ZN3ccc8CC7x7y12E, 2,
  &(vtc__ZN3ccc8CC7x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x7y12E),2, //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  DD7x7y12  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD7x7y123abcEv
  ~DD7x7y12(); // tgen
  DD7x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x7y12E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD7x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x7y123abcEv");}
ccc::DD7x7y12 ::~DD7x7y12(){ note_dtor("_ZN3ccc8DD7x7y12E", this);} // tgen
ccc::DD7x7y12 ::DD7x7y12(){ note_ctor("_ZN3ccc8DD7x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x7y12E, buf);
    ::ccc::DD7x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x7y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD7x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x7y12E);
    dp->::ccc::DD7x7y12::~DD7x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x7y12E(Test__ZN3ccc8DD7x7y12E, "_ZN3ccc8DD7x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x7y12C1Ev();
extern void _ZN3ccc8DD7x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x7y12E[] = {
  NSPAIR(_ZN3ccc8DD7x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD7x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y12E[];
extern void _ZN3ccc8DD7x7y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x7y123abcEv,_ZTv0_n12_N3ccc8DD7x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x7y123abcEv,_ZThn4_N3ccc8DD7x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x7y123abcEv,_ZTv0_n12_N3ccc8DD7x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x7y12E[] = {
  {&(_ZTVN3ccc8DD7x7y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x7y12E[];
static VTBL_ENTRY alt_thunk_names983[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x7y123abcEv,_ZTv0_n12_N3ccc8DD7x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x7y123abcEv,_ZThn4_N3ccc8DD7x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x7y12E = {  "_ZN3ccc8DD7x7y12E", // class name
  bases__ZN3ccc8DD7x7y12E, 2,
  &(vtc__ZN3ccc8DD7x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x7y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x7y12E),3, //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  CC7x7y13  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC7x7y133efgEv
  ~CC7x7y13(); // tgen
  CC7x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y13E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC7x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x7y133efgEv");}
ccc::CC7x7y13 ::~CC7x7y13(){ note_dtor("_ZN3ccc8CC7x7y13E", this);} // tgen
ccc::CC7x7y13 ::CC7x7y13(){ note_ctor("_ZN3ccc8CC7x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x7y13E, buf);
    ::ccc::CC7x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x7y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC7x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x7y13E);
    dp->::ccc::CC7x7y13::~CC7x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x7y13E(Test__ZN3ccc8CC7x7y13E, "_ZN3ccc8CC7x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x7y13C1Ev();
extern void _ZN3ccc8CC7x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x7y13E[] = {
  NSPAIR(_ZN3ccc8CC7x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC7x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC7x7y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x7y13E[] = {
  {&(_ZTVN3ccc8CC7x7y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x7y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x7y13E[];
Class_Descriptor cd__ZN3ccc8CC7x7y13E = {  "_ZN3ccc8CC7x7y13E", // class name
  bases__ZN3ccc8CC7x7y13E, 2,
  &(vtc__ZN3ccc8CC7x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x7y13E),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  DD7x7y13  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD7x7y133efgEv
  ~DD7x7y13(); // tgen
  DD7x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x7y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD7x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x7y133efgEv");}
ccc::DD7x7y13 ::~DD7x7y13(){ note_dtor("_ZN3ccc8DD7x7y13E", this);} // tgen
ccc::DD7x7y13 ::DD7x7y13(){ note_ctor("_ZN3ccc8DD7x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x7y13E, buf);
    ::ccc::DD7x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x7y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD7x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x7y13E);
    dp->::ccc::DD7x7y13::~DD7x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x7y13E(Test__ZN3ccc8DD7x7y13E, "_ZN3ccc8DD7x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x7y13C1Ev();
extern void _ZN3ccc8DD7x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x7y13E[] = {
  NSPAIR(_ZN3ccc8DD7x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD7x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x7y133efgEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x7y13E[] = {
  {&(_ZTVN3ccc8DD7x7y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x7y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x7y13E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x7y13E[];
Class_Descriptor cd__ZN3ccc8DD7x7y13E = {  "_ZN3ccc8DD7x7y13E", // class name
  bases__ZN3ccc8DD7x7y13E, 2,
  &(vtc__ZN3ccc8DD7x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x7y13E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x7y13E),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  CC7x7y14  : virtual ::ccc::AA7 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC7x7y143pqrEv
  ~CC7x7y14(); // tgen
  CC7x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC7x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x7y143pqrEv");}
ccc::CC7x7y14 ::~CC7x7y14(){ note_dtor("_ZN3ccc8CC7x7y14E", this);} // tgen
ccc::CC7x7y14 ::CC7x7y14(){ note_ctor("_ZN3ccc8CC7x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x7y14E, buf);
    ::ccc::CC7x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x7y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC7x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x7y14E);
    dp->::ccc::CC7x7y14::~CC7x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x7y14E(Test__ZN3ccc8CC7x7y14E, "_ZN3ccc8CC7x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x7y14C1Ev();
extern void _ZN3ccc8CC7x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x7y14E[] = {
  NSPAIR(_ZN3ccc8CC7x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC7x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC7x7y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x7y143pqrEv,_ZTv0_n16_N3ccc8CC7x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x7y143pqrEv,_ZThn4_N3ccc8CC7x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x7y143pqrEv,_ZTv0_n16_N3ccc8CC7x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x7y14E[] = {
  {&(_ZTVN3ccc8CC7x7y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x7y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x7y14E[];
static VTBL_ENTRY alt_thunk_names984[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x7y143pqrEv,_ZTv0_n16_N3ccc8CC7x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x7y143pqrEv,_ZThn4_N3ccc8CC7x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x7y14E = {  "_ZN3ccc8CC7x7y14E", // class name
  bases__ZN3ccc8CC7x7y14E, 2,
  &(vtc__ZN3ccc8CC7x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x7y14E),2, //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  DD7x7y14  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD7x7y143pqrEv
  ~DD7x7y14(); // tgen
  DD7x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x7y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD7x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x7y143pqrEv");}
ccc::DD7x7y14 ::~DD7x7y14(){ note_dtor("_ZN3ccc8DD7x7y14E", this);} // tgen
ccc::DD7x7y14 ::DD7x7y14(){ note_ctor("_ZN3ccc8DD7x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x7y14E, buf);
    ::ccc::DD7x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x7y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD7x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x7y14E);
    dp->::ccc::DD7x7y14::~DD7x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x7y14E(Test__ZN3ccc8DD7x7y14E, "_ZN3ccc8DD7x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x7y14C1Ev();
extern void _ZN3ccc8DD7x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x7y14E[] = {
  NSPAIR(_ZN3ccc8DD7x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD7x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x7y143pqrEv,_ZTv0_n16_N3ccc8DD7x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x7y143pqrEv,_ZThn4_N3ccc8DD7x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x7y143pqrEv,_ZTv0_n16_N3ccc8DD7x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x7y14E[] = {
  {&(_ZTVN3ccc8DD7x7y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x7y14E[];
static VTBL_ENTRY alt_thunk_names985[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x7y143pqrEv,_ZTv0_n16_N3ccc8DD7x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x7y143pqrEv,_ZThn4_N3ccc8DD7x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x7y14E = {  "_ZN3ccc8DD7x7y14E", // class name
  bases__ZN3ccc8DD7x7y14E, 2,
  &(vtc__ZN3ccc8DD7x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x7y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x7y14E),3, //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  CC7x7y15  : virtual ::ccc::AA7 , ::ccc::BB7 {
  ~CC7x7y15(); // tgen
  CC7x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x7y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC7x7y15 ::~CC7x7y15(){ note_dtor("_ZN3ccc8CC7x7y15E", this);} // tgen
ccc::CC7x7y15 ::CC7x7y15(){ note_ctor("_ZN3ccc8CC7x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x7y15E, buf);
    ::ccc::CC7x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x7y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC7x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x7y15E);
    dp->::ccc::CC7x7y15::~CC7x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x7y15E(Test__ZN3ccc8CC7x7y15E, "_ZN3ccc8CC7x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x7y15C1Ev();
extern void _ZN3ccc8CC7x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x7y15E[] = {
  NSPAIR(_ZN3ccc8CC7x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC7x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x7y15E[] = {
  {&(_ZTVN3ccc8CC7x7y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x7y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x7y15E[];
Class_Descriptor cd__ZN3ccc8CC7x7y15E = {  "_ZN3ccc8CC7x7y15E", // class name
  bases__ZN3ccc8CC7x7y15E, 2,
  &(vtc__ZN3ccc8CC7x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x7y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x7y15E),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  DD7x7y15  : virtual ::ccc::AA7 , virtual ::ccc::BB7 {
  ~DD7x7y15(); // tgen
  DD7x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x7y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD7x7y15 ::~DD7x7y15(){ note_dtor("_ZN3ccc8DD7x7y15E", this);} // tgen
ccc::DD7x7y15 ::DD7x7y15(){ note_ctor("_ZN3ccc8DD7x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x7y15E, buf);
    ::ccc::DD7x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x7y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD7x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x7y15E);
    dp->::ccc::DD7x7y15::~DD7x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x7y15E(Test__ZN3ccc8DD7x7y15E, "_ZN3ccc8DD7x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x7y15C1Ev();
extern void _ZN3ccc8DD7x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x7y15E[] = {
  NSPAIR(_ZN3ccc8DD7x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD7x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x7y15E[] = {
  {&(_ZTVN3ccc8DD7x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x7y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x7y15E[];
Class_Descriptor cd__ZN3ccc8DD7x7y15E = {  "_ZN3ccc8DD7x7y15E", // class name
  bases__ZN3ccc8DD7x7y15E, 2,
  &(vtc__ZN3ccc8DD7x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x7y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x7y15E),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  CC7x8y0  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y03pqrEv
  ~CC7x8y0(); // tgen
  CC7x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y0E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y03abcEv");}
void  ccc::CC7x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y03efgEv");}
void  ccc::CC7x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y03pqrEv");}
ccc::CC7x8y0 ::~CC7x8y0(){ note_dtor("_ZN3ccc7CC7x8y0E", this);} // tgen
ccc::CC7x8y0 ::CC7x8y0(){ note_ctor("_ZN3ccc7CC7x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y0E, buf);
    ::ccc::CC7x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y0E);
    dp->::ccc::CC7x8y0::~CC7x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y0E(Test__ZN3ccc7CC7x8y0E, "_ZN3ccc7CC7x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y0C1Ev();
extern void _ZN3ccc7CC7x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y0E[] = {
  NSPAIR(_ZN3ccc7CC7x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y0E[];
extern void _ZN3ccc7CC7x8y03efgEv();
extern void _ZN3ccc7CC7x8y03abcEv();
extern void _ZN3ccc7CC7x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y03abcEv,_ZTv0_n12_N3ccc7CC7x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y03abcEv,_ZThn4_N3ccc7CC7x8y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y03pqrEv,_ZTv0_n16_N3ccc7CC7x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y03pqrEv,_ZThn4_N3ccc7CC7x8y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y03abcEv,_ZTv0_n12_N3ccc7CC7x8y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y03pqrEv,_ZTv0_n16_N3ccc7CC7x8y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y0E[] = {
  {&(_ZTVN3ccc7CC7x8y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y0E[];
static VTBL_ENTRY alt_thunk_names986[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y03pqrEv,_ZTv0_n16_N3ccc7CC7x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y03pqrEv,_ZThn4_N3ccc7CC7x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y03abcEv,_ZTv0_n12_N3ccc7CC7x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y03abcEv,_ZThn4_N3ccc7CC7x8y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y0E = {  "_ZN3ccc7CC7x8y0E", // class name
  bases__ZN3ccc7CC7x8y0E, 2,
  &(vtc__ZN3ccc7CC7x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y0E),2, //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  DD7x8y0  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD7x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x8y03pqrEv
  ~DD7x8y0(); // tgen
  DD7x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y0E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y03abcEv");}
void  ccc::DD7x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y03efgEv");}
void  ccc::DD7x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y03pqrEv");}
ccc::DD7x8y0 ::~DD7x8y0(){ note_dtor("_ZN3ccc7DD7x8y0E", this);} // tgen
ccc::DD7x8y0 ::DD7x8y0(){ note_ctor("_ZN3ccc7DD7x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y0E, buf);
    ::ccc::DD7x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y0E);
    dp->::ccc::DD7x8y0::~DD7x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y0E(Test__ZN3ccc7DD7x8y0E, "_ZN3ccc7DD7x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y0C1Ev();
extern void _ZN3ccc7DD7x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y0E[] = {
  NSPAIR(_ZN3ccc7DD7x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y0E[];
extern void _ZN3ccc7DD7x8y03abcEv();
extern void _ZN3ccc7DD7x8y03pqrEv();
extern void _ZN3ccc7DD7x8y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y03efgEv,_ZTv0_n12_N3ccc7DD7x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y03efgEv,_ZThn4_N3ccc7DD7x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y03abcEv,_ZTv0_n16_N3ccc7DD7x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y03abcEv,_ZThn4_N3ccc7DD7x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y03efgEv,_ZTv0_n12_N3ccc7DD7x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y03abcEv,_ZTv0_n16_N3ccc7DD7x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y0E[] = {
  {&(_ZTVN3ccc7DD7x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y0E[];
static VTBL_ENTRY alt_thunk_names987[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y03abcEv,_ZTv0_n16_N3ccc7DD7x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y03abcEv,_ZThn4_N3ccc7DD7x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y03efgEv,_ZTv0_n12_N3ccc7DD7x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y03efgEv,_ZThn4_N3ccc7DD7x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y0E = {  "_ZN3ccc7DD7x8y0E", // class name
  bases__ZN3ccc7DD7x8y0E, 2,
  &(vtc__ZN3ccc7DD7x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y0E),3, //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  CC7x8y1  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x8y13efgEv
  ~CC7x8y1(); // tgen
  CC7x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y1E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y13abcEv");}
void  ccc::CC7x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y13pqrEv");}
void  ccc::CC7x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y13efgEv");}
ccc::CC7x8y1 ::~CC7x8y1(){ note_dtor("_ZN3ccc7CC7x8y1E", this);} // tgen
ccc::CC7x8y1 ::CC7x8y1(){ note_ctor("_ZN3ccc7CC7x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y1E, buf);
    ::ccc::CC7x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y1E);
    dp->::ccc::CC7x8y1::~CC7x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y1E(Test__ZN3ccc7CC7x8y1E, "_ZN3ccc7CC7x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y1C1Ev();
extern void _ZN3ccc7CC7x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y1E[] = {
  NSPAIR(_ZN3ccc7CC7x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y1E[];
extern void _ZN3ccc7CC7x8y13efgEv();
extern void _ZN3ccc7CC7x8y13abcEv();
extern void _ZN3ccc7CC7x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y13abcEv,_ZTv0_n12_N3ccc7CC7x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y13abcEv,_ZThn4_N3ccc7CC7x8y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y13pqrEv,_ZTv0_n16_N3ccc7CC7x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y13pqrEv,_ZThn4_N3ccc7CC7x8y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y13abcEv,_ZTv0_n12_N3ccc7CC7x8y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y13pqrEv,_ZTv0_n16_N3ccc7CC7x8y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y1E[] = {
  {&(_ZTVN3ccc7CC7x8y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y1E[];
static VTBL_ENTRY alt_thunk_names988[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y13pqrEv,_ZTv0_n16_N3ccc7CC7x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y13pqrEv,_ZThn4_N3ccc7CC7x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y13abcEv,_ZTv0_n12_N3ccc7CC7x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y13abcEv,_ZThn4_N3ccc7CC7x8y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y1E = {  "_ZN3ccc7CC7x8y1E", // class name
  bases__ZN3ccc7CC7x8y1E, 2,
  &(vtc__ZN3ccc7CC7x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y1E),2, //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  DD7x8y1  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD7x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x8y13efgEv
  ~DD7x8y1(); // tgen
  DD7x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y1E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y13abcEv");}
void  ccc::DD7x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y13pqrEv");}
void  ccc::DD7x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y13efgEv");}
ccc::DD7x8y1 ::~DD7x8y1(){ note_dtor("_ZN3ccc7DD7x8y1E", this);} // tgen
ccc::DD7x8y1 ::DD7x8y1(){ note_ctor("_ZN3ccc7DD7x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y1E, buf);
    ::ccc::DD7x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y1E);
    dp->::ccc::DD7x8y1::~DD7x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y1E(Test__ZN3ccc7DD7x8y1E, "_ZN3ccc7DD7x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y1C1Ev();
extern void _ZN3ccc7DD7x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y1E[] = {
  NSPAIR(_ZN3ccc7DD7x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y1E[];
extern void _ZN3ccc7DD7x8y13abcEv();
extern void _ZN3ccc7DD7x8y13pqrEv();
extern void _ZN3ccc7DD7x8y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y13efgEv,_ZTv0_n12_N3ccc7DD7x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y13efgEv,_ZThn4_N3ccc7DD7x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y13abcEv,_ZTv0_n16_N3ccc7DD7x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y13abcEv,_ZThn4_N3ccc7DD7x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y13efgEv,_ZTv0_n12_N3ccc7DD7x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y13abcEv,_ZTv0_n16_N3ccc7DD7x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y1E[] = {
  {&(_ZTVN3ccc7DD7x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y1E[];
static VTBL_ENTRY alt_thunk_names989[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y13abcEv,_ZTv0_n16_N3ccc7DD7x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y13abcEv,_ZThn4_N3ccc7DD7x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y13efgEv,_ZTv0_n12_N3ccc7DD7x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y13efgEv,_ZThn4_N3ccc7DD7x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y1E = {  "_ZN3ccc7DD7x8y1E", // class name
  bases__ZN3ccc7DD7x8y1E, 2,
  &(vtc__ZN3ccc7DD7x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y1E),3, //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  CC7x8y2  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y23pqrEv
  ~CC7x8y2(); // tgen
  CC7x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y2E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y23efgEv");}
void  ccc::CC7x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y23abcEv");}
void  ccc::CC7x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y23pqrEv");}
ccc::CC7x8y2 ::~CC7x8y2(){ note_dtor("_ZN3ccc7CC7x8y2E", this);} // tgen
ccc::CC7x8y2 ::CC7x8y2(){ note_ctor("_ZN3ccc7CC7x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y2E, buf);
    ::ccc::CC7x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y2E);
    dp->::ccc::CC7x8y2::~CC7x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y2E(Test__ZN3ccc7CC7x8y2E, "_ZN3ccc7CC7x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y2C1Ev();
extern void _ZN3ccc7CC7x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y2E[] = {
  NSPAIR(_ZN3ccc7CC7x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y2E[];
extern void _ZN3ccc7CC7x8y23efgEv();
extern void _ZN3ccc7CC7x8y23abcEv();
extern void _ZN3ccc7CC7x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y23abcEv,_ZTv0_n12_N3ccc7CC7x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y23abcEv,_ZThn4_N3ccc7CC7x8y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y23pqrEv,_ZTv0_n16_N3ccc7CC7x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y23pqrEv,_ZThn4_N3ccc7CC7x8y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y23abcEv,_ZTv0_n12_N3ccc7CC7x8y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y23pqrEv,_ZTv0_n16_N3ccc7CC7x8y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y2E[] = {
  {&(_ZTVN3ccc7CC7x8y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y2E[];
static VTBL_ENTRY alt_thunk_names990[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y23pqrEv,_ZTv0_n16_N3ccc7CC7x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y23pqrEv,_ZThn4_N3ccc7CC7x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y23abcEv,_ZTv0_n12_N3ccc7CC7x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y23abcEv,_ZThn4_N3ccc7CC7x8y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y2E = {  "_ZN3ccc7CC7x8y2E", // class name
  bases__ZN3ccc7CC7x8y2E, 2,
  &(vtc__ZN3ccc7CC7x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y2E),2, //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  DD7x8y2  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD7x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x8y23pqrEv
  ~DD7x8y2(); // tgen
  DD7x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y2E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y23efgEv");}
void  ccc::DD7x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y23abcEv");}
void  ccc::DD7x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y23pqrEv");}
ccc::DD7x8y2 ::~DD7x8y2(){ note_dtor("_ZN3ccc7DD7x8y2E", this);} // tgen
ccc::DD7x8y2 ::DD7x8y2(){ note_ctor("_ZN3ccc7DD7x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y2E, buf);
    ::ccc::DD7x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y2E);
    dp->::ccc::DD7x8y2::~DD7x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y2E(Test__ZN3ccc7DD7x8y2E, "_ZN3ccc7DD7x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y2C1Ev();
extern void _ZN3ccc7DD7x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y2E[] = {
  NSPAIR(_ZN3ccc7DD7x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y2E[];
extern void _ZN3ccc7DD7x8y23abcEv();
extern void _ZN3ccc7DD7x8y23pqrEv();
extern void _ZN3ccc7DD7x8y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y23efgEv,_ZTv0_n12_N3ccc7DD7x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y23efgEv,_ZThn4_N3ccc7DD7x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y23abcEv,_ZTv0_n16_N3ccc7DD7x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y23abcEv,_ZThn4_N3ccc7DD7x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y23efgEv,_ZTv0_n12_N3ccc7DD7x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y23abcEv,_ZTv0_n16_N3ccc7DD7x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y2E[] = {
  {&(_ZTVN3ccc7DD7x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y2E[];
static VTBL_ENTRY alt_thunk_names991[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y23abcEv,_ZTv0_n16_N3ccc7DD7x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y23abcEv,_ZThn4_N3ccc7DD7x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y23efgEv,_ZTv0_n12_N3ccc7DD7x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y23efgEv,_ZThn4_N3ccc7DD7x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y2E = {  "_ZN3ccc7DD7x8y2E", // class name
  bases__ZN3ccc7DD7x8y2E, 2,
  &(vtc__ZN3ccc7DD7x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y2E),3, //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  CC7x8y3  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x8y33abcEv
  ~CC7x8y3(); // tgen
  CC7x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y3E) C1{ VBC2{ v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y33efgEv");}
void  ccc::CC7x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y33pqrEv");}
void  ccc::CC7x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y33abcEv");}
ccc::CC7x8y3 ::~CC7x8y3(){ note_dtor("_ZN3ccc7CC7x8y3E", this);} // tgen
ccc::CC7x8y3 ::CC7x8y3(){ note_ctor("_ZN3ccc7CC7x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y3E, buf);
    ::ccc::CC7x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y3E);
    dp->::ccc::CC7x8y3::~CC7x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y3E(Test__ZN3ccc7CC7x8y3E, "_ZN3ccc7CC7x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y3C1Ev();
extern void _ZN3ccc7CC7x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y3E[] = {
  NSPAIR(_ZN3ccc7CC7x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y3E[];
extern void _ZN3ccc7CC7x8y33efgEv();
extern void _ZN3ccc7CC7x8y33abcEv();
extern void _ZN3ccc7CC7x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y33abcEv,_ZTv0_n12_N3ccc7CC7x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y33abcEv,_ZThn4_N3ccc7CC7x8y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y33pqrEv,_ZTv0_n16_N3ccc7CC7x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y33pqrEv,_ZThn4_N3ccc7CC7x8y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y33abcEv,_ZTv0_n12_N3ccc7CC7x8y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y33pqrEv,_ZTv0_n16_N3ccc7CC7x8y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y3E[] = {
  {&(_ZTVN3ccc7CC7x8y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y3E[];
static VTBL_ENTRY alt_thunk_names992[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y33pqrEv,_ZTv0_n16_N3ccc7CC7x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y33pqrEv,_ZThn4_N3ccc7CC7x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y33abcEv,_ZTv0_n12_N3ccc7CC7x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y33abcEv,_ZThn4_N3ccc7CC7x8y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y3E = {  "_ZN3ccc7CC7x8y3E", // class name
  bases__ZN3ccc7CC7x8y3E, 2,
  &(vtc__ZN3ccc7CC7x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y3E),2, //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  DD7x8y3  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD7x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x8y33abcEv
  ~DD7x8y3(); // tgen
  DD7x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y3E) C1{ VBC2{ v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y33efgEv");}
void  ccc::DD7x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y33pqrEv");}
void  ccc::DD7x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y33abcEv");}
ccc::DD7x8y3 ::~DD7x8y3(){ note_dtor("_ZN3ccc7DD7x8y3E", this);} // tgen
ccc::DD7x8y3 ::DD7x8y3(){ note_ctor("_ZN3ccc7DD7x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y3E, buf);
    ::ccc::DD7x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y3E);
    dp->::ccc::DD7x8y3::~DD7x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y3E(Test__ZN3ccc7DD7x8y3E, "_ZN3ccc7DD7x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y3C1Ev();
extern void _ZN3ccc7DD7x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y3E[] = {
  NSPAIR(_ZN3ccc7DD7x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y3E[];
extern void _ZN3ccc7DD7x8y33abcEv();
extern void _ZN3ccc7DD7x8y33pqrEv();
extern void _ZN3ccc7DD7x8y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y33efgEv,_ZTv0_n12_N3ccc7DD7x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y33efgEv,_ZThn4_N3ccc7DD7x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y33abcEv,_ZTv0_n16_N3ccc7DD7x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y33abcEv,_ZThn4_N3ccc7DD7x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y33efgEv,_ZTv0_n12_N3ccc7DD7x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y33abcEv,_ZTv0_n16_N3ccc7DD7x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y3E[] = {
  {&(_ZTVN3ccc7DD7x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y3E[];
static VTBL_ENTRY alt_thunk_names993[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y33abcEv,_ZTv0_n16_N3ccc7DD7x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y33abcEv,_ZThn4_N3ccc7DD7x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y33efgEv,_ZTv0_n12_N3ccc7DD7x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y33efgEv,_ZThn4_N3ccc7DD7x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y3E = {  "_ZN3ccc7DD7x8y3E", // class name
  bases__ZN3ccc7DD7x8y3E, 2,
  &(vtc__ZN3ccc7DD7x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y3E),3, //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  CC7x8y4  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC7x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x8y43efgEv
  ~CC7x8y4(); // tgen
  CC7x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y4E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y43pqrEv");}
void  ccc::CC7x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y43abcEv");}
void  ccc::CC7x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y43efgEv");}
ccc::CC7x8y4 ::~CC7x8y4(){ note_dtor("_ZN3ccc7CC7x8y4E", this);} // tgen
ccc::CC7x8y4 ::CC7x8y4(){ note_ctor("_ZN3ccc7CC7x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y4E, buf);
    ::ccc::CC7x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y4E);
    dp->::ccc::CC7x8y4::~CC7x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y4E(Test__ZN3ccc7CC7x8y4E, "_ZN3ccc7CC7x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y4C1Ev();
extern void _ZN3ccc7CC7x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y4E[] = {
  NSPAIR(_ZN3ccc7CC7x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y4E[];
extern void _ZN3ccc7CC7x8y43efgEv();
extern void _ZN3ccc7CC7x8y43abcEv();
extern void _ZN3ccc7CC7x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y43abcEv,_ZTv0_n12_N3ccc7CC7x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y43abcEv,_ZThn4_N3ccc7CC7x8y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y43pqrEv,_ZTv0_n16_N3ccc7CC7x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y43pqrEv,_ZThn4_N3ccc7CC7x8y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y43abcEv,_ZTv0_n12_N3ccc7CC7x8y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y43pqrEv,_ZTv0_n16_N3ccc7CC7x8y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y4E[] = {
  {&(_ZTVN3ccc7CC7x8y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y4E[];
static VTBL_ENTRY alt_thunk_names994[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y43pqrEv,_ZTv0_n16_N3ccc7CC7x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y43pqrEv,_ZThn4_N3ccc7CC7x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y43abcEv,_ZTv0_n12_N3ccc7CC7x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y43abcEv,_ZThn4_N3ccc7CC7x8y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y4E = {  "_ZN3ccc7CC7x8y4E", // class name
  bases__ZN3ccc7CC7x8y4E, 2,
  &(vtc__ZN3ccc7CC7x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y4E),2, //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  DD7x8y4  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD7x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x8y43efgEv
  ~DD7x8y4(); // tgen
  DD7x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y4E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y43pqrEv");}
void  ccc::DD7x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y43abcEv");}
void  ccc::DD7x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y43efgEv");}
ccc::DD7x8y4 ::~DD7x8y4(){ note_dtor("_ZN3ccc7DD7x8y4E", this);} // tgen
ccc::DD7x8y4 ::DD7x8y4(){ note_ctor("_ZN3ccc7DD7x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y4E, buf);
    ::ccc::DD7x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y4E);
    dp->::ccc::DD7x8y4::~DD7x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y4E(Test__ZN3ccc7DD7x8y4E, "_ZN3ccc7DD7x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y4C1Ev();
extern void _ZN3ccc7DD7x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y4E[] = {
  NSPAIR(_ZN3ccc7DD7x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y4E[];
extern void _ZN3ccc7DD7x8y43abcEv();
extern void _ZN3ccc7DD7x8y43pqrEv();
extern void _ZN3ccc7DD7x8y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y43efgEv,_ZTv0_n12_N3ccc7DD7x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y43efgEv,_ZThn4_N3ccc7DD7x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y43abcEv,_ZTv0_n16_N3ccc7DD7x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y43abcEv,_ZThn4_N3ccc7DD7x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y43efgEv,_ZTv0_n12_N3ccc7DD7x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y43abcEv,_ZTv0_n16_N3ccc7DD7x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y4E[] = {
  {&(_ZTVN3ccc7DD7x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y4E[];
static VTBL_ENTRY alt_thunk_names995[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y43abcEv,_ZTv0_n16_N3ccc7DD7x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y43abcEv,_ZThn4_N3ccc7DD7x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y43efgEv,_ZTv0_n12_N3ccc7DD7x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y43efgEv,_ZThn4_N3ccc7DD7x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y4E = {  "_ZN3ccc7DD7x8y4E", // class name
  bases__ZN3ccc7DD7x8y4E, 2,
  &(vtc__ZN3ccc7DD7x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y4E),3, //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  CC7x8y5  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC7x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x8y53abcEv
  ~CC7x8y5(); // tgen
  CC7x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y5E) C1{ VBC2{ v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y53pqrEv");}
void  ccc::CC7x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y53efgEv");}
void  ccc::CC7x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y53abcEv");}
ccc::CC7x8y5 ::~CC7x8y5(){ note_dtor("_ZN3ccc7CC7x8y5E", this);} // tgen
ccc::CC7x8y5 ::CC7x8y5(){ note_ctor("_ZN3ccc7CC7x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y5E, buf);
    ::ccc::CC7x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y5E);
    dp->::ccc::CC7x8y5::~CC7x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y5E(Test__ZN3ccc7CC7x8y5E, "_ZN3ccc7CC7x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y5C1Ev();
extern void _ZN3ccc7CC7x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y5E[] = {
  NSPAIR(_ZN3ccc7CC7x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y5E[];
extern void _ZN3ccc7CC7x8y53efgEv();
extern void _ZN3ccc7CC7x8y53abcEv();
extern void _ZN3ccc7CC7x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y53abcEv,_ZTv0_n12_N3ccc7CC7x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y53abcEv,_ZThn4_N3ccc7CC7x8y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y53pqrEv,_ZTv0_n16_N3ccc7CC7x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y53pqrEv,_ZThn4_N3ccc7CC7x8y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y53abcEv,_ZTv0_n12_N3ccc7CC7x8y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y53pqrEv,_ZTv0_n16_N3ccc7CC7x8y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y5E[] = {
  {&(_ZTVN3ccc7CC7x8y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y5E[];
static VTBL_ENTRY alt_thunk_names996[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y53pqrEv,_ZTv0_n16_N3ccc7CC7x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y53pqrEv,_ZThn4_N3ccc7CC7x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y53abcEv,_ZTv0_n12_N3ccc7CC7x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y53abcEv,_ZThn4_N3ccc7CC7x8y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y5E = {  "_ZN3ccc7CC7x8y5E", // class name
  bases__ZN3ccc7CC7x8y5E, 2,
  &(vtc__ZN3ccc7CC7x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y5E),2, //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  DD7x8y5  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD7x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x8y53abcEv
  ~DD7x8y5(); // tgen
  DD7x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y5E) C1{ VBC2{ v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y53pqrEv");}
void  ccc::DD7x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y53efgEv");}
void  ccc::DD7x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y53abcEv");}
ccc::DD7x8y5 ::~DD7x8y5(){ note_dtor("_ZN3ccc7DD7x8y5E", this);} // tgen
ccc::DD7x8y5 ::DD7x8y5(){ note_ctor("_ZN3ccc7DD7x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y5E, buf);
    ::ccc::DD7x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y5E);
    dp->::ccc::DD7x8y5::~DD7x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y5E(Test__ZN3ccc7DD7x8y5E, "_ZN3ccc7DD7x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y5C1Ev();
extern void _ZN3ccc7DD7x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y5E[] = {
  NSPAIR(_ZN3ccc7DD7x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y5E[];
extern void _ZN3ccc7DD7x8y53abcEv();
extern void _ZN3ccc7DD7x8y53pqrEv();
extern void _ZN3ccc7DD7x8y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y53efgEv,_ZTv0_n12_N3ccc7DD7x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y53efgEv,_ZThn4_N3ccc7DD7x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y53abcEv,_ZTv0_n16_N3ccc7DD7x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y53abcEv,_ZThn4_N3ccc7DD7x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y53efgEv,_ZTv0_n12_N3ccc7DD7x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y53abcEv,_ZTv0_n16_N3ccc7DD7x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y5E[] = {
  {&(_ZTVN3ccc7DD7x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y5E[];
static VTBL_ENTRY alt_thunk_names997[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y53abcEv,_ZTv0_n16_N3ccc7DD7x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y53abcEv,_ZThn4_N3ccc7DD7x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y53efgEv,_ZTv0_n12_N3ccc7DD7x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y53efgEv,_ZThn4_N3ccc7DD7x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y5E = {  "_ZN3ccc7DD7x8y5E", // class name
  bases__ZN3ccc7DD7x8y5E, 2,
  &(vtc__ZN3ccc7DD7x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y5E),3, //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  CC7x8y6  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x8y63efgEv
  ~CC7x8y6(); // tgen
  CC7x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y6E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y63abcEv");}
void  ccc::CC7x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y63efgEv");}
ccc::CC7x8y6 ::~CC7x8y6(){ note_dtor("_ZN3ccc7CC7x8y6E", this);} // tgen
ccc::CC7x8y6 ::CC7x8y6(){ note_ctor("_ZN3ccc7CC7x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y6E, buf);
    ::ccc::CC7x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y6E);
    dp->::ccc::CC7x8y6::~CC7x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y6E(Test__ZN3ccc7CC7x8y6E, "_ZN3ccc7CC7x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y6C1Ev();
extern void _ZN3ccc7CC7x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y6E[] = {
  NSPAIR(_ZN3ccc7CC7x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y6E[];
extern void _ZN3ccc7CC7x8y63efgEv();
extern void _ZN3ccc7CC7x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y63abcEv,_ZTv0_n12_N3ccc7CC7x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y63abcEv,_ZThn4_N3ccc7CC7x8y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y63abcEv,_ZTv0_n12_N3ccc7CC7x8y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y6E[] = {
  {&(_ZTVN3ccc7CC7x8y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC7x8y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y6E[];
static VTBL_ENTRY alt_thunk_names998[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y63abcEv,_ZTv0_n12_N3ccc7CC7x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y63abcEv,_ZThn4_N3ccc7CC7x8y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y6E = {  "_ZN3ccc7CC7x8y6E", // class name
  bases__ZN3ccc7CC7x8y6E, 2,
  &(vtc__ZN3ccc7CC7x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y6E),2, //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  DD7x8y6  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD7x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x8y63efgEv
  ~DD7x8y6(); // tgen
  DD7x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y6E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y63abcEv");}
void  ccc::DD7x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y63efgEv");}
ccc::DD7x8y6 ::~DD7x8y6(){ note_dtor("_ZN3ccc7DD7x8y6E", this);} // tgen
ccc::DD7x8y6 ::DD7x8y6(){ note_ctor("_ZN3ccc7DD7x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y6E, buf);
    ::ccc::DD7x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y6E);
    dp->::ccc::DD7x8y6::~DD7x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y6E(Test__ZN3ccc7DD7x8y6E, "_ZN3ccc7DD7x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y6C1Ev();
extern void _ZN3ccc7DD7x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y6E[] = {
  NSPAIR(_ZN3ccc7DD7x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y6E[];
extern void _ZN3ccc7DD7x8y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x8y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y63efgEv,_ZTv0_n12_N3ccc7DD7x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y63efgEv,_ZThn4_N3ccc7DD7x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y63abcEv,_ZTv0_n16_N3ccc7DD7x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y63abcEv,_ZThn4_N3ccc7DD7x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y63efgEv,_ZTv0_n12_N3ccc7DD7x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y63abcEv,_ZTv0_n16_N3ccc7DD7x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y6E[] = {
  {&(_ZTVN3ccc7DD7x8y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y6E[];
static VTBL_ENTRY alt_thunk_names999[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y63abcEv,_ZTv0_n16_N3ccc7DD7x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y63abcEv,_ZThn4_N3ccc7DD7x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y63efgEv,_ZTv0_n12_N3ccc7DD7x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y63efgEv,_ZThn4_N3ccc7DD7x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y6E = {  "_ZN3ccc7DD7x8y6E", // class name
  bases__ZN3ccc7DD7x8y6E, 2,
  &(vtc__ZN3ccc7DD7x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y6E),3, //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  CC7x8y7  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC7x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y73pqrEv
  ~CC7x8y7(); // tgen
  CC7x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y7E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y73abcEv");}
void  ccc::CC7x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y73pqrEv");}
ccc::CC7x8y7 ::~CC7x8y7(){ note_dtor("_ZN3ccc7CC7x8y7E", this);} // tgen
ccc::CC7x8y7 ::CC7x8y7(){ note_ctor("_ZN3ccc7CC7x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y7E, buf);
    ::ccc::CC7x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y7E);
    dp->::ccc::CC7x8y7::~CC7x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y7E(Test__ZN3ccc7CC7x8y7E, "_ZN3ccc7CC7x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y7C1Ev();
extern void _ZN3ccc7CC7x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y7E[] = {
  NSPAIR(_ZN3ccc7CC7x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC7x8y73abcEv();
extern void _ZN3ccc7CC7x8y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y73abcEv,_ZTv0_n12_N3ccc7CC7x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y73abcEv,_ZThn4_N3ccc7CC7x8y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y73pqrEv,_ZTv0_n16_N3ccc7CC7x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y73pqrEv,_ZThn4_N3ccc7CC7x8y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y73abcEv,_ZTv0_n12_N3ccc7CC7x8y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y73pqrEv,_ZTv0_n16_N3ccc7CC7x8y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y7E[] = {
  {&(_ZTVN3ccc7CC7x8y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y7E[];
static VTBL_ENTRY alt_thunk_names1000[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y73pqrEv,_ZTv0_n16_N3ccc7CC7x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y73pqrEv,_ZThn4_N3ccc7CC7x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y73abcEv,_ZTv0_n12_N3ccc7CC7x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y73abcEv,_ZThn4_N3ccc7CC7x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y7E = {  "_ZN3ccc7CC7x8y7E", // class name
  bases__ZN3ccc7CC7x8y7E, 2,
  &(vtc__ZN3ccc7CC7x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y7E),2, //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  DD7x8y7  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD7x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x8y73pqrEv
  ~DD7x8y7(); // tgen
  DD7x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y7E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y73abcEv");}
void  ccc::DD7x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y73pqrEv");}
ccc::DD7x8y7 ::~DD7x8y7(){ note_dtor("_ZN3ccc7DD7x8y7E", this);} // tgen
ccc::DD7x8y7 ::DD7x8y7(){ note_ctor("_ZN3ccc7DD7x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y7E, buf);
    ::ccc::DD7x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y7E);
    dp->::ccc::DD7x8y7::~DD7x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y7E(Test__ZN3ccc7DD7x8y7E, "_ZN3ccc7DD7x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y7C1Ev();
extern void _ZN3ccc7DD7x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y7E[] = {
  NSPAIR(_ZN3ccc7DD7x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y7E[];
extern void _ZN3ccc7DD7x8y73abcEv();
extern void _ZN3ccc7DD7x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y73abcEv,_ZTv0_n16_N3ccc7DD7x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y73abcEv,_ZThn4_N3ccc7DD7x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y73abcEv,_ZTv0_n16_N3ccc7DD7x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y7E[] = {
  {&(_ZTVN3ccc7DD7x8y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x8y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x8y7E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y7E[];
static VTBL_ENTRY alt_thunk_names1001[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y73abcEv,_ZTv0_n16_N3ccc7DD7x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y73abcEv,_ZThn4_N3ccc7DD7x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y7E = {  "_ZN3ccc7DD7x8y7E", // class name
  bases__ZN3ccc7DD7x8y7E, 2,
  &(vtc__ZN3ccc7DD7x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y7E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y7E),3, //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  CC7x8y8  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x8y83abcEv
  ~CC7x8y8(); // tgen
  CC7x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y8E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y83efgEv");}
void  ccc::CC7x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x8y83abcEv");}
ccc::CC7x8y8 ::~CC7x8y8(){ note_dtor("_ZN3ccc7CC7x8y8E", this);} // tgen
ccc::CC7x8y8 ::CC7x8y8(){ note_ctor("_ZN3ccc7CC7x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y8E, buf);
    ::ccc::CC7x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y8E);
    dp->::ccc::CC7x8y8::~CC7x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y8E(Test__ZN3ccc7CC7x8y8E, "_ZN3ccc7CC7x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y8C1Ev();
extern void _ZN3ccc7CC7x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y8E[] = {
  NSPAIR(_ZN3ccc7CC7x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y8E[];
extern void _ZN3ccc7CC7x8y83efgEv();
extern void _ZN3ccc7CC7x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x8y83abcEv,_ZTv0_n12_N3ccc7CC7x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y83abcEv,_ZThn4_N3ccc7CC7x8y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x8y83abcEv,_ZTv0_n12_N3ccc7CC7x8y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y8E[] = {
  {&(_ZTVN3ccc7CC7x8y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC7x8y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y8E[];
static VTBL_ENTRY alt_thunk_names1002[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x8y83abcEv,_ZTv0_n12_N3ccc7CC7x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y83abcEv,_ZThn4_N3ccc7CC7x8y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y8E = {  "_ZN3ccc7CC7x8y8E", // class name
  bases__ZN3ccc7CC7x8y8E, 2,
  &(vtc__ZN3ccc7CC7x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y8E),2, //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  DD7x8y8  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD7x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x8y83abcEv
  ~DD7x8y8(); // tgen
  DD7x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y8E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y83efgEv");}
void  ccc::DD7x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x8y83abcEv");}
ccc::DD7x8y8 ::~DD7x8y8(){ note_dtor("_ZN3ccc7DD7x8y8E", this);} // tgen
ccc::DD7x8y8 ::DD7x8y8(){ note_ctor("_ZN3ccc7DD7x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y8E, buf);
    ::ccc::DD7x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y8E);
    dp->::ccc::DD7x8y8::~DD7x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y8E(Test__ZN3ccc7DD7x8y8E, "_ZN3ccc7DD7x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y8C1Ev();
extern void _ZN3ccc7DD7x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y8E[] = {
  NSPAIR(_ZN3ccc7DD7x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y8E[];
extern void _ZN3ccc7DD7x8y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x8y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y83efgEv,_ZTv0_n12_N3ccc7DD7x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y83efgEv,_ZThn4_N3ccc7DD7x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x8y83abcEv,_ZTv0_n16_N3ccc7DD7x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y83abcEv,_ZThn4_N3ccc7DD7x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y83efgEv,_ZTv0_n12_N3ccc7DD7x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x8y83abcEv,_ZTv0_n16_N3ccc7DD7x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y8E[] = {
  {&(_ZTVN3ccc7DD7x8y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y8E[];
static VTBL_ENTRY alt_thunk_names1003[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x8y83abcEv,_ZTv0_n16_N3ccc7DD7x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y83abcEv,_ZThn4_N3ccc7DD7x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y83efgEv,_ZTv0_n12_N3ccc7DD7x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y83efgEv,_ZThn4_N3ccc7DD7x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y8E = {  "_ZN3ccc7DD7x8y8E", // class name
  bases__ZN3ccc7DD7x8y8E, 2,
  &(vtc__ZN3ccc7DD7x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y8E),3, //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  CC7x8y9  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC7x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x8y93pqrEv
  ~CC7x8y9(); // tgen
  CC7x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x8y9E) C1{ VBC2{ v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x8y93efgEv");}
void  ccc::CC7x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x8y93pqrEv");}
ccc::CC7x8y9 ::~CC7x8y9(){ note_dtor("_ZN3ccc7CC7x8y9E", this);} // tgen
ccc::CC7x8y9 ::CC7x8y9(){ note_ctor("_ZN3ccc7CC7x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x8y9E, buf);
    ::ccc::CC7x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x8y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC7x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x8y9E);
    dp->::ccc::CC7x8y9::~CC7x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x8y9E(Test__ZN3ccc7CC7x8y9E, "_ZN3ccc7CC7x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x8y9C1Ev();
extern void _ZN3ccc7CC7x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x8y9E[] = {
  NSPAIR(_ZN3ccc7CC7x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC7x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x8y9E[];
extern void _ZN3ccc7CC7x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC7x8y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x8y93pqrEv,_ZTv0_n16_N3ccc7CC7x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x8y93pqrEv,_ZThn4_N3ccc7CC7x8y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x8y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x8y93pqrEv,_ZTv0_n16_N3ccc7CC7x8y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x8y9E[] = {
  {&(_ZTVN3ccc7CC7x8y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x8y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x8y9E[];
static VTBL_ENTRY alt_thunk_names1004[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x8y93pqrEv,_ZTv0_n16_N3ccc7CC7x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x8y93pqrEv,_ZThn4_N3ccc7CC7x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x8y9E = {  "_ZN3ccc7CC7x8y9E", // class name
  bases__ZN3ccc7CC7x8y9E, 2,
  &(vtc__ZN3ccc7CC7x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x8y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x8y9E),2, //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  DD7x8y9  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD7x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x8y93pqrEv
  ~DD7x8y9(); // tgen
  DD7x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x8y9E) C1{ VBC2{ v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x8y93efgEv");}
void  ccc::DD7x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x8y93pqrEv");}
ccc::DD7x8y9 ::~DD7x8y9(){ note_dtor("_ZN3ccc7DD7x8y9E", this);} // tgen
ccc::DD7x8y9 ::DD7x8y9(){ note_ctor("_ZN3ccc7DD7x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x8y9E, buf);
    ::ccc::DD7x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x8y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD7x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x8y9E);
    dp->::ccc::DD7x8y9::~DD7x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x8y9E(Test__ZN3ccc7DD7x8y9E, "_ZN3ccc7DD7x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x8y9C1Ev();
extern void _ZN3ccc7DD7x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x8y9E[] = {
  NSPAIR(_ZN3ccc7DD7x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD7x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x8y93pqrEv();
extern void _ZN3ccc7DD7x8y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x8y93efgEv,_ZTv0_n12_N3ccc7DD7x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x8y93efgEv,_ZThn4_N3ccc7DD7x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x8y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x8y93efgEv,_ZTv0_n12_N3ccc7DD7x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x8y9E[] = {
  {&(_ZTVN3ccc7DD7x8y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x8y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x8y9E[];
static VTBL_ENTRY alt_thunk_names1005[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x8y93efgEv,_ZTv0_n12_N3ccc7DD7x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x8y93efgEv,_ZThn4_N3ccc7DD7x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x8y9E = {  "_ZN3ccc7DD7x8y9E", // class name
  bases__ZN3ccc7DD7x8y9E, 2,
  &(vtc__ZN3ccc7DD7x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x8y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x8y9E),3, //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  CC7x8y10  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC7x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x8y103abcEv
  ~CC7x8y10(); // tgen
  CC7x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y10E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x8y103pqrEv");}
void  ccc::CC7x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x8y103abcEv");}
ccc::CC7x8y10 ::~CC7x8y10(){ note_dtor("_ZN3ccc8CC7x8y10E", this);} // tgen
ccc::CC7x8y10 ::CC7x8y10(){ note_ctor("_ZN3ccc8CC7x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x8y10E, buf);
    ::ccc::CC7x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x8y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC7x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x8y10E);
    dp->::ccc::CC7x8y10::~CC7x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x8y10E(Test__ZN3ccc8CC7x8y10E, "_ZN3ccc8CC7x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x8y10C1Ev();
extern void _ZN3ccc8CC7x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x8y10E[] = {
  NSPAIR(_ZN3ccc8CC7x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC7x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC7x8y103abcEv();
extern void _ZN3ccc8CC7x8y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x8y103abcEv,_ZTv0_n12_N3ccc8CC7x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y103abcEv,_ZThn4_N3ccc8CC7x8y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x8y103pqrEv,_ZTv0_n16_N3ccc8CC7x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y103pqrEv,_ZThn4_N3ccc8CC7x8y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x8y103abcEv,_ZTv0_n12_N3ccc8CC7x8y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x8y103pqrEv,_ZTv0_n16_N3ccc8CC7x8y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x8y10E[] = {
  {&(_ZTVN3ccc8CC7x8y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x8y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x8y10E[];
static VTBL_ENTRY alt_thunk_names1006[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x8y103pqrEv,_ZTv0_n16_N3ccc8CC7x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x8y103pqrEv,_ZThn4_N3ccc8CC7x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x8y103abcEv,_ZTv0_n12_N3ccc8CC7x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x8y103abcEv,_ZThn4_N3ccc8CC7x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x8y10E = {  "_ZN3ccc8CC7x8y10E", // class name
  bases__ZN3ccc8CC7x8y10E, 2,
  &(vtc__ZN3ccc8CC7x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x8y10E),2, //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  DD7x8y10  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD7x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x8y103abcEv
  ~DD7x8y10(); // tgen
  DD7x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x8y10E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x8y103pqrEv");}
void  ccc::DD7x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x8y103abcEv");}
ccc::DD7x8y10 ::~DD7x8y10(){ note_dtor("_ZN3ccc8DD7x8y10E", this);} // tgen
ccc::DD7x8y10 ::DD7x8y10(){ note_ctor("_ZN3ccc8DD7x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x8y10E, buf);
    ::ccc::DD7x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x8y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD7x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x8y10E);
    dp->::ccc::DD7x8y10::~DD7x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x8y10E(Test__ZN3ccc8DD7x8y10E, "_ZN3ccc8DD7x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x8y10C1Ev();
extern void _ZN3ccc8DD7x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x8y10E[] = {
  NSPAIR(_ZN3ccc8DD7x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD7x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y10E[];
extern void _ZN3ccc8DD7x8y103abcEv();
extern void _ZN3ccc8DD7x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x8y103abcEv,_ZTv0_n16_N3ccc8DD7x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x8y103abcEv,_ZThn4_N3ccc8DD7x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x8y103abcEv,_ZTv0_n16_N3ccc8DD7x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x8y10E[] = {
  {&(_ZTVN3ccc8DD7x8y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y10E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x8y10E[];
static VTBL_ENTRY alt_thunk_names1007[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x8y103abcEv,_ZTv0_n16_N3ccc8DD7x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x8y103abcEv,_ZThn4_N3ccc8DD7x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x8y10E = {  "_ZN3ccc8DD7x8y10E", // class name
  bases__ZN3ccc8DD7x8y10E, 2,
  &(vtc__ZN3ccc8DD7x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x8y10E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x8y10E),3, //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  CC7x8y11  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC7x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x8y113efgEv
  ~CC7x8y11(); // tgen
  CC7x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y11E) C1{ VBC2{ v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x8y113pqrEv");}
void  ccc::CC7x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x8y113efgEv");}
ccc::CC7x8y11 ::~CC7x8y11(){ note_dtor("_ZN3ccc8CC7x8y11E", this);} // tgen
ccc::CC7x8y11 ::CC7x8y11(){ note_ctor("_ZN3ccc8CC7x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x8y11E, buf);
    ::ccc::CC7x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x8y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC7x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x8y11E);
    dp->::ccc::CC7x8y11::~CC7x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x8y11E(Test__ZN3ccc8CC7x8y11E, "_ZN3ccc8CC7x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x8y11C1Ev();
extern void _ZN3ccc8CC7x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x8y11E[] = {
  NSPAIR(_ZN3ccc8CC7x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC7x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x8y11E[];
extern void _ZN3ccc8CC7x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC7x8y113pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x8y113pqrEv,_ZTv0_n16_N3ccc8CC7x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y113pqrEv,_ZThn4_N3ccc8CC7x8y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x8y113pqrEv,_ZTv0_n16_N3ccc8CC7x8y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x8y11E[] = {
  {&(_ZTVN3ccc8CC7x8y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x8y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x8y11E[];
static VTBL_ENTRY alt_thunk_names1008[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x8y113pqrEv,_ZTv0_n16_N3ccc8CC7x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x8y113pqrEv,_ZThn4_N3ccc8CC7x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x8y11E = {  "_ZN3ccc8CC7x8y11E", // class name
  bases__ZN3ccc8CC7x8y11E, 2,
  &(vtc__ZN3ccc8CC7x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x8y11E),2, //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  DD7x8y11  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD7x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x8y113efgEv
  ~DD7x8y11(); // tgen
  DD7x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x8y11E) C1{ VBC2{ v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x8y113pqrEv");}
void  ccc::DD7x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x8y113efgEv");}
ccc::DD7x8y11 ::~DD7x8y11(){ note_dtor("_ZN3ccc8DD7x8y11E", this);} // tgen
ccc::DD7x8y11 ::DD7x8y11(){ note_ctor("_ZN3ccc8DD7x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x8y11E, buf);
    ::ccc::DD7x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x8y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD7x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x8y11E);
    dp->::ccc::DD7x8y11::~DD7x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x8y11E(Test__ZN3ccc8DD7x8y11E, "_ZN3ccc8DD7x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x8y11C1Ev();
extern void _ZN3ccc8DD7x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x8y11E[] = {
  NSPAIR(_ZN3ccc8DD7x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD7x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x8y113pqrEv();
extern void _ZN3ccc8DD7x8y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x8y113efgEv,_ZTv0_n12_N3ccc8DD7x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x8y113efgEv,_ZThn4_N3ccc8DD7x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x8y113efgEv,_ZTv0_n12_N3ccc8DD7x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x8y11E[] = {
  {&(_ZTVN3ccc8DD7x8y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x8y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x8y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x8y11E[];
static VTBL_ENTRY alt_thunk_names1009[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x8y113efgEv,_ZTv0_n12_N3ccc8DD7x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x8y113efgEv,_ZThn4_N3ccc8DD7x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x8y11E = {  "_ZN3ccc8DD7x8y11E", // class name
  bases__ZN3ccc8DD7x8y11E, 2,
  &(vtc__ZN3ccc8DD7x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x8y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x8y11E),3, //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  CC7x8y12  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC7x8y123abcEv
  ~CC7x8y12(); // tgen
  CC7x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC7x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x8y123abcEv");}
ccc::CC7x8y12 ::~CC7x8y12(){ note_dtor("_ZN3ccc8CC7x8y12E", this);} // tgen
ccc::CC7x8y12 ::CC7x8y12(){ note_ctor("_ZN3ccc8CC7x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x8y12E, buf);
    ::ccc::CC7x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x8y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC7x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x8y12E);
    dp->::ccc::CC7x8y12::~CC7x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x8y12E(Test__ZN3ccc8CC7x8y12E, "_ZN3ccc8CC7x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x8y12C1Ev();
extern void _ZN3ccc8CC7x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x8y12E[] = {
  NSPAIR(_ZN3ccc8CC7x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC7x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC7x8y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x8y123abcEv,_ZTv0_n12_N3ccc8CC7x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y123abcEv,_ZThn4_N3ccc8CC7x8y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x8y123abcEv,_ZTv0_n12_N3ccc8CC7x8y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x8y12E[] = {
  {&(_ZTVN3ccc8CC7x8y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x8y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x8y12E[];
static VTBL_ENTRY alt_thunk_names1010[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x8y123abcEv,_ZTv0_n12_N3ccc8CC7x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x8y123abcEv,_ZThn4_N3ccc8CC7x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x8y12E = {  "_ZN3ccc8CC7x8y12E", // class name
  bases__ZN3ccc8CC7x8y12E, 2,
  &(vtc__ZN3ccc8CC7x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x8y12E),2, //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  DD7x8y12  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD7x8y123abcEv
  ~DD7x8y12(); // tgen
  DD7x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x8y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD7x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x8y123abcEv");}
ccc::DD7x8y12 ::~DD7x8y12(){ note_dtor("_ZN3ccc8DD7x8y12E", this);} // tgen
ccc::DD7x8y12 ::DD7x8y12(){ note_ctor("_ZN3ccc8DD7x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x8y12E, buf);
    ::ccc::DD7x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x8y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD7x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x8y12E);
    dp->::ccc::DD7x8y12::~DD7x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x8y12E(Test__ZN3ccc8DD7x8y12E, "_ZN3ccc8DD7x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x8y12C1Ev();
extern void _ZN3ccc8DD7x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x8y12E[] = {
  NSPAIR(_ZN3ccc8DD7x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD7x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y12E[];
extern void _ZN3ccc8DD7x8y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x8y123abcEv,_ZTv0_n16_N3ccc8DD7x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x8y123abcEv,_ZThn4_N3ccc8DD7x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x8y123abcEv,_ZTv0_n16_N3ccc8DD7x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x8y12E[] = {
  {&(_ZTVN3ccc8DD7x8y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x8y12E[];
static VTBL_ENTRY alt_thunk_names1011[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x8y123abcEv,_ZTv0_n16_N3ccc8DD7x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x8y123abcEv,_ZThn4_N3ccc8DD7x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x8y12E = {  "_ZN3ccc8DD7x8y12E", // class name
  bases__ZN3ccc8DD7x8y12E, 2,
  &(vtc__ZN3ccc8DD7x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x8y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x8y12E),3, //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  CC7x8y13  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC7x8y133efgEv
  ~CC7x8y13(); // tgen
  CC7x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y13E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC7x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x8y133efgEv");}
ccc::CC7x8y13 ::~CC7x8y13(){ note_dtor("_ZN3ccc8CC7x8y13E", this);} // tgen
ccc::CC7x8y13 ::CC7x8y13(){ note_ctor("_ZN3ccc8CC7x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x8y13E, buf);
    ::ccc::CC7x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x8y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC7x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x8y13E);
    dp->::ccc::CC7x8y13::~CC7x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x8y13E(Test__ZN3ccc8CC7x8y13E, "_ZN3ccc8CC7x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x8y13C1Ev();
extern void _ZN3ccc8CC7x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x8y13E[] = {
  NSPAIR(_ZN3ccc8CC7x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC7x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x8y13E[];
extern void _ZN3ccc8CC7x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x8y13E[] = {
  {&(_ZTVN3ccc8CC7x8y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x8y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x8y13E[];
Class_Descriptor cd__ZN3ccc8CC7x8y13E = {  "_ZN3ccc8CC7x8y13E", // class name
  bases__ZN3ccc8CC7x8y13E, 2,
  &(vtc__ZN3ccc8CC7x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x8y13E),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  DD7x8y13  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD7x8y133efgEv
  ~DD7x8y13(); // tgen
  DD7x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x8y13E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD7x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x8y133efgEv");}
ccc::DD7x8y13 ::~DD7x8y13(){ note_dtor("_ZN3ccc8DD7x8y13E", this);} // tgen
ccc::DD7x8y13 ::DD7x8y13(){ note_ctor("_ZN3ccc8DD7x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x8y13E, buf);
    ::ccc::DD7x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x8y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD7x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x8y13E);
    dp->::ccc::DD7x8y13::~DD7x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x8y13E(Test__ZN3ccc8DD7x8y13E, "_ZN3ccc8DD7x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x8y13C1Ev();
extern void _ZN3ccc8DD7x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x8y13E[] = {
  NSPAIR(_ZN3ccc8DD7x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD7x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x8y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x8y133efgEv,_ZTv0_n12_N3ccc8DD7x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x8y133efgEv,_ZThn4_N3ccc8DD7x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x8y133efgEv,_ZTv0_n12_N3ccc8DD7x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x8y13E[] = {
  {&(_ZTVN3ccc8DD7x8y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x8y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x8y13E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x8y13E[];
static VTBL_ENTRY alt_thunk_names1012[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x8y133efgEv,_ZTv0_n12_N3ccc8DD7x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x8y133efgEv,_ZThn4_N3ccc8DD7x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x8y13E = {  "_ZN3ccc8DD7x8y13E", // class name
  bases__ZN3ccc8DD7x8y13E, 2,
  &(vtc__ZN3ccc8DD7x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x8y13E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x8y13E),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  CC7x8y14  : virtual ::ccc::AA7 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC7x8y143pqrEv
  ~CC7x8y14(); // tgen
  CC7x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x8y143pqrEv");}
ccc::CC7x8y14 ::~CC7x8y14(){ note_dtor("_ZN3ccc8CC7x8y14E", this);} // tgen
ccc::CC7x8y14 ::CC7x8y14(){ note_ctor("_ZN3ccc8CC7x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x8y14E, buf);
    ::ccc::CC7x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x8y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC7x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x8y14E);
    dp->::ccc::CC7x8y14::~CC7x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x8y14E(Test__ZN3ccc8CC7x8y14E, "_ZN3ccc8CC7x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x8y14C1Ev();
extern void _ZN3ccc8CC7x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x8y14E[] = {
  NSPAIR(_ZN3ccc8CC7x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC7x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC7x8y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x8y143pqrEv,_ZTv0_n16_N3ccc8CC7x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x8y143pqrEv,_ZThn4_N3ccc8CC7x8y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x8y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x8y143pqrEv,_ZTv0_n16_N3ccc8CC7x8y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x8y14E[] = {
  {&(_ZTVN3ccc8CC7x8y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x8y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x8y14E[];
static VTBL_ENTRY alt_thunk_names1013[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x8y143pqrEv,_ZTv0_n16_N3ccc8CC7x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x8y143pqrEv,_ZThn4_N3ccc8CC7x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x8y14E = {  "_ZN3ccc8CC7x8y14E", // class name
  bases__ZN3ccc8CC7x8y14E, 2,
  &(vtc__ZN3ccc8CC7x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x8y14E),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  DD7x8y14  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD7x8y143pqrEv
  ~DD7x8y14(); // tgen
  DD7x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x8y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x8y143pqrEv");}
ccc::DD7x8y14 ::~DD7x8y14(){ note_dtor("_ZN3ccc8DD7x8y14E", this);} // tgen
ccc::DD7x8y14 ::DD7x8y14(){ note_ctor("_ZN3ccc8DD7x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x8y14E, buf);
    ::ccc::DD7x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x8y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD7x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x8y14E);
    dp->::ccc::DD7x8y14::~DD7x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x8y14E(Test__ZN3ccc8DD7x8y14E, "_ZN3ccc8DD7x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x8y14C1Ev();
extern void _ZN3ccc8DD7x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x8y14E[] = {
  NSPAIR(_ZN3ccc8DD7x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD7x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x8y14E[] = {
  {&(_ZTVN3ccc8DD7x8y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x8y14E[];
Class_Descriptor cd__ZN3ccc8DD7x8y14E = {  "_ZN3ccc8DD7x8y14E", // class name
  bases__ZN3ccc8DD7x8y14E, 2,
  &(vtc__ZN3ccc8DD7x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x8y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x8y14E),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  CC7x8y15  : virtual ::ccc::AA7 , ::ccc::BB8 {
  ~CC7x8y15(); // tgen
  CC7x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x8y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC7x8y15 ::~CC7x8y15(){ note_dtor("_ZN3ccc8CC7x8y15E", this);} // tgen
ccc::CC7x8y15 ::CC7x8y15(){ note_ctor("_ZN3ccc8CC7x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x8y15E, buf);
    ::ccc::CC7x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x8y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC7x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x8y15E);
    dp->::ccc::CC7x8y15::~CC7x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x8y15E(Test__ZN3ccc8CC7x8y15E, "_ZN3ccc8CC7x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x8y15C1Ev();
extern void _ZN3ccc8CC7x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x8y15E[] = {
  NSPAIR(_ZN3ccc8CC7x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC7x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x8y15E[] = {
  {&(_ZTVN3ccc8CC7x8y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x8y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x8y15E[];
Class_Descriptor cd__ZN3ccc8CC7x8y15E = {  "_ZN3ccc8CC7x8y15E", // class name
  bases__ZN3ccc8CC7x8y15E, 2,
  &(vtc__ZN3ccc8CC7x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x8y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x8y15E),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  DD7x8y15  : virtual ::ccc::AA7 , virtual ::ccc::BB8 {
  ~DD7x8y15(); // tgen
  DD7x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x8y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD7x8y15 ::~DD7x8y15(){ note_dtor("_ZN3ccc8DD7x8y15E", this);} // tgen
ccc::DD7x8y15 ::DD7x8y15(){ note_ctor("_ZN3ccc8DD7x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x8y15E, buf);
    ::ccc::DD7x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x8y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD7x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x8y15E);
    dp->::ccc::DD7x8y15::~DD7x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x8y15E(Test__ZN3ccc8DD7x8y15E, "_ZN3ccc8DD7x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x8y15C1Ev();
extern void _ZN3ccc8DD7x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x8y15E[] = {
  NSPAIR(_ZN3ccc8DD7x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD7x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x8y15E[] = {
  {&(_ZTVN3ccc8DD7x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x8y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x8y15E[];
Class_Descriptor cd__ZN3ccc8DD7x8y15E = {  "_ZN3ccc8DD7x8y15E", // class name
  bases__ZN3ccc8DD7x8y15E, 2,
  &(vtc__ZN3ccc8DD7x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x8y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x8y15E),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  CC7x9y0  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC7x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y03pqrEv
  ~CC7x9y0(); // tgen
  CC7x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y0E) C1{ VBC2{ v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y03abcEv");}
void  ccc::CC7x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y03efgEv");}
void  ccc::CC7x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y03pqrEv");}
ccc::CC7x9y0 ::~CC7x9y0(){ note_dtor("_ZN3ccc7CC7x9y0E", this);} // tgen
ccc::CC7x9y0 ::CC7x9y0(){ note_ctor("_ZN3ccc7CC7x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y0E, buf);
    ::ccc::CC7x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y0E);
    dp->::ccc::CC7x9y0::~CC7x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y0E(Test__ZN3ccc7CC7x9y0E, "_ZN3ccc7CC7x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y0C1Ev();
extern void _ZN3ccc7CC7x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y0E[] = {
  NSPAIR(_ZN3ccc7CC7x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y0E[];
extern void _ZN3ccc7CC7x9y03efgEv();
extern void _ZN3ccc7CC7x9y03pqrEv();
extern void _ZN3ccc7CC7x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y03abcEv,_ZTv0_n12_N3ccc7CC7x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y03abcEv,_ZThn4_N3ccc7CC7x9y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y03pqrEv,_ZTv0_n16_N3ccc7CC7x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y03pqrEv,_ZThn4_N3ccc7CC7x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y03abcEv,_ZTv0_n12_N3ccc7CC7x9y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y03pqrEv,_ZTv0_n16_N3ccc7CC7x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y0E[] = {
  {&(_ZTVN3ccc7CC7x9y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y0E[];
static VTBL_ENTRY alt_thunk_names1014[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y03pqrEv,_ZTv0_n16_N3ccc7CC7x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y03pqrEv,_ZThn4_N3ccc7CC7x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y03abcEv,_ZTv0_n12_N3ccc7CC7x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y03abcEv,_ZThn4_N3ccc7CC7x9y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y0E = {  "_ZN3ccc7CC7x9y0E", // class name
  bases__ZN3ccc7CC7x9y0E, 2,
  &(vtc__ZN3ccc7CC7x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y0E),2, //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  DD7x9y0  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD7x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD7x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x9y03pqrEv
  ~DD7x9y0(); // tgen
  DD7x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y0E) C1{ VBC2{ v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y03abcEv");}
void  ccc::DD7x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y03efgEv");}
void  ccc::DD7x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y03pqrEv");}
ccc::DD7x9y0 ::~DD7x9y0(){ note_dtor("_ZN3ccc7DD7x9y0E", this);} // tgen
ccc::DD7x9y0 ::DD7x9y0(){ note_ctor("_ZN3ccc7DD7x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y0E, buf);
    ::ccc::DD7x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y0E);
    dp->::ccc::DD7x9y0::~DD7x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y0E(Test__ZN3ccc7DD7x9y0E, "_ZN3ccc7DD7x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y0C1Ev();
extern void _ZN3ccc7DD7x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y0E[] = {
  NSPAIR(_ZN3ccc7DD7x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y0E[];
extern void _ZN3ccc7DD7x9y03abcEv();
extern void _ZN3ccc7DD7x9y03pqrEv();
extern void _ZN3ccc7DD7x9y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y03efgEv,_ZTv0_n12_N3ccc7DD7x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y03efgEv,_ZThn4_N3ccc7DD7x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y03pqrEv,_ZTv0_n16_N3ccc7DD7x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y03pqrEv,_ZThn4_N3ccc7DD7x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y03efgEv,_ZTv0_n12_N3ccc7DD7x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y03pqrEv,_ZTv0_n16_N3ccc7DD7x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y0E[] = {
  {&(_ZTVN3ccc7DD7x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y0E[];
static VTBL_ENTRY alt_thunk_names1015[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y03pqrEv,_ZTv0_n16_N3ccc7DD7x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y03pqrEv,_ZThn4_N3ccc7DD7x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y03efgEv,_ZTv0_n12_N3ccc7DD7x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y03efgEv,_ZThn4_N3ccc7DD7x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y0E = {  "_ZN3ccc7DD7x9y0E", // class name
  bases__ZN3ccc7DD7x9y0E, 2,
  &(vtc__ZN3ccc7DD7x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y0E),3, //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  CC7x9y1  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x9y13efgEv
  ~CC7x9y1(); // tgen
  CC7x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y1E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y13abcEv");}
void  ccc::CC7x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y13pqrEv");}
void  ccc::CC7x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y13efgEv");}
ccc::CC7x9y1 ::~CC7x9y1(){ note_dtor("_ZN3ccc7CC7x9y1E", this);} // tgen
ccc::CC7x9y1 ::CC7x9y1(){ note_ctor("_ZN3ccc7CC7x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y1E, buf);
    ::ccc::CC7x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y1E);
    dp->::ccc::CC7x9y1::~CC7x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y1E(Test__ZN3ccc7CC7x9y1E, "_ZN3ccc7CC7x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y1C1Ev();
extern void _ZN3ccc7CC7x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y1E[] = {
  NSPAIR(_ZN3ccc7CC7x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y1E[];
extern void _ZN3ccc7CC7x9y13efgEv();
extern void _ZN3ccc7CC7x9y13pqrEv();
extern void _ZN3ccc7CC7x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y13abcEv,_ZTv0_n12_N3ccc7CC7x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y13abcEv,_ZThn4_N3ccc7CC7x9y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y13pqrEv,_ZTv0_n16_N3ccc7CC7x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y13pqrEv,_ZThn4_N3ccc7CC7x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y13abcEv,_ZTv0_n12_N3ccc7CC7x9y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y13pqrEv,_ZTv0_n16_N3ccc7CC7x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y1E[] = {
  {&(_ZTVN3ccc7CC7x9y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y1E[];
static VTBL_ENTRY alt_thunk_names1016[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y13pqrEv,_ZTv0_n16_N3ccc7CC7x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y13pqrEv,_ZThn4_N3ccc7CC7x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y13abcEv,_ZTv0_n12_N3ccc7CC7x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y13abcEv,_ZThn4_N3ccc7CC7x9y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y1E = {  "_ZN3ccc7CC7x9y1E", // class name
  bases__ZN3ccc7CC7x9y1E, 2,
  &(vtc__ZN3ccc7CC7x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y1E),2, //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  DD7x9y1  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD7x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x9y13efgEv
  ~DD7x9y1(); // tgen
  DD7x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y1E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y13abcEv");}
void  ccc::DD7x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y13pqrEv");}
void  ccc::DD7x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y13efgEv");}
ccc::DD7x9y1 ::~DD7x9y1(){ note_dtor("_ZN3ccc7DD7x9y1E", this);} // tgen
ccc::DD7x9y1 ::DD7x9y1(){ note_ctor("_ZN3ccc7DD7x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y1E, buf);
    ::ccc::DD7x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y1E);
    dp->::ccc::DD7x9y1::~DD7x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y1E(Test__ZN3ccc7DD7x9y1E, "_ZN3ccc7DD7x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y1C1Ev();
extern void _ZN3ccc7DD7x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y1E[] = {
  NSPAIR(_ZN3ccc7DD7x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y1E[];
extern void _ZN3ccc7DD7x9y13abcEv();
extern void _ZN3ccc7DD7x9y13pqrEv();
extern void _ZN3ccc7DD7x9y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y13efgEv,_ZTv0_n12_N3ccc7DD7x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y13efgEv,_ZThn4_N3ccc7DD7x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y13pqrEv,_ZTv0_n16_N3ccc7DD7x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y13pqrEv,_ZThn4_N3ccc7DD7x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y13efgEv,_ZTv0_n12_N3ccc7DD7x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y13pqrEv,_ZTv0_n16_N3ccc7DD7x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y1E[] = {
  {&(_ZTVN3ccc7DD7x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y1E[];
static VTBL_ENTRY alt_thunk_names1017[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y13pqrEv,_ZTv0_n16_N3ccc7DD7x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y13pqrEv,_ZThn4_N3ccc7DD7x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y13efgEv,_ZTv0_n12_N3ccc7DD7x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y13efgEv,_ZThn4_N3ccc7DD7x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y1E = {  "_ZN3ccc7DD7x9y1E", // class name
  bases__ZN3ccc7DD7x9y1E, 2,
  &(vtc__ZN3ccc7DD7x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y1E),3, //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  CC7x9y2  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC7x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y23pqrEv
  ~CC7x9y2(); // tgen
  CC7x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y2E) C1{ VBC2{ v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y23efgEv");}
void  ccc::CC7x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y23abcEv");}
void  ccc::CC7x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y23pqrEv");}
ccc::CC7x9y2 ::~CC7x9y2(){ note_dtor("_ZN3ccc7CC7x9y2E", this);} // tgen
ccc::CC7x9y2 ::CC7x9y2(){ note_ctor("_ZN3ccc7CC7x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y2E, buf);
    ::ccc::CC7x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y2E);
    dp->::ccc::CC7x9y2::~CC7x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y2E(Test__ZN3ccc7CC7x9y2E, "_ZN3ccc7CC7x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y2C1Ev();
extern void _ZN3ccc7CC7x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y2E[] = {
  NSPAIR(_ZN3ccc7CC7x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y2E[];
extern void _ZN3ccc7CC7x9y23efgEv();
extern void _ZN3ccc7CC7x9y23pqrEv();
extern void _ZN3ccc7CC7x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y23abcEv,_ZTv0_n12_N3ccc7CC7x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y23abcEv,_ZThn4_N3ccc7CC7x9y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y23pqrEv,_ZTv0_n16_N3ccc7CC7x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y23pqrEv,_ZThn4_N3ccc7CC7x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y23abcEv,_ZTv0_n12_N3ccc7CC7x9y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y23pqrEv,_ZTv0_n16_N3ccc7CC7x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y2E[] = {
  {&(_ZTVN3ccc7CC7x9y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y2E[];
static VTBL_ENTRY alt_thunk_names1018[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y23pqrEv,_ZTv0_n16_N3ccc7CC7x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y23pqrEv,_ZThn4_N3ccc7CC7x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y23abcEv,_ZTv0_n12_N3ccc7CC7x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y23abcEv,_ZThn4_N3ccc7CC7x9y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y2E = {  "_ZN3ccc7CC7x9y2E", // class name
  bases__ZN3ccc7CC7x9y2E, 2,
  &(vtc__ZN3ccc7CC7x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y2E),2, //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  DD7x9y2  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD7x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD7x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x9y23pqrEv
  ~DD7x9y2(); // tgen
  DD7x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y2E) C1{ VBC2{ v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y23efgEv");}
void  ccc::DD7x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y23abcEv");}
void  ccc::DD7x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y23pqrEv");}
ccc::DD7x9y2 ::~DD7x9y2(){ note_dtor("_ZN3ccc7DD7x9y2E", this);} // tgen
ccc::DD7x9y2 ::DD7x9y2(){ note_ctor("_ZN3ccc7DD7x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y2E, buf);
    ::ccc::DD7x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y2E);
    dp->::ccc::DD7x9y2::~DD7x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y2E(Test__ZN3ccc7DD7x9y2E, "_ZN3ccc7DD7x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y2C1Ev();
extern void _ZN3ccc7DD7x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y2E[] = {
  NSPAIR(_ZN3ccc7DD7x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y2E[];
extern void _ZN3ccc7DD7x9y23abcEv();
extern void _ZN3ccc7DD7x9y23pqrEv();
extern void _ZN3ccc7DD7x9y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y23efgEv,_ZTv0_n12_N3ccc7DD7x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y23efgEv,_ZThn4_N3ccc7DD7x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y23pqrEv,_ZTv0_n16_N3ccc7DD7x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y23pqrEv,_ZThn4_N3ccc7DD7x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y23efgEv,_ZTv0_n12_N3ccc7DD7x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y23pqrEv,_ZTv0_n16_N3ccc7DD7x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y2E[] = {
  {&(_ZTVN3ccc7DD7x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y2E[];
static VTBL_ENTRY alt_thunk_names1019[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y23pqrEv,_ZTv0_n16_N3ccc7DD7x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y23pqrEv,_ZThn4_N3ccc7DD7x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y23efgEv,_ZTv0_n12_N3ccc7DD7x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y23efgEv,_ZThn4_N3ccc7DD7x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y2E = {  "_ZN3ccc7DD7x9y2E", // class name
  bases__ZN3ccc7DD7x9y2E, 2,
  &(vtc__ZN3ccc7DD7x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y2E),3, //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  CC7x9y3  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x9y33abcEv
  ~CC7x9y3(); // tgen
  CC7x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y3E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y33efgEv");}
void  ccc::CC7x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y33pqrEv");}
void  ccc::CC7x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y33abcEv");}
ccc::CC7x9y3 ::~CC7x9y3(){ note_dtor("_ZN3ccc7CC7x9y3E", this);} // tgen
ccc::CC7x9y3 ::CC7x9y3(){ note_ctor("_ZN3ccc7CC7x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y3E, buf);
    ::ccc::CC7x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y3E);
    dp->::ccc::CC7x9y3::~CC7x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y3E(Test__ZN3ccc7CC7x9y3E, "_ZN3ccc7CC7x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y3C1Ev();
extern void _ZN3ccc7CC7x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y3E[] = {
  NSPAIR(_ZN3ccc7CC7x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y3E[];
extern void _ZN3ccc7CC7x9y33efgEv();
extern void _ZN3ccc7CC7x9y33pqrEv();
extern void _ZN3ccc7CC7x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y33abcEv,_ZTv0_n12_N3ccc7CC7x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y33abcEv,_ZThn4_N3ccc7CC7x9y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y33pqrEv,_ZTv0_n16_N3ccc7CC7x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y33pqrEv,_ZThn4_N3ccc7CC7x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y33abcEv,_ZTv0_n12_N3ccc7CC7x9y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y33pqrEv,_ZTv0_n16_N3ccc7CC7x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y3E[] = {
  {&(_ZTVN3ccc7CC7x9y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y3E[];
static VTBL_ENTRY alt_thunk_names1020[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y33pqrEv,_ZTv0_n16_N3ccc7CC7x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y33pqrEv,_ZThn4_N3ccc7CC7x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y33abcEv,_ZTv0_n12_N3ccc7CC7x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y33abcEv,_ZThn4_N3ccc7CC7x9y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y3E = {  "_ZN3ccc7CC7x9y3E", // class name
  bases__ZN3ccc7CC7x9y3E, 2,
  &(vtc__ZN3ccc7CC7x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y3E),2, //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  DD7x9y3  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD7x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x9y33abcEv
  ~DD7x9y3(); // tgen
  DD7x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y3E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y33efgEv");}
void  ccc::DD7x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y33pqrEv");}
void  ccc::DD7x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y33abcEv");}
ccc::DD7x9y3 ::~DD7x9y3(){ note_dtor("_ZN3ccc7DD7x9y3E", this);} // tgen
ccc::DD7x9y3 ::DD7x9y3(){ note_ctor("_ZN3ccc7DD7x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y3E, buf);
    ::ccc::DD7x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y3E);
    dp->::ccc::DD7x9y3::~DD7x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y3E(Test__ZN3ccc7DD7x9y3E, "_ZN3ccc7DD7x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y3C1Ev();
extern void _ZN3ccc7DD7x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y3E[] = {
  NSPAIR(_ZN3ccc7DD7x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y3E[];
extern void _ZN3ccc7DD7x9y33abcEv();
extern void _ZN3ccc7DD7x9y33pqrEv();
extern void _ZN3ccc7DD7x9y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y33efgEv,_ZTv0_n12_N3ccc7DD7x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y33efgEv,_ZThn4_N3ccc7DD7x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y33pqrEv,_ZTv0_n16_N3ccc7DD7x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y33pqrEv,_ZThn4_N3ccc7DD7x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y33efgEv,_ZTv0_n12_N3ccc7DD7x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y33pqrEv,_ZTv0_n16_N3ccc7DD7x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y3E[] = {
  {&(_ZTVN3ccc7DD7x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y3E[];
static VTBL_ENTRY alt_thunk_names1021[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y33pqrEv,_ZTv0_n16_N3ccc7DD7x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y33pqrEv,_ZThn4_N3ccc7DD7x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y33efgEv,_ZTv0_n12_N3ccc7DD7x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y33efgEv,_ZThn4_N3ccc7DD7x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y3E = {  "_ZN3ccc7DD7x9y3E", // class name
  bases__ZN3ccc7DD7x9y3E, 2,
  &(vtc__ZN3ccc7DD7x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y3E),3, //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  CC7x9y4  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC7x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC7x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC7x9y43efgEv
  ~CC7x9y4(); // tgen
  CC7x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y4E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y43pqrEv");}
void  ccc::CC7x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y43abcEv");}
void  ccc::CC7x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y43efgEv");}
ccc::CC7x9y4 ::~CC7x9y4(){ note_dtor("_ZN3ccc7CC7x9y4E", this);} // tgen
ccc::CC7x9y4 ::CC7x9y4(){ note_ctor("_ZN3ccc7CC7x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y4E, buf);
    ::ccc::CC7x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y4E);
    dp->::ccc::CC7x9y4::~CC7x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y4E(Test__ZN3ccc7CC7x9y4E, "_ZN3ccc7CC7x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y4C1Ev();
extern void _ZN3ccc7CC7x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y4E[] = {
  NSPAIR(_ZN3ccc7CC7x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y4E[];
extern void _ZN3ccc7CC7x9y43efgEv();
extern void _ZN3ccc7CC7x9y43pqrEv();
extern void _ZN3ccc7CC7x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y43abcEv,_ZTv0_n12_N3ccc7CC7x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y43abcEv,_ZThn4_N3ccc7CC7x9y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y43pqrEv,_ZTv0_n16_N3ccc7CC7x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y43pqrEv,_ZThn4_N3ccc7CC7x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y43abcEv,_ZTv0_n12_N3ccc7CC7x9y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y43pqrEv,_ZTv0_n16_N3ccc7CC7x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y4E[] = {
  {&(_ZTVN3ccc7CC7x9y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y4E[];
static VTBL_ENTRY alt_thunk_names1022[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y43pqrEv,_ZTv0_n16_N3ccc7CC7x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y43pqrEv,_ZThn4_N3ccc7CC7x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y43abcEv,_ZTv0_n12_N3ccc7CC7x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y43abcEv,_ZThn4_N3ccc7CC7x9y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y4E = {  "_ZN3ccc7CC7x9y4E", // class name
  bases__ZN3ccc7CC7x9y4E, 2,
  &(vtc__ZN3ccc7CC7x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y4E),2, //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  DD7x9y4  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD7x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD7x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD7x9y43efgEv
  ~DD7x9y4(); // tgen
  DD7x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y4E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y43pqrEv");}
void  ccc::DD7x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y43abcEv");}
void  ccc::DD7x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y43efgEv");}
ccc::DD7x9y4 ::~DD7x9y4(){ note_dtor("_ZN3ccc7DD7x9y4E", this);} // tgen
ccc::DD7x9y4 ::DD7x9y4(){ note_ctor("_ZN3ccc7DD7x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y4E, buf);
    ::ccc::DD7x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y4E);
    dp->::ccc::DD7x9y4::~DD7x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y4E(Test__ZN3ccc7DD7x9y4E, "_ZN3ccc7DD7x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y4C1Ev();
extern void _ZN3ccc7DD7x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y4E[] = {
  NSPAIR(_ZN3ccc7DD7x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y4E[];
extern void _ZN3ccc7DD7x9y43abcEv();
extern void _ZN3ccc7DD7x9y43pqrEv();
extern void _ZN3ccc7DD7x9y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y43efgEv,_ZTv0_n12_N3ccc7DD7x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y43efgEv,_ZThn4_N3ccc7DD7x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y43pqrEv,_ZTv0_n16_N3ccc7DD7x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y43pqrEv,_ZThn4_N3ccc7DD7x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y43efgEv,_ZTv0_n12_N3ccc7DD7x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y43pqrEv,_ZTv0_n16_N3ccc7DD7x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y4E[] = {
  {&(_ZTVN3ccc7DD7x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y4E[];
static VTBL_ENTRY alt_thunk_names1023[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y43pqrEv,_ZTv0_n16_N3ccc7DD7x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y43pqrEv,_ZThn4_N3ccc7DD7x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y43efgEv,_ZTv0_n12_N3ccc7DD7x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y43efgEv,_ZThn4_N3ccc7DD7x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y4E = {  "_ZN3ccc7DD7x9y4E", // class name
  bases__ZN3ccc7DD7x9y4E, 2,
  &(vtc__ZN3ccc7DD7x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y4E),3, //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  CC7x9y5  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC7x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC7x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC7x9y53abcEv
  ~CC7x9y5(); // tgen
  CC7x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y5E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y53pqrEv");}
void  ccc::CC7x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y53efgEv");}
void  ccc::CC7x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y53abcEv");}
ccc::CC7x9y5 ::~CC7x9y5(){ note_dtor("_ZN3ccc7CC7x9y5E", this);} // tgen
ccc::CC7x9y5 ::CC7x9y5(){ note_ctor("_ZN3ccc7CC7x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y5E, buf);
    ::ccc::CC7x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y5E);
    dp->::ccc::CC7x9y5::~CC7x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y5E(Test__ZN3ccc7CC7x9y5E, "_ZN3ccc7CC7x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y5C1Ev();
extern void _ZN3ccc7CC7x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y5E[] = {
  NSPAIR(_ZN3ccc7CC7x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y5E[];
extern void _ZN3ccc7CC7x9y53efgEv();
extern void _ZN3ccc7CC7x9y53pqrEv();
extern void _ZN3ccc7CC7x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y53abcEv,_ZTv0_n12_N3ccc7CC7x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y53abcEv,_ZThn4_N3ccc7CC7x9y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y53pqrEv,_ZTv0_n16_N3ccc7CC7x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y53pqrEv,_ZThn4_N3ccc7CC7x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y53abcEv,_ZTv0_n12_N3ccc7CC7x9y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y53pqrEv,_ZTv0_n16_N3ccc7CC7x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y5E[] = {
  {&(_ZTVN3ccc7CC7x9y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y5E[];
static VTBL_ENTRY alt_thunk_names1024[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y53pqrEv,_ZTv0_n16_N3ccc7CC7x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y53pqrEv,_ZThn4_N3ccc7CC7x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y53abcEv,_ZTv0_n12_N3ccc7CC7x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y53abcEv,_ZThn4_N3ccc7CC7x9y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y5E = {  "_ZN3ccc7CC7x9y5E", // class name
  bases__ZN3ccc7CC7x9y5E, 2,
  &(vtc__ZN3ccc7CC7x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y5E),2, //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  DD7x9y5  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD7x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD7x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD7x9y53abcEv
  ~DD7x9y5(); // tgen
  DD7x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y5E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y53pqrEv");}
void  ccc::DD7x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y53efgEv");}
void  ccc::DD7x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y53abcEv");}
ccc::DD7x9y5 ::~DD7x9y5(){ note_dtor("_ZN3ccc7DD7x9y5E", this);} // tgen
ccc::DD7x9y5 ::DD7x9y5(){ note_ctor("_ZN3ccc7DD7x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y5E, buf);
    ::ccc::DD7x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y5E);
    dp->::ccc::DD7x9y5::~DD7x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y5E(Test__ZN3ccc7DD7x9y5E, "_ZN3ccc7DD7x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y5C1Ev();
extern void _ZN3ccc7DD7x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y5E[] = {
  NSPAIR(_ZN3ccc7DD7x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y5E[];
extern void _ZN3ccc7DD7x9y53abcEv();
extern void _ZN3ccc7DD7x9y53pqrEv();
extern void _ZN3ccc7DD7x9y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y53efgEv,_ZTv0_n12_N3ccc7DD7x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y53efgEv,_ZThn4_N3ccc7DD7x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y53pqrEv,_ZTv0_n16_N3ccc7DD7x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y53pqrEv,_ZThn4_N3ccc7DD7x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y53efgEv,_ZTv0_n12_N3ccc7DD7x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y53pqrEv,_ZTv0_n16_N3ccc7DD7x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y5E[] = {
  {&(_ZTVN3ccc7DD7x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y5E[];
static VTBL_ENTRY alt_thunk_names1025[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y53pqrEv,_ZTv0_n16_N3ccc7DD7x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y53pqrEv,_ZThn4_N3ccc7DD7x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y53efgEv,_ZTv0_n12_N3ccc7DD7x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y53efgEv,_ZThn4_N3ccc7DD7x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y5E = {  "_ZN3ccc7DD7x9y5E", // class name
  bases__ZN3ccc7DD7x9y5E, 2,
  &(vtc__ZN3ccc7DD7x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y5E),3, //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  CC7x9y6  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC7x9y63efgEv
  ~CC7x9y6(); // tgen
  CC7x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y6E) C1{ VBC2{ v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y63abcEv");}
void  ccc::CC7x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y63efgEv");}
ccc::CC7x9y6 ::~CC7x9y6(){ note_dtor("_ZN3ccc7CC7x9y6E", this);} // tgen
ccc::CC7x9y6 ::CC7x9y6(){ note_ctor("_ZN3ccc7CC7x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y6E, buf);
    ::ccc::CC7x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y6E);
    dp->::ccc::CC7x9y6::~CC7x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y6E(Test__ZN3ccc7CC7x9y6E, "_ZN3ccc7CC7x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y6C1Ev();
extern void _ZN3ccc7CC7x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y6E[] = {
  NSPAIR(_ZN3ccc7CC7x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y6E[];
extern void _ZN3ccc7CC7x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC7x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y63abcEv,_ZTv0_n12_N3ccc7CC7x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y63abcEv,_ZThn4_N3ccc7CC7x9y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y63abcEv,_ZTv0_n12_N3ccc7CC7x9y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y6E[] = {
  {&(_ZTVN3ccc7CC7x9y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y6E[];
static VTBL_ENTRY alt_thunk_names1026[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y63abcEv,_ZTv0_n12_N3ccc7CC7x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y63abcEv,_ZThn4_N3ccc7CC7x9y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y6E = {  "_ZN3ccc7CC7x9y6E", // class name
  bases__ZN3ccc7CC7x9y6E, 2,
  &(vtc__ZN3ccc7CC7x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y6E),2, //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  DD7x9y6  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD7x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD7x9y63efgEv
  ~DD7x9y6(); // tgen
  DD7x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y6E) C1{ VBC2{ v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y63abcEv");}
void  ccc::DD7x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y63efgEv");}
ccc::DD7x9y6 ::~DD7x9y6(){ note_dtor("_ZN3ccc7DD7x9y6E", this);} // tgen
ccc::DD7x9y6 ::DD7x9y6(){ note_ctor("_ZN3ccc7DD7x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y6E, buf);
    ::ccc::DD7x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y6E);
    dp->::ccc::DD7x9y6::~DD7x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y6E(Test__ZN3ccc7DD7x9y6E, "_ZN3ccc7DD7x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y6C1Ev();
extern void _ZN3ccc7DD7x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y6E[] = {
  NSPAIR(_ZN3ccc7DD7x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y6E[];
extern void _ZN3ccc7DD7x9y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x9y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y63efgEv,_ZTv0_n12_N3ccc7DD7x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y63efgEv,_ZThn4_N3ccc7DD7x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y63efgEv,_ZTv0_n12_N3ccc7DD7x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y6E[] = {
  {&(_ZTVN3ccc7DD7x9y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y6E[];
static VTBL_ENTRY alt_thunk_names1027[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y63efgEv,_ZTv0_n12_N3ccc7DD7x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y63efgEv,_ZThn4_N3ccc7DD7x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y6E = {  "_ZN3ccc7DD7x9y6E", // class name
  bases__ZN3ccc7DD7x9y6E, 2,
  &(vtc__ZN3ccc7DD7x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y6E),3, //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  CC7x9y7  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC7x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y73pqrEv
  ~CC7x9y7(); // tgen
  CC7x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y7E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y73abcEv");}
void  ccc::CC7x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y73pqrEv");}
ccc::CC7x9y7 ::~CC7x9y7(){ note_dtor("_ZN3ccc7CC7x9y7E", this);} // tgen
ccc::CC7x9y7 ::CC7x9y7(){ note_ctor("_ZN3ccc7CC7x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y7E, buf);
    ::ccc::CC7x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y7E);
    dp->::ccc::CC7x9y7::~CC7x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y7E(Test__ZN3ccc7CC7x9y7E, "_ZN3ccc7CC7x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y7C1Ev();
extern void _ZN3ccc7CC7x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y7E[] = {
  NSPAIR(_ZN3ccc7CC7x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC7x9y73pqrEv();
extern void _ZN3ccc7CC7x9y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y73abcEv,_ZTv0_n12_N3ccc7CC7x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y73abcEv,_ZThn4_N3ccc7CC7x9y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y73pqrEv,_ZTv0_n16_N3ccc7CC7x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y73pqrEv,_ZThn4_N3ccc7CC7x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y73abcEv,_ZTv0_n12_N3ccc7CC7x9y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y73pqrEv,_ZTv0_n16_N3ccc7CC7x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y7E[] = {
  {&(_ZTVN3ccc7CC7x9y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y7E[];
static VTBL_ENTRY alt_thunk_names1028[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y73pqrEv,_ZTv0_n16_N3ccc7CC7x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y73pqrEv,_ZThn4_N3ccc7CC7x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y73abcEv,_ZTv0_n12_N3ccc7CC7x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y73abcEv,_ZThn4_N3ccc7CC7x9y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y7E = {  "_ZN3ccc7CC7x9y7E", // class name
  bases__ZN3ccc7CC7x9y7E, 2,
  &(vtc__ZN3ccc7CC7x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y7E),2, //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  DD7x9y7  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD7x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD7x9y73pqrEv
  ~DD7x9y7(); // tgen
  DD7x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y7E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y73abcEv");}
void  ccc::DD7x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y73pqrEv");}
ccc::DD7x9y7 ::~DD7x9y7(){ note_dtor("_ZN3ccc7DD7x9y7E", this);} // tgen
ccc::DD7x9y7 ::DD7x9y7(){ note_ctor("_ZN3ccc7DD7x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y7E, buf);
    ::ccc::DD7x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y7E);
    dp->::ccc::DD7x9y7::~DD7x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y7E(Test__ZN3ccc7DD7x9y7E, "_ZN3ccc7DD7x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y7C1Ev();
extern void _ZN3ccc7DD7x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y7E[] = {
  NSPAIR(_ZN3ccc7DD7x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y7E[];
extern void _ZN3ccc7DD7x9y73abcEv();
extern void _ZN3ccc7DD7x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y73pqrEv,_ZTv0_n16_N3ccc7DD7x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y73pqrEv,_ZThn4_N3ccc7DD7x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y73pqrEv,_ZTv0_n16_N3ccc7DD7x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y7E[] = {
  {&(_ZTVN3ccc7DD7x9y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x9y7E[6]),  6,14},
  {&(_ZTVN3ccc7DD7x9y7E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y7E[];
static VTBL_ENTRY alt_thunk_names1029[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y73pqrEv,_ZTv0_n16_N3ccc7DD7x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y73pqrEv,_ZThn4_N3ccc7DD7x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y7E = {  "_ZN3ccc7DD7x9y7E", // class name
  bases__ZN3ccc7DD7x9y7E, 2,
  &(vtc__ZN3ccc7DD7x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y7E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y7E),3, //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  CC7x9y8  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC7x9y83abcEv
  ~CC7x9y8(); // tgen
  CC7x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y8E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y83efgEv");}
void  ccc::CC7x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC7x9y83abcEv");}
ccc::CC7x9y8 ::~CC7x9y8(){ note_dtor("_ZN3ccc7CC7x9y8E", this);} // tgen
ccc::CC7x9y8 ::CC7x9y8(){ note_ctor("_ZN3ccc7CC7x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y8E, buf);
    ::ccc::CC7x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y8E);
    dp->::ccc::CC7x9y8::~CC7x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y8E(Test__ZN3ccc7CC7x9y8E, "_ZN3ccc7CC7x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y8C1Ev();
extern void _ZN3ccc7CC7x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y8E[] = {
  NSPAIR(_ZN3ccc7CC7x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y8E[];
extern void _ZN3ccc7CC7x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC7x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC7x9y83abcEv,_ZTv0_n12_N3ccc7CC7x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y83abcEv,_ZThn4_N3ccc7CC7x9y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC7x9y83abcEv,_ZTv0_n12_N3ccc7CC7x9y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y8E[] = {
  {&(_ZTVN3ccc7CC7x9y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC7x9y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y8E[];
static VTBL_ENTRY alt_thunk_names1030[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC7x9y83abcEv,_ZTv0_n12_N3ccc7CC7x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y83abcEv,_ZThn4_N3ccc7CC7x9y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y8E = {  "_ZN3ccc7CC7x9y8E", // class name
  bases__ZN3ccc7CC7x9y8E, 2,
  &(vtc__ZN3ccc7CC7x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y8E),2, //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  DD7x9y8  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD7x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD7x9y83abcEv
  ~DD7x9y8(); // tgen
  DD7x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y8E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y83efgEv");}
void  ccc::DD7x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD7x9y83abcEv");}
ccc::DD7x9y8 ::~DD7x9y8(){ note_dtor("_ZN3ccc7DD7x9y8E", this);} // tgen
ccc::DD7x9y8 ::DD7x9y8(){ note_ctor("_ZN3ccc7DD7x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y8E, buf);
    ::ccc::DD7x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y8E);
    dp->::ccc::DD7x9y8::~DD7x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y8E(Test__ZN3ccc7DD7x9y8E, "_ZN3ccc7DD7x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y8C1Ev();
extern void _ZN3ccc7DD7x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y8E[] = {
  NSPAIR(_ZN3ccc7DD7x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y8E[];
extern void _ZN3ccc7DD7x9y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc7DD7x9y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y83efgEv,_ZTv0_n12_N3ccc7DD7x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y83efgEv,_ZThn4_N3ccc7DD7x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y83efgEv,_ZTv0_n12_N3ccc7DD7x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y8E[] = {
  {&(_ZTVN3ccc7DD7x9y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y8E[];
static VTBL_ENTRY alt_thunk_names1031[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y83efgEv,_ZTv0_n12_N3ccc7DD7x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y83efgEv,_ZThn4_N3ccc7DD7x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y8E = {  "_ZN3ccc7DD7x9y8E", // class name
  bases__ZN3ccc7DD7x9y8E, 2,
  &(vtc__ZN3ccc7DD7x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y8E),3, //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  CC7x9y9  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC7x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC7x9y93pqrEv
  ~CC7x9y9(); // tgen
  CC7x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC7x9y9E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC7x9y93efgEv");}
void  ccc::CC7x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC7x9y93pqrEv");}
ccc::CC7x9y9 ::~CC7x9y9(){ note_dtor("_ZN3ccc7CC7x9y9E", this);} // tgen
ccc::CC7x9y9 ::CC7x9y9(){ note_ctor("_ZN3ccc7CC7x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC7x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC7x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC7x9y9E, buf);
    ::ccc::CC7x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC7x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC7x9y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc7CC7x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC7x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC7x9y9E);
    dp->::ccc::CC7x9y9::~CC7x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC7x9y9E(Test__ZN3ccc7CC7x9y9E, "_ZN3ccc7CC7x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC7x9y9C1Ev();
extern void _ZN3ccc7CC7x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC7x9y9E[] = {
  NSPAIR(_ZN3ccc7CC7x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC7x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC7x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC7x9y9E[];
extern void _ZN3ccc7CC7x9y93efgEv();
extern void _ZN3ccc7CC7x9y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC7x9y93pqrEv,_ZTv0_n16_N3ccc7CC7x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC7x9y93pqrEv,_ZThn4_N3ccc7CC7x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC7x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC7x9y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC7x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC7x9y93pqrEv,_ZTv0_n16_N3ccc7CC7x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC7x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC7x9y9E[] = {
  {&(_ZTVN3ccc7CC7x9y9E[3]),  3,11},
  {&(_ZTVN3ccc7CC7x9y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC7x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC7x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC7x9y9E[];
static VTBL_ENTRY alt_thunk_names1032[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC7x9y93pqrEv,_ZTv0_n16_N3ccc7CC7x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC7x9y93pqrEv,_ZThn4_N3ccc7CC7x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC7x9y9E = {  "_ZN3ccc7CC7x9y9E", // class name
  bases__ZN3ccc7CC7x9y9E, 2,
  &(vtc__ZN3ccc7CC7x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC7x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC7x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC7x9y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC7x9y9E),2, //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  DD7x9y9  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD7x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD7x9y93pqrEv
  ~DD7x9y9(); // tgen
  DD7x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD7x9y9E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD7x9y93efgEv");}
void  ccc::DD7x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD7x9y93pqrEv");}
ccc::DD7x9y9 ::~DD7x9y9(){ note_dtor("_ZN3ccc7DD7x9y9E", this);} // tgen
ccc::DD7x9y9 ::DD7x9y9(){ note_ctor("_ZN3ccc7DD7x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD7x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD7x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD7x9y9E, buf);
    ::ccc::DD7x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD7x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD7x9y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc7DD7x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD7x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD7x9y9E);
    dp->::ccc::DD7x9y9::~DD7x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD7x9y9E(Test__ZN3ccc7DD7x9y9E, "_ZN3ccc7DD7x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD7x9y9C1Ev();
extern void _ZN3ccc7DD7x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD7x9y9E[] = {
  NSPAIR(_ZN3ccc7DD7x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD7x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD7x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc7DD7x9y93pqrEv();
extern void _ZN3ccc7DD7x9y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD7x9y93efgEv,_ZTv0_n12_N3ccc7DD7x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y93efgEv,_ZThn4_N3ccc7DD7x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD7x9y93pqrEv,_ZTv0_n16_N3ccc7DD7x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD7x9y93pqrEv,_ZThn4_N3ccc7DD7x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD7x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD7x9y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD7x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD7x9y93efgEv,_ZTv0_n12_N3ccc7DD7x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD7x9y93pqrEv,_ZTv0_n16_N3ccc7DD7x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD7x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD7x9y9E[] = {
  {&(_ZTVN3ccc7DD7x9y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD7x9y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD7x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD7x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD7x9y9E[];
static VTBL_ENTRY alt_thunk_names1033[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD7x9y93pqrEv,_ZTv0_n16_N3ccc7DD7x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y93pqrEv,_ZThn4_N3ccc7DD7x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD7x9y93efgEv,_ZTv0_n12_N3ccc7DD7x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD7x9y93efgEv,_ZThn4_N3ccc7DD7x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD7x9y9E = {  "_ZN3ccc7DD7x9y9E", // class name
  bases__ZN3ccc7DD7x9y9E, 2,
  &(vtc__ZN3ccc7DD7x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD7x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD7x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD7x9y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD7x9y9E),3, //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  CC7x9y10  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC7x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x9y103abcEv
  ~CC7x9y10(); // tgen
  CC7x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y10E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x9y103pqrEv");}
void  ccc::CC7x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x9y103abcEv");}
ccc::CC7x9y10 ::~CC7x9y10(){ note_dtor("_ZN3ccc8CC7x9y10E", this);} // tgen
ccc::CC7x9y10 ::CC7x9y10(){ note_ctor("_ZN3ccc8CC7x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC7x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x9y10E, buf);
    ::ccc::CC7x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x9y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC7x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x9y10E);
    dp->::ccc::CC7x9y10::~CC7x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x9y10E(Test__ZN3ccc8CC7x9y10E, "_ZN3ccc8CC7x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x9y10C1Ev();
extern void _ZN3ccc8CC7x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC7x9y10E[] = {
  NSPAIR(_ZN3ccc8CC7x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC7x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC7x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC7x9y103pqrEv();
extern void _ZN3ccc8CC7x9y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x9y103abcEv,_ZTv0_n12_N3ccc8CC7x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y103abcEv,_ZThn4_N3ccc8CC7x9y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x9y103pqrEv,_ZTv0_n16_N3ccc8CC7x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y103pqrEv,_ZThn4_N3ccc8CC7x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x9y103abcEv,_ZTv0_n12_N3ccc8CC7x9y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x9y103pqrEv,_ZTv0_n16_N3ccc8CC7x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x9y10E[] = {
  {&(_ZTVN3ccc8CC7x9y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x9y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x9y10E[];
static VTBL_ENTRY alt_thunk_names1034[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x9y103pqrEv,_ZTv0_n16_N3ccc8CC7x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x9y103pqrEv,_ZThn4_N3ccc8CC7x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x9y103abcEv,_ZTv0_n12_N3ccc8CC7x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x9y103abcEv,_ZThn4_N3ccc8CC7x9y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x9y10E = {  "_ZN3ccc8CC7x9y10E", // class name
  bases__ZN3ccc8CC7x9y10E, 2,
  &(vtc__ZN3ccc8CC7x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x9y10E),2, //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  DD7x9y10  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD7x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x9y103abcEv
  ~DD7x9y10(); // tgen
  DD7x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD7x9y10E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x9y103pqrEv");}
void  ccc::DD7x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x9y103abcEv");}
ccc::DD7x9y10 ::~DD7x9y10(){ note_dtor("_ZN3ccc8DD7x9y10E", this);} // tgen
ccc::DD7x9y10 ::DD7x9y10(){ note_ctor("_ZN3ccc8DD7x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD7x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x9y10E, buf);
    ::ccc::DD7x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x9y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD7x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x9y10E);
    dp->::ccc::DD7x9y10::~DD7x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x9y10E(Test__ZN3ccc8DD7x9y10E, "_ZN3ccc8DD7x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x9y10C1Ev();
extern void _ZN3ccc8DD7x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD7x9y10E[] = {
  NSPAIR(_ZN3ccc8DD7x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD7x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD7x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y10E[];
extern void _ZN3ccc8DD7x9y103abcEv();
extern void _ZN3ccc8DD7x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x9y103pqrEv,_ZTv0_n16_N3ccc8DD7x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x9y103pqrEv,_ZThn4_N3ccc8DD7x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x9y103pqrEv,_ZTv0_n16_N3ccc8DD7x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x9y10E[] = {
  {&(_ZTVN3ccc8DD7x9y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y10E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y10E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x9y10E[];
static VTBL_ENTRY alt_thunk_names1035[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x9y103pqrEv,_ZTv0_n16_N3ccc8DD7x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x9y103pqrEv,_ZThn4_N3ccc8DD7x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x9y10E = {  "_ZN3ccc8DD7x9y10E", // class name
  bases__ZN3ccc8DD7x9y10E, 2,
  &(vtc__ZN3ccc8DD7x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x9y10E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x9y10E),3, //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  CC7x9y11  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC7x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x9y113efgEv
  ~CC7x9y11(); // tgen
  CC7x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y11E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x9y113pqrEv");}
void  ccc::CC7x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x9y113efgEv");}
ccc::CC7x9y11 ::~CC7x9y11(){ note_dtor("_ZN3ccc8CC7x9y11E", this);} // tgen
ccc::CC7x9y11 ::CC7x9y11(){ note_ctor("_ZN3ccc8CC7x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC7x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x9y11E, buf);
    ::ccc::CC7x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x9y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC7x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x9y11E);
    dp->::ccc::CC7x9y11::~CC7x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x9y11E(Test__ZN3ccc8CC7x9y11E, "_ZN3ccc8CC7x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x9y11C1Ev();
extern void _ZN3ccc8CC7x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC7x9y11E[] = {
  NSPAIR(_ZN3ccc8CC7x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC7x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC7x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x9y11E[];
extern void _ZN3ccc8CC7x9y113efgEv();
extern void _ZN3ccc8CC7x9y113pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x9y113pqrEv,_ZTv0_n16_N3ccc8CC7x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y113pqrEv,_ZThn4_N3ccc8CC7x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x9y113pqrEv,_ZTv0_n16_N3ccc8CC7x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x9y11E[] = {
  {&(_ZTVN3ccc8CC7x9y11E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x9y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x9y11E[];
static VTBL_ENTRY alt_thunk_names1036[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x9y113pqrEv,_ZTv0_n16_N3ccc8CC7x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x9y113pqrEv,_ZThn4_N3ccc8CC7x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x9y11E = {  "_ZN3ccc8CC7x9y11E", // class name
  bases__ZN3ccc8CC7x9y11E, 2,
  &(vtc__ZN3ccc8CC7x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x9y11E),2, //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  DD7x9y11  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD7x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x9y113efgEv
  ~DD7x9y11(); // tgen
  DD7x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD7x9y11E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x9y113pqrEv");}
void  ccc::DD7x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x9y113efgEv");}
ccc::DD7x9y11 ::~DD7x9y11(){ note_dtor("_ZN3ccc8DD7x9y11E", this);} // tgen
ccc::DD7x9y11 ::DD7x9y11(){ note_ctor("_ZN3ccc8DD7x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD7x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x9y11E, buf);
    ::ccc::DD7x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x9y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD7x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x9y11E);
    dp->::ccc::DD7x9y11::~DD7x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x9y11E(Test__ZN3ccc8DD7x9y11E, "_ZN3ccc8DD7x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x9y11C1Ev();
extern void _ZN3ccc8DD7x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD7x9y11E[] = {
  NSPAIR(_ZN3ccc8DD7x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD7x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD7x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x9y113pqrEv();
extern void _ZN3ccc8DD7x9y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x9y113efgEv,_ZTv0_n12_N3ccc8DD7x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x9y113efgEv,_ZThn4_N3ccc8DD7x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x9y113pqrEv,_ZTv0_n16_N3ccc8DD7x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x9y113pqrEv,_ZThn4_N3ccc8DD7x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x9y113efgEv,_ZTv0_n12_N3ccc8DD7x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x9y113pqrEv,_ZTv0_n16_N3ccc8DD7x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x9y11E[] = {
  {&(_ZTVN3ccc8DD7x9y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x9y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x9y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x9y11E[];
static VTBL_ENTRY alt_thunk_names1037[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x9y113pqrEv,_ZTv0_n16_N3ccc8DD7x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x9y113pqrEv,_ZThn4_N3ccc8DD7x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x9y113efgEv,_ZTv0_n12_N3ccc8DD7x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x9y113efgEv,_ZThn4_N3ccc8DD7x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x9y11E = {  "_ZN3ccc8DD7x9y11E", // class name
  bases__ZN3ccc8DD7x9y11E, 2,
  &(vtc__ZN3ccc8DD7x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x9y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x9y11E),3, //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  CC7x9y12  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC7x9y123abcEv
  ~CC7x9y12(); // tgen
  CC7x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x9y123abcEv");}
ccc::CC7x9y12 ::~CC7x9y12(){ note_dtor("_ZN3ccc8CC7x9y12E", this);} // tgen
ccc::CC7x9y12 ::CC7x9y12(){ note_ctor("_ZN3ccc8CC7x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC7x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x9y12E, buf);
    ::ccc::CC7x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x9y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC7x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x9y12E);
    dp->::ccc::CC7x9y12::~CC7x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x9y12E(Test__ZN3ccc8CC7x9y12E, "_ZN3ccc8CC7x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x9y12C1Ev();
extern void _ZN3ccc8CC7x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC7x9y12E[] = {
  NSPAIR(_ZN3ccc8CC7x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC7x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC7x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC7x9y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x9y123abcEv,_ZTv0_n12_N3ccc8CC7x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y123abcEv,_ZThn4_N3ccc8CC7x9y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x9y123abcEv,_ZTv0_n12_N3ccc8CC7x9y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x9y12E[] = {
  {&(_ZTVN3ccc8CC7x9y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x9y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x9y12E[];
static VTBL_ENTRY alt_thunk_names1038[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x9y123abcEv,_ZTv0_n12_N3ccc8CC7x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x9y123abcEv,_ZThn4_N3ccc8CC7x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x9y12E = {  "_ZN3ccc8CC7x9y12E", // class name
  bases__ZN3ccc8CC7x9y12E, 2,
  &(vtc__ZN3ccc8CC7x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x9y12E),2, //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  DD7x9y12  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD7x9y123abcEv
  ~DD7x9y12(); // tgen
  DD7x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD7x9y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x9y123abcEv");}
ccc::DD7x9y12 ::~DD7x9y12(){ note_dtor("_ZN3ccc8DD7x9y12E", this);} // tgen
ccc::DD7x9y12 ::DD7x9y12(){ note_ctor("_ZN3ccc8DD7x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD7x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x9y12E, buf);
    ::ccc::DD7x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x9y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD7x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x9y12E);
    dp->::ccc::DD7x9y12::~DD7x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x9y12E(Test__ZN3ccc8DD7x9y12E, "_ZN3ccc8DD7x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x9y12C1Ev();
extern void _ZN3ccc8DD7x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD7x9y12E[] = {
  NSPAIR(_ZN3ccc8DD7x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD7x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD7x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y12E[];
extern void _ZN3ccc8DD7x9y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x9y12E[] = {
  {&(_ZTVN3ccc8DD7x9y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x9y12E[];
Class_Descriptor cd__ZN3ccc8DD7x9y12E = {  "_ZN3ccc8DD7x9y12E", // class name
  bases__ZN3ccc8DD7x9y12E, 2,
  &(vtc__ZN3ccc8DD7x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x9y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x9y12E),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  CC7x9y13  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC7x9y133efgEv
  ~CC7x9y13(); // tgen
  CC7x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y13E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC7x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x9y133efgEv");}
ccc::CC7x9y13 ::~CC7x9y13(){ note_dtor("_ZN3ccc8CC7x9y13E", this);} // tgen
ccc::CC7x9y13 ::CC7x9y13(){ note_ctor("_ZN3ccc8CC7x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC7x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x9y13E, buf);
    ::ccc::CC7x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x9y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC7x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x9y13E);
    dp->::ccc::CC7x9y13::~CC7x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x9y13E(Test__ZN3ccc8CC7x9y13E, "_ZN3ccc8CC7x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x9y13C1Ev();
extern void _ZN3ccc8CC7x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC7x9y13E[] = {
  NSPAIR(_ZN3ccc8CC7x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC7x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC7x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x9y13E[];
extern void _ZN3ccc8CC7x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x9y13E[] = {
  {&(_ZTVN3ccc8CC7x9y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x9y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x9y13E[];
Class_Descriptor cd__ZN3ccc8CC7x9y13E = {  "_ZN3ccc8CC7x9y13E", // class name
  bases__ZN3ccc8CC7x9y13E, 2,
  &(vtc__ZN3ccc8CC7x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x9y13E),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  DD7x9y13  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD7x9y133efgEv
  ~DD7x9y13(); // tgen
  DD7x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD7x9y13E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD7x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x9y133efgEv");}
ccc::DD7x9y13 ::~DD7x9y13(){ note_dtor("_ZN3ccc8DD7x9y13E", this);} // tgen
ccc::DD7x9y13 ::DD7x9y13(){ note_ctor("_ZN3ccc8DD7x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD7x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x9y13E, buf);
    ::ccc::DD7x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x9y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD7x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x9y13E);
    dp->::ccc::DD7x9y13::~DD7x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x9y13E(Test__ZN3ccc8DD7x9y13E, "_ZN3ccc8DD7x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x9y13C1Ev();
extern void _ZN3ccc8DD7x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD7x9y13E[] = {
  NSPAIR(_ZN3ccc8DD7x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD7x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD7x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x9y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x9y133efgEv,_ZTv0_n12_N3ccc8DD7x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x9y133efgEv,_ZThn4_N3ccc8DD7x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x9y133efgEv,_ZTv0_n12_N3ccc8DD7x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x9y13E[] = {
  {&(_ZTVN3ccc8DD7x9y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x9y13E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x9y13E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x9y13E[];
static VTBL_ENTRY alt_thunk_names1039[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x9y133efgEv,_ZTv0_n12_N3ccc8DD7x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x9y133efgEv,_ZThn4_N3ccc8DD7x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x9y13E = {  "_ZN3ccc8DD7x9y13E", // class name
  bases__ZN3ccc8DD7x9y13E, 2,
  &(vtc__ZN3ccc8DD7x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x9y13E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x9y13E),3, //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  CC7x9y14  : virtual ::ccc::AA7 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC7x9y143pqrEv
  ~CC7x9y14(); // tgen
  CC7x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC7x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x9y143pqrEv");}
ccc::CC7x9y14 ::~CC7x9y14(){ note_dtor("_ZN3ccc8CC7x9y14E", this);} // tgen
ccc::CC7x9y14 ::CC7x9y14(){ note_ctor("_ZN3ccc8CC7x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC7x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x9y14E, buf);
    ::ccc::CC7x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x9y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC7x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x9y14E);
    dp->::ccc::CC7x9y14::~CC7x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x9y14E(Test__ZN3ccc8CC7x9y14E, "_ZN3ccc8CC7x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x9y14C1Ev();
extern void _ZN3ccc8CC7x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC7x9y14E[] = {
  NSPAIR(_ZN3ccc8CC7x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC7x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC7x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC7x9y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x9y143pqrEv,_ZTv0_n16_N3ccc8CC7x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x9y143pqrEv,_ZThn4_N3ccc8CC7x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x9y143pqrEv,_ZTv0_n16_N3ccc8CC7x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x9y14E[] = {
  {&(_ZTVN3ccc8CC7x9y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x9y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x9y14E[];
static VTBL_ENTRY alt_thunk_names1040[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x9y143pqrEv,_ZTv0_n16_N3ccc8CC7x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x9y143pqrEv,_ZThn4_N3ccc8CC7x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x9y14E = {  "_ZN3ccc8CC7x9y14E", // class name
  bases__ZN3ccc8CC7x9y14E, 2,
  &(vtc__ZN3ccc8CC7x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x9y14E),2, //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  DD7x9y14  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD7x9y143pqrEv
  ~DD7x9y14(); // tgen
  DD7x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD7x9y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD7x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x9y143pqrEv");}
ccc::DD7x9y14 ::~DD7x9y14(){ note_dtor("_ZN3ccc8DD7x9y14E", this);} // tgen
ccc::DD7x9y14 ::DD7x9y14(){ note_ctor("_ZN3ccc8DD7x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD7x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x9y14E, buf);
    ::ccc::DD7x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x9y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD7x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x9y14E);
    dp->::ccc::DD7x9y14::~DD7x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x9y14E(Test__ZN3ccc8DD7x9y14E, "_ZN3ccc8DD7x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x9y14C1Ev();
extern void _ZN3ccc8DD7x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD7x9y14E[] = {
  NSPAIR(_ZN3ccc8DD7x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD7x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD7x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x9y143pqrEv,_ZTv0_n16_N3ccc8DD7x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x9y143pqrEv,_ZThn4_N3ccc8DD7x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x9y143pqrEv,_ZTv0_n16_N3ccc8DD7x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x9y14E[] = {
  {&(_ZTVN3ccc8DD7x9y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x9y14E[];
static VTBL_ENTRY alt_thunk_names1041[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x9y143pqrEv,_ZTv0_n16_N3ccc8DD7x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x9y143pqrEv,_ZThn4_N3ccc8DD7x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x9y14E = {  "_ZN3ccc8DD7x9y14E", // class name
  bases__ZN3ccc8DD7x9y14E, 2,
  &(vtc__ZN3ccc8DD7x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x9y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x9y14E),3, //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  CC7x9y15  : virtual ::ccc::AA7 , ::ccc::BB9 {
  ~CC7x9y15(); // tgen
  CC7x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC7x9y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC7x9y15 ::~CC7x9y15(){ note_dtor("_ZN3ccc8CC7x9y15E", this);} // tgen
ccc::CC7x9y15 ::CC7x9y15(){ note_ctor("_ZN3ccc8CC7x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC7x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x9y15E, buf);
    ::ccc::CC7x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x9y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC7x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x9y15E);
    dp->::ccc::CC7x9y15::~CC7x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x9y15E(Test__ZN3ccc8CC7x9y15E, "_ZN3ccc8CC7x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x9y15C1Ev();
extern void _ZN3ccc8CC7x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC7x9y15E[] = {
  NSPAIR(_ZN3ccc8CC7x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC7x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC7x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x9y15E[] = {
  {&(_ZTVN3ccc8CC7x9y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x9y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x9y15E[];
Class_Descriptor cd__ZN3ccc8CC7x9y15E = {  "_ZN3ccc8CC7x9y15E", // class name
  bases__ZN3ccc8CC7x9y15E, 2,
  &(vtc__ZN3ccc8CC7x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x9y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x9y15E),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  DD7x9y15  : virtual ::ccc::AA7 , virtual ::ccc::BB9 {
  ~DD7x9y15(); // tgen
  DD7x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD7x9y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD7x9y15 ::~DD7x9y15(){ note_dtor("_ZN3ccc8DD7x9y15E", this);} // tgen
ccc::DD7x9y15 ::DD7x9y15(){ note_ctor("_ZN3ccc8DD7x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD7x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x9y15E, buf);
    ::ccc::DD7x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x9y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD7x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x9y15E);
    dp->::ccc::DD7x9y15::~DD7x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x9y15E(Test__ZN3ccc8DD7x9y15E, "_ZN3ccc8DD7x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x9y15C1Ev();
extern void _ZN3ccc8DD7x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD7x9y15E[] = {
  NSPAIR(_ZN3ccc8DD7x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD7x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD7x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x9y15E[] = {
  {&(_ZTVN3ccc8DD7x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x9y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x9y15E[];
Class_Descriptor cd__ZN3ccc8DD7x9y15E = {  "_ZN3ccc8DD7x9y15E", // class name
  bases__ZN3ccc8DD7x9y15E, 2,
  &(vtc__ZN3ccc8DD7x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x9y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x9y15E),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  CC7x10y0  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y03pqrEv
  ~CC7x10y0(); // tgen
  CC7x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y0E) C1{ VBC2{ v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y03abcEv");}
void  ccc::CC7x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y03efgEv");}
void  ccc::CC7x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y03pqrEv");}
ccc::CC7x10y0 ::~CC7x10y0(){ note_dtor("_ZN3ccc8CC7x10y0E", this);} // tgen
ccc::CC7x10y0 ::CC7x10y0(){ note_ctor("_ZN3ccc8CC7x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y0E, buf);
    ::ccc::CC7x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y0E);
    dp->::ccc::CC7x10y0::~CC7x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y0E(Test__ZN3ccc8CC7x10y0E, "_ZN3ccc8CC7x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y0C1Ev();
extern void _ZN3ccc8CC7x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y0E[] = {
  NSPAIR(_ZN3ccc8CC7x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y0E[];
extern void _ZN3ccc8CC7x10y03pqrEv();
extern void _ZN3ccc8CC7x10y03abcEv();
extern void _ZN3ccc8CC7x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y03abcEv,_ZTv0_n12_N3ccc8CC7x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y03abcEv,_ZThn4_N3ccc8CC7x10y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y03pqrEv,_ZTv0_n16_N3ccc8CC7x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y03pqrEv,_ZThn4_N3ccc8CC7x10y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y03abcEv,_ZTv0_n12_N3ccc8CC7x10y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y03pqrEv,_ZTv0_n16_N3ccc8CC7x10y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y0E[] = {
  {&(_ZTVN3ccc8CC7x10y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y0E[];
static VTBL_ENTRY alt_thunk_names1042[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y03pqrEv,_ZTv0_n16_N3ccc8CC7x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y03pqrEv,_ZThn4_N3ccc8CC7x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y03abcEv,_ZTv0_n12_N3ccc8CC7x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y03abcEv,_ZThn4_N3ccc8CC7x10y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y0E = {  "_ZN3ccc8CC7x10y0E", // class name
  bases__ZN3ccc8CC7x10y0E, 2,
  &(vtc__ZN3ccc8CC7x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y0E),2, //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  DD7x10y0  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD7x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD7x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x10y03pqrEv
  ~DD7x10y0(); // tgen
  DD7x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y0E) C1{ VBC2{ v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y03abcEv");}
void  ccc::DD7x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y03efgEv");}
void  ccc::DD7x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y03pqrEv");}
ccc::DD7x10y0 ::~DD7x10y0(){ note_dtor("_ZN3ccc8DD7x10y0E", this);} // tgen
ccc::DD7x10y0 ::DD7x10y0(){ note_ctor("_ZN3ccc8DD7x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y0E, buf);
    ::ccc::DD7x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y0E);
    dp->::ccc::DD7x10y0::~DD7x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y0E(Test__ZN3ccc8DD7x10y0E, "_ZN3ccc8DD7x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y0C1Ev();
extern void _ZN3ccc8DD7x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y0E[] = {
  NSPAIR(_ZN3ccc8DD7x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y0E[];
extern void _ZN3ccc8DD7x10y03abcEv();
extern void _ZN3ccc8DD7x10y03pqrEv();
extern void _ZN3ccc8DD7x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y03pqrEv,_ZTv0_n12_N3ccc8DD7x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y03pqrEv,_ZThn4_N3ccc8DD7x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y03abcEv,_ZTv0_n16_N3ccc8DD7x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y03abcEv,_ZThn4_N3ccc8DD7x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y03pqrEv,_ZTv0_n12_N3ccc8DD7x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y03abcEv,_ZTv0_n16_N3ccc8DD7x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y0E[] = {
  {&(_ZTVN3ccc8DD7x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y0E[];
static VTBL_ENTRY alt_thunk_names1043[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y03abcEv,_ZTv0_n16_N3ccc8DD7x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y03abcEv,_ZThn4_N3ccc8DD7x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y03pqrEv,_ZTv0_n12_N3ccc8DD7x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y03pqrEv,_ZThn4_N3ccc8DD7x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y0E = {  "_ZN3ccc8DD7x10y0E", // class name
  bases__ZN3ccc8DD7x10y0E, 2,
  &(vtc__ZN3ccc8DD7x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y0E),3, //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  CC7x10y1  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x10y13efgEv
  ~CC7x10y1(); // tgen
  CC7x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y1E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y13abcEv");}
void  ccc::CC7x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y13pqrEv");}
void  ccc::CC7x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y13efgEv");}
ccc::CC7x10y1 ::~CC7x10y1(){ note_dtor("_ZN3ccc8CC7x10y1E", this);} // tgen
ccc::CC7x10y1 ::CC7x10y1(){ note_ctor("_ZN3ccc8CC7x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y1E, buf);
    ::ccc::CC7x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y1E);
    dp->::ccc::CC7x10y1::~CC7x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y1E(Test__ZN3ccc8CC7x10y1E, "_ZN3ccc8CC7x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y1C1Ev();
extern void _ZN3ccc8CC7x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y1E[] = {
  NSPAIR(_ZN3ccc8CC7x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y1E[];
extern void _ZN3ccc8CC7x10y13pqrEv();
extern void _ZN3ccc8CC7x10y13abcEv();
extern void _ZN3ccc8CC7x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y13abcEv,_ZTv0_n12_N3ccc8CC7x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y13abcEv,_ZThn4_N3ccc8CC7x10y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y13pqrEv,_ZTv0_n16_N3ccc8CC7x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y13pqrEv,_ZThn4_N3ccc8CC7x10y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y13abcEv,_ZTv0_n12_N3ccc8CC7x10y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y13pqrEv,_ZTv0_n16_N3ccc8CC7x10y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y1E[] = {
  {&(_ZTVN3ccc8CC7x10y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y1E[];
static VTBL_ENTRY alt_thunk_names1044[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y13pqrEv,_ZTv0_n16_N3ccc8CC7x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y13pqrEv,_ZThn4_N3ccc8CC7x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y13abcEv,_ZTv0_n12_N3ccc8CC7x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y13abcEv,_ZThn4_N3ccc8CC7x10y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y1E = {  "_ZN3ccc8CC7x10y1E", // class name
  bases__ZN3ccc8CC7x10y1E, 2,
  &(vtc__ZN3ccc8CC7x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y1E),2, //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  DD7x10y1  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD7x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x10y13efgEv
  ~DD7x10y1(); // tgen
  DD7x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y1E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y13abcEv");}
void  ccc::DD7x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y13pqrEv");}
void  ccc::DD7x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y13efgEv");}
ccc::DD7x10y1 ::~DD7x10y1(){ note_dtor("_ZN3ccc8DD7x10y1E", this);} // tgen
ccc::DD7x10y1 ::DD7x10y1(){ note_ctor("_ZN3ccc8DD7x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y1E, buf);
    ::ccc::DD7x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y1E);
    dp->::ccc::DD7x10y1::~DD7x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y1E(Test__ZN3ccc8DD7x10y1E, "_ZN3ccc8DD7x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y1C1Ev();
extern void _ZN3ccc8DD7x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y1E[] = {
  NSPAIR(_ZN3ccc8DD7x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y1E[];
extern void _ZN3ccc8DD7x10y13abcEv();
extern void _ZN3ccc8DD7x10y13pqrEv();
extern void _ZN3ccc8DD7x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y13pqrEv,_ZTv0_n12_N3ccc8DD7x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y13pqrEv,_ZThn4_N3ccc8DD7x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y13abcEv,_ZTv0_n16_N3ccc8DD7x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y13abcEv,_ZThn4_N3ccc8DD7x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y13pqrEv,_ZTv0_n12_N3ccc8DD7x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y13abcEv,_ZTv0_n16_N3ccc8DD7x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y1E[] = {
  {&(_ZTVN3ccc8DD7x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y1E[];
static VTBL_ENTRY alt_thunk_names1045[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y13abcEv,_ZTv0_n16_N3ccc8DD7x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y13abcEv,_ZThn4_N3ccc8DD7x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y13pqrEv,_ZTv0_n12_N3ccc8DD7x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y13pqrEv,_ZThn4_N3ccc8DD7x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y1E = {  "_ZN3ccc8DD7x10y1E", // class name
  bases__ZN3ccc8DD7x10y1E, 2,
  &(vtc__ZN3ccc8DD7x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y1E),3, //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  CC7x10y2  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y23pqrEv
  ~CC7x10y2(); // tgen
  CC7x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y2E) C1{ VBC2{ v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y23efgEv");}
void  ccc::CC7x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y23abcEv");}
void  ccc::CC7x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y23pqrEv");}
ccc::CC7x10y2 ::~CC7x10y2(){ note_dtor("_ZN3ccc8CC7x10y2E", this);} // tgen
ccc::CC7x10y2 ::CC7x10y2(){ note_ctor("_ZN3ccc8CC7x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y2E, buf);
    ::ccc::CC7x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y2E);
    dp->::ccc::CC7x10y2::~CC7x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y2E(Test__ZN3ccc8CC7x10y2E, "_ZN3ccc8CC7x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y2C1Ev();
extern void _ZN3ccc8CC7x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y2E[] = {
  NSPAIR(_ZN3ccc8CC7x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y2E[];
extern void _ZN3ccc8CC7x10y23pqrEv();
extern void _ZN3ccc8CC7x10y23abcEv();
extern void _ZN3ccc8CC7x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y23abcEv,_ZTv0_n12_N3ccc8CC7x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y23abcEv,_ZThn4_N3ccc8CC7x10y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y23pqrEv,_ZTv0_n16_N3ccc8CC7x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y23pqrEv,_ZThn4_N3ccc8CC7x10y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y23abcEv,_ZTv0_n12_N3ccc8CC7x10y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y23pqrEv,_ZTv0_n16_N3ccc8CC7x10y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y2E[] = {
  {&(_ZTVN3ccc8CC7x10y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y2E[];
static VTBL_ENTRY alt_thunk_names1046[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y23pqrEv,_ZTv0_n16_N3ccc8CC7x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y23pqrEv,_ZThn4_N3ccc8CC7x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y23abcEv,_ZTv0_n12_N3ccc8CC7x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y23abcEv,_ZThn4_N3ccc8CC7x10y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y2E = {  "_ZN3ccc8CC7x10y2E", // class name
  bases__ZN3ccc8CC7x10y2E, 2,
  &(vtc__ZN3ccc8CC7x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y2E),2, //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  DD7x10y2  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD7x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD7x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x10y23pqrEv
  ~DD7x10y2(); // tgen
  DD7x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y2E) C1{ VBC2{ v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y23efgEv");}
void  ccc::DD7x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y23abcEv");}
void  ccc::DD7x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y23pqrEv");}
ccc::DD7x10y2 ::~DD7x10y2(){ note_dtor("_ZN3ccc8DD7x10y2E", this);} // tgen
ccc::DD7x10y2 ::DD7x10y2(){ note_ctor("_ZN3ccc8DD7x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y2E, buf);
    ::ccc::DD7x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y2E);
    dp->::ccc::DD7x10y2::~DD7x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y2E(Test__ZN3ccc8DD7x10y2E, "_ZN3ccc8DD7x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y2C1Ev();
extern void _ZN3ccc8DD7x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y2E[] = {
  NSPAIR(_ZN3ccc8DD7x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y2E[];
extern void _ZN3ccc8DD7x10y23abcEv();
extern void _ZN3ccc8DD7x10y23pqrEv();
extern void _ZN3ccc8DD7x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y23pqrEv,_ZTv0_n12_N3ccc8DD7x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y23pqrEv,_ZThn4_N3ccc8DD7x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y23abcEv,_ZTv0_n16_N3ccc8DD7x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y23abcEv,_ZThn4_N3ccc8DD7x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y23pqrEv,_ZTv0_n12_N3ccc8DD7x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y23abcEv,_ZTv0_n16_N3ccc8DD7x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y2E[] = {
  {&(_ZTVN3ccc8DD7x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y2E[];
static VTBL_ENTRY alt_thunk_names1047[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y23abcEv,_ZTv0_n16_N3ccc8DD7x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y23abcEv,_ZThn4_N3ccc8DD7x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y23pqrEv,_ZTv0_n12_N3ccc8DD7x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y23pqrEv,_ZThn4_N3ccc8DD7x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y2E = {  "_ZN3ccc8DD7x10y2E", // class name
  bases__ZN3ccc8DD7x10y2E, 2,
  &(vtc__ZN3ccc8DD7x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y2E),3, //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  CC7x10y3  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x10y33abcEv
  ~CC7x10y3(); // tgen
  CC7x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y3E) C1{ VBC2{ v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y33efgEv");}
void  ccc::CC7x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y33pqrEv");}
void  ccc::CC7x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y33abcEv");}
ccc::CC7x10y3 ::~CC7x10y3(){ note_dtor("_ZN3ccc8CC7x10y3E", this);} // tgen
ccc::CC7x10y3 ::CC7x10y3(){ note_ctor("_ZN3ccc8CC7x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y3E, buf);
    ::ccc::CC7x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y3E);
    dp->::ccc::CC7x10y3::~CC7x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y3E(Test__ZN3ccc8CC7x10y3E, "_ZN3ccc8CC7x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y3C1Ev();
extern void _ZN3ccc8CC7x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y3E[] = {
  NSPAIR(_ZN3ccc8CC7x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y3E[];
extern void _ZN3ccc8CC7x10y33pqrEv();
extern void _ZN3ccc8CC7x10y33abcEv();
extern void _ZN3ccc8CC7x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y33abcEv,_ZTv0_n12_N3ccc8CC7x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y33abcEv,_ZThn4_N3ccc8CC7x10y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y33pqrEv,_ZTv0_n16_N3ccc8CC7x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y33pqrEv,_ZThn4_N3ccc8CC7x10y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y33abcEv,_ZTv0_n12_N3ccc8CC7x10y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y33pqrEv,_ZTv0_n16_N3ccc8CC7x10y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y3E[] = {
  {&(_ZTVN3ccc8CC7x10y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y3E[];
static VTBL_ENTRY alt_thunk_names1048[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y33pqrEv,_ZTv0_n16_N3ccc8CC7x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y33pqrEv,_ZThn4_N3ccc8CC7x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y33abcEv,_ZTv0_n12_N3ccc8CC7x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y33abcEv,_ZThn4_N3ccc8CC7x10y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y3E = {  "_ZN3ccc8CC7x10y3E", // class name
  bases__ZN3ccc8CC7x10y3E, 2,
  &(vtc__ZN3ccc8CC7x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y3E),2, //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  DD7x10y3  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD7x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x10y33abcEv
  ~DD7x10y3(); // tgen
  DD7x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y3E) C1{ VBC2{ v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y33efgEv");}
void  ccc::DD7x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y33pqrEv");}
void  ccc::DD7x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y33abcEv");}
ccc::DD7x10y3 ::~DD7x10y3(){ note_dtor("_ZN3ccc8DD7x10y3E", this);} // tgen
ccc::DD7x10y3 ::DD7x10y3(){ note_ctor("_ZN3ccc8DD7x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y3E, buf);
    ::ccc::DD7x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y3E);
    dp->::ccc::DD7x10y3::~DD7x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y3E(Test__ZN3ccc8DD7x10y3E, "_ZN3ccc8DD7x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y3C1Ev();
extern void _ZN3ccc8DD7x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y3E[] = {
  NSPAIR(_ZN3ccc8DD7x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y3E[];
extern void _ZN3ccc8DD7x10y33abcEv();
extern void _ZN3ccc8DD7x10y33pqrEv();
extern void _ZN3ccc8DD7x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y33pqrEv,_ZTv0_n12_N3ccc8DD7x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y33pqrEv,_ZThn4_N3ccc8DD7x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y33abcEv,_ZTv0_n16_N3ccc8DD7x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y33abcEv,_ZThn4_N3ccc8DD7x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y33pqrEv,_ZTv0_n12_N3ccc8DD7x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y33abcEv,_ZTv0_n16_N3ccc8DD7x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y3E[] = {
  {&(_ZTVN3ccc8DD7x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y3E[];
static VTBL_ENTRY alt_thunk_names1049[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y33abcEv,_ZTv0_n16_N3ccc8DD7x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y33abcEv,_ZThn4_N3ccc8DD7x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y33pqrEv,_ZTv0_n12_N3ccc8DD7x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y33pqrEv,_ZThn4_N3ccc8DD7x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y3E = {  "_ZN3ccc8DD7x10y3E", // class name
  bases__ZN3ccc8DD7x10y3E, 2,
  &(vtc__ZN3ccc8DD7x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y3E),3, //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  CC7x10y4  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC7x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x10y43efgEv
  ~CC7x10y4(); // tgen
  CC7x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y4E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y43pqrEv");}
void  ccc::CC7x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y43abcEv");}
void  ccc::CC7x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y43efgEv");}
ccc::CC7x10y4 ::~CC7x10y4(){ note_dtor("_ZN3ccc8CC7x10y4E", this);} // tgen
ccc::CC7x10y4 ::CC7x10y4(){ note_ctor("_ZN3ccc8CC7x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y4E, buf);
    ::ccc::CC7x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y4E);
    dp->::ccc::CC7x10y4::~CC7x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y4E(Test__ZN3ccc8CC7x10y4E, "_ZN3ccc8CC7x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y4C1Ev();
extern void _ZN3ccc8CC7x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y4E[] = {
  NSPAIR(_ZN3ccc8CC7x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y4E[];
extern void _ZN3ccc8CC7x10y43pqrEv();
extern void _ZN3ccc8CC7x10y43abcEv();
extern void _ZN3ccc8CC7x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y43abcEv,_ZTv0_n12_N3ccc8CC7x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y43abcEv,_ZThn4_N3ccc8CC7x10y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y43pqrEv,_ZTv0_n16_N3ccc8CC7x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y43pqrEv,_ZThn4_N3ccc8CC7x10y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y43abcEv,_ZTv0_n12_N3ccc8CC7x10y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y43pqrEv,_ZTv0_n16_N3ccc8CC7x10y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y4E[] = {
  {&(_ZTVN3ccc8CC7x10y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y4E[];
static VTBL_ENTRY alt_thunk_names1050[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y43pqrEv,_ZTv0_n16_N3ccc8CC7x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y43pqrEv,_ZThn4_N3ccc8CC7x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y43abcEv,_ZTv0_n12_N3ccc8CC7x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y43abcEv,_ZThn4_N3ccc8CC7x10y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y4E = {  "_ZN3ccc8CC7x10y4E", // class name
  bases__ZN3ccc8CC7x10y4E, 2,
  &(vtc__ZN3ccc8CC7x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y4E),2, //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  DD7x10y4  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD7x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD7x10y43efgEv
  ~DD7x10y4(); // tgen
  DD7x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y4E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y43pqrEv");}
void  ccc::DD7x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y43abcEv");}
void  ccc::DD7x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y43efgEv");}
ccc::DD7x10y4 ::~DD7x10y4(){ note_dtor("_ZN3ccc8DD7x10y4E", this);} // tgen
ccc::DD7x10y4 ::DD7x10y4(){ note_ctor("_ZN3ccc8DD7x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y4E, buf);
    ::ccc::DD7x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y4E);
    dp->::ccc::DD7x10y4::~DD7x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y4E(Test__ZN3ccc8DD7x10y4E, "_ZN3ccc8DD7x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y4C1Ev();
extern void _ZN3ccc8DD7x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y4E[] = {
  NSPAIR(_ZN3ccc8DD7x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y4E[];
extern void _ZN3ccc8DD7x10y43abcEv();
extern void _ZN3ccc8DD7x10y43pqrEv();
extern void _ZN3ccc8DD7x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y43pqrEv,_ZTv0_n12_N3ccc8DD7x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y43pqrEv,_ZThn4_N3ccc8DD7x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y43abcEv,_ZTv0_n16_N3ccc8DD7x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y43abcEv,_ZThn4_N3ccc8DD7x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y43pqrEv,_ZTv0_n12_N3ccc8DD7x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y43abcEv,_ZTv0_n16_N3ccc8DD7x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y4E[] = {
  {&(_ZTVN3ccc8DD7x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y4E[];
static VTBL_ENTRY alt_thunk_names1051[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y43abcEv,_ZTv0_n16_N3ccc8DD7x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y43abcEv,_ZThn4_N3ccc8DD7x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y43pqrEv,_ZTv0_n12_N3ccc8DD7x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y43pqrEv,_ZThn4_N3ccc8DD7x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y4E = {  "_ZN3ccc8DD7x10y4E", // class name
  bases__ZN3ccc8DD7x10y4E, 2,
  &(vtc__ZN3ccc8DD7x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y4E),3, //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  CC7x10y5  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC7x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x10y53abcEv
  ~CC7x10y5(); // tgen
  CC7x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y5E) C1{ VBC2{ v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y53pqrEv");}
void  ccc::CC7x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y53efgEv");}
void  ccc::CC7x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y53abcEv");}
ccc::CC7x10y5 ::~CC7x10y5(){ note_dtor("_ZN3ccc8CC7x10y5E", this);} // tgen
ccc::CC7x10y5 ::CC7x10y5(){ note_ctor("_ZN3ccc8CC7x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y5E, buf);
    ::ccc::CC7x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y5E);
    dp->::ccc::CC7x10y5::~CC7x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y5E(Test__ZN3ccc8CC7x10y5E, "_ZN3ccc8CC7x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y5C1Ev();
extern void _ZN3ccc8CC7x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y5E[] = {
  NSPAIR(_ZN3ccc8CC7x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y5E[];
extern void _ZN3ccc8CC7x10y53pqrEv();
extern void _ZN3ccc8CC7x10y53abcEv();
extern void _ZN3ccc8CC7x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y53abcEv,_ZTv0_n12_N3ccc8CC7x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y53abcEv,_ZThn4_N3ccc8CC7x10y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y53pqrEv,_ZTv0_n16_N3ccc8CC7x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y53pqrEv,_ZThn4_N3ccc8CC7x10y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y53abcEv,_ZTv0_n12_N3ccc8CC7x10y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y53pqrEv,_ZTv0_n16_N3ccc8CC7x10y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y5E[] = {
  {&(_ZTVN3ccc8CC7x10y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y5E[];
static VTBL_ENTRY alt_thunk_names1052[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y53pqrEv,_ZTv0_n16_N3ccc8CC7x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y53pqrEv,_ZThn4_N3ccc8CC7x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y53abcEv,_ZTv0_n12_N3ccc8CC7x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y53abcEv,_ZThn4_N3ccc8CC7x10y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y5E = {  "_ZN3ccc8CC7x10y5E", // class name
  bases__ZN3ccc8CC7x10y5E, 2,
  &(vtc__ZN3ccc8CC7x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y5E),2, //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  DD7x10y5  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD7x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD7x10y53abcEv
  ~DD7x10y5(); // tgen
  DD7x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y5E) C1{ VBC2{ v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y53pqrEv");}
void  ccc::DD7x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y53efgEv");}
void  ccc::DD7x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y53abcEv");}
ccc::DD7x10y5 ::~DD7x10y5(){ note_dtor("_ZN3ccc8DD7x10y5E", this);} // tgen
ccc::DD7x10y5 ::DD7x10y5(){ note_ctor("_ZN3ccc8DD7x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y5E, buf);
    ::ccc::DD7x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y5E);
    dp->::ccc::DD7x10y5::~DD7x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y5E(Test__ZN3ccc8DD7x10y5E, "_ZN3ccc8DD7x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y5C1Ev();
extern void _ZN3ccc8DD7x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y5E[] = {
  NSPAIR(_ZN3ccc8DD7x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y5E[];
extern void _ZN3ccc8DD7x10y53abcEv();
extern void _ZN3ccc8DD7x10y53pqrEv();
extern void _ZN3ccc8DD7x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y53pqrEv,_ZTv0_n12_N3ccc8DD7x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y53pqrEv,_ZThn4_N3ccc8DD7x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y53abcEv,_ZTv0_n16_N3ccc8DD7x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y53abcEv,_ZThn4_N3ccc8DD7x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y53pqrEv,_ZTv0_n12_N3ccc8DD7x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y53abcEv,_ZTv0_n16_N3ccc8DD7x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y5E[] = {
  {&(_ZTVN3ccc8DD7x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y5E[];
static VTBL_ENTRY alt_thunk_names1053[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y53abcEv,_ZTv0_n16_N3ccc8DD7x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y53abcEv,_ZThn4_N3ccc8DD7x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y53pqrEv,_ZTv0_n12_N3ccc8DD7x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y53pqrEv,_ZThn4_N3ccc8DD7x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y5E = {  "_ZN3ccc8DD7x10y5E", // class name
  bases__ZN3ccc8DD7x10y5E, 2,
  &(vtc__ZN3ccc8DD7x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y5E),3, //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  CC7x10y6  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x10y63efgEv
  ~CC7x10y6(); // tgen
  CC7x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y6E) C1{ VBC2{ v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y63abcEv");}
void  ccc::CC7x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y63efgEv");}
ccc::CC7x10y6 ::~CC7x10y6(){ note_dtor("_ZN3ccc8CC7x10y6E", this);} // tgen
ccc::CC7x10y6 ::CC7x10y6(){ note_ctor("_ZN3ccc8CC7x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y6E, buf);
    ::ccc::CC7x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y6E);
    dp->::ccc::CC7x10y6::~CC7x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y6E(Test__ZN3ccc8CC7x10y6E, "_ZN3ccc8CC7x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y6C1Ev();
extern void _ZN3ccc8CC7x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y6E[] = {
  NSPAIR(_ZN3ccc8CC7x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC7x10y63abcEv();
extern void _ZN3ccc8CC7x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y63abcEv,_ZTv0_n12_N3ccc8CC7x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y63abcEv,_ZThn4_N3ccc8CC7x10y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y63abcEv,_ZTv0_n12_N3ccc8CC7x10y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y6E[] = {
  {&(_ZTVN3ccc8CC7x10y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y6E[];
static VTBL_ENTRY alt_thunk_names1054[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y63abcEv,_ZTv0_n12_N3ccc8CC7x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y63abcEv,_ZThn4_N3ccc8CC7x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y6E = {  "_ZN3ccc8CC7x10y6E", // class name
  bases__ZN3ccc8CC7x10y6E, 2,
  &(vtc__ZN3ccc8CC7x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y6E),2, //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  DD7x10y6  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD7x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD7x10y63efgEv
  ~DD7x10y6(); // tgen
  DD7x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y6E) C1{ VBC2{ v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y63abcEv");}
void  ccc::DD7x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y63efgEv");}
ccc::DD7x10y6 ::~DD7x10y6(){ note_dtor("_ZN3ccc8DD7x10y6E", this);} // tgen
ccc::DD7x10y6 ::DD7x10y6(){ note_ctor("_ZN3ccc8DD7x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y6E, buf);
    ::ccc::DD7x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y6E);
    dp->::ccc::DD7x10y6::~DD7x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y6E(Test__ZN3ccc8DD7x10y6E, "_ZN3ccc8DD7x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y6C1Ev();
extern void _ZN3ccc8DD7x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y6E[] = {
  NSPAIR(_ZN3ccc8DD7x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y6E[];
extern void _ZN3ccc8DD7x10y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x10y63efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y63abcEv,_ZTv0_n16_N3ccc8DD7x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y63abcEv,_ZThn4_N3ccc8DD7x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y63abcEv,_ZTv0_n16_N3ccc8DD7x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y6E[] = {
  {&(_ZTVN3ccc8DD7x10y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y6E[];
static VTBL_ENTRY alt_thunk_names1055[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y63abcEv,_ZTv0_n16_N3ccc8DD7x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y63abcEv,_ZThn4_N3ccc8DD7x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y6E = {  "_ZN3ccc8DD7x10y6E", // class name
  bases__ZN3ccc8DD7x10y6E, 2,
  &(vtc__ZN3ccc8DD7x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y6E),3, //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  CC7x10y7  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC7x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y73pqrEv
  ~CC7x10y7(); // tgen
  CC7x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y7E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y73abcEv");}
void  ccc::CC7x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y73pqrEv");}
ccc::CC7x10y7 ::~CC7x10y7(){ note_dtor("_ZN3ccc8CC7x10y7E", this);} // tgen
ccc::CC7x10y7 ::CC7x10y7(){ note_ctor("_ZN3ccc8CC7x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y7E, buf);
    ::ccc::CC7x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y7E);
    dp->::ccc::CC7x10y7::~CC7x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y7E(Test__ZN3ccc8CC7x10y7E, "_ZN3ccc8CC7x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y7C1Ev();
extern void _ZN3ccc8CC7x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y7E[] = {
  NSPAIR(_ZN3ccc8CC7x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y7E[];
extern void _ZN3ccc8CC7x10y73pqrEv();
extern void _ZN3ccc8CC7x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y73abcEv,_ZTv0_n12_N3ccc8CC7x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y73abcEv,_ZThn4_N3ccc8CC7x10y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y73pqrEv,_ZTv0_n16_N3ccc8CC7x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y73pqrEv,_ZThn4_N3ccc8CC7x10y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y73abcEv,_ZTv0_n12_N3ccc8CC7x10y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y73pqrEv,_ZTv0_n16_N3ccc8CC7x10y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y7E[] = {
  {&(_ZTVN3ccc8CC7x10y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x10y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y7E[];
static VTBL_ENTRY alt_thunk_names1056[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y73pqrEv,_ZTv0_n16_N3ccc8CC7x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y73pqrEv,_ZThn4_N3ccc8CC7x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y73abcEv,_ZTv0_n12_N3ccc8CC7x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y73abcEv,_ZThn4_N3ccc8CC7x10y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y7E = {  "_ZN3ccc8CC7x10y7E", // class name
  bases__ZN3ccc8CC7x10y7E, 2,
  &(vtc__ZN3ccc8CC7x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y7E),2, //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  DD7x10y7  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD7x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x10y73pqrEv
  ~DD7x10y7(); // tgen
  DD7x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y7E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y73abcEv");}
void  ccc::DD7x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y73pqrEv");}
ccc::DD7x10y7 ::~DD7x10y7(){ note_dtor("_ZN3ccc8DD7x10y7E", this);} // tgen
ccc::DD7x10y7 ::DD7x10y7(){ note_ctor("_ZN3ccc8DD7x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y7E, buf);
    ::ccc::DD7x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y7E);
    dp->::ccc::DD7x10y7::~DD7x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y7E(Test__ZN3ccc8DD7x10y7E, "_ZN3ccc8DD7x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y7C1Ev();
extern void _ZN3ccc8DD7x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y7E[] = {
  NSPAIR(_ZN3ccc8DD7x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y7E[];
extern void _ZN3ccc8DD7x10y73abcEv();
extern void _ZN3ccc8DD7x10y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y73pqrEv,_ZTv0_n12_N3ccc8DD7x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y73pqrEv,_ZThn4_N3ccc8DD7x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y73abcEv,_ZTv0_n16_N3ccc8DD7x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y73abcEv,_ZThn4_N3ccc8DD7x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y73pqrEv,_ZTv0_n12_N3ccc8DD7x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y73abcEv,_ZTv0_n16_N3ccc8DD7x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y7E[] = {
  {&(_ZTVN3ccc8DD7x10y7E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x10y7E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x10y7E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y7E[];
static VTBL_ENTRY alt_thunk_names1057[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y73abcEv,_ZTv0_n16_N3ccc8DD7x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y73abcEv,_ZThn4_N3ccc8DD7x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y73pqrEv,_ZTv0_n12_N3ccc8DD7x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y73pqrEv,_ZThn4_N3ccc8DD7x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y7E = {  "_ZN3ccc8DD7x10y7E", // class name
  bases__ZN3ccc8DD7x10y7E, 2,
  &(vtc__ZN3ccc8DD7x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y7E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y7E),3, //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  CC7x10y8  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x10y83abcEv
  ~CC7x10y8(); // tgen
  CC7x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y8E) C1{ VBC2{ v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y83efgEv");}
void  ccc::CC7x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x10y83abcEv");}
ccc::CC7x10y8 ::~CC7x10y8(){ note_dtor("_ZN3ccc8CC7x10y8E", this);} // tgen
ccc::CC7x10y8 ::CC7x10y8(){ note_ctor("_ZN3ccc8CC7x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y8E, buf);
    ::ccc::CC7x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y8E);
    dp->::ccc::CC7x10y8::~CC7x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y8E(Test__ZN3ccc8CC7x10y8E, "_ZN3ccc8CC7x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y8C1Ev();
extern void _ZN3ccc8CC7x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y8E[] = {
  NSPAIR(_ZN3ccc8CC7x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC7x10y83abcEv();
extern void _ZN3ccc8CC7x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x10y83abcEv,_ZTv0_n12_N3ccc8CC7x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y83abcEv,_ZThn4_N3ccc8CC7x10y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x10y83abcEv,_ZTv0_n12_N3ccc8CC7x10y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y8E[] = {
  {&(_ZTVN3ccc8CC7x10y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y8E[];
static VTBL_ENTRY alt_thunk_names1058[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x10y83abcEv,_ZTv0_n12_N3ccc8CC7x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y83abcEv,_ZThn4_N3ccc8CC7x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y8E = {  "_ZN3ccc8CC7x10y8E", // class name
  bases__ZN3ccc8CC7x10y8E, 2,
  &(vtc__ZN3ccc8CC7x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y8E),2, //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  DD7x10y8  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD7x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD7x10y83abcEv
  ~DD7x10y8(); // tgen
  DD7x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y8E) C1{ VBC2{ v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y83efgEv");}
void  ccc::DD7x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x10y83abcEv");}
ccc::DD7x10y8 ::~DD7x10y8(){ note_dtor("_ZN3ccc8DD7x10y8E", this);} // tgen
ccc::DD7x10y8 ::DD7x10y8(){ note_ctor("_ZN3ccc8DD7x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y8E, buf);
    ::ccc::DD7x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y8E);
    dp->::ccc::DD7x10y8::~DD7x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y8E(Test__ZN3ccc8DD7x10y8E, "_ZN3ccc8DD7x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y8C1Ev();
extern void _ZN3ccc8DD7x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y8E[] = {
  NSPAIR(_ZN3ccc8DD7x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y8E[];
extern void _ZN3ccc8DD7x10y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x10y83efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x10y83abcEv,_ZTv0_n16_N3ccc8DD7x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y83abcEv,_ZThn4_N3ccc8DD7x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x10y83abcEv,_ZTv0_n16_N3ccc8DD7x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y8E[] = {
  {&(_ZTVN3ccc8DD7x10y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y8E[];
static VTBL_ENTRY alt_thunk_names1059[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x10y83abcEv,_ZTv0_n16_N3ccc8DD7x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y83abcEv,_ZThn4_N3ccc8DD7x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y8E = {  "_ZN3ccc8DD7x10y8E", // class name
  bases__ZN3ccc8DD7x10y8E, 2,
  &(vtc__ZN3ccc8DD7x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y8E),3, //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  CC7x10y9  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC7x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x10y93pqrEv
  ~CC7x10y9(); // tgen
  CC7x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x10y9E) C1{ VBC2{ v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x10y93efgEv");}
void  ccc::CC7x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x10y93pqrEv");}
ccc::CC7x10y9 ::~CC7x10y9(){ note_dtor("_ZN3ccc8CC7x10y9E", this);} // tgen
ccc::CC7x10y9 ::CC7x10y9(){ note_ctor("_ZN3ccc8CC7x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC7x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x10y9E, buf);
    ::ccc::CC7x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x10y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC7x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x10y9E);
    dp->::ccc::CC7x10y9::~CC7x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x10y9E(Test__ZN3ccc8CC7x10y9E, "_ZN3ccc8CC7x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x10y9C1Ev();
extern void _ZN3ccc8CC7x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC7x10y9E[] = {
  NSPAIR(_ZN3ccc8CC7x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC7x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC7x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x10y9E[];
extern void _ZN3ccc8CC7x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC7x10y93efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x10y93pqrEv,_ZTv0_n16_N3ccc8CC7x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x10y93pqrEv,_ZThn4_N3ccc8CC7x10y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x10y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x10y93pqrEv,_ZTv0_n16_N3ccc8CC7x10y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x10y9E[] = {
  {&(_ZTVN3ccc8CC7x10y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x10y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x10y9E[];
static VTBL_ENTRY alt_thunk_names1060[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x10y93pqrEv,_ZTv0_n16_N3ccc8CC7x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x10y93pqrEv,_ZThn4_N3ccc8CC7x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x10y9E = {  "_ZN3ccc8CC7x10y9E", // class name
  bases__ZN3ccc8CC7x10y9E, 2,
  &(vtc__ZN3ccc8CC7x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x10y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x10y9E),2, //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  DD7x10y9  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD7x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x10y93pqrEv
  ~DD7x10y9(); // tgen
  DD7x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD7x10y9E) C1{ VBC2{ v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x10y93efgEv");}
void  ccc::DD7x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x10y93pqrEv");}
ccc::DD7x10y9 ::~DD7x10y9(){ note_dtor("_ZN3ccc8DD7x10y9E", this);} // tgen
ccc::DD7x10y9 ::DD7x10y9(){ note_ctor("_ZN3ccc8DD7x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD7x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x10y9E, buf);
    ::ccc::DD7x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x10y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD7x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x10y9E);
    dp->::ccc::DD7x10y9::~DD7x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x10y9E(Test__ZN3ccc8DD7x10y9E, "_ZN3ccc8DD7x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x10y9C1Ev();
extern void _ZN3ccc8DD7x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD7x10y9E[] = {
  NSPAIR(_ZN3ccc8DD7x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD7x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD7x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x10y93pqrEv();
extern void _ZN3ccc8DD7x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x10y93pqrEv,_ZTv0_n12_N3ccc8DD7x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x10y93pqrEv,_ZThn4_N3ccc8DD7x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x10y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x10y93pqrEv,_ZTv0_n12_N3ccc8DD7x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x10y9E[] = {
  {&(_ZTVN3ccc8DD7x10y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x10y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x10y9E[];
static VTBL_ENTRY alt_thunk_names1061[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x10y93pqrEv,_ZTv0_n12_N3ccc8DD7x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x10y93pqrEv,_ZThn4_N3ccc8DD7x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x10y9E = {  "_ZN3ccc8DD7x10y9E", // class name
  bases__ZN3ccc8DD7x10y9E, 2,
  &(vtc__ZN3ccc8DD7x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x10y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x10y9E),3, //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  CC7x10y10  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC7x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x10y103abcEv
  ~CC7x10y10(); // tgen
  CC7x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y10E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x10y103pqrEv");}
void  ccc::CC7x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x10y103abcEv");}
ccc::CC7x10y10 ::~CC7x10y10(){ note_dtor("_ZN3ccc9CC7x10y10E", this);} // tgen
ccc::CC7x10y10 ::CC7x10y10(){ note_ctor("_ZN3ccc9CC7x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC7x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x10y10E, buf);
    ::ccc::CC7x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x10y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC7x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x10y10E);
    dp->::ccc::CC7x10y10::~CC7x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x10y10E(Test__ZN3ccc9CC7x10y10E, "_ZN3ccc9CC7x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x10y10C1Ev();
extern void _ZN3ccc9CC7x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC7x10y10E[] = {
  NSPAIR(_ZN3ccc9CC7x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC7x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC7x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x10y10E[];
extern void _ZN3ccc9CC7x10y103pqrEv();
extern void _ZN3ccc9CC7x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x10y103abcEv,_ZTv0_n12_N3ccc9CC7x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y103abcEv,_ZThn4_N3ccc9CC7x10y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x10y103pqrEv,_ZTv0_n16_N3ccc9CC7x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y103pqrEv,_ZThn4_N3ccc9CC7x10y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x10y103abcEv,_ZTv0_n12_N3ccc9CC7x10y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x10y103pqrEv,_ZTv0_n16_N3ccc9CC7x10y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x10y10E[] = {
  {&(_ZTVN3ccc9CC7x10y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x10y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x10y10E[];
static VTBL_ENTRY alt_thunk_names1062[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x10y103pqrEv,_ZTv0_n16_N3ccc9CC7x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x10y103pqrEv,_ZThn4_N3ccc9CC7x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x10y103abcEv,_ZTv0_n12_N3ccc9CC7x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x10y103abcEv,_ZThn4_N3ccc9CC7x10y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x10y10E = {  "_ZN3ccc9CC7x10y10E", // class name
  bases__ZN3ccc9CC7x10y10E, 2,
  &(vtc__ZN3ccc9CC7x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x10y10E),2, //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  DD7x10y10  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD7x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD7x10y103abcEv
  ~DD7x10y10(); // tgen
  DD7x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD7x10y10E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x10y103pqrEv");}
void  ccc::DD7x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x10y103abcEv");}
ccc::DD7x10y10 ::~DD7x10y10(){ note_dtor("_ZN3ccc9DD7x10y10E", this);} // tgen
ccc::DD7x10y10 ::DD7x10y10(){ note_ctor("_ZN3ccc9DD7x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD7x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x10y10E, buf);
    ::ccc::DD7x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x10y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD7x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x10y10E);
    dp->::ccc::DD7x10y10::~DD7x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x10y10E(Test__ZN3ccc9DD7x10y10E, "_ZN3ccc9DD7x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x10y10C1Ev();
extern void _ZN3ccc9DD7x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD7x10y10E[] = {
  NSPAIR(_ZN3ccc9DD7x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD7x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD7x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y10E[];
extern void _ZN3ccc9DD7x10y103abcEv();
extern void _ZN3ccc9DD7x10y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x10y103pqrEv,_ZTv0_n12_N3ccc9DD7x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x10y103pqrEv,_ZThn4_N3ccc9DD7x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD7x10y103abcEv,_ZTv0_n16_N3ccc9DD7x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x10y103abcEv,_ZThn4_N3ccc9DD7x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x10y103pqrEv,_ZTv0_n12_N3ccc9DD7x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD7x10y103abcEv,_ZTv0_n16_N3ccc9DD7x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x10y10E[] = {
  {&(_ZTVN3ccc9DD7x10y10E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y10E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y10E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x10y10E[];
static VTBL_ENTRY alt_thunk_names1063[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD7x10y103abcEv,_ZTv0_n16_N3ccc9DD7x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x10y103abcEv,_ZThn4_N3ccc9DD7x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x10y103pqrEv,_ZTv0_n12_N3ccc9DD7x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x10y103pqrEv,_ZThn4_N3ccc9DD7x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x10y10E = {  "_ZN3ccc9DD7x10y10E", // class name
  bases__ZN3ccc9DD7x10y10E, 2,
  &(vtc__ZN3ccc9DD7x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x10y10E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x10y10E),3, //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  CC7x10y11  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC7x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x10y113efgEv
  ~CC7x10y11(); // tgen
  CC7x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y11E) C1{ VBC2{ v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x10y113pqrEv");}
void  ccc::CC7x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x10y113efgEv");}
ccc::CC7x10y11 ::~CC7x10y11(){ note_dtor("_ZN3ccc9CC7x10y11E", this);} // tgen
ccc::CC7x10y11 ::CC7x10y11(){ note_ctor("_ZN3ccc9CC7x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC7x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x10y11E, buf);
    ::ccc::CC7x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x10y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC7x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x10y11E);
    dp->::ccc::CC7x10y11::~CC7x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x10y11E(Test__ZN3ccc9CC7x10y11E, "_ZN3ccc9CC7x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x10y11C1Ev();
extern void _ZN3ccc9CC7x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC7x10y11E[] = {
  NSPAIR(_ZN3ccc9CC7x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC7x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC7x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x10y11E[];
extern void _ZN3ccc9CC7x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC7x10y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x10y113pqrEv,_ZTv0_n16_N3ccc9CC7x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y113pqrEv,_ZThn4_N3ccc9CC7x10y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x10y113pqrEv,_ZTv0_n16_N3ccc9CC7x10y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x10y11E[] = {
  {&(_ZTVN3ccc9CC7x10y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC7x10y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x10y11E[];
static VTBL_ENTRY alt_thunk_names1064[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x10y113pqrEv,_ZTv0_n16_N3ccc9CC7x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x10y113pqrEv,_ZThn4_N3ccc9CC7x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x10y11E = {  "_ZN3ccc9CC7x10y11E", // class name
  bases__ZN3ccc9CC7x10y11E, 2,
  &(vtc__ZN3ccc9CC7x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x10y11E),2, //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  DD7x10y11  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD7x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD7x10y113efgEv
  ~DD7x10y11(); // tgen
  DD7x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD7x10y11E) C1{ VBC2{ v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x10y113pqrEv");}
void  ccc::DD7x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x10y113efgEv");}
ccc::DD7x10y11 ::~DD7x10y11(){ note_dtor("_ZN3ccc9DD7x10y11E", this);} // tgen
ccc::DD7x10y11 ::DD7x10y11(){ note_ctor("_ZN3ccc9DD7x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD7x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x10y11E, buf);
    ::ccc::DD7x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x10y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD7x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x10y11E);
    dp->::ccc::DD7x10y11::~DD7x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x10y11E(Test__ZN3ccc9DD7x10y11E, "_ZN3ccc9DD7x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x10y11C1Ev();
extern void _ZN3ccc9DD7x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD7x10y11E[] = {
  NSPAIR(_ZN3ccc9DD7x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD7x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD7x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x10y113pqrEv();
extern void _ZN3ccc9DD7x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x10y113pqrEv,_ZTv0_n12_N3ccc9DD7x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x10y113pqrEv,_ZThn4_N3ccc9DD7x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x10y113pqrEv,_ZTv0_n12_N3ccc9DD7x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x10y11E[] = {
  {&(_ZTVN3ccc9DD7x10y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x10y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x10y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x10y11E[];
static VTBL_ENTRY alt_thunk_names1065[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x10y113pqrEv,_ZTv0_n12_N3ccc9DD7x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x10y113pqrEv,_ZThn4_N3ccc9DD7x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x10y11E = {  "_ZN3ccc9DD7x10y11E", // class name
  bases__ZN3ccc9DD7x10y11E, 2,
  &(vtc__ZN3ccc9DD7x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x10y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x10y11E),3, //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  CC7x10y12  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC7x10y123abcEv
  ~CC7x10y12(); // tgen
  CC7x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y12E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC7x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x10y123abcEv");}
ccc::CC7x10y12 ::~CC7x10y12(){ note_dtor("_ZN3ccc9CC7x10y12E", this);} // tgen
ccc::CC7x10y12 ::CC7x10y12(){ note_ctor("_ZN3ccc9CC7x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC7x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x10y12E, buf);
    ::ccc::CC7x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x10y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC7x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x10y12E);
    dp->::ccc::CC7x10y12::~CC7x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x10y12E(Test__ZN3ccc9CC7x10y12E, "_ZN3ccc9CC7x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x10y12C1Ev();
extern void _ZN3ccc9CC7x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC7x10y12E[] = {
  NSPAIR(_ZN3ccc9CC7x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC7x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC7x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC7x10y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x10y123abcEv,_ZTv0_n12_N3ccc9CC7x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y123abcEv,_ZThn4_N3ccc9CC7x10y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x10y123abcEv,_ZTv0_n12_N3ccc9CC7x10y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x10y12E[] = {
  {&(_ZTVN3ccc9CC7x10y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x10y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x10y12E[];
static VTBL_ENTRY alt_thunk_names1066[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x10y123abcEv,_ZTv0_n12_N3ccc9CC7x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x10y123abcEv,_ZThn4_N3ccc9CC7x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x10y12E = {  "_ZN3ccc9CC7x10y12E", // class name
  bases__ZN3ccc9CC7x10y12E, 2,
  &(vtc__ZN3ccc9CC7x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x10y12E),2, //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  DD7x10y12  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD7x10y123abcEv
  ~DD7x10y12(); // tgen
  DD7x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD7x10y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD7x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x10y123abcEv");}
ccc::DD7x10y12 ::~DD7x10y12(){ note_dtor("_ZN3ccc9DD7x10y12E", this);} // tgen
ccc::DD7x10y12 ::DD7x10y12(){ note_ctor("_ZN3ccc9DD7x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD7x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x10y12E, buf);
    ::ccc::DD7x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x10y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD7x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x10y12E);
    dp->::ccc::DD7x10y12::~DD7x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x10y12E(Test__ZN3ccc9DD7x10y12E, "_ZN3ccc9DD7x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x10y12C1Ev();
extern void _ZN3ccc9DD7x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD7x10y12E[] = {
  NSPAIR(_ZN3ccc9DD7x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD7x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD7x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y12E[];
extern void _ZN3ccc9DD7x10y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD7x10y123abcEv,_ZTv0_n16_N3ccc9DD7x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x10y123abcEv,_ZThn4_N3ccc9DD7x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD7x10y123abcEv,_ZTv0_n16_N3ccc9DD7x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x10y12E[] = {
  {&(_ZTVN3ccc9DD7x10y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x10y12E[];
static VTBL_ENTRY alt_thunk_names1067[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD7x10y123abcEv,_ZTv0_n16_N3ccc9DD7x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x10y123abcEv,_ZThn4_N3ccc9DD7x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x10y12E = {  "_ZN3ccc9DD7x10y12E", // class name
  bases__ZN3ccc9DD7x10y12E, 2,
  &(vtc__ZN3ccc9DD7x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x10y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x10y12E),3, //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  CC7x10y13  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC7x10y133efgEv
  ~CC7x10y13(); // tgen
  CC7x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y13E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC7x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x10y133efgEv");}
ccc::CC7x10y13 ::~CC7x10y13(){ note_dtor("_ZN3ccc9CC7x10y13E", this);} // tgen
ccc::CC7x10y13 ::CC7x10y13(){ note_ctor("_ZN3ccc9CC7x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC7x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x10y13E, buf);
    ::ccc::CC7x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x10y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC7x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x10y13E);
    dp->::ccc::CC7x10y13::~CC7x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x10y13E(Test__ZN3ccc9CC7x10y13E, "_ZN3ccc9CC7x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x10y13C1Ev();
extern void _ZN3ccc9CC7x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC7x10y13E[] = {
  NSPAIR(_ZN3ccc9CC7x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC7x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC7x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC7x10y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x10y13E[] = {
  {&(_ZTVN3ccc9CC7x10y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC7x10y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x10y13E[];
Class_Descriptor cd__ZN3ccc9CC7x10y13E = {  "_ZN3ccc9CC7x10y13E", // class name
  bases__ZN3ccc9CC7x10y13E, 2,
  &(vtc__ZN3ccc9CC7x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x10y13E),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  DD7x10y13  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD7x10y133efgEv
  ~DD7x10y13(); // tgen
  DD7x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD7x10y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD7x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x10y133efgEv");}
ccc::DD7x10y13 ::~DD7x10y13(){ note_dtor("_ZN3ccc9DD7x10y13E", this);} // tgen
ccc::DD7x10y13 ::DD7x10y13(){ note_ctor("_ZN3ccc9DD7x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD7x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x10y13E, buf);
    ::ccc::DD7x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x10y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD7x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x10y13E);
    dp->::ccc::DD7x10y13::~DD7x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x10y13E(Test__ZN3ccc9DD7x10y13E, "_ZN3ccc9DD7x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x10y13C1Ev();
extern void _ZN3ccc9DD7x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD7x10y13E[] = {
  NSPAIR(_ZN3ccc9DD7x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD7x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD7x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9DD7x10y133efgEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x10y13E[] = {
  {&(_ZTVN3ccc9DD7x10y13E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x10y13E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x10y13E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x10y13E[];
Class_Descriptor cd__ZN3ccc9DD7x10y13E = {  "_ZN3ccc9DD7x10y13E", // class name
  bases__ZN3ccc9DD7x10y13E, 2,
  &(vtc__ZN3ccc9DD7x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x10y13E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x10y13E),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  CC7x10y14  : virtual ::ccc::AA7 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC7x10y143pqrEv
  ~CC7x10y14(); // tgen
  CC7x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC7x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x10y143pqrEv");}
ccc::CC7x10y14 ::~CC7x10y14(){ note_dtor("_ZN3ccc9CC7x10y14E", this);} // tgen
ccc::CC7x10y14 ::CC7x10y14(){ note_ctor("_ZN3ccc9CC7x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC7x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x10y14E, buf);
    ::ccc::CC7x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x10y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC7x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x10y14E);
    dp->::ccc::CC7x10y14::~CC7x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x10y14E(Test__ZN3ccc9CC7x10y14E, "_ZN3ccc9CC7x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x10y14C1Ev();
extern void _ZN3ccc9CC7x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC7x10y14E[] = {
  NSPAIR(_ZN3ccc9CC7x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC7x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC7x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x10y14E[];
extern void _ZN3ccc9CC7x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x10y143pqrEv,_ZTv0_n16_N3ccc9CC7x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x10y143pqrEv,_ZThn4_N3ccc9CC7x10y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x10y143pqrEv,_ZTv0_n16_N3ccc9CC7x10y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x10y14E[] = {
  {&(_ZTVN3ccc9CC7x10y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x10y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x10y14E[];
static VTBL_ENTRY alt_thunk_names1068[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x10y143pqrEv,_ZTv0_n16_N3ccc9CC7x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x10y143pqrEv,_ZThn4_N3ccc9CC7x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x10y14E = {  "_ZN3ccc9CC7x10y14E", // class name
  bases__ZN3ccc9CC7x10y14E, 2,
  &(vtc__ZN3ccc9CC7x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x10y14E),2, //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  DD7x10y14  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD7x10y143pqrEv
  ~DD7x10y14(); // tgen
  DD7x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD7x10y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD7x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x10y143pqrEv");}
ccc::DD7x10y14 ::~DD7x10y14(){ note_dtor("_ZN3ccc9DD7x10y14E", this);} // tgen
ccc::DD7x10y14 ::DD7x10y14(){ note_ctor("_ZN3ccc9DD7x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD7x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x10y14E, buf);
    ::ccc::DD7x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x10y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD7x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x10y14E);
    dp->::ccc::DD7x10y14::~DD7x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x10y14E(Test__ZN3ccc9DD7x10y14E, "_ZN3ccc9DD7x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x10y14C1Ev();
extern void _ZN3ccc9DD7x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD7x10y14E[] = {
  NSPAIR(_ZN3ccc9DD7x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD7x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD7x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x10y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x10y143pqrEv,_ZTv0_n12_N3ccc9DD7x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x10y143pqrEv,_ZThn4_N3ccc9DD7x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x10y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x10y143pqrEv,_ZTv0_n12_N3ccc9DD7x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x10y14E[] = {
  {&(_ZTVN3ccc9DD7x10y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x10y14E[];
static VTBL_ENTRY alt_thunk_names1069[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x10y143pqrEv,_ZTv0_n12_N3ccc9DD7x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x10y143pqrEv,_ZThn4_N3ccc9DD7x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x10y14E = {  "_ZN3ccc9DD7x10y14E", // class name
  bases__ZN3ccc9DD7x10y14E, 2,
  &(vtc__ZN3ccc9DD7x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x10y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x10y14E),3, //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  CC7x10y15  : virtual ::ccc::AA7 , ::ccc::BB10 {
  ~CC7x10y15(); // tgen
  CC7x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x10y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC7x10y15 ::~CC7x10y15(){ note_dtor("_ZN3ccc9CC7x10y15E", this);} // tgen
ccc::CC7x10y15 ::CC7x10y15(){ note_ctor("_ZN3ccc9CC7x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC7x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x10y15E, buf);
    ::ccc::CC7x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x10y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC7x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x10y15E);
    dp->::ccc::CC7x10y15::~CC7x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x10y15E(Test__ZN3ccc9CC7x10y15E, "_ZN3ccc9CC7x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x10y15C1Ev();
extern void _ZN3ccc9CC7x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC7x10y15E[] = {
  NSPAIR(_ZN3ccc9CC7x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC7x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC7x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x10y15E[] = {
  {&(_ZTVN3ccc9CC7x10y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x10y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x10y15E[];
Class_Descriptor cd__ZN3ccc9CC7x10y15E = {  "_ZN3ccc9CC7x10y15E", // class name
  bases__ZN3ccc9CC7x10y15E, 2,
  &(vtc__ZN3ccc9CC7x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x10y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x10y15E),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  DD7x10y15  : virtual ::ccc::AA7 , virtual ::ccc::BB10 {
  ~DD7x10y15(); // tgen
  DD7x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD7x10y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD7x10y15 ::~DD7x10y15(){ note_dtor("_ZN3ccc9DD7x10y15E", this);} // tgen
ccc::DD7x10y15 ::DD7x10y15(){ note_ctor("_ZN3ccc9DD7x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD7x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x10y15E, buf);
    ::ccc::DD7x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x10y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD7x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x10y15E);
    dp->::ccc::DD7x10y15::~DD7x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x10y15E(Test__ZN3ccc9DD7x10y15E, "_ZN3ccc9DD7x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x10y15C1Ev();
extern void _ZN3ccc9DD7x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD7x10y15E[] = {
  NSPAIR(_ZN3ccc9DD7x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD7x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD7x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x10y15E[] = {
  {&(_ZTVN3ccc9DD7x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x10y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x10y15E[];
Class_Descriptor cd__ZN3ccc9DD7x10y15E = {  "_ZN3ccc9DD7x10y15E", // class name
  bases__ZN3ccc9DD7x10y15E, 2,
  &(vtc__ZN3ccc9DD7x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x10y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x10y15E),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  CC7x11y0  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y03pqrEv
  ~CC7x11y0(); // tgen
  CC7x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y0E) C1{ VBC2{ v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y03abcEv");}
void  ccc::CC7x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y03efgEv");}
void  ccc::CC7x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y03pqrEv");}
ccc::CC7x11y0 ::~CC7x11y0(){ note_dtor("_ZN3ccc8CC7x11y0E", this);} // tgen
ccc::CC7x11y0 ::CC7x11y0(){ note_ctor("_ZN3ccc8CC7x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y0E, buf);
    ::ccc::CC7x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y0E);
    dp->::ccc::CC7x11y0::~CC7x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y0E(Test__ZN3ccc8CC7x11y0E, "_ZN3ccc8CC7x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y0C1Ev();
extern void _ZN3ccc8CC7x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y0E[] = {
  NSPAIR(_ZN3ccc8CC7x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y0E[];
extern void _ZN3ccc8CC7x11y03pqrEv();
extern void _ZN3ccc8CC7x11y03efgEv();
extern void _ZN3ccc8CC7x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y03abcEv,_ZTv0_n12_N3ccc8CC7x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y03abcEv,_ZThn4_N3ccc8CC7x11y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y03pqrEv,_ZTv0_n16_N3ccc8CC7x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y03pqrEv,_ZThn4_N3ccc8CC7x11y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y03abcEv,_ZTv0_n12_N3ccc8CC7x11y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y03pqrEv,_ZTv0_n16_N3ccc8CC7x11y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y0E[] = {
  {&(_ZTVN3ccc8CC7x11y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y0E[];
static VTBL_ENTRY alt_thunk_names1070[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y03pqrEv,_ZTv0_n16_N3ccc8CC7x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y03pqrEv,_ZThn4_N3ccc8CC7x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y03abcEv,_ZTv0_n12_N3ccc8CC7x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y03abcEv,_ZThn4_N3ccc8CC7x11y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y0E = {  "_ZN3ccc8CC7x11y0E", // class name
  bases__ZN3ccc8CC7x11y0E, 2,
  &(vtc__ZN3ccc8CC7x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y0E),2, //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  DD7x11y0  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD7x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD7x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x11y03pqrEv
  ~DD7x11y0(); // tgen
  DD7x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y0E) C1{ VBC2{ v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y03abcEv");}
void  ccc::DD7x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y03efgEv");}
void  ccc::DD7x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y03pqrEv");}
ccc::DD7x11y0 ::~DD7x11y0(){ note_dtor("_ZN3ccc8DD7x11y0E", this);} // tgen
ccc::DD7x11y0 ::DD7x11y0(){ note_ctor("_ZN3ccc8DD7x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y0E, buf);
    ::ccc::DD7x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y0E);
    dp->::ccc::DD7x11y0::~DD7x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y0E(Test__ZN3ccc8DD7x11y0E, "_ZN3ccc8DD7x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y0C1Ev();
extern void _ZN3ccc8DD7x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y0E[] = {
  NSPAIR(_ZN3ccc8DD7x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y0E[];
extern void _ZN3ccc8DD7x11y03abcEv();
extern void _ZN3ccc8DD7x11y03pqrEv();
extern void _ZN3ccc8DD7x11y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y03pqrEv,_ZTv0_n12_N3ccc8DD7x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y03pqrEv,_ZThn4_N3ccc8DD7x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y03efgEv,_ZTv0_n16_N3ccc8DD7x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y03efgEv,_ZThn4_N3ccc8DD7x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y03pqrEv,_ZTv0_n12_N3ccc8DD7x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y03efgEv,_ZTv0_n16_N3ccc8DD7x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y0E[] = {
  {&(_ZTVN3ccc8DD7x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y0E[];
static VTBL_ENTRY alt_thunk_names1071[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y03efgEv,_ZTv0_n16_N3ccc8DD7x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y03efgEv,_ZThn4_N3ccc8DD7x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y03pqrEv,_ZTv0_n12_N3ccc8DD7x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y03pqrEv,_ZThn4_N3ccc8DD7x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y0E = {  "_ZN3ccc8DD7x11y0E", // class name
  bases__ZN3ccc8DD7x11y0E, 2,
  &(vtc__ZN3ccc8DD7x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y0E),3, //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  CC7x11y1  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x11y13efgEv
  ~CC7x11y1(); // tgen
  CC7x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y1E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y13abcEv");}
void  ccc::CC7x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y13pqrEv");}
void  ccc::CC7x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y13efgEv");}
ccc::CC7x11y1 ::~CC7x11y1(){ note_dtor("_ZN3ccc8CC7x11y1E", this);} // tgen
ccc::CC7x11y1 ::CC7x11y1(){ note_ctor("_ZN3ccc8CC7x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y1E, buf);
    ::ccc::CC7x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y1E);
    dp->::ccc::CC7x11y1::~CC7x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y1E(Test__ZN3ccc8CC7x11y1E, "_ZN3ccc8CC7x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y1C1Ev();
extern void _ZN3ccc8CC7x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y1E[] = {
  NSPAIR(_ZN3ccc8CC7x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y1E[];
extern void _ZN3ccc8CC7x11y13pqrEv();
extern void _ZN3ccc8CC7x11y13efgEv();
extern void _ZN3ccc8CC7x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y13abcEv,_ZTv0_n12_N3ccc8CC7x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y13abcEv,_ZThn4_N3ccc8CC7x11y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y13pqrEv,_ZTv0_n16_N3ccc8CC7x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y13pqrEv,_ZThn4_N3ccc8CC7x11y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y13abcEv,_ZTv0_n12_N3ccc8CC7x11y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y13pqrEv,_ZTv0_n16_N3ccc8CC7x11y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y1E[] = {
  {&(_ZTVN3ccc8CC7x11y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y1E[];
static VTBL_ENTRY alt_thunk_names1072[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y13pqrEv,_ZTv0_n16_N3ccc8CC7x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y13pqrEv,_ZThn4_N3ccc8CC7x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y13abcEv,_ZTv0_n12_N3ccc8CC7x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y13abcEv,_ZThn4_N3ccc8CC7x11y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y1E = {  "_ZN3ccc8CC7x11y1E", // class name
  bases__ZN3ccc8CC7x11y1E, 2,
  &(vtc__ZN3ccc8CC7x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y1E),2, //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  DD7x11y1  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD7x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x11y13efgEv
  ~DD7x11y1(); // tgen
  DD7x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y1E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y13abcEv");}
void  ccc::DD7x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y13pqrEv");}
void  ccc::DD7x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y13efgEv");}
ccc::DD7x11y1 ::~DD7x11y1(){ note_dtor("_ZN3ccc8DD7x11y1E", this);} // tgen
ccc::DD7x11y1 ::DD7x11y1(){ note_ctor("_ZN3ccc8DD7x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y1E, buf);
    ::ccc::DD7x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y1E);
    dp->::ccc::DD7x11y1::~DD7x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y1E(Test__ZN3ccc8DD7x11y1E, "_ZN3ccc8DD7x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y1C1Ev();
extern void _ZN3ccc8DD7x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y1E[] = {
  NSPAIR(_ZN3ccc8DD7x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y1E[];
extern void _ZN3ccc8DD7x11y13abcEv();
extern void _ZN3ccc8DD7x11y13pqrEv();
extern void _ZN3ccc8DD7x11y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y13pqrEv,_ZTv0_n12_N3ccc8DD7x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y13pqrEv,_ZThn4_N3ccc8DD7x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y13efgEv,_ZTv0_n16_N3ccc8DD7x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y13efgEv,_ZThn4_N3ccc8DD7x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y13pqrEv,_ZTv0_n12_N3ccc8DD7x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y13efgEv,_ZTv0_n16_N3ccc8DD7x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y1E[] = {
  {&(_ZTVN3ccc8DD7x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y1E[];
static VTBL_ENTRY alt_thunk_names1073[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y13efgEv,_ZTv0_n16_N3ccc8DD7x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y13efgEv,_ZThn4_N3ccc8DD7x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y13pqrEv,_ZTv0_n12_N3ccc8DD7x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y13pqrEv,_ZThn4_N3ccc8DD7x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y1E = {  "_ZN3ccc8DD7x11y1E", // class name
  bases__ZN3ccc8DD7x11y1E, 2,
  &(vtc__ZN3ccc8DD7x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y1E),3, //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  CC7x11y2  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y23pqrEv
  ~CC7x11y2(); // tgen
  CC7x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y2E) C1{ VBC2{ v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y23efgEv");}
void  ccc::CC7x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y23abcEv");}
void  ccc::CC7x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y23pqrEv");}
ccc::CC7x11y2 ::~CC7x11y2(){ note_dtor("_ZN3ccc8CC7x11y2E", this);} // tgen
ccc::CC7x11y2 ::CC7x11y2(){ note_ctor("_ZN3ccc8CC7x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y2E, buf);
    ::ccc::CC7x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y2E);
    dp->::ccc::CC7x11y2::~CC7x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y2E(Test__ZN3ccc8CC7x11y2E, "_ZN3ccc8CC7x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y2C1Ev();
extern void _ZN3ccc8CC7x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y2E[] = {
  NSPAIR(_ZN3ccc8CC7x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y2E[];
extern void _ZN3ccc8CC7x11y23pqrEv();
extern void _ZN3ccc8CC7x11y23efgEv();
extern void _ZN3ccc8CC7x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y23abcEv,_ZTv0_n12_N3ccc8CC7x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y23abcEv,_ZThn4_N3ccc8CC7x11y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y23pqrEv,_ZTv0_n16_N3ccc8CC7x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y23pqrEv,_ZThn4_N3ccc8CC7x11y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y23abcEv,_ZTv0_n12_N3ccc8CC7x11y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y23pqrEv,_ZTv0_n16_N3ccc8CC7x11y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y2E[] = {
  {&(_ZTVN3ccc8CC7x11y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y2E[];
static VTBL_ENTRY alt_thunk_names1074[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y23pqrEv,_ZTv0_n16_N3ccc8CC7x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y23pqrEv,_ZThn4_N3ccc8CC7x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y23abcEv,_ZTv0_n12_N3ccc8CC7x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y23abcEv,_ZThn4_N3ccc8CC7x11y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y2E = {  "_ZN3ccc8CC7x11y2E", // class name
  bases__ZN3ccc8CC7x11y2E, 2,
  &(vtc__ZN3ccc8CC7x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y2E),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  DD7x11y2  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD7x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD7x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x11y23pqrEv
  ~DD7x11y2(); // tgen
  DD7x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y2E) C1{ VBC2{ v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y23efgEv");}
void  ccc::DD7x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y23abcEv");}
void  ccc::DD7x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y23pqrEv");}
ccc::DD7x11y2 ::~DD7x11y2(){ note_dtor("_ZN3ccc8DD7x11y2E", this);} // tgen
ccc::DD7x11y2 ::DD7x11y2(){ note_ctor("_ZN3ccc8DD7x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y2E, buf);
    ::ccc::DD7x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y2E);
    dp->::ccc::DD7x11y2::~DD7x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y2E(Test__ZN3ccc8DD7x11y2E, "_ZN3ccc8DD7x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y2C1Ev();
extern void _ZN3ccc8DD7x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y2E[] = {
  NSPAIR(_ZN3ccc8DD7x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y2E[];
extern void _ZN3ccc8DD7x11y23abcEv();
extern void _ZN3ccc8DD7x11y23pqrEv();
extern void _ZN3ccc8DD7x11y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y23pqrEv,_ZTv0_n12_N3ccc8DD7x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y23pqrEv,_ZThn4_N3ccc8DD7x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y23efgEv,_ZTv0_n16_N3ccc8DD7x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y23efgEv,_ZThn4_N3ccc8DD7x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y23pqrEv,_ZTv0_n12_N3ccc8DD7x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y23efgEv,_ZTv0_n16_N3ccc8DD7x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y2E[] = {
  {&(_ZTVN3ccc8DD7x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y2E[];
static VTBL_ENTRY alt_thunk_names1075[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y23efgEv,_ZTv0_n16_N3ccc8DD7x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y23efgEv,_ZThn4_N3ccc8DD7x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y23pqrEv,_ZTv0_n12_N3ccc8DD7x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y23pqrEv,_ZThn4_N3ccc8DD7x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y2E = {  "_ZN3ccc8DD7x11y2E", // class name
  bases__ZN3ccc8DD7x11y2E, 2,
  &(vtc__ZN3ccc8DD7x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y2E),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  CC7x11y3  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x11y33abcEv
  ~CC7x11y3(); // tgen
  CC7x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y3E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y33efgEv");}
void  ccc::CC7x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y33pqrEv");}
void  ccc::CC7x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y33abcEv");}
ccc::CC7x11y3 ::~CC7x11y3(){ note_dtor("_ZN3ccc8CC7x11y3E", this);} // tgen
ccc::CC7x11y3 ::CC7x11y3(){ note_ctor("_ZN3ccc8CC7x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y3E, buf);
    ::ccc::CC7x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y3E);
    dp->::ccc::CC7x11y3::~CC7x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y3E(Test__ZN3ccc8CC7x11y3E, "_ZN3ccc8CC7x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y3C1Ev();
extern void _ZN3ccc8CC7x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y3E[] = {
  NSPAIR(_ZN3ccc8CC7x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y3E[];
extern void _ZN3ccc8CC7x11y33pqrEv();
extern void _ZN3ccc8CC7x11y33efgEv();
extern void _ZN3ccc8CC7x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y33abcEv,_ZTv0_n12_N3ccc8CC7x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y33abcEv,_ZThn4_N3ccc8CC7x11y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y33pqrEv,_ZTv0_n16_N3ccc8CC7x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y33pqrEv,_ZThn4_N3ccc8CC7x11y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y33abcEv,_ZTv0_n12_N3ccc8CC7x11y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y33pqrEv,_ZTv0_n16_N3ccc8CC7x11y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y3E[] = {
  {&(_ZTVN3ccc8CC7x11y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y3E[];
static VTBL_ENTRY alt_thunk_names1076[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y33pqrEv,_ZTv0_n16_N3ccc8CC7x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y33pqrEv,_ZThn4_N3ccc8CC7x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y33abcEv,_ZTv0_n12_N3ccc8CC7x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y33abcEv,_ZThn4_N3ccc8CC7x11y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y3E = {  "_ZN3ccc8CC7x11y3E", // class name
  bases__ZN3ccc8CC7x11y3E, 2,
  &(vtc__ZN3ccc8CC7x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y3E),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  DD7x11y3  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD7x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x11y33abcEv
  ~DD7x11y3(); // tgen
  DD7x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y3E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y33efgEv");}
void  ccc::DD7x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y33pqrEv");}
void  ccc::DD7x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y33abcEv");}
ccc::DD7x11y3 ::~DD7x11y3(){ note_dtor("_ZN3ccc8DD7x11y3E", this);} // tgen
ccc::DD7x11y3 ::DD7x11y3(){ note_ctor("_ZN3ccc8DD7x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y3E, buf);
    ::ccc::DD7x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y3E);
    dp->::ccc::DD7x11y3::~DD7x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y3E(Test__ZN3ccc8DD7x11y3E, "_ZN3ccc8DD7x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y3C1Ev();
extern void _ZN3ccc8DD7x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y3E[] = {
  NSPAIR(_ZN3ccc8DD7x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y3E[];
extern void _ZN3ccc8DD7x11y33abcEv();
extern void _ZN3ccc8DD7x11y33pqrEv();
extern void _ZN3ccc8DD7x11y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y33pqrEv,_ZTv0_n12_N3ccc8DD7x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y33pqrEv,_ZThn4_N3ccc8DD7x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y33efgEv,_ZTv0_n16_N3ccc8DD7x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y33efgEv,_ZThn4_N3ccc8DD7x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y33pqrEv,_ZTv0_n12_N3ccc8DD7x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y33efgEv,_ZTv0_n16_N3ccc8DD7x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y3E[] = {
  {&(_ZTVN3ccc8DD7x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y3E[];
static VTBL_ENTRY alt_thunk_names1077[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y33efgEv,_ZTv0_n16_N3ccc8DD7x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y33efgEv,_ZThn4_N3ccc8DD7x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y33pqrEv,_ZTv0_n12_N3ccc8DD7x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y33pqrEv,_ZThn4_N3ccc8DD7x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y3E = {  "_ZN3ccc8DD7x11y3E", // class name
  bases__ZN3ccc8DD7x11y3E, 2,
  &(vtc__ZN3ccc8DD7x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y3E),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  CC7x11y4  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC7x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x11y43efgEv
  ~CC7x11y4(); // tgen
  CC7x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y4E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y43pqrEv");}
void  ccc::CC7x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y43abcEv");}
void  ccc::CC7x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y43efgEv");}
ccc::CC7x11y4 ::~CC7x11y4(){ note_dtor("_ZN3ccc8CC7x11y4E", this);} // tgen
ccc::CC7x11y4 ::CC7x11y4(){ note_ctor("_ZN3ccc8CC7x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y4E, buf);
    ::ccc::CC7x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y4E);
    dp->::ccc::CC7x11y4::~CC7x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y4E(Test__ZN3ccc8CC7x11y4E, "_ZN3ccc8CC7x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y4C1Ev();
extern void _ZN3ccc8CC7x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y4E[] = {
  NSPAIR(_ZN3ccc8CC7x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y4E[];
extern void _ZN3ccc8CC7x11y43pqrEv();
extern void _ZN3ccc8CC7x11y43efgEv();
extern void _ZN3ccc8CC7x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y43abcEv,_ZTv0_n12_N3ccc8CC7x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y43abcEv,_ZThn4_N3ccc8CC7x11y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y43pqrEv,_ZTv0_n16_N3ccc8CC7x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y43pqrEv,_ZThn4_N3ccc8CC7x11y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y43abcEv,_ZTv0_n12_N3ccc8CC7x11y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y43pqrEv,_ZTv0_n16_N3ccc8CC7x11y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y4E[] = {
  {&(_ZTVN3ccc8CC7x11y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y4E[];
static VTBL_ENTRY alt_thunk_names1078[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y43pqrEv,_ZTv0_n16_N3ccc8CC7x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y43pqrEv,_ZThn4_N3ccc8CC7x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y43abcEv,_ZTv0_n12_N3ccc8CC7x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y43abcEv,_ZThn4_N3ccc8CC7x11y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y4E = {  "_ZN3ccc8CC7x11y4E", // class name
  bases__ZN3ccc8CC7x11y4E, 2,
  &(vtc__ZN3ccc8CC7x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y4E),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  DD7x11y4  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD7x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD7x11y43efgEv
  ~DD7x11y4(); // tgen
  DD7x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y4E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y43pqrEv");}
void  ccc::DD7x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y43abcEv");}
void  ccc::DD7x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y43efgEv");}
ccc::DD7x11y4 ::~DD7x11y4(){ note_dtor("_ZN3ccc8DD7x11y4E", this);} // tgen
ccc::DD7x11y4 ::DD7x11y4(){ note_ctor("_ZN3ccc8DD7x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y4E, buf);
    ::ccc::DD7x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y4E);
    dp->::ccc::DD7x11y4::~DD7x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y4E(Test__ZN3ccc8DD7x11y4E, "_ZN3ccc8DD7x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y4C1Ev();
extern void _ZN3ccc8DD7x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y4E[] = {
  NSPAIR(_ZN3ccc8DD7x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y4E[];
extern void _ZN3ccc8DD7x11y43abcEv();
extern void _ZN3ccc8DD7x11y43pqrEv();
extern void _ZN3ccc8DD7x11y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y43pqrEv,_ZTv0_n12_N3ccc8DD7x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y43pqrEv,_ZThn4_N3ccc8DD7x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y43efgEv,_ZTv0_n16_N3ccc8DD7x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y43efgEv,_ZThn4_N3ccc8DD7x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y43pqrEv,_ZTv0_n12_N3ccc8DD7x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y43efgEv,_ZTv0_n16_N3ccc8DD7x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y4E[] = {
  {&(_ZTVN3ccc8DD7x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y4E[];
static VTBL_ENTRY alt_thunk_names1079[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y43efgEv,_ZTv0_n16_N3ccc8DD7x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y43efgEv,_ZThn4_N3ccc8DD7x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y43pqrEv,_ZTv0_n12_N3ccc8DD7x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y43pqrEv,_ZThn4_N3ccc8DD7x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y4E = {  "_ZN3ccc8DD7x11y4E", // class name
  bases__ZN3ccc8DD7x11y4E, 2,
  &(vtc__ZN3ccc8DD7x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y4E),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  CC7x11y5  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC7x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x11y53abcEv
  ~CC7x11y5(); // tgen
  CC7x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y5E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y53pqrEv");}
void  ccc::CC7x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y53efgEv");}
void  ccc::CC7x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y53abcEv");}
ccc::CC7x11y5 ::~CC7x11y5(){ note_dtor("_ZN3ccc8CC7x11y5E", this);} // tgen
ccc::CC7x11y5 ::CC7x11y5(){ note_ctor("_ZN3ccc8CC7x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y5E, buf);
    ::ccc::CC7x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y5E);
    dp->::ccc::CC7x11y5::~CC7x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y5E(Test__ZN3ccc8CC7x11y5E, "_ZN3ccc8CC7x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y5C1Ev();
extern void _ZN3ccc8CC7x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y5E[] = {
  NSPAIR(_ZN3ccc8CC7x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y5E[];
extern void _ZN3ccc8CC7x11y53pqrEv();
extern void _ZN3ccc8CC7x11y53efgEv();
extern void _ZN3ccc8CC7x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y53abcEv,_ZTv0_n12_N3ccc8CC7x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y53abcEv,_ZThn4_N3ccc8CC7x11y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y53pqrEv,_ZTv0_n16_N3ccc8CC7x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y53pqrEv,_ZThn4_N3ccc8CC7x11y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y53abcEv,_ZTv0_n12_N3ccc8CC7x11y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y53pqrEv,_ZTv0_n16_N3ccc8CC7x11y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y5E[] = {
  {&(_ZTVN3ccc8CC7x11y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y5E[];
static VTBL_ENTRY alt_thunk_names1080[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y53pqrEv,_ZTv0_n16_N3ccc8CC7x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y53pqrEv,_ZThn4_N3ccc8CC7x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y53abcEv,_ZTv0_n12_N3ccc8CC7x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y53abcEv,_ZThn4_N3ccc8CC7x11y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y5E = {  "_ZN3ccc8CC7x11y5E", // class name
  bases__ZN3ccc8CC7x11y5E, 2,
  &(vtc__ZN3ccc8CC7x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y5E),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  DD7x11y5  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD7x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD7x11y53abcEv
  ~DD7x11y5(); // tgen
  DD7x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y5E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y53pqrEv");}
void  ccc::DD7x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y53efgEv");}
void  ccc::DD7x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y53abcEv");}
ccc::DD7x11y5 ::~DD7x11y5(){ note_dtor("_ZN3ccc8DD7x11y5E", this);} // tgen
ccc::DD7x11y5 ::DD7x11y5(){ note_ctor("_ZN3ccc8DD7x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y5E, buf);
    ::ccc::DD7x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y5E);
    dp->::ccc::DD7x11y5::~DD7x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y5E(Test__ZN3ccc8DD7x11y5E, "_ZN3ccc8DD7x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y5C1Ev();
extern void _ZN3ccc8DD7x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y5E[] = {
  NSPAIR(_ZN3ccc8DD7x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y5E[];
extern void _ZN3ccc8DD7x11y53abcEv();
extern void _ZN3ccc8DD7x11y53pqrEv();
extern void _ZN3ccc8DD7x11y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y53pqrEv,_ZTv0_n12_N3ccc8DD7x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y53pqrEv,_ZThn4_N3ccc8DD7x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y53efgEv,_ZTv0_n16_N3ccc8DD7x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y53efgEv,_ZThn4_N3ccc8DD7x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y53pqrEv,_ZTv0_n12_N3ccc8DD7x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y53efgEv,_ZTv0_n16_N3ccc8DD7x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y5E[] = {
  {&(_ZTVN3ccc8DD7x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y5E[];
static VTBL_ENTRY alt_thunk_names1081[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y53efgEv,_ZTv0_n16_N3ccc8DD7x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y53efgEv,_ZThn4_N3ccc8DD7x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y53pqrEv,_ZTv0_n12_N3ccc8DD7x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y53pqrEv,_ZThn4_N3ccc8DD7x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y5E = {  "_ZN3ccc8DD7x11y5E", // class name
  bases__ZN3ccc8DD7x11y5E, 2,
  &(vtc__ZN3ccc8DD7x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y5E),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  CC7x11y6  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x11y63efgEv
  ~CC7x11y6(); // tgen
  CC7x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y6E) C1{ VBC2{ v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y63abcEv");}
void  ccc::CC7x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y63efgEv");}
ccc::CC7x11y6 ::~CC7x11y6(){ note_dtor("_ZN3ccc8CC7x11y6E", this);} // tgen
ccc::CC7x11y6 ::CC7x11y6(){ note_ctor("_ZN3ccc8CC7x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y6E, buf);
    ::ccc::CC7x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y6E);
    dp->::ccc::CC7x11y6::~CC7x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y6E(Test__ZN3ccc8CC7x11y6E, "_ZN3ccc8CC7x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y6C1Ev();
extern void _ZN3ccc8CC7x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y6E[] = {
  NSPAIR(_ZN3ccc8CC7x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC7x11y63efgEv();
extern void _ZN3ccc8CC7x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y63abcEv,_ZTv0_n12_N3ccc8CC7x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y63abcEv,_ZThn4_N3ccc8CC7x11y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y63abcEv,_ZTv0_n12_N3ccc8CC7x11y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y6E[] = {
  {&(_ZTVN3ccc8CC7x11y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y6E[];
static VTBL_ENTRY alt_thunk_names1082[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y63abcEv,_ZTv0_n12_N3ccc8CC7x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y63abcEv,_ZThn4_N3ccc8CC7x11y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y6E = {  "_ZN3ccc8CC7x11y6E", // class name
  bases__ZN3ccc8CC7x11y6E, 2,
  &(vtc__ZN3ccc8CC7x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y6E),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  DD7x11y6  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD7x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD7x11y63efgEv
  ~DD7x11y6(); // tgen
  DD7x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y6E) C1{ VBC2{ v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y63abcEv");}
void  ccc::DD7x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y63efgEv");}
ccc::DD7x11y6 ::~DD7x11y6(){ note_dtor("_ZN3ccc8DD7x11y6E", this);} // tgen
ccc::DD7x11y6 ::DD7x11y6(){ note_ctor("_ZN3ccc8DD7x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y6E, buf);
    ::ccc::DD7x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y6E);
    dp->::ccc::DD7x11y6::~DD7x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y6E(Test__ZN3ccc8DD7x11y6E, "_ZN3ccc8DD7x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y6C1Ev();
extern void _ZN3ccc8DD7x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y6E[] = {
  NSPAIR(_ZN3ccc8DD7x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y6E[];
extern void _ZN3ccc8DD7x11y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x11y63efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y63efgEv,_ZTv0_n16_N3ccc8DD7x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y63efgEv,_ZThn4_N3ccc8DD7x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y63efgEv,_ZTv0_n16_N3ccc8DD7x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y6E[] = {
  {&(_ZTVN3ccc8DD7x11y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y6E[];
static VTBL_ENTRY alt_thunk_names1083[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y63efgEv,_ZTv0_n16_N3ccc8DD7x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y63efgEv,_ZThn4_N3ccc8DD7x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y6E = {  "_ZN3ccc8DD7x11y6E", // class name
  bases__ZN3ccc8DD7x11y6E, 2,
  &(vtc__ZN3ccc8DD7x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y6E),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  CC7x11y7  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC7x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y73pqrEv
  ~CC7x11y7(); // tgen
  CC7x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y7E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y73abcEv");}
void  ccc::CC7x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y73pqrEv");}
ccc::CC7x11y7 ::~CC7x11y7(){ note_dtor("_ZN3ccc8CC7x11y7E", this);} // tgen
ccc::CC7x11y7 ::CC7x11y7(){ note_ctor("_ZN3ccc8CC7x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y7E, buf);
    ::ccc::CC7x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y7E);
    dp->::ccc::CC7x11y7::~CC7x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y7E(Test__ZN3ccc8CC7x11y7E, "_ZN3ccc8CC7x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y7C1Ev();
extern void _ZN3ccc8CC7x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y7E[] = {
  NSPAIR(_ZN3ccc8CC7x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y7E[];
extern void _ZN3ccc8CC7x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC7x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y73abcEv,_ZTv0_n12_N3ccc8CC7x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y73abcEv,_ZThn4_N3ccc8CC7x11y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y73pqrEv,_ZTv0_n16_N3ccc8CC7x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y73pqrEv,_ZThn4_N3ccc8CC7x11y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y73abcEv,_ZTv0_n12_N3ccc8CC7x11y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y73pqrEv,_ZTv0_n16_N3ccc8CC7x11y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y7E[] = {
  {&(_ZTVN3ccc8CC7x11y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y7E[];
static VTBL_ENTRY alt_thunk_names1084[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y73pqrEv,_ZTv0_n16_N3ccc8CC7x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y73pqrEv,_ZThn4_N3ccc8CC7x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y73abcEv,_ZTv0_n12_N3ccc8CC7x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y73abcEv,_ZThn4_N3ccc8CC7x11y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y7E = {  "_ZN3ccc8CC7x11y7E", // class name
  bases__ZN3ccc8CC7x11y7E, 2,
  &(vtc__ZN3ccc8CC7x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y7E),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  DD7x11y7  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD7x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x11y73pqrEv
  ~DD7x11y7(); // tgen
  DD7x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y7E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y73abcEv");}
void  ccc::DD7x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y73pqrEv");}
ccc::DD7x11y7 ::~DD7x11y7(){ note_dtor("_ZN3ccc8DD7x11y7E", this);} // tgen
ccc::DD7x11y7 ::DD7x11y7(){ note_ctor("_ZN3ccc8DD7x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y7E, buf);
    ::ccc::DD7x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y7E);
    dp->::ccc::DD7x11y7::~DD7x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y7E(Test__ZN3ccc8DD7x11y7E, "_ZN3ccc8DD7x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y7C1Ev();
extern void _ZN3ccc8DD7x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y7E[] = {
  NSPAIR(_ZN3ccc8DD7x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y7E[];
extern void _ZN3ccc8DD7x11y73abcEv();
extern void _ZN3ccc8DD7x11y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y73pqrEv,_ZTv0_n12_N3ccc8DD7x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y73pqrEv,_ZThn4_N3ccc8DD7x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y73pqrEv,_ZTv0_n12_N3ccc8DD7x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y7E[] = {
  {&(_ZTVN3ccc8DD7x11y7E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x11y7E[6]),  6,14},
  {&(_ZTVN3ccc8DD7x11y7E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y7E[];
static VTBL_ENTRY alt_thunk_names1085[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y73pqrEv,_ZTv0_n12_N3ccc8DD7x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y73pqrEv,_ZThn4_N3ccc8DD7x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y7E = {  "_ZN3ccc8DD7x11y7E", // class name
  bases__ZN3ccc8DD7x11y7E, 2,
  &(vtc__ZN3ccc8DD7x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y7E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y7E),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  CC7x11y8  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x11y83abcEv
  ~CC7x11y8(); // tgen
  CC7x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y8E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y83efgEv");}
void  ccc::CC7x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x11y83abcEv");}
ccc::CC7x11y8 ::~CC7x11y8(){ note_dtor("_ZN3ccc8CC7x11y8E", this);} // tgen
ccc::CC7x11y8 ::CC7x11y8(){ note_ctor("_ZN3ccc8CC7x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y8E, buf);
    ::ccc::CC7x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y8E);
    dp->::ccc::CC7x11y8::~CC7x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y8E(Test__ZN3ccc8CC7x11y8E, "_ZN3ccc8CC7x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y8C1Ev();
extern void _ZN3ccc8CC7x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y8E[] = {
  NSPAIR(_ZN3ccc8CC7x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC7x11y83efgEv();
extern void _ZN3ccc8CC7x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x11y83abcEv,_ZTv0_n12_N3ccc8CC7x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y83abcEv,_ZThn4_N3ccc8CC7x11y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x11y83abcEv,_ZTv0_n12_N3ccc8CC7x11y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y8E[] = {
  {&(_ZTVN3ccc8CC7x11y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x11y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y8E[];
static VTBL_ENTRY alt_thunk_names1086[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x11y83abcEv,_ZTv0_n12_N3ccc8CC7x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y83abcEv,_ZThn4_N3ccc8CC7x11y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y8E = {  "_ZN3ccc8CC7x11y8E", // class name
  bases__ZN3ccc8CC7x11y8E, 2,
  &(vtc__ZN3ccc8CC7x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y8E),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  DD7x11y8  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD7x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD7x11y83abcEv
  ~DD7x11y8(); // tgen
  DD7x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y8E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y83efgEv");}
void  ccc::DD7x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x11y83abcEv");}
ccc::DD7x11y8 ::~DD7x11y8(){ note_dtor("_ZN3ccc8DD7x11y8E", this);} // tgen
ccc::DD7x11y8 ::DD7x11y8(){ note_ctor("_ZN3ccc8DD7x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y8E, buf);
    ::ccc::DD7x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y8E);
    dp->::ccc::DD7x11y8::~DD7x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y8E(Test__ZN3ccc8DD7x11y8E, "_ZN3ccc8DD7x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y8C1Ev();
extern void _ZN3ccc8DD7x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y8E[] = {
  NSPAIR(_ZN3ccc8DD7x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y8E[];
extern void _ZN3ccc8DD7x11y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x11y83efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y83efgEv,_ZTv0_n16_N3ccc8DD7x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y83efgEv,_ZThn4_N3ccc8DD7x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y83efgEv,_ZTv0_n16_N3ccc8DD7x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y8E[] = {
  {&(_ZTVN3ccc8DD7x11y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y8E[];
static VTBL_ENTRY alt_thunk_names1087[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y83efgEv,_ZTv0_n16_N3ccc8DD7x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y83efgEv,_ZThn4_N3ccc8DD7x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y8E = {  "_ZN3ccc8DD7x11y8E", // class name
  bases__ZN3ccc8DD7x11y8E, 2,
  &(vtc__ZN3ccc8DD7x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y8E),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  CC7x11y9  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC7x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x11y93pqrEv
  ~CC7x11y9(); // tgen
  CC7x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x11y9E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x11y93efgEv");}
void  ccc::CC7x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x11y93pqrEv");}
ccc::CC7x11y9 ::~CC7x11y9(){ note_dtor("_ZN3ccc8CC7x11y9E", this);} // tgen
ccc::CC7x11y9 ::CC7x11y9(){ note_ctor("_ZN3ccc8CC7x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC7x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x11y9E, buf);
    ::ccc::CC7x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x11y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC7x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x11y9E);
    dp->::ccc::CC7x11y9::~CC7x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x11y9E(Test__ZN3ccc8CC7x11y9E, "_ZN3ccc8CC7x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x11y9C1Ev();
extern void _ZN3ccc8CC7x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC7x11y9E[] = {
  NSPAIR(_ZN3ccc8CC7x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC7x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC7x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x11y9E[];
extern void _ZN3ccc8CC7x11y93pqrEv();
extern void _ZN3ccc8CC7x11y93efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x11y93pqrEv,_ZTv0_n16_N3ccc8CC7x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x11y93pqrEv,_ZThn4_N3ccc8CC7x11y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x11y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x11y93pqrEv,_ZTv0_n16_N3ccc8CC7x11y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x11y9E[] = {
  {&(_ZTVN3ccc8CC7x11y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x11y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x11y9E[];
static VTBL_ENTRY alt_thunk_names1088[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x11y93pqrEv,_ZTv0_n16_N3ccc8CC7x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x11y93pqrEv,_ZThn4_N3ccc8CC7x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x11y9E = {  "_ZN3ccc8CC7x11y9E", // class name
  bases__ZN3ccc8CC7x11y9E, 2,
  &(vtc__ZN3ccc8CC7x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x11y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x11y9E),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  DD7x11y9  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD7x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x11y93pqrEv
  ~DD7x11y9(); // tgen
  DD7x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD7x11y9E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x11y93efgEv");}
void  ccc::DD7x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x11y93pqrEv");}
ccc::DD7x11y9 ::~DD7x11y9(){ note_dtor("_ZN3ccc8DD7x11y9E", this);} // tgen
ccc::DD7x11y9 ::DD7x11y9(){ note_ctor("_ZN3ccc8DD7x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD7x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x11y9E, buf);
    ::ccc::DD7x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x11y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD7x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x11y9E);
    dp->::ccc::DD7x11y9::~DD7x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x11y9E(Test__ZN3ccc8DD7x11y9E, "_ZN3ccc8DD7x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x11y9C1Ev();
extern void _ZN3ccc8DD7x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD7x11y9E[] = {
  NSPAIR(_ZN3ccc8DD7x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD7x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD7x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x11y93pqrEv();
extern void _ZN3ccc8DD7x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x11y93pqrEv,_ZTv0_n12_N3ccc8DD7x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y93pqrEv,_ZThn4_N3ccc8DD7x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD7x11y93efgEv,_ZTv0_n16_N3ccc8DD7x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x11y93efgEv,_ZThn4_N3ccc8DD7x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x11y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x11y93pqrEv,_ZTv0_n12_N3ccc8DD7x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD7x11y93efgEv,_ZTv0_n16_N3ccc8DD7x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x11y9E[] = {
  {&(_ZTVN3ccc8DD7x11y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD7x11y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x11y9E[];
static VTBL_ENTRY alt_thunk_names1089[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD7x11y93efgEv,_ZTv0_n16_N3ccc8DD7x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y93efgEv,_ZThn4_N3ccc8DD7x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x11y93pqrEv,_ZTv0_n12_N3ccc8DD7x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x11y93pqrEv,_ZThn4_N3ccc8DD7x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x11y9E = {  "_ZN3ccc8DD7x11y9E", // class name
  bases__ZN3ccc8DD7x11y9E, 2,
  &(vtc__ZN3ccc8DD7x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x11y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x11y9E),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  CC7x11y10  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC7x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x11y103abcEv
  ~CC7x11y10(); // tgen
  CC7x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y10E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x11y103pqrEv");}
void  ccc::CC7x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x11y103abcEv");}
ccc::CC7x11y10 ::~CC7x11y10(){ note_dtor("_ZN3ccc9CC7x11y10E", this);} // tgen
ccc::CC7x11y10 ::CC7x11y10(){ note_ctor("_ZN3ccc9CC7x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC7x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x11y10E, buf);
    ::ccc::CC7x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x11y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC7x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x11y10E);
    dp->::ccc::CC7x11y10::~CC7x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x11y10E(Test__ZN3ccc9CC7x11y10E, "_ZN3ccc9CC7x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x11y10C1Ev();
extern void _ZN3ccc9CC7x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC7x11y10E[] = {
  NSPAIR(_ZN3ccc9CC7x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC7x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC7x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x11y10E[];
extern void _ZN3ccc9CC7x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC7x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x11y103abcEv,_ZTv0_n12_N3ccc9CC7x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y103abcEv,_ZThn4_N3ccc9CC7x11y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x11y103pqrEv,_ZTv0_n16_N3ccc9CC7x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y103pqrEv,_ZThn4_N3ccc9CC7x11y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x11y103abcEv,_ZTv0_n12_N3ccc9CC7x11y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x11y103pqrEv,_ZTv0_n16_N3ccc9CC7x11y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x11y10E[] = {
  {&(_ZTVN3ccc9CC7x11y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC7x11y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x11y10E[];
static VTBL_ENTRY alt_thunk_names1090[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x11y103pqrEv,_ZTv0_n16_N3ccc9CC7x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x11y103pqrEv,_ZThn4_N3ccc9CC7x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x11y103abcEv,_ZTv0_n12_N3ccc9CC7x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x11y103abcEv,_ZThn4_N3ccc9CC7x11y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x11y10E = {  "_ZN3ccc9CC7x11y10E", // class name
  bases__ZN3ccc9CC7x11y10E, 2,
  &(vtc__ZN3ccc9CC7x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x11y10E),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  DD7x11y10  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD7x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD7x11y103abcEv
  ~DD7x11y10(); // tgen
  DD7x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD7x11y10E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x11y103pqrEv");}
void  ccc::DD7x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x11y103abcEv");}
ccc::DD7x11y10 ::~DD7x11y10(){ note_dtor("_ZN3ccc9DD7x11y10E", this);} // tgen
ccc::DD7x11y10 ::DD7x11y10(){ note_ctor("_ZN3ccc9DD7x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD7x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x11y10E, buf);
    ::ccc::DD7x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x11y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD7x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x11y10E);
    dp->::ccc::DD7x11y10::~DD7x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x11y10E(Test__ZN3ccc9DD7x11y10E, "_ZN3ccc9DD7x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x11y10C1Ev();
extern void _ZN3ccc9DD7x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD7x11y10E[] = {
  NSPAIR(_ZN3ccc9DD7x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD7x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD7x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y10E[];
extern void _ZN3ccc9DD7x11y103abcEv();
extern void _ZN3ccc9DD7x11y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x11y103pqrEv,_ZTv0_n12_N3ccc9DD7x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x11y103pqrEv,_ZThn4_N3ccc9DD7x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x11y103pqrEv,_ZTv0_n12_N3ccc9DD7x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x11y10E[] = {
  {&(_ZTVN3ccc9DD7x11y10E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y10E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y10E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x11y10E[];
static VTBL_ENTRY alt_thunk_names1091[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x11y103pqrEv,_ZTv0_n12_N3ccc9DD7x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x11y103pqrEv,_ZThn4_N3ccc9DD7x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x11y10E = {  "_ZN3ccc9DD7x11y10E", // class name
  bases__ZN3ccc9DD7x11y10E, 2,
  &(vtc__ZN3ccc9DD7x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x11y10E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x11y10E),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  CC7x11y11  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC7x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x11y113efgEv
  ~CC7x11y11(); // tgen
  CC7x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y11E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x11y113pqrEv");}
void  ccc::CC7x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x11y113efgEv");}
ccc::CC7x11y11 ::~CC7x11y11(){ note_dtor("_ZN3ccc9CC7x11y11E", this);} // tgen
ccc::CC7x11y11 ::CC7x11y11(){ note_ctor("_ZN3ccc9CC7x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC7x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x11y11E, buf);
    ::ccc::CC7x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x11y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC7x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x11y11E);
    dp->::ccc::CC7x11y11::~CC7x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x11y11E(Test__ZN3ccc9CC7x11y11E, "_ZN3ccc9CC7x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x11y11C1Ev();
extern void _ZN3ccc9CC7x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC7x11y11E[] = {
  NSPAIR(_ZN3ccc9CC7x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC7x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC7x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x11y11E[];
extern void _ZN3ccc9CC7x11y113pqrEv();
extern void _ZN3ccc9CC7x11y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x11y113pqrEv,_ZTv0_n16_N3ccc9CC7x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y113pqrEv,_ZThn4_N3ccc9CC7x11y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x11y113pqrEv,_ZTv0_n16_N3ccc9CC7x11y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x11y11E[] = {
  {&(_ZTVN3ccc9CC7x11y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x11y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x11y11E[];
static VTBL_ENTRY alt_thunk_names1092[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x11y113pqrEv,_ZTv0_n16_N3ccc9CC7x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x11y113pqrEv,_ZThn4_N3ccc9CC7x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x11y11E = {  "_ZN3ccc9CC7x11y11E", // class name
  bases__ZN3ccc9CC7x11y11E, 2,
  &(vtc__ZN3ccc9CC7x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x11y11E),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  DD7x11y11  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD7x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD7x11y113efgEv
  ~DD7x11y11(); // tgen
  DD7x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD7x11y11E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x11y113pqrEv");}
void  ccc::DD7x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x11y113efgEv");}
ccc::DD7x11y11 ::~DD7x11y11(){ note_dtor("_ZN3ccc9DD7x11y11E", this);} // tgen
ccc::DD7x11y11 ::DD7x11y11(){ note_ctor("_ZN3ccc9DD7x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD7x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x11y11E, buf);
    ::ccc::DD7x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x11y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD7x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x11y11E);
    dp->::ccc::DD7x11y11::~DD7x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x11y11E(Test__ZN3ccc9DD7x11y11E, "_ZN3ccc9DD7x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x11y11C1Ev();
extern void _ZN3ccc9DD7x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD7x11y11E[] = {
  NSPAIR(_ZN3ccc9DD7x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD7x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD7x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x11y113pqrEv();
extern void _ZN3ccc9DD7x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x11y113pqrEv,_ZTv0_n12_N3ccc9DD7x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x11y113pqrEv,_ZThn4_N3ccc9DD7x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD7x11y113efgEv,_ZTv0_n16_N3ccc9DD7x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x11y113efgEv,_ZThn4_N3ccc9DD7x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x11y113pqrEv,_ZTv0_n12_N3ccc9DD7x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD7x11y113efgEv,_ZTv0_n16_N3ccc9DD7x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x11y11E[] = {
  {&(_ZTVN3ccc9DD7x11y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x11y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x11y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x11y11E[];
static VTBL_ENTRY alt_thunk_names1093[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD7x11y113efgEv,_ZTv0_n16_N3ccc9DD7x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x11y113efgEv,_ZThn4_N3ccc9DD7x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x11y113pqrEv,_ZTv0_n12_N3ccc9DD7x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x11y113pqrEv,_ZThn4_N3ccc9DD7x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x11y11E = {  "_ZN3ccc9DD7x11y11E", // class name
  bases__ZN3ccc9DD7x11y11E, 2,
  &(vtc__ZN3ccc9DD7x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x11y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x11y11E),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  CC7x11y12  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC7x11y123abcEv
  ~CC7x11y12(); // tgen
  CC7x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y12E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC7x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x11y123abcEv");}
ccc::CC7x11y12 ::~CC7x11y12(){ note_dtor("_ZN3ccc9CC7x11y12E", this);} // tgen
ccc::CC7x11y12 ::CC7x11y12(){ note_ctor("_ZN3ccc9CC7x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC7x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x11y12E, buf);
    ::ccc::CC7x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x11y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC7x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x11y12E);
    dp->::ccc::CC7x11y12::~CC7x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x11y12E(Test__ZN3ccc9CC7x11y12E, "_ZN3ccc9CC7x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x11y12C1Ev();
extern void _ZN3ccc9CC7x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC7x11y12E[] = {
  NSPAIR(_ZN3ccc9CC7x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC7x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC7x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC7x11y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x11y123abcEv,_ZTv0_n12_N3ccc9CC7x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y123abcEv,_ZThn4_N3ccc9CC7x11y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x11y123abcEv,_ZTv0_n12_N3ccc9CC7x11y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x11y12E[] = {
  {&(_ZTVN3ccc9CC7x11y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC7x11y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x11y12E[];
static VTBL_ENTRY alt_thunk_names1094[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x11y123abcEv,_ZTv0_n12_N3ccc9CC7x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x11y123abcEv,_ZThn4_N3ccc9CC7x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x11y12E = {  "_ZN3ccc9CC7x11y12E", // class name
  bases__ZN3ccc9CC7x11y12E, 2,
  &(vtc__ZN3ccc9CC7x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x11y12E),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  DD7x11y12  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD7x11y123abcEv
  ~DD7x11y12(); // tgen
  DD7x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD7x11y12E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD7x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x11y123abcEv");}
ccc::DD7x11y12 ::~DD7x11y12(){ note_dtor("_ZN3ccc9DD7x11y12E", this);} // tgen
ccc::DD7x11y12 ::DD7x11y12(){ note_ctor("_ZN3ccc9DD7x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD7x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x11y12E, buf);
    ::ccc::DD7x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x11y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD7x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x11y12E);
    dp->::ccc::DD7x11y12::~DD7x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x11y12E(Test__ZN3ccc9DD7x11y12E, "_ZN3ccc9DD7x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x11y12C1Ev();
extern void _ZN3ccc9DD7x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD7x11y12E[] = {
  NSPAIR(_ZN3ccc9DD7x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD7x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD7x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y12E[];
extern void _ZN3ccc9DD7x11y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x11y12E[] = {
  {&(_ZTVN3ccc9DD7x11y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x11y12E[];
Class_Descriptor cd__ZN3ccc9DD7x11y12E = {  "_ZN3ccc9DD7x11y12E", // class name
  bases__ZN3ccc9DD7x11y12E, 2,
  &(vtc__ZN3ccc9DD7x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x11y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x11y12E),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  CC7x11y13  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC7x11y133efgEv
  ~CC7x11y13(); // tgen
  CC7x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y13E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC7x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x11y133efgEv");}
ccc::CC7x11y13 ::~CC7x11y13(){ note_dtor("_ZN3ccc9CC7x11y13E", this);} // tgen
ccc::CC7x11y13 ::CC7x11y13(){ note_ctor("_ZN3ccc9CC7x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC7x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x11y13E, buf);
    ::ccc::CC7x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x11y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC7x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x11y13E);
    dp->::ccc::CC7x11y13::~CC7x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x11y13E(Test__ZN3ccc9CC7x11y13E, "_ZN3ccc9CC7x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x11y13C1Ev();
extern void _ZN3ccc9CC7x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC7x11y13E[] = {
  NSPAIR(_ZN3ccc9CC7x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC7x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC7x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC7x11y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x11y13E[] = {
  {&(_ZTVN3ccc9CC7x11y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x11y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x11y13E[];
Class_Descriptor cd__ZN3ccc9CC7x11y13E = {  "_ZN3ccc9CC7x11y13E", // class name
  bases__ZN3ccc9CC7x11y13E, 2,
  &(vtc__ZN3ccc9CC7x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x11y13E),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  DD7x11y13  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD7x11y133efgEv
  ~DD7x11y13(); // tgen
  DD7x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD7x11y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD7x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x11y133efgEv");}
ccc::DD7x11y13 ::~DD7x11y13(){ note_dtor("_ZN3ccc9DD7x11y13E", this);} // tgen
ccc::DD7x11y13 ::DD7x11y13(){ note_ctor("_ZN3ccc9DD7x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD7x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x11y13E, buf);
    ::ccc::DD7x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x11y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD7x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x11y13E);
    dp->::ccc::DD7x11y13::~DD7x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x11y13E(Test__ZN3ccc9DD7x11y13E, "_ZN3ccc9DD7x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x11y13C1Ev();
extern void _ZN3ccc9DD7x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD7x11y13E[] = {
  NSPAIR(_ZN3ccc9DD7x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD7x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD7x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9DD7x11y133efgEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD7x11y133efgEv,_ZTv0_n16_N3ccc9DD7x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x11y133efgEv,_ZThn4_N3ccc9DD7x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y133efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD7x11y133efgEv,_ZTv0_n16_N3ccc9DD7x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x11y13E[] = {
  {&(_ZTVN3ccc9DD7x11y13E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x11y13E[6]),  6,15},
  {&(_ZTVN3ccc9DD7x11y13E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x11y13E[];
static VTBL_ENTRY alt_thunk_names1095[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD7x11y133efgEv,_ZTv0_n16_N3ccc9DD7x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x11y133efgEv,_ZThn4_N3ccc9DD7x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x11y13E = {  "_ZN3ccc9DD7x11y13E", // class name
  bases__ZN3ccc9DD7x11y13E, 2,
  &(vtc__ZN3ccc9DD7x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x11y13E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x11y13E),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  CC7x11y14  : virtual ::ccc::AA7 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC7x11y143pqrEv
  ~CC7x11y14(); // tgen
  CC7x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC7x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x11y143pqrEv");}
ccc::CC7x11y14 ::~CC7x11y14(){ note_dtor("_ZN3ccc9CC7x11y14E", this);} // tgen
ccc::CC7x11y14 ::CC7x11y14(){ note_ctor("_ZN3ccc9CC7x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC7x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x11y14E, buf);
    ::ccc::CC7x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x11y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC7x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x11y14E);
    dp->::ccc::CC7x11y14::~CC7x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x11y14E(Test__ZN3ccc9CC7x11y14E, "_ZN3ccc9CC7x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x11y14C1Ev();
extern void _ZN3ccc9CC7x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC7x11y14E[] = {
  NSPAIR(_ZN3ccc9CC7x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC7x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC7x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x11y14E[];
extern void _ZN3ccc9CC7x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x11y143pqrEv,_ZTv0_n16_N3ccc9CC7x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x11y143pqrEv,_ZThn4_N3ccc9CC7x11y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x11y143pqrEv,_ZTv0_n16_N3ccc9CC7x11y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x11y14E[] = {
  {&(_ZTVN3ccc9CC7x11y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x11y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x11y14E[];
static VTBL_ENTRY alt_thunk_names1096[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x11y143pqrEv,_ZTv0_n16_N3ccc9CC7x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x11y143pqrEv,_ZThn4_N3ccc9CC7x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x11y14E = {  "_ZN3ccc9CC7x11y14E", // class name
  bases__ZN3ccc9CC7x11y14E, 2,
  &(vtc__ZN3ccc9CC7x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x11y14E),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  DD7x11y14  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD7x11y143pqrEv
  ~DD7x11y14(); // tgen
  DD7x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD7x11y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD7x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x11y143pqrEv");}
ccc::DD7x11y14 ::~DD7x11y14(){ note_dtor("_ZN3ccc9DD7x11y14E", this);} // tgen
ccc::DD7x11y14 ::DD7x11y14(){ note_ctor("_ZN3ccc9DD7x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD7x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x11y14E, buf);
    ::ccc::DD7x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x11y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD7x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x11y14E);
    dp->::ccc::DD7x11y14::~DD7x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x11y14E(Test__ZN3ccc9DD7x11y14E, "_ZN3ccc9DD7x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x11y14C1Ev();
extern void _ZN3ccc9DD7x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD7x11y14E[] = {
  NSPAIR(_ZN3ccc9DD7x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD7x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD7x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x11y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x11y143pqrEv,_ZTv0_n12_N3ccc9DD7x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x11y143pqrEv,_ZThn4_N3ccc9DD7x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x11y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x11y143pqrEv,_ZTv0_n12_N3ccc9DD7x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x11y14E[] = {
  {&(_ZTVN3ccc9DD7x11y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x11y14E[];
static VTBL_ENTRY alt_thunk_names1097[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x11y143pqrEv,_ZTv0_n12_N3ccc9DD7x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x11y143pqrEv,_ZThn4_N3ccc9DD7x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x11y14E = {  "_ZN3ccc9DD7x11y14E", // class name
  bases__ZN3ccc9DD7x11y14E, 2,
  &(vtc__ZN3ccc9DD7x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x11y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x11y14E),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  CC7x11y15  : virtual ::ccc::AA7 , ::ccc::BB11 {
  ~CC7x11y15(); // tgen
  CC7x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x11y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC7x11y15 ::~CC7x11y15(){ note_dtor("_ZN3ccc9CC7x11y15E", this);} // tgen
ccc::CC7x11y15 ::CC7x11y15(){ note_ctor("_ZN3ccc9CC7x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC7x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x11y15E, buf);
    ::ccc::CC7x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x11y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC7x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x11y15E);
    dp->::ccc::CC7x11y15::~CC7x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x11y15E(Test__ZN3ccc9CC7x11y15E, "_ZN3ccc9CC7x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x11y15C1Ev();
extern void _ZN3ccc9CC7x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC7x11y15E[] = {
  NSPAIR(_ZN3ccc9CC7x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC7x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC7x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x11y15E[] = {
  {&(_ZTVN3ccc9CC7x11y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x11y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x11y15E[];
Class_Descriptor cd__ZN3ccc9CC7x11y15E = {  "_ZN3ccc9CC7x11y15E", // class name
  bases__ZN3ccc9CC7x11y15E, 2,
  &(vtc__ZN3ccc9CC7x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x11y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x11y15E),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  DD7x11y15  : virtual ::ccc::AA7 , virtual ::ccc::BB11 {
  ~DD7x11y15(); // tgen
  DD7x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD7x11y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD7x11y15 ::~DD7x11y15(){ note_dtor("_ZN3ccc9DD7x11y15E", this);} // tgen
ccc::DD7x11y15 ::DD7x11y15(){ note_ctor("_ZN3ccc9DD7x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD7x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x11y15E, buf);
    ::ccc::DD7x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x11y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD7x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x11y15E);
    dp->::ccc::DD7x11y15::~DD7x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x11y15E(Test__ZN3ccc9DD7x11y15E, "_ZN3ccc9DD7x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x11y15C1Ev();
extern void _ZN3ccc9DD7x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD7x11y15E[] = {
  NSPAIR(_ZN3ccc9DD7x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD7x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD7x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x11y15E[] = {
  {&(_ZTVN3ccc9DD7x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD7x11y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x11y15E[];
Class_Descriptor cd__ZN3ccc9DD7x11y15E = {  "_ZN3ccc9DD7x11y15E", // class name
  bases__ZN3ccc9DD7x11y15E, 2,
  &(vtc__ZN3ccc9DD7x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x11y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x11y15E),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  CC7x12y0  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y03pqrEv
  ~CC7x12y0(); // tgen
  CC7x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y0E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y03abcEv");}
void  ccc::CC7x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y03efgEv");}
void  ccc::CC7x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y03pqrEv");}
ccc::CC7x12y0 ::~CC7x12y0(){ note_dtor("_ZN3ccc8CC7x12y0E", this);} // tgen
ccc::CC7x12y0 ::CC7x12y0(){ note_ctor("_ZN3ccc8CC7x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y0E, buf);
    ::ccc::CC7x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y0E);
    dp->::ccc::CC7x12y0::~CC7x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y0E(Test__ZN3ccc8CC7x12y0E, "_ZN3ccc8CC7x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y0C1Ev();
extern void _ZN3ccc8CC7x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y0E[] = {
  NSPAIR(_ZN3ccc8CC7x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y0E[];
extern void _ZN3ccc8CC7x12y03abcEv();
extern void _ZN3ccc8CC7x12y03efgEv();
extern void _ZN3ccc8CC7x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y03abcEv,_ZTv0_n12_N3ccc8CC7x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y03abcEv,_ZThn4_N3ccc8CC7x12y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y03pqrEv,_ZTv0_n16_N3ccc8CC7x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y03pqrEv,_ZThn4_N3ccc8CC7x12y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y03abcEv,_ZTv0_n12_N3ccc8CC7x12y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y03pqrEv,_ZTv0_n16_N3ccc8CC7x12y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y0E[] = {
  {&(_ZTVN3ccc8CC7x12y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y0E[];
static VTBL_ENTRY alt_thunk_names1098[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y03pqrEv,_ZTv0_n16_N3ccc8CC7x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y03pqrEv,_ZThn4_N3ccc8CC7x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y03abcEv,_ZTv0_n12_N3ccc8CC7x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y03abcEv,_ZThn4_N3ccc8CC7x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y0E = {  "_ZN3ccc8CC7x12y0E", // class name
  bases__ZN3ccc8CC7x12y0E, 2,
  &(vtc__ZN3ccc8CC7x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y0E),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  DD7x12y0  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD7x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD7x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x12y03pqrEv
  ~DD7x12y0(); // tgen
  DD7x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y0E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y03abcEv");}
void  ccc::DD7x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y03efgEv");}
void  ccc::DD7x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y03pqrEv");}
ccc::DD7x12y0 ::~DD7x12y0(){ note_dtor("_ZN3ccc8DD7x12y0E", this);} // tgen
ccc::DD7x12y0 ::DD7x12y0(){ note_ctor("_ZN3ccc8DD7x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y0E, buf);
    ::ccc::DD7x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y0E);
    dp->::ccc::DD7x12y0::~DD7x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y0E(Test__ZN3ccc8DD7x12y0E, "_ZN3ccc8DD7x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y0C1Ev();
extern void _ZN3ccc8DD7x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y0E[] = {
  NSPAIR(_ZN3ccc8DD7x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y0E[];
extern void _ZN3ccc8DD7x12y03abcEv();
extern void _ZN3ccc8DD7x12y03pqrEv();
extern void _ZN3ccc8DD7x12y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y03abcEv,_ZTv0_n12_N3ccc8DD7x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y03abcEv,_ZThn4_N3ccc8DD7x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y03abcEv,_ZTv0_n12_N3ccc8DD7x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y0E[] = {
  {&(_ZTVN3ccc8DD7x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y0E[];
static VTBL_ENTRY alt_thunk_names1099[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y03abcEv,_ZTv0_n12_N3ccc8DD7x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y03abcEv,_ZThn4_N3ccc8DD7x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y0E = {  "_ZN3ccc8DD7x12y0E", // class name
  bases__ZN3ccc8DD7x12y0E, 2,
  &(vtc__ZN3ccc8DD7x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y0E),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  CC7x12y1  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x12y13efgEv
  ~CC7x12y1(); // tgen
  CC7x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y1E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y13abcEv");}
void  ccc::CC7x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y13pqrEv");}
void  ccc::CC7x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y13efgEv");}
ccc::CC7x12y1 ::~CC7x12y1(){ note_dtor("_ZN3ccc8CC7x12y1E", this);} // tgen
ccc::CC7x12y1 ::CC7x12y1(){ note_ctor("_ZN3ccc8CC7x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y1E, buf);
    ::ccc::CC7x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y1E);
    dp->::ccc::CC7x12y1::~CC7x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y1E(Test__ZN3ccc8CC7x12y1E, "_ZN3ccc8CC7x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y1C1Ev();
extern void _ZN3ccc8CC7x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y1E[] = {
  NSPAIR(_ZN3ccc8CC7x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y1E[];
extern void _ZN3ccc8CC7x12y13abcEv();
extern void _ZN3ccc8CC7x12y13pqrEv();
extern void _ZN3ccc8CC7x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y13abcEv,_ZTv0_n12_N3ccc8CC7x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y13abcEv,_ZThn4_N3ccc8CC7x12y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y13pqrEv,_ZTv0_n16_N3ccc8CC7x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y13pqrEv,_ZThn4_N3ccc8CC7x12y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y13abcEv,_ZTv0_n12_N3ccc8CC7x12y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y13pqrEv,_ZTv0_n16_N3ccc8CC7x12y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y1E[] = {
  {&(_ZTVN3ccc8CC7x12y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y1E[];
static VTBL_ENTRY alt_thunk_names1100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y13pqrEv,_ZTv0_n16_N3ccc8CC7x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y13pqrEv,_ZThn4_N3ccc8CC7x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y13abcEv,_ZTv0_n12_N3ccc8CC7x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y13abcEv,_ZThn4_N3ccc8CC7x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y1E = {  "_ZN3ccc8CC7x12y1E", // class name
  bases__ZN3ccc8CC7x12y1E, 2,
  &(vtc__ZN3ccc8CC7x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y1E),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  DD7x12y1  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD7x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x12y13efgEv
  ~DD7x12y1(); // tgen
  DD7x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y1E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y13abcEv");}
void  ccc::DD7x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y13pqrEv");}
void  ccc::DD7x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y13efgEv");}
ccc::DD7x12y1 ::~DD7x12y1(){ note_dtor("_ZN3ccc8DD7x12y1E", this);} // tgen
ccc::DD7x12y1 ::DD7x12y1(){ note_ctor("_ZN3ccc8DD7x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y1E, buf);
    ::ccc::DD7x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y1E);
    dp->::ccc::DD7x12y1::~DD7x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y1E(Test__ZN3ccc8DD7x12y1E, "_ZN3ccc8DD7x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y1C1Ev();
extern void _ZN3ccc8DD7x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y1E[] = {
  NSPAIR(_ZN3ccc8DD7x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y1E[];
extern void _ZN3ccc8DD7x12y13abcEv();
extern void _ZN3ccc8DD7x12y13pqrEv();
extern void _ZN3ccc8DD7x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y13abcEv,_ZTv0_n12_N3ccc8DD7x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y13abcEv,_ZThn4_N3ccc8DD7x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y13abcEv,_ZTv0_n12_N3ccc8DD7x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y1E[] = {
  {&(_ZTVN3ccc8DD7x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y1E[];
static VTBL_ENTRY alt_thunk_names1101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y13abcEv,_ZTv0_n12_N3ccc8DD7x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y13abcEv,_ZThn4_N3ccc8DD7x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y1E = {  "_ZN3ccc8DD7x12y1E", // class name
  bases__ZN3ccc8DD7x12y1E, 2,
  &(vtc__ZN3ccc8DD7x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y1E),3, //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  CC7x12y2  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y23pqrEv
  ~CC7x12y2(); // tgen
  CC7x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y2E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y23efgEv");}
void  ccc::CC7x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y23abcEv");}
void  ccc::CC7x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y23pqrEv");}
ccc::CC7x12y2 ::~CC7x12y2(){ note_dtor("_ZN3ccc8CC7x12y2E", this);} // tgen
ccc::CC7x12y2 ::CC7x12y2(){ note_ctor("_ZN3ccc8CC7x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y2E, buf);
    ::ccc::CC7x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y2E);
    dp->::ccc::CC7x12y2::~CC7x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y2E(Test__ZN3ccc8CC7x12y2E, "_ZN3ccc8CC7x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y2C1Ev();
extern void _ZN3ccc8CC7x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y2E[] = {
  NSPAIR(_ZN3ccc8CC7x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y2E[];
extern void _ZN3ccc8CC7x12y23abcEv();
extern void _ZN3ccc8CC7x12y23efgEv();
extern void _ZN3ccc8CC7x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y23abcEv,_ZTv0_n12_N3ccc8CC7x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y23abcEv,_ZThn4_N3ccc8CC7x12y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y23pqrEv,_ZTv0_n16_N3ccc8CC7x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y23pqrEv,_ZThn4_N3ccc8CC7x12y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y23abcEv,_ZTv0_n12_N3ccc8CC7x12y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y23pqrEv,_ZTv0_n16_N3ccc8CC7x12y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y2E[] = {
  {&(_ZTVN3ccc8CC7x12y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y2E[];
static VTBL_ENTRY alt_thunk_names1102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y23pqrEv,_ZTv0_n16_N3ccc8CC7x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y23pqrEv,_ZThn4_N3ccc8CC7x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y23abcEv,_ZTv0_n12_N3ccc8CC7x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y23abcEv,_ZThn4_N3ccc8CC7x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y2E = {  "_ZN3ccc8CC7x12y2E", // class name
  bases__ZN3ccc8CC7x12y2E, 2,
  &(vtc__ZN3ccc8CC7x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y2E),2, //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  DD7x12y2  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD7x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD7x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x12y23pqrEv
  ~DD7x12y2(); // tgen
  DD7x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y2E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y23efgEv");}
void  ccc::DD7x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y23abcEv");}
void  ccc::DD7x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y23pqrEv");}
ccc::DD7x12y2 ::~DD7x12y2(){ note_dtor("_ZN3ccc8DD7x12y2E", this);} // tgen
ccc::DD7x12y2 ::DD7x12y2(){ note_ctor("_ZN3ccc8DD7x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y2E, buf);
    ::ccc::DD7x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y2E);
    dp->::ccc::DD7x12y2::~DD7x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y2E(Test__ZN3ccc8DD7x12y2E, "_ZN3ccc8DD7x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y2C1Ev();
extern void _ZN3ccc8DD7x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y2E[] = {
  NSPAIR(_ZN3ccc8DD7x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y2E[];
extern void _ZN3ccc8DD7x12y23abcEv();
extern void _ZN3ccc8DD7x12y23pqrEv();
extern void _ZN3ccc8DD7x12y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y23abcEv,_ZTv0_n12_N3ccc8DD7x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y23abcEv,_ZThn4_N3ccc8DD7x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y23abcEv,_ZTv0_n12_N3ccc8DD7x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y2E[] = {
  {&(_ZTVN3ccc8DD7x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y2E[];
static VTBL_ENTRY alt_thunk_names1103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y23abcEv,_ZTv0_n12_N3ccc8DD7x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y23abcEv,_ZThn4_N3ccc8DD7x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y2E = {  "_ZN3ccc8DD7x12y2E", // class name
  bases__ZN3ccc8DD7x12y2E, 2,
  &(vtc__ZN3ccc8DD7x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y2E),3, //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  CC7x12y3  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x12y33abcEv
  ~CC7x12y3(); // tgen
  CC7x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y3E) C1{ VBC2{ v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y33efgEv");}
void  ccc::CC7x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y33pqrEv");}
void  ccc::CC7x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y33abcEv");}
ccc::CC7x12y3 ::~CC7x12y3(){ note_dtor("_ZN3ccc8CC7x12y3E", this);} // tgen
ccc::CC7x12y3 ::CC7x12y3(){ note_ctor("_ZN3ccc8CC7x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y3E, buf);
    ::ccc::CC7x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y3E);
    dp->::ccc::CC7x12y3::~CC7x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y3E(Test__ZN3ccc8CC7x12y3E, "_ZN3ccc8CC7x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y3C1Ev();
extern void _ZN3ccc8CC7x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y3E[] = {
  NSPAIR(_ZN3ccc8CC7x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y3E[];
extern void _ZN3ccc8CC7x12y33abcEv();
extern void _ZN3ccc8CC7x12y33efgEv();
extern void _ZN3ccc8CC7x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y33abcEv,_ZTv0_n12_N3ccc8CC7x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y33abcEv,_ZThn4_N3ccc8CC7x12y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y33pqrEv,_ZTv0_n16_N3ccc8CC7x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y33pqrEv,_ZThn4_N3ccc8CC7x12y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y33abcEv,_ZTv0_n12_N3ccc8CC7x12y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y33pqrEv,_ZTv0_n16_N3ccc8CC7x12y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y3E[] = {
  {&(_ZTVN3ccc8CC7x12y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y3E[];
static VTBL_ENTRY alt_thunk_names1104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y33pqrEv,_ZTv0_n16_N3ccc8CC7x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y33pqrEv,_ZThn4_N3ccc8CC7x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y33abcEv,_ZTv0_n12_N3ccc8CC7x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y33abcEv,_ZThn4_N3ccc8CC7x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y3E = {  "_ZN3ccc8CC7x12y3E", // class name
  bases__ZN3ccc8CC7x12y3E, 2,
  &(vtc__ZN3ccc8CC7x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y3E),2, //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  DD7x12y3  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD7x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x12y33abcEv
  ~DD7x12y3(); // tgen
  DD7x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y3E) C1{ VBC2{ v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y33efgEv");}
void  ccc::DD7x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y33pqrEv");}
void  ccc::DD7x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y33abcEv");}
ccc::DD7x12y3 ::~DD7x12y3(){ note_dtor("_ZN3ccc8DD7x12y3E", this);} // tgen
ccc::DD7x12y3 ::DD7x12y3(){ note_ctor("_ZN3ccc8DD7x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y3E, buf);
    ::ccc::DD7x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y3E);
    dp->::ccc::DD7x12y3::~DD7x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y3E(Test__ZN3ccc8DD7x12y3E, "_ZN3ccc8DD7x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y3C1Ev();
extern void _ZN3ccc8DD7x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y3E[] = {
  NSPAIR(_ZN3ccc8DD7x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y3E[];
extern void _ZN3ccc8DD7x12y33abcEv();
extern void _ZN3ccc8DD7x12y33pqrEv();
extern void _ZN3ccc8DD7x12y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y33abcEv,_ZTv0_n12_N3ccc8DD7x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y33abcEv,_ZThn4_N3ccc8DD7x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y33abcEv,_ZTv0_n12_N3ccc8DD7x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y3E[] = {
  {&(_ZTVN3ccc8DD7x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y3E[];
static VTBL_ENTRY alt_thunk_names1105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y33abcEv,_ZTv0_n12_N3ccc8DD7x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y33abcEv,_ZThn4_N3ccc8DD7x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y3E = {  "_ZN3ccc8DD7x12y3E", // class name
  bases__ZN3ccc8DD7x12y3E, 2,
  &(vtc__ZN3ccc8DD7x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y3E),3, //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  CC7x12y4  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC7x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x12y43efgEv
  ~CC7x12y4(); // tgen
  CC7x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y4E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y43pqrEv");}
void  ccc::CC7x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y43abcEv");}
void  ccc::CC7x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y43efgEv");}
ccc::CC7x12y4 ::~CC7x12y4(){ note_dtor("_ZN3ccc8CC7x12y4E", this);} // tgen
ccc::CC7x12y4 ::CC7x12y4(){ note_ctor("_ZN3ccc8CC7x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y4E, buf);
    ::ccc::CC7x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y4E);
    dp->::ccc::CC7x12y4::~CC7x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y4E(Test__ZN3ccc8CC7x12y4E, "_ZN3ccc8CC7x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y4C1Ev();
extern void _ZN3ccc8CC7x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y4E[] = {
  NSPAIR(_ZN3ccc8CC7x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y4E[];
extern void _ZN3ccc8CC7x12y43abcEv();
extern void _ZN3ccc8CC7x12y43pqrEv();
extern void _ZN3ccc8CC7x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y43abcEv,_ZTv0_n12_N3ccc8CC7x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y43abcEv,_ZThn4_N3ccc8CC7x12y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y43pqrEv,_ZTv0_n16_N3ccc8CC7x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y43pqrEv,_ZThn4_N3ccc8CC7x12y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y43abcEv,_ZTv0_n12_N3ccc8CC7x12y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y43pqrEv,_ZTv0_n16_N3ccc8CC7x12y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y4E[] = {
  {&(_ZTVN3ccc8CC7x12y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y4E[];
static VTBL_ENTRY alt_thunk_names1106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y43pqrEv,_ZTv0_n16_N3ccc8CC7x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y43pqrEv,_ZThn4_N3ccc8CC7x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y43abcEv,_ZTv0_n12_N3ccc8CC7x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y43abcEv,_ZThn4_N3ccc8CC7x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y4E = {  "_ZN3ccc8CC7x12y4E", // class name
  bases__ZN3ccc8CC7x12y4E, 2,
  &(vtc__ZN3ccc8CC7x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y4E),2, //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  DD7x12y4  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD7x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD7x12y43efgEv
  ~DD7x12y4(); // tgen
  DD7x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y4E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y43pqrEv");}
void  ccc::DD7x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y43abcEv");}
void  ccc::DD7x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y43efgEv");}
ccc::DD7x12y4 ::~DD7x12y4(){ note_dtor("_ZN3ccc8DD7x12y4E", this);} // tgen
ccc::DD7x12y4 ::DD7x12y4(){ note_ctor("_ZN3ccc8DD7x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y4E, buf);
    ::ccc::DD7x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y4E);
    dp->::ccc::DD7x12y4::~DD7x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y4E(Test__ZN3ccc8DD7x12y4E, "_ZN3ccc8DD7x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y4C1Ev();
extern void _ZN3ccc8DD7x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y4E[] = {
  NSPAIR(_ZN3ccc8DD7x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y4E[];
extern void _ZN3ccc8DD7x12y43abcEv();
extern void _ZN3ccc8DD7x12y43pqrEv();
extern void _ZN3ccc8DD7x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y43abcEv,_ZTv0_n12_N3ccc8DD7x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y43abcEv,_ZThn4_N3ccc8DD7x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y43abcEv,_ZTv0_n12_N3ccc8DD7x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y4E[] = {
  {&(_ZTVN3ccc8DD7x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y4E[];
static VTBL_ENTRY alt_thunk_names1107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y43abcEv,_ZTv0_n12_N3ccc8DD7x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y43abcEv,_ZThn4_N3ccc8DD7x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y4E = {  "_ZN3ccc8DD7x12y4E", // class name
  bases__ZN3ccc8DD7x12y4E, 2,
  &(vtc__ZN3ccc8DD7x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y4E),3, //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  CC7x12y5  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC7x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x12y53abcEv
  ~CC7x12y5(); // tgen
  CC7x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y5E) C1{ VBC2{ v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y53pqrEv");}
void  ccc::CC7x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y53efgEv");}
void  ccc::CC7x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y53abcEv");}
ccc::CC7x12y5 ::~CC7x12y5(){ note_dtor("_ZN3ccc8CC7x12y5E", this);} // tgen
ccc::CC7x12y5 ::CC7x12y5(){ note_ctor("_ZN3ccc8CC7x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y5E, buf);
    ::ccc::CC7x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y5E);
    dp->::ccc::CC7x12y5::~CC7x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y5E(Test__ZN3ccc8CC7x12y5E, "_ZN3ccc8CC7x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y5C1Ev();
extern void _ZN3ccc8CC7x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y5E[] = {
  NSPAIR(_ZN3ccc8CC7x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y5E[];
extern void _ZN3ccc8CC7x12y53abcEv();
extern void _ZN3ccc8CC7x12y53pqrEv();
extern void _ZN3ccc8CC7x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y53abcEv,_ZTv0_n12_N3ccc8CC7x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y53abcEv,_ZThn4_N3ccc8CC7x12y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y53pqrEv,_ZTv0_n16_N3ccc8CC7x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y53pqrEv,_ZThn4_N3ccc8CC7x12y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y53abcEv,_ZTv0_n12_N3ccc8CC7x12y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y53pqrEv,_ZTv0_n16_N3ccc8CC7x12y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y5E[] = {
  {&(_ZTVN3ccc8CC7x12y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y5E[];
static VTBL_ENTRY alt_thunk_names1108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y53pqrEv,_ZTv0_n16_N3ccc8CC7x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y53pqrEv,_ZThn4_N3ccc8CC7x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y53abcEv,_ZTv0_n12_N3ccc8CC7x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y53abcEv,_ZThn4_N3ccc8CC7x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y5E = {  "_ZN3ccc8CC7x12y5E", // class name
  bases__ZN3ccc8CC7x12y5E, 2,
  &(vtc__ZN3ccc8CC7x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y5E),2, //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  DD7x12y5  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD7x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD7x12y53abcEv
  ~DD7x12y5(); // tgen
  DD7x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y5E) C1{ VBC2{ v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y53pqrEv");}
void  ccc::DD7x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y53efgEv");}
void  ccc::DD7x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y53abcEv");}
ccc::DD7x12y5 ::~DD7x12y5(){ note_dtor("_ZN3ccc8DD7x12y5E", this);} // tgen
ccc::DD7x12y5 ::DD7x12y5(){ note_ctor("_ZN3ccc8DD7x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y5E, buf);
    ::ccc::DD7x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y5E);
    dp->::ccc::DD7x12y5::~DD7x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y5E(Test__ZN3ccc8DD7x12y5E, "_ZN3ccc8DD7x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y5C1Ev();
extern void _ZN3ccc8DD7x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y5E[] = {
  NSPAIR(_ZN3ccc8DD7x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y5E[];
extern void _ZN3ccc8DD7x12y53abcEv();
extern void _ZN3ccc8DD7x12y53pqrEv();
extern void _ZN3ccc8DD7x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y53abcEv,_ZTv0_n12_N3ccc8DD7x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y53abcEv,_ZThn4_N3ccc8DD7x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y53abcEv,_ZTv0_n12_N3ccc8DD7x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y5E[] = {
  {&(_ZTVN3ccc8DD7x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y5E[];
static VTBL_ENTRY alt_thunk_names1109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y53abcEv,_ZTv0_n12_N3ccc8DD7x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y53abcEv,_ZThn4_N3ccc8DD7x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y5E = {  "_ZN3ccc8DD7x12y5E", // class name
  bases__ZN3ccc8DD7x12y5E, 2,
  &(vtc__ZN3ccc8DD7x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y5E),3, //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  CC7x12y6  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x12y63efgEv
  ~CC7x12y6(); // tgen
  CC7x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y6E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y63abcEv");}
void  ccc::CC7x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y63efgEv");}
ccc::CC7x12y6 ::~CC7x12y6(){ note_dtor("_ZN3ccc8CC7x12y6E", this);} // tgen
ccc::CC7x12y6 ::CC7x12y6(){ note_ctor("_ZN3ccc8CC7x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y6E, buf);
    ::ccc::CC7x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y6E);
    dp->::ccc::CC7x12y6::~CC7x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y6E(Test__ZN3ccc8CC7x12y6E, "_ZN3ccc8CC7x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y6C1Ev();
extern void _ZN3ccc8CC7x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y6E[] = {
  NSPAIR(_ZN3ccc8CC7x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y6E[];
extern void _ZN3ccc8CC7x12y63abcEv();
extern void _ZN3ccc8CC7x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y63abcEv,_ZTv0_n12_N3ccc8CC7x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y63abcEv,_ZThn4_N3ccc8CC7x12y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y63abcEv,_ZTv0_n12_N3ccc8CC7x12y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y6E[] = {
  {&(_ZTVN3ccc8CC7x12y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x12y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y6E[];
static VTBL_ENTRY alt_thunk_names1110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y63abcEv,_ZTv0_n12_N3ccc8CC7x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y63abcEv,_ZThn4_N3ccc8CC7x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y6E = {  "_ZN3ccc8CC7x12y6E", // class name
  bases__ZN3ccc8CC7x12y6E, 2,
  &(vtc__ZN3ccc8CC7x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y6E),2, //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  DD7x12y6  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD7x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD7x12y63efgEv
  ~DD7x12y6(); // tgen
  DD7x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y6E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y63abcEv");}
void  ccc::DD7x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y63efgEv");}
ccc::DD7x12y6 ::~DD7x12y6(){ note_dtor("_ZN3ccc8DD7x12y6E", this);} // tgen
ccc::DD7x12y6 ::DD7x12y6(){ note_ctor("_ZN3ccc8DD7x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y6E, buf);
    ::ccc::DD7x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y6E);
    dp->::ccc::DD7x12y6::~DD7x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y6E(Test__ZN3ccc8DD7x12y6E, "_ZN3ccc8DD7x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y6C1Ev();
extern void _ZN3ccc8DD7x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y6E[] = {
  NSPAIR(_ZN3ccc8DD7x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y6E[];
extern void _ZN3ccc8DD7x12y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y63abcEv,_ZTv0_n12_N3ccc8DD7x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y63abcEv,_ZThn4_N3ccc8DD7x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y63abcEv,_ZTv0_n12_N3ccc8DD7x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y6E[] = {
  {&(_ZTVN3ccc8DD7x12y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y6E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y6E[];
static VTBL_ENTRY alt_thunk_names1111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y63abcEv,_ZTv0_n12_N3ccc8DD7x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y63abcEv,_ZThn4_N3ccc8DD7x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y6E = {  "_ZN3ccc8DD7x12y6E", // class name
  bases__ZN3ccc8DD7x12y6E, 2,
  &(vtc__ZN3ccc8DD7x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y6E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y6E),3, //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  CC7x12y7  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC7x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y73pqrEv
  ~CC7x12y7(); // tgen
  CC7x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y7E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y73abcEv");}
void  ccc::CC7x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y73pqrEv");}
ccc::CC7x12y7 ::~CC7x12y7(){ note_dtor("_ZN3ccc8CC7x12y7E", this);} // tgen
ccc::CC7x12y7 ::CC7x12y7(){ note_ctor("_ZN3ccc8CC7x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y7E, buf);
    ::ccc::CC7x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y7E);
    dp->::ccc::CC7x12y7::~CC7x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y7E(Test__ZN3ccc8CC7x12y7E, "_ZN3ccc8CC7x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y7C1Ev();
extern void _ZN3ccc8CC7x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y7E[] = {
  NSPAIR(_ZN3ccc8CC7x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y7E[];
extern void _ZN3ccc8CC7x12y73abcEv();
extern void _ZN3ccc8CC7x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y73abcEv,_ZTv0_n12_N3ccc8CC7x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y73abcEv,_ZThn4_N3ccc8CC7x12y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y73pqrEv,_ZTv0_n16_N3ccc8CC7x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y73pqrEv,_ZThn4_N3ccc8CC7x12y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y73abcEv,_ZTv0_n12_N3ccc8CC7x12y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y73pqrEv,_ZTv0_n16_N3ccc8CC7x12y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y7E[] = {
  {&(_ZTVN3ccc8CC7x12y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x12y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y7E[];
static VTBL_ENTRY alt_thunk_names1112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y73pqrEv,_ZTv0_n16_N3ccc8CC7x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y73pqrEv,_ZThn4_N3ccc8CC7x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y73abcEv,_ZTv0_n12_N3ccc8CC7x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y73abcEv,_ZThn4_N3ccc8CC7x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y7E = {  "_ZN3ccc8CC7x12y7E", // class name
  bases__ZN3ccc8CC7x12y7E, 2,
  &(vtc__ZN3ccc8CC7x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y7E),2, //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  DD7x12y7  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD7x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x12y73pqrEv
  ~DD7x12y7(); // tgen
  DD7x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y7E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y73abcEv");}
void  ccc::DD7x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y73pqrEv");}
ccc::DD7x12y7 ::~DD7x12y7(){ note_dtor("_ZN3ccc8DD7x12y7E", this);} // tgen
ccc::DD7x12y7 ::DD7x12y7(){ note_ctor("_ZN3ccc8DD7x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y7E, buf);
    ::ccc::DD7x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y7E);
    dp->::ccc::DD7x12y7::~DD7x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y7E(Test__ZN3ccc8DD7x12y7E, "_ZN3ccc8DD7x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y7C1Ev();
extern void _ZN3ccc8DD7x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y7E[] = {
  NSPAIR(_ZN3ccc8DD7x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y7E[];
extern void _ZN3ccc8DD7x12y73abcEv();
extern void _ZN3ccc8DD7x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y73abcEv,_ZTv0_n12_N3ccc8DD7x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y73abcEv,_ZThn4_N3ccc8DD7x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y73abcEv,_ZTv0_n12_N3ccc8DD7x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y7E[] = {
  {&(_ZTVN3ccc8DD7x12y7E[6]),  6,12},
  {&(_ZTVN3ccc8DD7x12y7E[6]),  6,12},
  {&(_ZTVN3ccc8DD7x12y7E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y7E[];
static VTBL_ENTRY alt_thunk_names1113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y73abcEv,_ZTv0_n12_N3ccc8DD7x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y73abcEv,_ZThn4_N3ccc8DD7x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y7E = {  "_ZN3ccc8DD7x12y7E", // class name
  bases__ZN3ccc8DD7x12y7E, 2,
  &(vtc__ZN3ccc8DD7x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y7E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y7E),3, //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  CC7x12y8  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x12y83abcEv
  ~CC7x12y8(); // tgen
  CC7x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y8E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y83efgEv");}
void  ccc::CC7x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x12y83abcEv");}
ccc::CC7x12y8 ::~CC7x12y8(){ note_dtor("_ZN3ccc8CC7x12y8E", this);} // tgen
ccc::CC7x12y8 ::CC7x12y8(){ note_ctor("_ZN3ccc8CC7x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y8E, buf);
    ::ccc::CC7x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y8E);
    dp->::ccc::CC7x12y8::~CC7x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y8E(Test__ZN3ccc8CC7x12y8E, "_ZN3ccc8CC7x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y8C1Ev();
extern void _ZN3ccc8CC7x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y8E[] = {
  NSPAIR(_ZN3ccc8CC7x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y8E[];
extern void _ZN3ccc8CC7x12y83abcEv();
extern void _ZN3ccc8CC7x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x12y83abcEv,_ZTv0_n12_N3ccc8CC7x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y83abcEv,_ZThn4_N3ccc8CC7x12y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x12y83abcEv,_ZTv0_n12_N3ccc8CC7x12y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y8E[] = {
  {&(_ZTVN3ccc8CC7x12y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x12y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y8E[];
static VTBL_ENTRY alt_thunk_names1114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x12y83abcEv,_ZTv0_n12_N3ccc8CC7x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y83abcEv,_ZThn4_N3ccc8CC7x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y8E = {  "_ZN3ccc8CC7x12y8E", // class name
  bases__ZN3ccc8CC7x12y8E, 2,
  &(vtc__ZN3ccc8CC7x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y8E),2, //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  DD7x12y8  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD7x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD7x12y83abcEv
  ~DD7x12y8(); // tgen
  DD7x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y8E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y83efgEv");}
void  ccc::DD7x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x12y83abcEv");}
ccc::DD7x12y8 ::~DD7x12y8(){ note_dtor("_ZN3ccc8DD7x12y8E", this);} // tgen
ccc::DD7x12y8 ::DD7x12y8(){ note_ctor("_ZN3ccc8DD7x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y8E, buf);
    ::ccc::DD7x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y8E);
    dp->::ccc::DD7x12y8::~DD7x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y8E(Test__ZN3ccc8DD7x12y8E, "_ZN3ccc8DD7x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y8C1Ev();
extern void _ZN3ccc8DD7x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y8E[] = {
  NSPAIR(_ZN3ccc8DD7x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y8E[];
extern void _ZN3ccc8DD7x12y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x12y83abcEv,_ZTv0_n12_N3ccc8DD7x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x12y83abcEv,_ZThn4_N3ccc8DD7x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x12y83abcEv,_ZTv0_n12_N3ccc8DD7x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y8E[] = {
  {&(_ZTVN3ccc8DD7x12y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y8E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y8E[];
static VTBL_ENTRY alt_thunk_names1115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x12y83abcEv,_ZTv0_n12_N3ccc8DD7x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x12y83abcEv,_ZThn4_N3ccc8DD7x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x12y8E = {  "_ZN3ccc8DD7x12y8E", // class name
  bases__ZN3ccc8DD7x12y8E, 2,
  &(vtc__ZN3ccc8DD7x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y8E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y8E),3, //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  CC7x12y9  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC7x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x12y93pqrEv
  ~CC7x12y9(); // tgen
  CC7x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x12y9E) C1{ VBC2{ v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x12y93efgEv");}
void  ccc::CC7x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x12y93pqrEv");}
ccc::CC7x12y9 ::~CC7x12y9(){ note_dtor("_ZN3ccc8CC7x12y9E", this);} // tgen
ccc::CC7x12y9 ::CC7x12y9(){ note_ctor("_ZN3ccc8CC7x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC7x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x12y9E, buf);
    ::ccc::CC7x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x12y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC7x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x12y9E);
    dp->::ccc::CC7x12y9::~CC7x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x12y9E(Test__ZN3ccc8CC7x12y9E, "_ZN3ccc8CC7x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x12y9C1Ev();
extern void _ZN3ccc8CC7x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC7x12y9E[] = {
  NSPAIR(_ZN3ccc8CC7x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC7x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC7x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC7x12y93efgEv();
extern void _ZN3ccc8CC7x12y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x12y93pqrEv,_ZTv0_n16_N3ccc8CC7x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x12y93pqrEv,_ZThn4_N3ccc8CC7x12y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x12y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x12y93pqrEv,_ZTv0_n16_N3ccc8CC7x12y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x12y9E[] = {
  {&(_ZTVN3ccc8CC7x12y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x12y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x12y9E[];
static VTBL_ENTRY alt_thunk_names1116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x12y93pqrEv,_ZTv0_n16_N3ccc8CC7x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x12y93pqrEv,_ZThn4_N3ccc8CC7x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x12y9E = {  "_ZN3ccc8CC7x12y9E", // class name
  bases__ZN3ccc8CC7x12y9E, 2,
  &(vtc__ZN3ccc8CC7x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x12y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x12y9E),2, //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  DD7x12y9  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD7x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x12y93pqrEv
  ~DD7x12y9(); // tgen
  DD7x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD7x12y9E) C1{ VBC2{ v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x12y93efgEv");}
void  ccc::DD7x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x12y93pqrEv");}
ccc::DD7x12y9 ::~DD7x12y9(){ note_dtor("_ZN3ccc8DD7x12y9E", this);} // tgen
ccc::DD7x12y9 ::DD7x12y9(){ note_ctor("_ZN3ccc8DD7x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD7x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x12y9E, buf);
    ::ccc::DD7x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x12y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD7x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x12y9E);
    dp->::ccc::DD7x12y9::~DD7x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x12y9E(Test__ZN3ccc8DD7x12y9E, "_ZN3ccc8DD7x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x12y9C1Ev();
extern void _ZN3ccc8DD7x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD7x12y9E[] = {
  NSPAIR(_ZN3ccc8DD7x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD7x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD7x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x12y93pqrEv();
extern void _ZN3ccc8DD7x12y93efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x12y93efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x12y9E[] = {
  {&(_ZTVN3ccc8DD7x12y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x12y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x12y9E[];
Class_Descriptor cd__ZN3ccc8DD7x12y9E = {  "_ZN3ccc8DD7x12y9E", // class name
  bases__ZN3ccc8DD7x12y9E, 2,
  &(vtc__ZN3ccc8DD7x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x12y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x12y9E),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  CC7x12y10  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC7x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x12y103abcEv
  ~CC7x12y10(); // tgen
  CC7x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y10E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x12y103pqrEv");}
void  ccc::CC7x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x12y103abcEv");}
ccc::CC7x12y10 ::~CC7x12y10(){ note_dtor("_ZN3ccc9CC7x12y10E", this);} // tgen
ccc::CC7x12y10 ::CC7x12y10(){ note_ctor("_ZN3ccc9CC7x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC7x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x12y10E, buf);
    ::ccc::CC7x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x12y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC7x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x12y10E);
    dp->::ccc::CC7x12y10::~CC7x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x12y10E(Test__ZN3ccc9CC7x12y10E, "_ZN3ccc9CC7x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x12y10C1Ev();
extern void _ZN3ccc9CC7x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC7x12y10E[] = {
  NSPAIR(_ZN3ccc9CC7x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC7x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC7x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x12y10E[];
extern void _ZN3ccc9CC7x12y103abcEv();
extern void _ZN3ccc9CC7x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x12y103abcEv,_ZTv0_n12_N3ccc9CC7x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y103abcEv,_ZThn4_N3ccc9CC7x12y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x12y103pqrEv,_ZTv0_n16_N3ccc9CC7x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y103pqrEv,_ZThn4_N3ccc9CC7x12y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x12y103abcEv,_ZTv0_n12_N3ccc9CC7x12y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x12y103pqrEv,_ZTv0_n16_N3ccc9CC7x12y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x12y10E[] = {
  {&(_ZTVN3ccc9CC7x12y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x12y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x12y10E[];
static VTBL_ENTRY alt_thunk_names1117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x12y103pqrEv,_ZTv0_n16_N3ccc9CC7x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x12y103pqrEv,_ZThn4_N3ccc9CC7x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x12y103abcEv,_ZTv0_n12_N3ccc9CC7x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x12y103abcEv,_ZThn4_N3ccc9CC7x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x12y10E = {  "_ZN3ccc9CC7x12y10E", // class name
  bases__ZN3ccc9CC7x12y10E, 2,
  &(vtc__ZN3ccc9CC7x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x12y10E),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  DD7x12y10  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD7x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD7x12y103abcEv
  ~DD7x12y10(); // tgen
  DD7x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD7x12y10E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x12y103pqrEv");}
void  ccc::DD7x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x12y103abcEv");}
ccc::DD7x12y10 ::~DD7x12y10(){ note_dtor("_ZN3ccc9DD7x12y10E", this);} // tgen
ccc::DD7x12y10 ::DD7x12y10(){ note_ctor("_ZN3ccc9DD7x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD7x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x12y10E, buf);
    ::ccc::DD7x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x12y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD7x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x12y10E);
    dp->::ccc::DD7x12y10::~DD7x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x12y10E(Test__ZN3ccc9DD7x12y10E, "_ZN3ccc9DD7x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x12y10C1Ev();
extern void _ZN3ccc9DD7x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD7x12y10E[] = {
  NSPAIR(_ZN3ccc9DD7x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD7x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD7x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y10E[];
extern void _ZN3ccc9DD7x12y103abcEv();
extern void _ZN3ccc9DD7x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x12y103abcEv,_ZTv0_n12_N3ccc9DD7x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x12y103abcEv,_ZThn4_N3ccc9DD7x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x12y103abcEv,_ZTv0_n12_N3ccc9DD7x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x12y10E[] = {
  {&(_ZTVN3ccc9DD7x12y10E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y10E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y10E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x12y10E[];
static VTBL_ENTRY alt_thunk_names1118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x12y103abcEv,_ZTv0_n12_N3ccc9DD7x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x12y103abcEv,_ZThn4_N3ccc9DD7x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x12y10E = {  "_ZN3ccc9DD7x12y10E", // class name
  bases__ZN3ccc9DD7x12y10E, 2,
  &(vtc__ZN3ccc9DD7x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x12y10E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x12y10E),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  CC7x12y11  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC7x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x12y113efgEv
  ~CC7x12y11(); // tgen
  CC7x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y11E) C1{ VBC2{ v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x12y113pqrEv");}
void  ccc::CC7x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x12y113efgEv");}
ccc::CC7x12y11 ::~CC7x12y11(){ note_dtor("_ZN3ccc9CC7x12y11E", this);} // tgen
ccc::CC7x12y11 ::CC7x12y11(){ note_ctor("_ZN3ccc9CC7x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC7x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x12y11E, buf);
    ::ccc::CC7x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x12y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC7x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x12y11E);
    dp->::ccc::CC7x12y11::~CC7x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x12y11E(Test__ZN3ccc9CC7x12y11E, "_ZN3ccc9CC7x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x12y11C1Ev();
extern void _ZN3ccc9CC7x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC7x12y11E[] = {
  NSPAIR(_ZN3ccc9CC7x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC7x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC7x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC7x12y113pqrEv();
extern void _ZN3ccc9CC7x12y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x12y113pqrEv,_ZTv0_n16_N3ccc9CC7x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y113pqrEv,_ZThn4_N3ccc9CC7x12y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x12y113pqrEv,_ZTv0_n16_N3ccc9CC7x12y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x12y11E[] = {
  {&(_ZTVN3ccc9CC7x12y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC7x12y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x12y11E[];
static VTBL_ENTRY alt_thunk_names1119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x12y113pqrEv,_ZTv0_n16_N3ccc9CC7x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x12y113pqrEv,_ZThn4_N3ccc9CC7x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x12y11E = {  "_ZN3ccc9CC7x12y11E", // class name
  bases__ZN3ccc9CC7x12y11E, 2,
  &(vtc__ZN3ccc9CC7x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x12y11E),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  DD7x12y11  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD7x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD7x12y113efgEv
  ~DD7x12y11(); // tgen
  DD7x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD7x12y11E) C1{ VBC2{ v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x12y113pqrEv");}
void  ccc::DD7x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x12y113efgEv");}
ccc::DD7x12y11 ::~DD7x12y11(){ note_dtor("_ZN3ccc9DD7x12y11E", this);} // tgen
ccc::DD7x12y11 ::DD7x12y11(){ note_ctor("_ZN3ccc9DD7x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD7x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x12y11E, buf);
    ::ccc::DD7x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x12y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD7x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x12y11E);
    dp->::ccc::DD7x12y11::~DD7x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x12y11E(Test__ZN3ccc9DD7x12y11E, "_ZN3ccc9DD7x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x12y11C1Ev();
extern void _ZN3ccc9DD7x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD7x12y11E[] = {
  NSPAIR(_ZN3ccc9DD7x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD7x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD7x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x12y113pqrEv();
extern void _ZN3ccc9DD7x12y113efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y113efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x12y11E[] = {
  {&(_ZTVN3ccc9DD7x12y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x12y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x12y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x12y11E[];
Class_Descriptor cd__ZN3ccc9DD7x12y11E = {  "_ZN3ccc9DD7x12y11E", // class name
  bases__ZN3ccc9DD7x12y11E, 2,
  &(vtc__ZN3ccc9DD7x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x12y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x12y11E),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  CC7x12y12  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC7x12y123abcEv
  ~CC7x12y12(); // tgen
  CC7x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y12E) C1{ VBC2{ v1 v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC7x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x12y123abcEv");}
ccc::CC7x12y12 ::~CC7x12y12(){ note_dtor("_ZN3ccc9CC7x12y12E", this);} // tgen
ccc::CC7x12y12 ::CC7x12y12(){ note_ctor("_ZN3ccc9CC7x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC7x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x12y12E, buf);
    ::ccc::CC7x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x12y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC7x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x12y12E);
    dp->::ccc::CC7x12y12::~CC7x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x12y12E(Test__ZN3ccc9CC7x12y12E, "_ZN3ccc9CC7x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x12y12C1Ev();
extern void _ZN3ccc9CC7x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC7x12y12E[] = {
  NSPAIR(_ZN3ccc9CC7x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC7x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC7x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x12y12E[];
extern void _ZN3ccc9CC7x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x12y123abcEv,_ZTv0_n12_N3ccc9CC7x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y123abcEv,_ZThn4_N3ccc9CC7x12y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x12y123abcEv,_ZTv0_n12_N3ccc9CC7x12y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x12y12E[] = {
  {&(_ZTVN3ccc9CC7x12y12E[3]),  3,10},
  {&(_ZTVN3ccc9CC7x12y12E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x12y12E[];
static VTBL_ENTRY alt_thunk_names1120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x12y123abcEv,_ZTv0_n12_N3ccc9CC7x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x12y123abcEv,_ZThn4_N3ccc9CC7x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x12y12E = {  "_ZN3ccc9CC7x12y12E", // class name
  bases__ZN3ccc9CC7x12y12E, 2,
  &(vtc__ZN3ccc9CC7x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y12E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x12y12E),2, //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  DD7x12y12  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD7x12y123abcEv
  ~DD7x12y12(); // tgen
  DD7x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD7x12y12E) C1{ VBC2{ v1 v2} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD7x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x12y123abcEv");}
ccc::DD7x12y12 ::~DD7x12y12(){ note_dtor("_ZN3ccc9DD7x12y12E", this);} // tgen
ccc::DD7x12y12 ::DD7x12y12(){ note_ctor("_ZN3ccc9DD7x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD7x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x12y12E, buf);
    ::ccc::DD7x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x12y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD7x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x12y12E);
    dp->::ccc::DD7x12y12::~DD7x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x12y12E(Test__ZN3ccc9DD7x12y12E, "_ZN3ccc9DD7x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x12y12C1Ev();
extern void _ZN3ccc9DD7x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD7x12y12E[] = {
  NSPAIR(_ZN3ccc9DD7x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD7x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD7x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y12E[];
extern void _ZN3ccc9DD7x12y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x12y123abcEv,_ZTv0_n12_N3ccc9DD7x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x12y123abcEv,_ZThn4_N3ccc9DD7x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x12y123abcEv,_ZTv0_n12_N3ccc9DD7x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x12y12E[] = {
  {&(_ZTVN3ccc9DD7x12y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x12y12E[];
static VTBL_ENTRY alt_thunk_names1121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x12y123abcEv,_ZTv0_n12_N3ccc9DD7x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x12y123abcEv,_ZThn4_N3ccc9DD7x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x12y12E = {  "_ZN3ccc9DD7x12y12E", // class name
  bases__ZN3ccc9DD7x12y12E, 2,
  &(vtc__ZN3ccc9DD7x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x12y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x12y12E),3, //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  CC7x12y13  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC7x12y133efgEv
  ~CC7x12y13(); // tgen
  CC7x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y13E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC7x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x12y133efgEv");}
ccc::CC7x12y13 ::~CC7x12y13(){ note_dtor("_ZN3ccc9CC7x12y13E", this);} // tgen
ccc::CC7x12y13 ::CC7x12y13(){ note_ctor("_ZN3ccc9CC7x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC7x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x12y13E, buf);
    ::ccc::CC7x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x12y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC7x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x12y13E);
    dp->::ccc::CC7x12y13::~CC7x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x12y13E(Test__ZN3ccc9CC7x12y13E, "_ZN3ccc9CC7x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x12y13C1Ev();
extern void _ZN3ccc9CC7x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC7x12y13E[] = {
  NSPAIR(_ZN3ccc9CC7x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC7x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC7x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC7x12y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x12y13E[] = {
  {&(_ZTVN3ccc9CC7x12y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x12y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x12y13E[];
Class_Descriptor cd__ZN3ccc9CC7x12y13E = {  "_ZN3ccc9CC7x12y13E", // class name
  bases__ZN3ccc9CC7x12y13E, 2,
  &(vtc__ZN3ccc9CC7x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x12y13E),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  DD7x12y13  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD7x12y133efgEv
  ~DD7x12y13(); // tgen
  DD7x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD7x12y13E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD7x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x12y133efgEv");}
ccc::DD7x12y13 ::~DD7x12y13(){ note_dtor("_ZN3ccc9DD7x12y13E", this);} // tgen
ccc::DD7x12y13 ::DD7x12y13(){ note_ctor("_ZN3ccc9DD7x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD7x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x12y13E, buf);
    ::ccc::DD7x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x12y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD7x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x12y13E);
    dp->::ccc::DD7x12y13::~DD7x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x12y13E(Test__ZN3ccc9DD7x12y13E, "_ZN3ccc9DD7x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x12y13C1Ev();
extern void _ZN3ccc9DD7x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD7x12y13E[] = {
  NSPAIR(_ZN3ccc9DD7x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD7x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD7x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9DD7x12y133efgEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x12y13E[] = {
  {&(_ZTVN3ccc9DD7x12y13E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x12y13E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x12y13E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x12y13E[];
Class_Descriptor cd__ZN3ccc9DD7x12y13E = {  "_ZN3ccc9DD7x12y13E", // class name
  bases__ZN3ccc9DD7x12y13E, 2,
  &(vtc__ZN3ccc9DD7x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x12y13E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x12y13E),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  CC7x12y14  : virtual ::ccc::AA7 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC7x12y143pqrEv
  ~CC7x12y14(); // tgen
  CC7x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y14E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC7x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x12y143pqrEv");}
ccc::CC7x12y14 ::~CC7x12y14(){ note_dtor("_ZN3ccc9CC7x12y14E", this);} // tgen
ccc::CC7x12y14 ::CC7x12y14(){ note_ctor("_ZN3ccc9CC7x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC7x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x12y14E, buf);
    ::ccc::CC7x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x12y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC7x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x12y14E);
    dp->::ccc::CC7x12y14::~CC7x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x12y14E(Test__ZN3ccc9CC7x12y14E, "_ZN3ccc9CC7x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x12y14C1Ev();
extern void _ZN3ccc9CC7x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC7x12y14E[] = {
  NSPAIR(_ZN3ccc9CC7x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC7x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC7x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC7x12y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x12y143pqrEv,_ZTv0_n16_N3ccc9CC7x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x12y143pqrEv,_ZThn4_N3ccc9CC7x12y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x12y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x12y143pqrEv,_ZTv0_n16_N3ccc9CC7x12y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x12y14E[] = {
  {&(_ZTVN3ccc9CC7x12y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x12y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x12y14E[];
static VTBL_ENTRY alt_thunk_names1122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x12y143pqrEv,_ZTv0_n16_N3ccc9CC7x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x12y143pqrEv,_ZThn4_N3ccc9CC7x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x12y14E = {  "_ZN3ccc9CC7x12y14E", // class name
  bases__ZN3ccc9CC7x12y14E, 2,
  &(vtc__ZN3ccc9CC7x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x12y14E),2, //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  DD7x12y14  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD7x12y143pqrEv
  ~DD7x12y14(); // tgen
  DD7x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD7x12y14E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD7x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x12y143pqrEv");}
ccc::DD7x12y14 ::~DD7x12y14(){ note_dtor("_ZN3ccc9DD7x12y14E", this);} // tgen
ccc::DD7x12y14 ::DD7x12y14(){ note_ctor("_ZN3ccc9DD7x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD7x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x12y14E, buf);
    ::ccc::DD7x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x12y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD7x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x12y14E);
    dp->::ccc::DD7x12y14::~DD7x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x12y14E(Test__ZN3ccc9DD7x12y14E, "_ZN3ccc9DD7x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x12y14C1Ev();
extern void _ZN3ccc9DD7x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD7x12y14E[] = {
  NSPAIR(_ZN3ccc9DD7x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD7x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD7x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x12y14E[] = {
  {&(_ZTVN3ccc9DD7x12y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y14E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x12y14E[];
Class_Descriptor cd__ZN3ccc9DD7x12y14E = {  "_ZN3ccc9DD7x12y14E", // class name
  bases__ZN3ccc9DD7x12y14E, 2,
  &(vtc__ZN3ccc9DD7x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x12y14E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x12y14E),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  CC7x12y15  : virtual ::ccc::AA7 , ::ccc::BB12 {
  ~CC7x12y15(); // tgen
  CC7x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x12y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC7x12y15 ::~CC7x12y15(){ note_dtor("_ZN3ccc9CC7x12y15E", this);} // tgen
ccc::CC7x12y15 ::CC7x12y15(){ note_ctor("_ZN3ccc9CC7x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC7x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x12y15E, buf);
    ::ccc::CC7x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x12y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC7x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x12y15E);
    dp->::ccc::CC7x12y15::~CC7x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x12y15E(Test__ZN3ccc9CC7x12y15E, "_ZN3ccc9CC7x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x12y15C1Ev();
extern void _ZN3ccc9CC7x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC7x12y15E[] = {
  NSPAIR(_ZN3ccc9CC7x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC7x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC7x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x12y15E[] = {
  {&(_ZTVN3ccc9CC7x12y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC7x12y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x12y15E[];
Class_Descriptor cd__ZN3ccc9CC7x12y15E = {  "_ZN3ccc9CC7x12y15E", // class name
  bases__ZN3ccc9CC7x12y15E, 2,
  &(vtc__ZN3ccc9CC7x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x12y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x12y15E),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  DD7x12y15  : virtual ::ccc::AA7 , virtual ::ccc::BB12 {
  ~DD7x12y15(); // tgen
  DD7x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD7x12y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD7x12y15 ::~DD7x12y15(){ note_dtor("_ZN3ccc9DD7x12y15E", this);} // tgen
ccc::DD7x12y15 ::DD7x12y15(){ note_ctor("_ZN3ccc9DD7x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD7x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x12y15E, buf);
    ::ccc::DD7x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x12y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD7x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x12y15E);
    dp->::ccc::DD7x12y15::~DD7x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x12y15E(Test__ZN3ccc9DD7x12y15E, "_ZN3ccc9DD7x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x12y15C1Ev();
extern void _ZN3ccc9DD7x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD7x12y15E[] = {
  NSPAIR(_ZN3ccc9DD7x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD7x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD7x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x12y15E[] = {
  {&(_ZTVN3ccc9DD7x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x12y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x12y15E[];
Class_Descriptor cd__ZN3ccc9DD7x12y15E = {  "_ZN3ccc9DD7x12y15E", // class name
  bases__ZN3ccc9DD7x12y15E, 2,
  &(vtc__ZN3ccc9DD7x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x12y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x12y15E),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  CC7x13y0  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y03pqrEv
  ~CC7x13y0(); // tgen
  CC7x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y0E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y03abcEv");}
void  ccc::CC7x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y03efgEv");}
void  ccc::CC7x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y03pqrEv");}
ccc::CC7x13y0 ::~CC7x13y0(){ note_dtor("_ZN3ccc8CC7x13y0E", this);} // tgen
ccc::CC7x13y0 ::CC7x13y0(){ note_ctor("_ZN3ccc8CC7x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y0E, buf);
    ::ccc::CC7x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y0E);
    dp->::ccc::CC7x13y0::~CC7x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y0E(Test__ZN3ccc8CC7x13y0E, "_ZN3ccc8CC7x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y0C1Ev();
extern void _ZN3ccc8CC7x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y0E[] = {
  NSPAIR(_ZN3ccc8CC7x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y0E[];
extern void _ZN3ccc8CC7x13y03efgEv();
extern void _ZN3ccc8CC7x13y03abcEv();
extern void _ZN3ccc8CC7x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y03abcEv,_ZTv0_n12_N3ccc8CC7x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y03abcEv,_ZThn4_N3ccc8CC7x13y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y03pqrEv,_ZTv0_n16_N3ccc8CC7x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y03pqrEv,_ZThn4_N3ccc8CC7x13y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y03abcEv,_ZTv0_n12_N3ccc8CC7x13y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y03pqrEv,_ZTv0_n16_N3ccc8CC7x13y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y0E[] = {
  {&(_ZTVN3ccc8CC7x13y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y0E[];
static VTBL_ENTRY alt_thunk_names1123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y03pqrEv,_ZTv0_n16_N3ccc8CC7x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y03pqrEv,_ZThn4_N3ccc8CC7x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y03abcEv,_ZTv0_n12_N3ccc8CC7x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y03abcEv,_ZThn4_N3ccc8CC7x13y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y0E = {  "_ZN3ccc8CC7x13y0E", // class name
  bases__ZN3ccc8CC7x13y0E, 2,
  &(vtc__ZN3ccc8CC7x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y0E),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  DD7x13y0  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD7x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD7x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x13y03pqrEv
  ~DD7x13y0(); // tgen
  DD7x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y0E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y03abcEv");}
void  ccc::DD7x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y03efgEv");}
void  ccc::DD7x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y03pqrEv");}
ccc::DD7x13y0 ::~DD7x13y0(){ note_dtor("_ZN3ccc8DD7x13y0E", this);} // tgen
ccc::DD7x13y0 ::DD7x13y0(){ note_ctor("_ZN3ccc8DD7x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y0E, buf);
    ::ccc::DD7x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y0E);
    dp->::ccc::DD7x13y0::~DD7x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y0E(Test__ZN3ccc8DD7x13y0E, "_ZN3ccc8DD7x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y0C1Ev();
extern void _ZN3ccc8DD7x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y0E[] = {
  NSPAIR(_ZN3ccc8DD7x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y0E[];
extern void _ZN3ccc8DD7x13y03abcEv();
extern void _ZN3ccc8DD7x13y03pqrEv();
extern void _ZN3ccc8DD7x13y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y03efgEv,_ZTv0_n12_N3ccc8DD7x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y03efgEv,_ZThn4_N3ccc8DD7x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y03efgEv,_ZTv0_n12_N3ccc8DD7x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y0E[] = {
  {&(_ZTVN3ccc8DD7x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y0E[];
static VTBL_ENTRY alt_thunk_names1124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y03efgEv,_ZTv0_n12_N3ccc8DD7x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y03efgEv,_ZThn4_N3ccc8DD7x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y0E = {  "_ZN3ccc8DD7x13y0E", // class name
  bases__ZN3ccc8DD7x13y0E, 2,
  &(vtc__ZN3ccc8DD7x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y0E),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  CC7x13y1  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x13y13efgEv
  ~CC7x13y1(); // tgen
  CC7x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y1E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y13abcEv");}
void  ccc::CC7x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y13pqrEv");}
void  ccc::CC7x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y13efgEv");}
ccc::CC7x13y1 ::~CC7x13y1(){ note_dtor("_ZN3ccc8CC7x13y1E", this);} // tgen
ccc::CC7x13y1 ::CC7x13y1(){ note_ctor("_ZN3ccc8CC7x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y1E, buf);
    ::ccc::CC7x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y1E);
    dp->::ccc::CC7x13y1::~CC7x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y1E(Test__ZN3ccc8CC7x13y1E, "_ZN3ccc8CC7x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y1C1Ev();
extern void _ZN3ccc8CC7x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y1E[] = {
  NSPAIR(_ZN3ccc8CC7x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y1E[];
extern void _ZN3ccc8CC7x13y13efgEv();
extern void _ZN3ccc8CC7x13y13abcEv();
extern void _ZN3ccc8CC7x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y13abcEv,_ZTv0_n12_N3ccc8CC7x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y13abcEv,_ZThn4_N3ccc8CC7x13y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y13pqrEv,_ZTv0_n16_N3ccc8CC7x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y13pqrEv,_ZThn4_N3ccc8CC7x13y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y13abcEv,_ZTv0_n12_N3ccc8CC7x13y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y13pqrEv,_ZTv0_n16_N3ccc8CC7x13y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y1E[] = {
  {&(_ZTVN3ccc8CC7x13y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y1E[];
static VTBL_ENTRY alt_thunk_names1125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y13pqrEv,_ZTv0_n16_N3ccc8CC7x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y13pqrEv,_ZThn4_N3ccc8CC7x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y13abcEv,_ZTv0_n12_N3ccc8CC7x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y13abcEv,_ZThn4_N3ccc8CC7x13y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y1E = {  "_ZN3ccc8CC7x13y1E", // class name
  bases__ZN3ccc8CC7x13y1E, 2,
  &(vtc__ZN3ccc8CC7x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y1E),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  DD7x13y1  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD7x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x13y13efgEv
  ~DD7x13y1(); // tgen
  DD7x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y1E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y13abcEv");}
void  ccc::DD7x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y13pqrEv");}
void  ccc::DD7x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y13efgEv");}
ccc::DD7x13y1 ::~DD7x13y1(){ note_dtor("_ZN3ccc8DD7x13y1E", this);} // tgen
ccc::DD7x13y1 ::DD7x13y1(){ note_ctor("_ZN3ccc8DD7x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y1E, buf);
    ::ccc::DD7x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y1E);
    dp->::ccc::DD7x13y1::~DD7x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y1E(Test__ZN3ccc8DD7x13y1E, "_ZN3ccc8DD7x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y1C1Ev();
extern void _ZN3ccc8DD7x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y1E[] = {
  NSPAIR(_ZN3ccc8DD7x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y1E[];
extern void _ZN3ccc8DD7x13y13abcEv();
extern void _ZN3ccc8DD7x13y13pqrEv();
extern void _ZN3ccc8DD7x13y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y13efgEv,_ZTv0_n12_N3ccc8DD7x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y13efgEv,_ZThn4_N3ccc8DD7x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y13efgEv,_ZTv0_n12_N3ccc8DD7x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y1E[] = {
  {&(_ZTVN3ccc8DD7x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y1E[];
static VTBL_ENTRY alt_thunk_names1126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y13efgEv,_ZTv0_n12_N3ccc8DD7x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y13efgEv,_ZThn4_N3ccc8DD7x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y1E = {  "_ZN3ccc8DD7x13y1E", // class name
  bases__ZN3ccc8DD7x13y1E, 2,
  &(vtc__ZN3ccc8DD7x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y1E),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  CC7x13y2  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y23pqrEv
  ~CC7x13y2(); // tgen
  CC7x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y2E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y23efgEv");}
void  ccc::CC7x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y23abcEv");}
void  ccc::CC7x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y23pqrEv");}
ccc::CC7x13y2 ::~CC7x13y2(){ note_dtor("_ZN3ccc8CC7x13y2E", this);} // tgen
ccc::CC7x13y2 ::CC7x13y2(){ note_ctor("_ZN3ccc8CC7x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y2E, buf);
    ::ccc::CC7x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y2E);
    dp->::ccc::CC7x13y2::~CC7x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y2E(Test__ZN3ccc8CC7x13y2E, "_ZN3ccc8CC7x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y2C1Ev();
extern void _ZN3ccc8CC7x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y2E[] = {
  NSPAIR(_ZN3ccc8CC7x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y2E[];
extern void _ZN3ccc8CC7x13y23efgEv();
extern void _ZN3ccc8CC7x13y23abcEv();
extern void _ZN3ccc8CC7x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y23abcEv,_ZTv0_n12_N3ccc8CC7x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y23abcEv,_ZThn4_N3ccc8CC7x13y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y23pqrEv,_ZTv0_n16_N3ccc8CC7x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y23pqrEv,_ZThn4_N3ccc8CC7x13y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y23abcEv,_ZTv0_n12_N3ccc8CC7x13y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y23pqrEv,_ZTv0_n16_N3ccc8CC7x13y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y2E[] = {
  {&(_ZTVN3ccc8CC7x13y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y2E[];
static VTBL_ENTRY alt_thunk_names1127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y23pqrEv,_ZTv0_n16_N3ccc8CC7x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y23pqrEv,_ZThn4_N3ccc8CC7x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y23abcEv,_ZTv0_n12_N3ccc8CC7x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y23abcEv,_ZThn4_N3ccc8CC7x13y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y2E = {  "_ZN3ccc8CC7x13y2E", // class name
  bases__ZN3ccc8CC7x13y2E, 2,
  &(vtc__ZN3ccc8CC7x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y2E),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  DD7x13y2  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD7x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD7x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x13y23pqrEv
  ~DD7x13y2(); // tgen
  DD7x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y2E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y23efgEv");}
void  ccc::DD7x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y23abcEv");}
void  ccc::DD7x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y23pqrEv");}
ccc::DD7x13y2 ::~DD7x13y2(){ note_dtor("_ZN3ccc8DD7x13y2E", this);} // tgen
ccc::DD7x13y2 ::DD7x13y2(){ note_ctor("_ZN3ccc8DD7x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y2E, buf);
    ::ccc::DD7x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y2E);
    dp->::ccc::DD7x13y2::~DD7x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y2E(Test__ZN3ccc8DD7x13y2E, "_ZN3ccc8DD7x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y2C1Ev();
extern void _ZN3ccc8DD7x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y2E[] = {
  NSPAIR(_ZN3ccc8DD7x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y2E[];
extern void _ZN3ccc8DD7x13y23abcEv();
extern void _ZN3ccc8DD7x13y23pqrEv();
extern void _ZN3ccc8DD7x13y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y23efgEv,_ZTv0_n12_N3ccc8DD7x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y23efgEv,_ZThn4_N3ccc8DD7x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y23efgEv,_ZTv0_n12_N3ccc8DD7x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y2E[] = {
  {&(_ZTVN3ccc8DD7x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y2E[];
static VTBL_ENTRY alt_thunk_names1128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y23efgEv,_ZTv0_n12_N3ccc8DD7x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y23efgEv,_ZThn4_N3ccc8DD7x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y2E = {  "_ZN3ccc8DD7x13y2E", // class name
  bases__ZN3ccc8DD7x13y2E, 2,
  &(vtc__ZN3ccc8DD7x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y2E),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  CC7x13y3  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x13y33abcEv
  ~CC7x13y3(); // tgen
  CC7x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y3E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y33efgEv");}
void  ccc::CC7x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y33pqrEv");}
void  ccc::CC7x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y33abcEv");}
ccc::CC7x13y3 ::~CC7x13y3(){ note_dtor("_ZN3ccc8CC7x13y3E", this);} // tgen
ccc::CC7x13y3 ::CC7x13y3(){ note_ctor("_ZN3ccc8CC7x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y3E, buf);
    ::ccc::CC7x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y3E);
    dp->::ccc::CC7x13y3::~CC7x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y3E(Test__ZN3ccc8CC7x13y3E, "_ZN3ccc8CC7x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y3C1Ev();
extern void _ZN3ccc8CC7x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y3E[] = {
  NSPAIR(_ZN3ccc8CC7x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y3E[];
extern void _ZN3ccc8CC7x13y33efgEv();
extern void _ZN3ccc8CC7x13y33pqrEv();
extern void _ZN3ccc8CC7x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y33abcEv,_ZTv0_n12_N3ccc8CC7x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y33abcEv,_ZThn4_N3ccc8CC7x13y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y33pqrEv,_ZTv0_n16_N3ccc8CC7x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y33pqrEv,_ZThn4_N3ccc8CC7x13y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y33abcEv,_ZTv0_n12_N3ccc8CC7x13y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y33pqrEv,_ZTv0_n16_N3ccc8CC7x13y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y3E[] = {
  {&(_ZTVN3ccc8CC7x13y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y3E[];
static VTBL_ENTRY alt_thunk_names1129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y33pqrEv,_ZTv0_n16_N3ccc8CC7x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y33pqrEv,_ZThn4_N3ccc8CC7x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y33abcEv,_ZTv0_n12_N3ccc8CC7x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y33abcEv,_ZThn4_N3ccc8CC7x13y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y3E = {  "_ZN3ccc8CC7x13y3E", // class name
  bases__ZN3ccc8CC7x13y3E, 2,
  &(vtc__ZN3ccc8CC7x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y3E),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  DD7x13y3  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD7x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x13y33abcEv
  ~DD7x13y3(); // tgen
  DD7x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y3E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y33efgEv");}
void  ccc::DD7x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y33pqrEv");}
void  ccc::DD7x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y33abcEv");}
ccc::DD7x13y3 ::~DD7x13y3(){ note_dtor("_ZN3ccc8DD7x13y3E", this);} // tgen
ccc::DD7x13y3 ::DD7x13y3(){ note_ctor("_ZN3ccc8DD7x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y3E, buf);
    ::ccc::DD7x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y3E);
    dp->::ccc::DD7x13y3::~DD7x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y3E(Test__ZN3ccc8DD7x13y3E, "_ZN3ccc8DD7x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y3C1Ev();
extern void _ZN3ccc8DD7x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y3E[] = {
  NSPAIR(_ZN3ccc8DD7x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y3E[];
extern void _ZN3ccc8DD7x13y33abcEv();
extern void _ZN3ccc8DD7x13y33pqrEv();
extern void _ZN3ccc8DD7x13y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y33efgEv,_ZTv0_n12_N3ccc8DD7x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y33efgEv,_ZThn4_N3ccc8DD7x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y33efgEv,_ZTv0_n12_N3ccc8DD7x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y3E[] = {
  {&(_ZTVN3ccc8DD7x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y3E[];
static VTBL_ENTRY alt_thunk_names1130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y33efgEv,_ZTv0_n12_N3ccc8DD7x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y33efgEv,_ZThn4_N3ccc8DD7x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y3E = {  "_ZN3ccc8DD7x13y3E", // class name
  bases__ZN3ccc8DD7x13y3E, 2,
  &(vtc__ZN3ccc8DD7x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y3E),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  CC7x13y4  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC7x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x13y43efgEv
  ~CC7x13y4(); // tgen
  CC7x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y4E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y43pqrEv");}
void  ccc::CC7x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y43abcEv");}
void  ccc::CC7x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y43efgEv");}
ccc::CC7x13y4 ::~CC7x13y4(){ note_dtor("_ZN3ccc8CC7x13y4E", this);} // tgen
ccc::CC7x13y4 ::CC7x13y4(){ note_ctor("_ZN3ccc8CC7x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y4E, buf);
    ::ccc::CC7x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y4E);
    dp->::ccc::CC7x13y4::~CC7x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y4E(Test__ZN3ccc8CC7x13y4E, "_ZN3ccc8CC7x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y4C1Ev();
extern void _ZN3ccc8CC7x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y4E[] = {
  NSPAIR(_ZN3ccc8CC7x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y4E[];
extern void _ZN3ccc8CC7x13y43efgEv();
extern void _ZN3ccc8CC7x13y43pqrEv();
extern void _ZN3ccc8CC7x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y43abcEv,_ZTv0_n12_N3ccc8CC7x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y43abcEv,_ZThn4_N3ccc8CC7x13y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y43pqrEv,_ZTv0_n16_N3ccc8CC7x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y43pqrEv,_ZThn4_N3ccc8CC7x13y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y43abcEv,_ZTv0_n12_N3ccc8CC7x13y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y43pqrEv,_ZTv0_n16_N3ccc8CC7x13y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y4E[] = {
  {&(_ZTVN3ccc8CC7x13y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y4E[];
static VTBL_ENTRY alt_thunk_names1131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y43pqrEv,_ZTv0_n16_N3ccc8CC7x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y43pqrEv,_ZThn4_N3ccc8CC7x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y43abcEv,_ZTv0_n12_N3ccc8CC7x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y43abcEv,_ZThn4_N3ccc8CC7x13y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y4E = {  "_ZN3ccc8CC7x13y4E", // class name
  bases__ZN3ccc8CC7x13y4E, 2,
  &(vtc__ZN3ccc8CC7x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y4E),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  DD7x13y4  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD7x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD7x13y43efgEv
  ~DD7x13y4(); // tgen
  DD7x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y4E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y43pqrEv");}
void  ccc::DD7x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y43abcEv");}
void  ccc::DD7x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y43efgEv");}
ccc::DD7x13y4 ::~DD7x13y4(){ note_dtor("_ZN3ccc8DD7x13y4E", this);} // tgen
ccc::DD7x13y4 ::DD7x13y4(){ note_ctor("_ZN3ccc8DD7x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y4E, buf);
    ::ccc::DD7x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y4E);
    dp->::ccc::DD7x13y4::~DD7x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y4E(Test__ZN3ccc8DD7x13y4E, "_ZN3ccc8DD7x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y4C1Ev();
extern void _ZN3ccc8DD7x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y4E[] = {
  NSPAIR(_ZN3ccc8DD7x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y4E[];
extern void _ZN3ccc8DD7x13y43abcEv();
extern void _ZN3ccc8DD7x13y43pqrEv();
extern void _ZN3ccc8DD7x13y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y43efgEv,_ZTv0_n12_N3ccc8DD7x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y43efgEv,_ZThn4_N3ccc8DD7x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y43efgEv,_ZTv0_n12_N3ccc8DD7x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y4E[] = {
  {&(_ZTVN3ccc8DD7x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y4E[];
static VTBL_ENTRY alt_thunk_names1132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y43efgEv,_ZTv0_n12_N3ccc8DD7x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y43efgEv,_ZThn4_N3ccc8DD7x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y4E = {  "_ZN3ccc8DD7x13y4E", // class name
  bases__ZN3ccc8DD7x13y4E, 2,
  &(vtc__ZN3ccc8DD7x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y4E),3, //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  CC7x13y5  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC7x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x13y53abcEv
  ~CC7x13y5(); // tgen
  CC7x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y5E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y53pqrEv");}
void  ccc::CC7x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y53efgEv");}
void  ccc::CC7x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y53abcEv");}
ccc::CC7x13y5 ::~CC7x13y5(){ note_dtor("_ZN3ccc8CC7x13y5E", this);} // tgen
ccc::CC7x13y5 ::CC7x13y5(){ note_ctor("_ZN3ccc8CC7x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y5E, buf);
    ::ccc::CC7x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y5E);
    dp->::ccc::CC7x13y5::~CC7x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y5E(Test__ZN3ccc8CC7x13y5E, "_ZN3ccc8CC7x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y5C1Ev();
extern void _ZN3ccc8CC7x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y5E[] = {
  NSPAIR(_ZN3ccc8CC7x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y5E[];
extern void _ZN3ccc8CC7x13y53efgEv();
extern void _ZN3ccc8CC7x13y53pqrEv();
extern void _ZN3ccc8CC7x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y53abcEv,_ZTv0_n12_N3ccc8CC7x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y53abcEv,_ZThn4_N3ccc8CC7x13y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y53pqrEv,_ZTv0_n16_N3ccc8CC7x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y53pqrEv,_ZThn4_N3ccc8CC7x13y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y53abcEv,_ZTv0_n12_N3ccc8CC7x13y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y53pqrEv,_ZTv0_n16_N3ccc8CC7x13y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y5E[] = {
  {&(_ZTVN3ccc8CC7x13y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y5E[];
static VTBL_ENTRY alt_thunk_names1133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y53pqrEv,_ZTv0_n16_N3ccc8CC7x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y53pqrEv,_ZThn4_N3ccc8CC7x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y53abcEv,_ZTv0_n12_N3ccc8CC7x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y53abcEv,_ZThn4_N3ccc8CC7x13y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y5E = {  "_ZN3ccc8CC7x13y5E", // class name
  bases__ZN3ccc8CC7x13y5E, 2,
  &(vtc__ZN3ccc8CC7x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y5E),2, //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  DD7x13y5  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD7x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD7x13y53abcEv
  ~DD7x13y5(); // tgen
  DD7x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y5E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y53pqrEv");}
void  ccc::DD7x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y53efgEv");}
void  ccc::DD7x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y53abcEv");}
ccc::DD7x13y5 ::~DD7x13y5(){ note_dtor("_ZN3ccc8DD7x13y5E", this);} // tgen
ccc::DD7x13y5 ::DD7x13y5(){ note_ctor("_ZN3ccc8DD7x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y5E, buf);
    ::ccc::DD7x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y5E);
    dp->::ccc::DD7x13y5::~DD7x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y5E(Test__ZN3ccc8DD7x13y5E, "_ZN3ccc8DD7x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y5C1Ev();
extern void _ZN3ccc8DD7x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y5E[] = {
  NSPAIR(_ZN3ccc8DD7x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y5E[];
extern void _ZN3ccc8DD7x13y53abcEv();
extern void _ZN3ccc8DD7x13y53pqrEv();
extern void _ZN3ccc8DD7x13y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y53efgEv,_ZTv0_n12_N3ccc8DD7x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y53efgEv,_ZThn4_N3ccc8DD7x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y53efgEv,_ZTv0_n12_N3ccc8DD7x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y5E[] = {
  {&(_ZTVN3ccc8DD7x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y5E[];
static VTBL_ENTRY alt_thunk_names1134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y53efgEv,_ZTv0_n12_N3ccc8DD7x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y53efgEv,_ZThn4_N3ccc8DD7x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y5E = {  "_ZN3ccc8DD7x13y5E", // class name
  bases__ZN3ccc8DD7x13y5E, 2,
  &(vtc__ZN3ccc8DD7x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y5E),3, //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  CC7x13y6  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x13y63efgEv
  ~CC7x13y6(); // tgen
  CC7x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y6E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y63abcEv");}
void  ccc::CC7x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y63efgEv");}
ccc::CC7x13y6 ::~CC7x13y6(){ note_dtor("_ZN3ccc8CC7x13y6E", this);} // tgen
ccc::CC7x13y6 ::CC7x13y6(){ note_ctor("_ZN3ccc8CC7x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y6E, buf);
    ::ccc::CC7x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y6E);
    dp->::ccc::CC7x13y6::~CC7x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y6E(Test__ZN3ccc8CC7x13y6E, "_ZN3ccc8CC7x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y6C1Ev();
extern void _ZN3ccc8CC7x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y6E[] = {
  NSPAIR(_ZN3ccc8CC7x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y6E[];
extern void _ZN3ccc8CC7x13y63efgEv();
extern void _ZN3ccc8CC7x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y63abcEv,_ZTv0_n12_N3ccc8CC7x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y63abcEv,_ZThn4_N3ccc8CC7x13y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y63abcEv,_ZTv0_n12_N3ccc8CC7x13y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y6E[] = {
  {&(_ZTVN3ccc8CC7x13y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x13y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y6E[];
static VTBL_ENTRY alt_thunk_names1135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y63abcEv,_ZTv0_n12_N3ccc8CC7x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y63abcEv,_ZThn4_N3ccc8CC7x13y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y6E = {  "_ZN3ccc8CC7x13y6E", // class name
  bases__ZN3ccc8CC7x13y6E, 2,
  &(vtc__ZN3ccc8CC7x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y6E),2, //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  DD7x13y6  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD7x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD7x13y63efgEv
  ~DD7x13y6(); // tgen
  DD7x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y6E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y63abcEv");}
void  ccc::DD7x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y63efgEv");}
ccc::DD7x13y6 ::~DD7x13y6(){ note_dtor("_ZN3ccc8DD7x13y6E", this);} // tgen
ccc::DD7x13y6 ::DD7x13y6(){ note_ctor("_ZN3ccc8DD7x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y6E, buf);
    ::ccc::DD7x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y6E);
    dp->::ccc::DD7x13y6::~DD7x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y6E(Test__ZN3ccc8DD7x13y6E, "_ZN3ccc8DD7x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y6C1Ev();
extern void _ZN3ccc8DD7x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y6E[] = {
  NSPAIR(_ZN3ccc8DD7x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y6E[];
extern void _ZN3ccc8DD7x13y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x13y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y63efgEv,_ZTv0_n12_N3ccc8DD7x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y63efgEv,_ZThn4_N3ccc8DD7x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y63efgEv,_ZTv0_n12_N3ccc8DD7x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y6E[] = {
  {&(_ZTVN3ccc8DD7x13y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y6E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y6E[];
static VTBL_ENTRY alt_thunk_names1136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y63efgEv,_ZTv0_n12_N3ccc8DD7x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y63efgEv,_ZThn4_N3ccc8DD7x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y6E = {  "_ZN3ccc8DD7x13y6E", // class name
  bases__ZN3ccc8DD7x13y6E, 2,
  &(vtc__ZN3ccc8DD7x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y6E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y6E),3, //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  CC7x13y7  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC7x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y73pqrEv
  ~CC7x13y7(); // tgen
  CC7x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y7E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y73abcEv");}
void  ccc::CC7x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y73pqrEv");}
ccc::CC7x13y7 ::~CC7x13y7(){ note_dtor("_ZN3ccc8CC7x13y7E", this);} // tgen
ccc::CC7x13y7 ::CC7x13y7(){ note_ctor("_ZN3ccc8CC7x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y7E, buf);
    ::ccc::CC7x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y7E);
    dp->::ccc::CC7x13y7::~CC7x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y7E(Test__ZN3ccc8CC7x13y7E, "_ZN3ccc8CC7x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y7C1Ev();
extern void _ZN3ccc8CC7x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y7E[] = {
  NSPAIR(_ZN3ccc8CC7x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC7x13y73abcEv();
extern void _ZN3ccc8CC7x13y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y73abcEv,_ZTv0_n12_N3ccc8CC7x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y73abcEv,_ZThn4_N3ccc8CC7x13y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y73pqrEv,_ZTv0_n16_N3ccc8CC7x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y73pqrEv,_ZThn4_N3ccc8CC7x13y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y73abcEv,_ZTv0_n12_N3ccc8CC7x13y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y73pqrEv,_ZTv0_n16_N3ccc8CC7x13y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y7E[] = {
  {&(_ZTVN3ccc8CC7x13y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x13y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y7E[];
static VTBL_ENTRY alt_thunk_names1137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y73pqrEv,_ZTv0_n16_N3ccc8CC7x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y73pqrEv,_ZThn4_N3ccc8CC7x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y73abcEv,_ZTv0_n12_N3ccc8CC7x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y73abcEv,_ZThn4_N3ccc8CC7x13y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y7E = {  "_ZN3ccc8CC7x13y7E", // class name
  bases__ZN3ccc8CC7x13y7E, 2,
  &(vtc__ZN3ccc8CC7x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y7E),2, //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  DD7x13y7  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD7x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x13y73pqrEv
  ~DD7x13y7(); // tgen
  DD7x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y7E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y73abcEv");}
void  ccc::DD7x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y73pqrEv");}
ccc::DD7x13y7 ::~DD7x13y7(){ note_dtor("_ZN3ccc8DD7x13y7E", this);} // tgen
ccc::DD7x13y7 ::DD7x13y7(){ note_ctor("_ZN3ccc8DD7x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y7E, buf);
    ::ccc::DD7x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y7E);
    dp->::ccc::DD7x13y7::~DD7x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y7E(Test__ZN3ccc8DD7x13y7E, "_ZN3ccc8DD7x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y7C1Ev();
extern void _ZN3ccc8DD7x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y7E[] = {
  NSPAIR(_ZN3ccc8DD7x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y7E[];
extern void _ZN3ccc8DD7x13y73abcEv();
extern void _ZN3ccc8DD7x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y7E[] = {
  {&(_ZTVN3ccc8DD7x13y7E[6]),  6,12},
  {&(_ZTVN3ccc8DD7x13y7E[6]),  6,12},
  {&(_ZTVN3ccc8DD7x13y7E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y7E[];
Class_Descriptor cd__ZN3ccc8DD7x13y7E = {  "_ZN3ccc8DD7x13y7E", // class name
  bases__ZN3ccc8DD7x13y7E, 2,
  &(vtc__ZN3ccc8DD7x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y7E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y7E),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  CC7x13y8  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x13y83abcEv
  ~CC7x13y8(); // tgen
  CC7x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y8E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y83efgEv");}
void  ccc::CC7x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x13y83abcEv");}
ccc::CC7x13y8 ::~CC7x13y8(){ note_dtor("_ZN3ccc8CC7x13y8E", this);} // tgen
ccc::CC7x13y8 ::CC7x13y8(){ note_ctor("_ZN3ccc8CC7x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y8E, buf);
    ::ccc::CC7x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y8E);
    dp->::ccc::CC7x13y8::~CC7x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y8E(Test__ZN3ccc8CC7x13y8E, "_ZN3ccc8CC7x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y8C1Ev();
extern void _ZN3ccc8CC7x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y8E[] = {
  NSPAIR(_ZN3ccc8CC7x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y8E[];
extern void _ZN3ccc8CC7x13y83efgEv();
extern void _ZN3ccc8CC7x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x13y83abcEv,_ZTv0_n12_N3ccc8CC7x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y83abcEv,_ZThn4_N3ccc8CC7x13y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x13y83abcEv,_ZTv0_n12_N3ccc8CC7x13y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y8E[] = {
  {&(_ZTVN3ccc8CC7x13y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x13y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y8E[];
static VTBL_ENTRY alt_thunk_names1138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x13y83abcEv,_ZTv0_n12_N3ccc8CC7x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y83abcEv,_ZThn4_N3ccc8CC7x13y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y8E = {  "_ZN3ccc8CC7x13y8E", // class name
  bases__ZN3ccc8CC7x13y8E, 2,
  &(vtc__ZN3ccc8CC7x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y8E),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  DD7x13y8  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD7x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD7x13y83abcEv
  ~DD7x13y8(); // tgen
  DD7x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y8E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y83efgEv");}
void  ccc::DD7x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x13y83abcEv");}
ccc::DD7x13y8 ::~DD7x13y8(){ note_dtor("_ZN3ccc8DD7x13y8E", this);} // tgen
ccc::DD7x13y8 ::DD7x13y8(){ note_ctor("_ZN3ccc8DD7x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y8E, buf);
    ::ccc::DD7x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y8E);
    dp->::ccc::DD7x13y8::~DD7x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y8E(Test__ZN3ccc8DD7x13y8E, "_ZN3ccc8DD7x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y8C1Ev();
extern void _ZN3ccc8DD7x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y8E[] = {
  NSPAIR(_ZN3ccc8DD7x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y8E[];
extern void _ZN3ccc8DD7x13y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x13y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y83efgEv,_ZTv0_n12_N3ccc8DD7x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y83efgEv,_ZThn4_N3ccc8DD7x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y83efgEv,_ZTv0_n12_N3ccc8DD7x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y8E[] = {
  {&(_ZTVN3ccc8DD7x13y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y8E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y8E[];
static VTBL_ENTRY alt_thunk_names1139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y83efgEv,_ZTv0_n12_N3ccc8DD7x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y83efgEv,_ZThn4_N3ccc8DD7x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y8E = {  "_ZN3ccc8DD7x13y8E", // class name
  bases__ZN3ccc8DD7x13y8E, 2,
  &(vtc__ZN3ccc8DD7x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y8E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y8E),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  CC7x13y9  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC7x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x13y93pqrEv
  ~CC7x13y9(); // tgen
  CC7x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x13y9E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x13y93efgEv");}
void  ccc::CC7x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x13y93pqrEv");}
ccc::CC7x13y9 ::~CC7x13y9(){ note_dtor("_ZN3ccc8CC7x13y9E", this);} // tgen
ccc::CC7x13y9 ::CC7x13y9(){ note_ctor("_ZN3ccc8CC7x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC7x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x13y9E, buf);
    ::ccc::CC7x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x13y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC7x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x13y9E);
    dp->::ccc::CC7x13y9::~CC7x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x13y9E(Test__ZN3ccc8CC7x13y9E, "_ZN3ccc8CC7x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x13y9C1Ev();
extern void _ZN3ccc8CC7x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC7x13y9E[] = {
  NSPAIR(_ZN3ccc8CC7x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC7x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC7x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x13y9E[];
extern void _ZN3ccc8CC7x13y93efgEv();
extern void _ZN3ccc8CC7x13y93pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x13y93pqrEv,_ZTv0_n16_N3ccc8CC7x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x13y93pqrEv,_ZThn4_N3ccc8CC7x13y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x13y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x13y93pqrEv,_ZTv0_n16_N3ccc8CC7x13y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x13y9E[] = {
  {&(_ZTVN3ccc8CC7x13y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x13y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x13y9E[];
static VTBL_ENTRY alt_thunk_names1140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x13y93pqrEv,_ZTv0_n16_N3ccc8CC7x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x13y93pqrEv,_ZThn4_N3ccc8CC7x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x13y9E = {  "_ZN3ccc8CC7x13y9E", // class name
  bases__ZN3ccc8CC7x13y9E, 2,
  &(vtc__ZN3ccc8CC7x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x13y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x13y9E),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  DD7x13y9  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD7x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x13y93pqrEv
  ~DD7x13y9(); // tgen
  DD7x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD7x13y9E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x13y93efgEv");}
void  ccc::DD7x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x13y93pqrEv");}
ccc::DD7x13y9 ::~DD7x13y9(){ note_dtor("_ZN3ccc8DD7x13y9E", this);} // tgen
ccc::DD7x13y9 ::DD7x13y9(){ note_ctor("_ZN3ccc8DD7x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD7x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x13y9E, buf);
    ::ccc::DD7x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x13y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD7x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x13y9E);
    dp->::ccc::DD7x13y9::~DD7x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x13y9E(Test__ZN3ccc8DD7x13y9E, "_ZN3ccc8DD7x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x13y9C1Ev();
extern void _ZN3ccc8DD7x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD7x13y9E[] = {
  NSPAIR(_ZN3ccc8DD7x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD7x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD7x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x13y93pqrEv();
extern void _ZN3ccc8DD7x13y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x13y93efgEv,_ZTv0_n12_N3ccc8DD7x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x13y93efgEv,_ZThn4_N3ccc8DD7x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x13y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x13y93efgEv,_ZTv0_n12_N3ccc8DD7x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x13y9E[] = {
  {&(_ZTVN3ccc8DD7x13y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x13y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x13y9E[];
static VTBL_ENTRY alt_thunk_names1141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x13y93efgEv,_ZTv0_n12_N3ccc8DD7x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x13y93efgEv,_ZThn4_N3ccc8DD7x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x13y9E = {  "_ZN3ccc8DD7x13y9E", // class name
  bases__ZN3ccc8DD7x13y9E, 2,
  &(vtc__ZN3ccc8DD7x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x13y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x13y9E),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  CC7x13y10  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC7x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x13y103abcEv
  ~CC7x13y10(); // tgen
  CC7x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y10E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC7x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x13y103pqrEv");}
void  ccc::CC7x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x13y103abcEv");}
ccc::CC7x13y10 ::~CC7x13y10(){ note_dtor("_ZN3ccc9CC7x13y10E", this);} // tgen
ccc::CC7x13y10 ::CC7x13y10(){ note_ctor("_ZN3ccc9CC7x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC7x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x13y10E, buf);
    ::ccc::CC7x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x13y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC7x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x13y10E);
    dp->::ccc::CC7x13y10::~CC7x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x13y10E(Test__ZN3ccc9CC7x13y10E, "_ZN3ccc9CC7x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x13y10C1Ev();
extern void _ZN3ccc9CC7x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC7x13y10E[] = {
  NSPAIR(_ZN3ccc9CC7x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC7x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC7x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC7x13y103pqrEv();
extern void _ZN3ccc9CC7x13y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x13y103abcEv,_ZTv0_n12_N3ccc9CC7x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y103abcEv,_ZThn4_N3ccc9CC7x13y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x13y103pqrEv,_ZTv0_n16_N3ccc9CC7x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y103pqrEv,_ZThn4_N3ccc9CC7x13y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x13y103abcEv,_ZTv0_n12_N3ccc9CC7x13y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x13y103pqrEv,_ZTv0_n16_N3ccc9CC7x13y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x13y10E[] = {
  {&(_ZTVN3ccc9CC7x13y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC7x13y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x13y10E[];
static VTBL_ENTRY alt_thunk_names1142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x13y103pqrEv,_ZTv0_n16_N3ccc9CC7x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x13y103pqrEv,_ZThn4_N3ccc9CC7x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x13y103abcEv,_ZTv0_n12_N3ccc9CC7x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x13y103abcEv,_ZThn4_N3ccc9CC7x13y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x13y10E = {  "_ZN3ccc9CC7x13y10E", // class name
  bases__ZN3ccc9CC7x13y10E, 2,
  &(vtc__ZN3ccc9CC7x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x13y10E),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  DD7x13y10  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD7x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD7x13y103abcEv
  ~DD7x13y10(); // tgen
  DD7x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD7x13y10E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD7x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x13y103pqrEv");}
void  ccc::DD7x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x13y103abcEv");}
ccc::DD7x13y10 ::~DD7x13y10(){ note_dtor("_ZN3ccc9DD7x13y10E", this);} // tgen
ccc::DD7x13y10 ::DD7x13y10(){ note_ctor("_ZN3ccc9DD7x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD7x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x13y10E, buf);
    ::ccc::DD7x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x13y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD7x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x13y10E);
    dp->::ccc::DD7x13y10::~DD7x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x13y10E(Test__ZN3ccc9DD7x13y10E, "_ZN3ccc9DD7x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x13y10C1Ev();
extern void _ZN3ccc9DD7x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD7x13y10E[] = {
  NSPAIR(_ZN3ccc9DD7x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD7x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD7x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y10E[];
extern void _ZN3ccc9DD7x13y103abcEv();
extern void _ZN3ccc9DD7x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y103pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x13y10E[] = {
  {&(_ZTVN3ccc9DD7x13y10E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y10E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y10E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x13y10E[];
Class_Descriptor cd__ZN3ccc9DD7x13y10E = {  "_ZN3ccc9DD7x13y10E", // class name
  bases__ZN3ccc9DD7x13y10E, 2,
  &(vtc__ZN3ccc9DD7x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x13y10E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x13y10E),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  CC7x13y11  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC7x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x13y113efgEv
  ~CC7x13y11(); // tgen
  CC7x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y11E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x13y113pqrEv");}
void  ccc::CC7x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x13y113efgEv");}
ccc::CC7x13y11 ::~CC7x13y11(){ note_dtor("_ZN3ccc9CC7x13y11E", this);} // tgen
ccc::CC7x13y11 ::CC7x13y11(){ note_ctor("_ZN3ccc9CC7x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC7x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x13y11E, buf);
    ::ccc::CC7x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x13y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC7x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x13y11E);
    dp->::ccc::CC7x13y11::~CC7x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x13y11E(Test__ZN3ccc9CC7x13y11E, "_ZN3ccc9CC7x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x13y11C1Ev();
extern void _ZN3ccc9CC7x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC7x13y11E[] = {
  NSPAIR(_ZN3ccc9CC7x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC7x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC7x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x13y11E[];
extern void _ZN3ccc9CC7x13y113efgEv();
extern void _ZN3ccc9CC7x13y113pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x13y113pqrEv,_ZTv0_n16_N3ccc9CC7x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y113pqrEv,_ZThn4_N3ccc9CC7x13y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x13y113pqrEv,_ZTv0_n16_N3ccc9CC7x13y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x13y11E[] = {
  {&(_ZTVN3ccc9CC7x13y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x13y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x13y11E[];
static VTBL_ENTRY alt_thunk_names1143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x13y113pqrEv,_ZTv0_n16_N3ccc9CC7x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x13y113pqrEv,_ZThn4_N3ccc9CC7x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x13y11E = {  "_ZN3ccc9CC7x13y11E", // class name
  bases__ZN3ccc9CC7x13y11E, 2,
  &(vtc__ZN3ccc9CC7x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x13y11E),2, //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  DD7x13y11  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD7x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD7x13y113efgEv
  ~DD7x13y11(); // tgen
  DD7x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD7x13y11E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x13y113pqrEv");}
void  ccc::DD7x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x13y113efgEv");}
ccc::DD7x13y11 ::~DD7x13y11(){ note_dtor("_ZN3ccc9DD7x13y11E", this);} // tgen
ccc::DD7x13y11 ::DD7x13y11(){ note_ctor("_ZN3ccc9DD7x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD7x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x13y11E, buf);
    ::ccc::DD7x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x13y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD7x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x13y11E);
    dp->::ccc::DD7x13y11::~DD7x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x13y11E(Test__ZN3ccc9DD7x13y11E, "_ZN3ccc9DD7x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x13y11C1Ev();
extern void _ZN3ccc9DD7x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD7x13y11E[] = {
  NSPAIR(_ZN3ccc9DD7x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD7x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD7x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x13y113pqrEv();
extern void _ZN3ccc9DD7x13y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x13y113efgEv,_ZTv0_n12_N3ccc9DD7x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x13y113efgEv,_ZThn4_N3ccc9DD7x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x13y113efgEv,_ZTv0_n12_N3ccc9DD7x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x13y11E[] = {
  {&(_ZTVN3ccc9DD7x13y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x13y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x13y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x13y11E[];
static VTBL_ENTRY alt_thunk_names1144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x13y113efgEv,_ZTv0_n12_N3ccc9DD7x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x13y113efgEv,_ZThn4_N3ccc9DD7x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x13y11E = {  "_ZN3ccc9DD7x13y11E", // class name
  bases__ZN3ccc9DD7x13y11E, 2,
  &(vtc__ZN3ccc9DD7x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x13y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x13y11E),3, //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  CC7x13y12  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC7x13y123abcEv
  ~CC7x13y12(); // tgen
  CC7x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y12E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC7x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x13y123abcEv");}
ccc::CC7x13y12 ::~CC7x13y12(){ note_dtor("_ZN3ccc9CC7x13y12E", this);} // tgen
ccc::CC7x13y12 ::CC7x13y12(){ note_ctor("_ZN3ccc9CC7x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC7x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x13y12E, buf);
    ::ccc::CC7x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x13y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC7x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x13y12E);
    dp->::ccc::CC7x13y12::~CC7x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x13y12E(Test__ZN3ccc9CC7x13y12E, "_ZN3ccc9CC7x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x13y12C1Ev();
extern void _ZN3ccc9CC7x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC7x13y12E[] = {
  NSPAIR(_ZN3ccc9CC7x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC7x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC7x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC7x13y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x13y123abcEv,_ZTv0_n12_N3ccc9CC7x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y123abcEv,_ZThn4_N3ccc9CC7x13y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x13y123abcEv,_ZTv0_n12_N3ccc9CC7x13y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x13y12E[] = {
  {&(_ZTVN3ccc9CC7x13y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x13y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x13y12E[];
static VTBL_ENTRY alt_thunk_names1145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x13y123abcEv,_ZTv0_n12_N3ccc9CC7x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x13y123abcEv,_ZThn4_N3ccc9CC7x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x13y12E = {  "_ZN3ccc9CC7x13y12E", // class name
  bases__ZN3ccc9CC7x13y12E, 2,
  &(vtc__ZN3ccc9CC7x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x13y12E),2, //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  DD7x13y12  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD7x13y123abcEv
  ~DD7x13y12(); // tgen
  DD7x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD7x13y12E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD7x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x13y123abcEv");}
ccc::DD7x13y12 ::~DD7x13y12(){ note_dtor("_ZN3ccc9DD7x13y12E", this);} // tgen
ccc::DD7x13y12 ::DD7x13y12(){ note_ctor("_ZN3ccc9DD7x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD7x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x13y12E, buf);
    ::ccc::DD7x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x13y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD7x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x13y12E);
    dp->::ccc::DD7x13y12::~DD7x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x13y12E(Test__ZN3ccc9DD7x13y12E, "_ZN3ccc9DD7x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x13y12C1Ev();
extern void _ZN3ccc9DD7x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD7x13y12E[] = {
  NSPAIR(_ZN3ccc9DD7x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD7x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD7x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y12E[];
extern void _ZN3ccc9DD7x13y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x13y12E[] = {
  {&(_ZTVN3ccc9DD7x13y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x13y12E[];
Class_Descriptor cd__ZN3ccc9DD7x13y12E = {  "_ZN3ccc9DD7x13y12E", // class name
  bases__ZN3ccc9DD7x13y12E, 2,
  &(vtc__ZN3ccc9DD7x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x13y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x13y12E),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  CC7x13y13  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC7x13y133efgEv
  ~CC7x13y13(); // tgen
  CC7x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y13E) C1{ VBC2{ v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC7x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x13y133efgEv");}
ccc::CC7x13y13 ::~CC7x13y13(){ note_dtor("_ZN3ccc9CC7x13y13E", this);} // tgen
ccc::CC7x13y13 ::CC7x13y13(){ note_ctor("_ZN3ccc9CC7x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC7x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x13y13E, buf);
    ::ccc::CC7x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x13y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC7x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x13y13E);
    dp->::ccc::CC7x13y13::~CC7x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x13y13E(Test__ZN3ccc9CC7x13y13E, "_ZN3ccc9CC7x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x13y13C1Ev();
extern void _ZN3ccc9CC7x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC7x13y13E[] = {
  NSPAIR(_ZN3ccc9CC7x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC7x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC7x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x13y13E[];
extern void _ZN3ccc9CC7x13y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x13y13E[] = {
  {&(_ZTVN3ccc9CC7x13y13E[3]),  3,10},
  {&(_ZTVN3ccc9CC7x13y13E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x13y13E[];
Class_Descriptor cd__ZN3ccc9CC7x13y13E = {  "_ZN3ccc9CC7x13y13E", // class name
  bases__ZN3ccc9CC7x13y13E, 2,
  &(vtc__ZN3ccc9CC7x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y13E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x13y13E),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  DD7x13y13  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD7x13y133efgEv
  ~DD7x13y13(); // tgen
  DD7x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD7x13y13E) C1{ VBC2{ v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD7x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x13y133efgEv");}
ccc::DD7x13y13 ::~DD7x13y13(){ note_dtor("_ZN3ccc9DD7x13y13E", this);} // tgen
ccc::DD7x13y13 ::DD7x13y13(){ note_ctor("_ZN3ccc9DD7x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD7x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x13y13E, buf);
    ::ccc::DD7x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x13y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD7x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x13y13E);
    dp->::ccc::DD7x13y13::~DD7x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x13y13E(Test__ZN3ccc9DD7x13y13E, "_ZN3ccc9DD7x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x13y13C1Ev();
extern void _ZN3ccc9DD7x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD7x13y13E[] = {
  NSPAIR(_ZN3ccc9DD7x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD7x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD7x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9DD7x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x13y133efgEv,_ZTv0_n12_N3ccc9DD7x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x13y133efgEv,_ZThn4_N3ccc9DD7x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y133efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x13y133efgEv,_ZTv0_n12_N3ccc9DD7x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x13y13E[] = {
  {&(_ZTVN3ccc9DD7x13y13E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x13y13E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x13y13E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x13y13E[];
static VTBL_ENTRY alt_thunk_names1146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x13y133efgEv,_ZTv0_n12_N3ccc9DD7x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x13y133efgEv,_ZThn4_N3ccc9DD7x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x13y13E = {  "_ZN3ccc9DD7x13y13E", // class name
  bases__ZN3ccc9DD7x13y13E, 2,
  &(vtc__ZN3ccc9DD7x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x13y13E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x13y13E),3, //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  CC7x13y14  : virtual ::ccc::AA7 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC7x13y143pqrEv
  ~CC7x13y14(); // tgen
  CC7x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y14E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC7x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x13y143pqrEv");}
ccc::CC7x13y14 ::~CC7x13y14(){ note_dtor("_ZN3ccc9CC7x13y14E", this);} // tgen
ccc::CC7x13y14 ::CC7x13y14(){ note_ctor("_ZN3ccc9CC7x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC7x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x13y14E, buf);
    ::ccc::CC7x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x13y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC7x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x13y14E);
    dp->::ccc::CC7x13y14::~CC7x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x13y14E(Test__ZN3ccc9CC7x13y14E, "_ZN3ccc9CC7x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x13y14C1Ev();
extern void _ZN3ccc9CC7x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC7x13y14E[] = {
  NSPAIR(_ZN3ccc9CC7x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC7x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC7x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC7x13y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x13y143pqrEv,_ZTv0_n16_N3ccc9CC7x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x13y143pqrEv,_ZThn4_N3ccc9CC7x13y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x13y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x13y143pqrEv,_ZTv0_n16_N3ccc9CC7x13y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x13y14E[] = {
  {&(_ZTVN3ccc9CC7x13y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x13y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x13y14E[];
static VTBL_ENTRY alt_thunk_names1147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x13y143pqrEv,_ZTv0_n16_N3ccc9CC7x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x13y143pqrEv,_ZThn4_N3ccc9CC7x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x13y14E = {  "_ZN3ccc9CC7x13y14E", // class name
  bases__ZN3ccc9CC7x13y14E, 2,
  &(vtc__ZN3ccc9CC7x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x13y14E),2, //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  DD7x13y14  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD7x13y143pqrEv
  ~DD7x13y14(); // tgen
  DD7x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD7x13y14E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD7x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x13y143pqrEv");}
ccc::DD7x13y14 ::~DD7x13y14(){ note_dtor("_ZN3ccc9DD7x13y14E", this);} // tgen
ccc::DD7x13y14 ::DD7x13y14(){ note_ctor("_ZN3ccc9DD7x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD7x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x13y14E, buf);
    ::ccc::DD7x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x13y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD7x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x13y14E);
    dp->::ccc::DD7x13y14::~DD7x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x13y14E(Test__ZN3ccc9DD7x13y14E, "_ZN3ccc9DD7x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x13y14C1Ev();
extern void _ZN3ccc9DD7x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD7x13y14E[] = {
  NSPAIR(_ZN3ccc9DD7x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD7x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD7x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x13y14E[] = {
  {&(_ZTVN3ccc9DD7x13y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y14E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x13y14E[];
Class_Descriptor cd__ZN3ccc9DD7x13y14E = {  "_ZN3ccc9DD7x13y14E", // class name
  bases__ZN3ccc9DD7x13y14E, 2,
  &(vtc__ZN3ccc9DD7x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x13y14E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x13y14E),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  CC7x13y15  : virtual ::ccc::AA7 , ::ccc::BB13 {
  ~CC7x13y15(); // tgen
  CC7x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x13y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC7x13y15 ::~CC7x13y15(){ note_dtor("_ZN3ccc9CC7x13y15E", this);} // tgen
ccc::CC7x13y15 ::CC7x13y15(){ note_ctor("_ZN3ccc9CC7x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC7x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x13y15E, buf);
    ::ccc::CC7x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x13y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC7x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x13y15E);
    dp->::ccc::CC7x13y15::~CC7x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x13y15E(Test__ZN3ccc9CC7x13y15E, "_ZN3ccc9CC7x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x13y15C1Ev();
extern void _ZN3ccc9CC7x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC7x13y15E[] = {
  NSPAIR(_ZN3ccc9CC7x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC7x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC7x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x13y15E[] = {
  {&(_ZTVN3ccc9CC7x13y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC7x13y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x13y15E[];
Class_Descriptor cd__ZN3ccc9CC7x13y15E = {  "_ZN3ccc9CC7x13y15E", // class name
  bases__ZN3ccc9CC7x13y15E, 2,
  &(vtc__ZN3ccc9CC7x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x13y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x13y15E),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  DD7x13y15  : virtual ::ccc::AA7 , virtual ::ccc::BB13 {
  ~DD7x13y15(); // tgen
  DD7x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD7x13y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD7x13y15 ::~DD7x13y15(){ note_dtor("_ZN3ccc9DD7x13y15E", this);} // tgen
ccc::DD7x13y15 ::DD7x13y15(){ note_ctor("_ZN3ccc9DD7x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD7x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x13y15E, buf);
    ::ccc::DD7x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x13y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD7x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x13y15E);
    dp->::ccc::DD7x13y15::~DD7x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x13y15E(Test__ZN3ccc9DD7x13y15E, "_ZN3ccc9DD7x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x13y15C1Ev();
extern void _ZN3ccc9DD7x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD7x13y15E[] = {
  NSPAIR(_ZN3ccc9DD7x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD7x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD7x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x13y15E[] = {
  {&(_ZTVN3ccc9DD7x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x13y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x13y15E[];
Class_Descriptor cd__ZN3ccc9DD7x13y15E = {  "_ZN3ccc9DD7x13y15E", // class name
  bases__ZN3ccc9DD7x13y15E, 2,
  &(vtc__ZN3ccc9DD7x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x13y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x13y15E),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  CC7x14y0  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y03pqrEv
  ~CC7x14y0(); // tgen
  CC7x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y0E) C1{ VBC2{ v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y03abcEv");}
void  ccc::CC7x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y03efgEv");}
void  ccc::CC7x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y03pqrEv");}
ccc::CC7x14y0 ::~CC7x14y0(){ note_dtor("_ZN3ccc8CC7x14y0E", this);} // tgen
ccc::CC7x14y0 ::CC7x14y0(){ note_ctor("_ZN3ccc8CC7x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y0E, buf);
    ::ccc::CC7x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y0E);
    dp->::ccc::CC7x14y0::~CC7x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y0E(Test__ZN3ccc8CC7x14y0E, "_ZN3ccc8CC7x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y0C1Ev();
extern void _ZN3ccc8CC7x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y0E[] = {
  NSPAIR(_ZN3ccc8CC7x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y0E[];
extern void _ZN3ccc8CC7x14y03pqrEv();
extern void _ZN3ccc8CC7x14y03abcEv();
extern void _ZN3ccc8CC7x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y03abcEv,_ZTv0_n12_N3ccc8CC7x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y03abcEv,_ZThn4_N3ccc8CC7x14y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y03pqrEv,_ZTv0_n16_N3ccc8CC7x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y03pqrEv,_ZThn4_N3ccc8CC7x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y03abcEv,_ZTv0_n12_N3ccc8CC7x14y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y03pqrEv,_ZTv0_n16_N3ccc8CC7x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y0E[] = {
  {&(_ZTVN3ccc8CC7x14y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y0E[];
static VTBL_ENTRY alt_thunk_names1148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y03pqrEv,_ZTv0_n16_N3ccc8CC7x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y03pqrEv,_ZThn4_N3ccc8CC7x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y03abcEv,_ZTv0_n12_N3ccc8CC7x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y03abcEv,_ZThn4_N3ccc8CC7x14y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y0E = {  "_ZN3ccc8CC7x14y0E", // class name
  bases__ZN3ccc8CC7x14y0E, 2,
  &(vtc__ZN3ccc8CC7x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y0E),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  DD7x14y0  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD7x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD7x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x14y03pqrEv
  ~DD7x14y0(); // tgen
  DD7x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y0E) C1{ VBC2{ v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y03abcEv");}
void  ccc::DD7x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y03efgEv");}
void  ccc::DD7x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y03pqrEv");}
ccc::DD7x14y0 ::~DD7x14y0(){ note_dtor("_ZN3ccc8DD7x14y0E", this);} // tgen
ccc::DD7x14y0 ::DD7x14y0(){ note_ctor("_ZN3ccc8DD7x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y0E, buf);
    ::ccc::DD7x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y0E);
    dp->::ccc::DD7x14y0::~DD7x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y0E(Test__ZN3ccc8DD7x14y0E, "_ZN3ccc8DD7x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y0C1Ev();
extern void _ZN3ccc8DD7x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y0E[] = {
  NSPAIR(_ZN3ccc8DD7x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y0E[];
extern void _ZN3ccc8DD7x14y03abcEv();
extern void _ZN3ccc8DD7x14y03pqrEv();
extern void _ZN3ccc8DD7x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y03pqrEv,_ZTv0_n12_N3ccc8DD7x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y03pqrEv,_ZThn4_N3ccc8DD7x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y03pqrEv,_ZTv0_n12_N3ccc8DD7x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y0E[] = {
  {&(_ZTVN3ccc8DD7x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y0E[];
static VTBL_ENTRY alt_thunk_names1149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y03pqrEv,_ZTv0_n12_N3ccc8DD7x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y03pqrEv,_ZThn4_N3ccc8DD7x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y0E = {  "_ZN3ccc8DD7x14y0E", // class name
  bases__ZN3ccc8DD7x14y0E, 2,
  &(vtc__ZN3ccc8DD7x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y0E),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  CC7x14y1  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x14y13efgEv
  ~CC7x14y1(); // tgen
  CC7x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y1E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y13abcEv");}
void  ccc::CC7x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y13pqrEv");}
void  ccc::CC7x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y13efgEv");}
ccc::CC7x14y1 ::~CC7x14y1(){ note_dtor("_ZN3ccc8CC7x14y1E", this);} // tgen
ccc::CC7x14y1 ::CC7x14y1(){ note_ctor("_ZN3ccc8CC7x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y1E, buf);
    ::ccc::CC7x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y1E);
    dp->::ccc::CC7x14y1::~CC7x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y1E(Test__ZN3ccc8CC7x14y1E, "_ZN3ccc8CC7x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y1C1Ev();
extern void _ZN3ccc8CC7x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y1E[] = {
  NSPAIR(_ZN3ccc8CC7x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y1E[];
extern void _ZN3ccc8CC7x14y13pqrEv();
extern void _ZN3ccc8CC7x14y13abcEv();
extern void _ZN3ccc8CC7x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y13abcEv,_ZTv0_n12_N3ccc8CC7x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y13abcEv,_ZThn4_N3ccc8CC7x14y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y13pqrEv,_ZTv0_n16_N3ccc8CC7x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y13pqrEv,_ZThn4_N3ccc8CC7x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y13abcEv,_ZTv0_n12_N3ccc8CC7x14y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y13pqrEv,_ZTv0_n16_N3ccc8CC7x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y1E[] = {
  {&(_ZTVN3ccc8CC7x14y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y1E[];
static VTBL_ENTRY alt_thunk_names1150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y13pqrEv,_ZTv0_n16_N3ccc8CC7x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y13pqrEv,_ZThn4_N3ccc8CC7x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y13abcEv,_ZTv0_n12_N3ccc8CC7x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y13abcEv,_ZThn4_N3ccc8CC7x14y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y1E = {  "_ZN3ccc8CC7x14y1E", // class name
  bases__ZN3ccc8CC7x14y1E, 2,
  &(vtc__ZN3ccc8CC7x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y1E),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  DD7x14y1  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD7x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x14y13efgEv
  ~DD7x14y1(); // tgen
  DD7x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y1E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y13abcEv");}
void  ccc::DD7x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y13pqrEv");}
void  ccc::DD7x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y13efgEv");}
ccc::DD7x14y1 ::~DD7x14y1(){ note_dtor("_ZN3ccc8DD7x14y1E", this);} // tgen
ccc::DD7x14y1 ::DD7x14y1(){ note_ctor("_ZN3ccc8DD7x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y1E, buf);
    ::ccc::DD7x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y1E);
    dp->::ccc::DD7x14y1::~DD7x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y1E(Test__ZN3ccc8DD7x14y1E, "_ZN3ccc8DD7x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y1C1Ev();
extern void _ZN3ccc8DD7x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y1E[] = {
  NSPAIR(_ZN3ccc8DD7x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y1E[];
extern void _ZN3ccc8DD7x14y13abcEv();
extern void _ZN3ccc8DD7x14y13pqrEv();
extern void _ZN3ccc8DD7x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y13pqrEv,_ZTv0_n12_N3ccc8DD7x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y13pqrEv,_ZThn4_N3ccc8DD7x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y13pqrEv,_ZTv0_n12_N3ccc8DD7x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y1E[] = {
  {&(_ZTVN3ccc8DD7x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y1E[];
static VTBL_ENTRY alt_thunk_names1151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y13pqrEv,_ZTv0_n12_N3ccc8DD7x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y13pqrEv,_ZThn4_N3ccc8DD7x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y1E = {  "_ZN3ccc8DD7x14y1E", // class name
  bases__ZN3ccc8DD7x14y1E, 2,
  &(vtc__ZN3ccc8DD7x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y1E),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  CC7x14y2  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y23pqrEv
  ~CC7x14y2(); // tgen
  CC7x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y2E) C1{ VBC2{ v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y23efgEv");}
void  ccc::CC7x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y23abcEv");}
void  ccc::CC7x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y23pqrEv");}
ccc::CC7x14y2 ::~CC7x14y2(){ note_dtor("_ZN3ccc8CC7x14y2E", this);} // tgen
ccc::CC7x14y2 ::CC7x14y2(){ note_ctor("_ZN3ccc8CC7x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y2E, buf);
    ::ccc::CC7x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y2E);
    dp->::ccc::CC7x14y2::~CC7x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y2E(Test__ZN3ccc8CC7x14y2E, "_ZN3ccc8CC7x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y2C1Ev();
extern void _ZN3ccc8CC7x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y2E[] = {
  NSPAIR(_ZN3ccc8CC7x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y2E[];
extern void _ZN3ccc8CC7x14y23pqrEv();
extern void _ZN3ccc8CC7x14y23efgEv();
extern void _ZN3ccc8CC7x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y23abcEv,_ZTv0_n12_N3ccc8CC7x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y23abcEv,_ZThn4_N3ccc8CC7x14y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y23pqrEv,_ZTv0_n16_N3ccc8CC7x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y23pqrEv,_ZThn4_N3ccc8CC7x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y23abcEv,_ZTv0_n12_N3ccc8CC7x14y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y23pqrEv,_ZTv0_n16_N3ccc8CC7x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y2E[] = {
  {&(_ZTVN3ccc8CC7x14y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y2E[];
static VTBL_ENTRY alt_thunk_names1152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y23pqrEv,_ZTv0_n16_N3ccc8CC7x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y23pqrEv,_ZThn4_N3ccc8CC7x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y23abcEv,_ZTv0_n12_N3ccc8CC7x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y23abcEv,_ZThn4_N3ccc8CC7x14y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y2E = {  "_ZN3ccc8CC7x14y2E", // class name
  bases__ZN3ccc8CC7x14y2E, 2,
  &(vtc__ZN3ccc8CC7x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y2E),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  DD7x14y2  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD7x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD7x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x14y23pqrEv
  ~DD7x14y2(); // tgen
  DD7x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y2E) C1{ VBC2{ v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y23efgEv");}
void  ccc::DD7x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y23abcEv");}
void  ccc::DD7x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y23pqrEv");}
ccc::DD7x14y2 ::~DD7x14y2(){ note_dtor("_ZN3ccc8DD7x14y2E", this);} // tgen
ccc::DD7x14y2 ::DD7x14y2(){ note_ctor("_ZN3ccc8DD7x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y2E, buf);
    ::ccc::DD7x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y2E);
    dp->::ccc::DD7x14y2::~DD7x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y2E(Test__ZN3ccc8DD7x14y2E, "_ZN3ccc8DD7x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y2C1Ev();
extern void _ZN3ccc8DD7x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y2E[] = {
  NSPAIR(_ZN3ccc8DD7x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y2E[];
extern void _ZN3ccc8DD7x14y23abcEv();
extern void _ZN3ccc8DD7x14y23pqrEv();
extern void _ZN3ccc8DD7x14y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y23pqrEv,_ZTv0_n12_N3ccc8DD7x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y23pqrEv,_ZThn4_N3ccc8DD7x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y23pqrEv,_ZTv0_n12_N3ccc8DD7x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y2E[] = {
  {&(_ZTVN3ccc8DD7x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y2E[];
static VTBL_ENTRY alt_thunk_names1153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y23pqrEv,_ZTv0_n12_N3ccc8DD7x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y23pqrEv,_ZThn4_N3ccc8DD7x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y2E = {  "_ZN3ccc8DD7x14y2E", // class name
  bases__ZN3ccc8DD7x14y2E, 2,
  &(vtc__ZN3ccc8DD7x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y2E),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  CC7x14y3  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x14y33abcEv
  ~CC7x14y3(); // tgen
  CC7x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y3E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y33efgEv");}
void  ccc::CC7x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y33pqrEv");}
void  ccc::CC7x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y33abcEv");}
ccc::CC7x14y3 ::~CC7x14y3(){ note_dtor("_ZN3ccc8CC7x14y3E", this);} // tgen
ccc::CC7x14y3 ::CC7x14y3(){ note_ctor("_ZN3ccc8CC7x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y3E, buf);
    ::ccc::CC7x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y3E);
    dp->::ccc::CC7x14y3::~CC7x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y3E(Test__ZN3ccc8CC7x14y3E, "_ZN3ccc8CC7x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y3C1Ev();
extern void _ZN3ccc8CC7x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y3E[] = {
  NSPAIR(_ZN3ccc8CC7x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y3E[];
extern void _ZN3ccc8CC7x14y33pqrEv();
extern void _ZN3ccc8CC7x14y33efgEv();
extern void _ZN3ccc8CC7x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y33abcEv,_ZTv0_n12_N3ccc8CC7x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y33abcEv,_ZThn4_N3ccc8CC7x14y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y33pqrEv,_ZTv0_n16_N3ccc8CC7x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y33pqrEv,_ZThn4_N3ccc8CC7x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y33abcEv,_ZTv0_n12_N3ccc8CC7x14y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y33pqrEv,_ZTv0_n16_N3ccc8CC7x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y3E[] = {
  {&(_ZTVN3ccc8CC7x14y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y3E[];
static VTBL_ENTRY alt_thunk_names1154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y33pqrEv,_ZTv0_n16_N3ccc8CC7x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y33pqrEv,_ZThn4_N3ccc8CC7x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y33abcEv,_ZTv0_n12_N3ccc8CC7x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y33abcEv,_ZThn4_N3ccc8CC7x14y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y3E = {  "_ZN3ccc8CC7x14y3E", // class name
  bases__ZN3ccc8CC7x14y3E, 2,
  &(vtc__ZN3ccc8CC7x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y3E),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  DD7x14y3  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD7x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x14y33abcEv
  ~DD7x14y3(); // tgen
  DD7x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y3E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y33efgEv");}
void  ccc::DD7x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y33pqrEv");}
void  ccc::DD7x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y33abcEv");}
ccc::DD7x14y3 ::~DD7x14y3(){ note_dtor("_ZN3ccc8DD7x14y3E", this);} // tgen
ccc::DD7x14y3 ::DD7x14y3(){ note_ctor("_ZN3ccc8DD7x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y3E, buf);
    ::ccc::DD7x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y3E);
    dp->::ccc::DD7x14y3::~DD7x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y3E(Test__ZN3ccc8DD7x14y3E, "_ZN3ccc8DD7x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y3C1Ev();
extern void _ZN3ccc8DD7x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y3E[] = {
  NSPAIR(_ZN3ccc8DD7x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y3E[];
extern void _ZN3ccc8DD7x14y33abcEv();
extern void _ZN3ccc8DD7x14y33pqrEv();
extern void _ZN3ccc8DD7x14y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y33pqrEv,_ZTv0_n12_N3ccc8DD7x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y33pqrEv,_ZThn4_N3ccc8DD7x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y33pqrEv,_ZTv0_n12_N3ccc8DD7x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y3E[] = {
  {&(_ZTVN3ccc8DD7x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y3E[];
static VTBL_ENTRY alt_thunk_names1155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y33pqrEv,_ZTv0_n12_N3ccc8DD7x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y33pqrEv,_ZThn4_N3ccc8DD7x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y3E = {  "_ZN3ccc8DD7x14y3E", // class name
  bases__ZN3ccc8DD7x14y3E, 2,
  &(vtc__ZN3ccc8DD7x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y3E),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  CC7x14y4  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC7x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x14y43efgEv
  ~CC7x14y4(); // tgen
  CC7x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y4E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y43pqrEv");}
void  ccc::CC7x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y43abcEv");}
void  ccc::CC7x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y43efgEv");}
ccc::CC7x14y4 ::~CC7x14y4(){ note_dtor("_ZN3ccc8CC7x14y4E", this);} // tgen
ccc::CC7x14y4 ::CC7x14y4(){ note_ctor("_ZN3ccc8CC7x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y4E, buf);
    ::ccc::CC7x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y4E);
    dp->::ccc::CC7x14y4::~CC7x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y4E(Test__ZN3ccc8CC7x14y4E, "_ZN3ccc8CC7x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y4C1Ev();
extern void _ZN3ccc8CC7x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y4E[] = {
  NSPAIR(_ZN3ccc8CC7x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y4E[];
extern void _ZN3ccc8CC7x14y43pqrEv();
extern void _ZN3ccc8CC7x14y43abcEv();
extern void _ZN3ccc8CC7x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y43abcEv,_ZTv0_n12_N3ccc8CC7x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y43abcEv,_ZThn4_N3ccc8CC7x14y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y43pqrEv,_ZTv0_n16_N3ccc8CC7x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y43pqrEv,_ZThn4_N3ccc8CC7x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y43abcEv,_ZTv0_n12_N3ccc8CC7x14y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y43pqrEv,_ZTv0_n16_N3ccc8CC7x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y4E[] = {
  {&(_ZTVN3ccc8CC7x14y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y4E[];
static VTBL_ENTRY alt_thunk_names1156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y43pqrEv,_ZTv0_n16_N3ccc8CC7x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y43pqrEv,_ZThn4_N3ccc8CC7x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y43abcEv,_ZTv0_n12_N3ccc8CC7x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y43abcEv,_ZThn4_N3ccc8CC7x14y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y4E = {  "_ZN3ccc8CC7x14y4E", // class name
  bases__ZN3ccc8CC7x14y4E, 2,
  &(vtc__ZN3ccc8CC7x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y4E),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  DD7x14y4  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD7x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD7x14y43efgEv
  ~DD7x14y4(); // tgen
  DD7x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y4E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y43pqrEv");}
void  ccc::DD7x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y43abcEv");}
void  ccc::DD7x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y43efgEv");}
ccc::DD7x14y4 ::~DD7x14y4(){ note_dtor("_ZN3ccc8DD7x14y4E", this);} // tgen
ccc::DD7x14y4 ::DD7x14y4(){ note_ctor("_ZN3ccc8DD7x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y4E, buf);
    ::ccc::DD7x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y4E);
    dp->::ccc::DD7x14y4::~DD7x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y4E(Test__ZN3ccc8DD7x14y4E, "_ZN3ccc8DD7x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y4C1Ev();
extern void _ZN3ccc8DD7x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y4E[] = {
  NSPAIR(_ZN3ccc8DD7x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y4E[];
extern void _ZN3ccc8DD7x14y43abcEv();
extern void _ZN3ccc8DD7x14y43pqrEv();
extern void _ZN3ccc8DD7x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y43pqrEv,_ZTv0_n12_N3ccc8DD7x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y43pqrEv,_ZThn4_N3ccc8DD7x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y43pqrEv,_ZTv0_n12_N3ccc8DD7x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y4E[] = {
  {&(_ZTVN3ccc8DD7x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y4E[];
static VTBL_ENTRY alt_thunk_names1157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y43pqrEv,_ZTv0_n12_N3ccc8DD7x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y43pqrEv,_ZThn4_N3ccc8DD7x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y4E = {  "_ZN3ccc8DD7x14y4E", // class name
  bases__ZN3ccc8DD7x14y4E, 2,
  &(vtc__ZN3ccc8DD7x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y4E),3, //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  CC7x14y5  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC7x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x14y53abcEv
  ~CC7x14y5(); // tgen
  CC7x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y5E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y53pqrEv");}
void  ccc::CC7x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y53efgEv");}
void  ccc::CC7x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y53abcEv");}
ccc::CC7x14y5 ::~CC7x14y5(){ note_dtor("_ZN3ccc8CC7x14y5E", this);} // tgen
ccc::CC7x14y5 ::CC7x14y5(){ note_ctor("_ZN3ccc8CC7x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y5E, buf);
    ::ccc::CC7x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y5E);
    dp->::ccc::CC7x14y5::~CC7x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y5E(Test__ZN3ccc8CC7x14y5E, "_ZN3ccc8CC7x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y5C1Ev();
extern void _ZN3ccc8CC7x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y5E[] = {
  NSPAIR(_ZN3ccc8CC7x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y5E[];
extern void _ZN3ccc8CC7x14y53pqrEv();
extern void _ZN3ccc8CC7x14y53efgEv();
extern void _ZN3ccc8CC7x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y53abcEv,_ZTv0_n12_N3ccc8CC7x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y53abcEv,_ZThn4_N3ccc8CC7x14y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y53pqrEv,_ZTv0_n16_N3ccc8CC7x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y53pqrEv,_ZThn4_N3ccc8CC7x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y53abcEv,_ZTv0_n12_N3ccc8CC7x14y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y53pqrEv,_ZTv0_n16_N3ccc8CC7x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y5E[] = {
  {&(_ZTVN3ccc8CC7x14y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y5E[];
static VTBL_ENTRY alt_thunk_names1158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y53pqrEv,_ZTv0_n16_N3ccc8CC7x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y53pqrEv,_ZThn4_N3ccc8CC7x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y53abcEv,_ZTv0_n12_N3ccc8CC7x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y53abcEv,_ZThn4_N3ccc8CC7x14y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y5E = {  "_ZN3ccc8CC7x14y5E", // class name
  bases__ZN3ccc8CC7x14y5E, 2,
  &(vtc__ZN3ccc8CC7x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y5E),2, //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  DD7x14y5  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD7x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD7x14y53abcEv
  ~DD7x14y5(); // tgen
  DD7x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y5E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y53pqrEv");}
void  ccc::DD7x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y53efgEv");}
void  ccc::DD7x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y53abcEv");}
ccc::DD7x14y5 ::~DD7x14y5(){ note_dtor("_ZN3ccc8DD7x14y5E", this);} // tgen
ccc::DD7x14y5 ::DD7x14y5(){ note_ctor("_ZN3ccc8DD7x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y5E, buf);
    ::ccc::DD7x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y5E);
    dp->::ccc::DD7x14y5::~DD7x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y5E(Test__ZN3ccc8DD7x14y5E, "_ZN3ccc8DD7x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y5C1Ev();
extern void _ZN3ccc8DD7x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y5E[] = {
  NSPAIR(_ZN3ccc8DD7x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y5E[];
extern void _ZN3ccc8DD7x14y53abcEv();
extern void _ZN3ccc8DD7x14y53pqrEv();
extern void _ZN3ccc8DD7x14y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y53pqrEv,_ZTv0_n12_N3ccc8DD7x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y53pqrEv,_ZThn4_N3ccc8DD7x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y53pqrEv,_ZTv0_n12_N3ccc8DD7x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y5E[] = {
  {&(_ZTVN3ccc8DD7x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y5E[];
static VTBL_ENTRY alt_thunk_names1159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y53pqrEv,_ZTv0_n12_N3ccc8DD7x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y53pqrEv,_ZThn4_N3ccc8DD7x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y5E = {  "_ZN3ccc8DD7x14y5E", // class name
  bases__ZN3ccc8DD7x14y5E, 2,
  &(vtc__ZN3ccc8DD7x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y5E),3, //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  CC7x14y6  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x14y63efgEv
  ~CC7x14y6(); // tgen
  CC7x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y6E) C1{ VBC2{ v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y63abcEv");}
void  ccc::CC7x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y63efgEv");}
ccc::CC7x14y6 ::~CC7x14y6(){ note_dtor("_ZN3ccc8CC7x14y6E", this);} // tgen
ccc::CC7x14y6 ::CC7x14y6(){ note_ctor("_ZN3ccc8CC7x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y6E, buf);
    ::ccc::CC7x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y6E);
    dp->::ccc::CC7x14y6::~CC7x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y6E(Test__ZN3ccc8CC7x14y6E, "_ZN3ccc8CC7x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y6C1Ev();
extern void _ZN3ccc8CC7x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y6E[] = {
  NSPAIR(_ZN3ccc8CC7x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC7x14y63abcEv();
extern void _ZN3ccc8CC7x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y63abcEv,_ZTv0_n12_N3ccc8CC7x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y63abcEv,_ZThn4_N3ccc8CC7x14y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y63abcEv,_ZTv0_n12_N3ccc8CC7x14y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y6E[] = {
  {&(_ZTVN3ccc8CC7x14y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y6E[];
static VTBL_ENTRY alt_thunk_names1160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y63abcEv,_ZTv0_n12_N3ccc8CC7x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y63abcEv,_ZThn4_N3ccc8CC7x14y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y6E = {  "_ZN3ccc8CC7x14y6E", // class name
  bases__ZN3ccc8CC7x14y6E, 2,
  &(vtc__ZN3ccc8CC7x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y6E),2, //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  DD7x14y6  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD7x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD7x14y63efgEv
  ~DD7x14y6(); // tgen
  DD7x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y6E) C1{ VBC2{ v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y63abcEv");}
void  ccc::DD7x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y63efgEv");}
ccc::DD7x14y6 ::~DD7x14y6(){ note_dtor("_ZN3ccc8DD7x14y6E", this);} // tgen
ccc::DD7x14y6 ::DD7x14y6(){ note_ctor("_ZN3ccc8DD7x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y6E, buf);
    ::ccc::DD7x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y6E);
    dp->::ccc::DD7x14y6::~DD7x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y6E(Test__ZN3ccc8DD7x14y6E, "_ZN3ccc8DD7x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y6C1Ev();
extern void _ZN3ccc8DD7x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y6E[] = {
  NSPAIR(_ZN3ccc8DD7x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y6E[];
extern void _ZN3ccc8DD7x14y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x14y63efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y6E[] = {
  {&(_ZTVN3ccc8DD7x14y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y6E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y6E[];
Class_Descriptor cd__ZN3ccc8DD7x14y6E = {  "_ZN3ccc8DD7x14y6E", // class name
  bases__ZN3ccc8DD7x14y6E, 2,
  &(vtc__ZN3ccc8DD7x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y6E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y6E),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  CC7x14y7  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC7x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y73pqrEv
  ~CC7x14y7(); // tgen
  CC7x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y7E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y73abcEv");}
void  ccc::CC7x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y73pqrEv");}
ccc::CC7x14y7 ::~CC7x14y7(){ note_dtor("_ZN3ccc8CC7x14y7E", this);} // tgen
ccc::CC7x14y7 ::CC7x14y7(){ note_ctor("_ZN3ccc8CC7x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y7E, buf);
    ::ccc::CC7x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y7E);
    dp->::ccc::CC7x14y7::~CC7x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y7E(Test__ZN3ccc8CC7x14y7E, "_ZN3ccc8CC7x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y7C1Ev();
extern void _ZN3ccc8CC7x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y7E[] = {
  NSPAIR(_ZN3ccc8CC7x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y7E[];
extern void _ZN3ccc8CC7x14y73pqrEv();
extern void _ZN3ccc8CC7x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y73abcEv,_ZTv0_n12_N3ccc8CC7x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y73abcEv,_ZThn4_N3ccc8CC7x14y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y73pqrEv,_ZTv0_n16_N3ccc8CC7x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y73pqrEv,_ZThn4_N3ccc8CC7x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y73abcEv,_ZTv0_n12_N3ccc8CC7x14y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y73pqrEv,_ZTv0_n16_N3ccc8CC7x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y7E[] = {
  {&(_ZTVN3ccc8CC7x14y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x14y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y7E[];
static VTBL_ENTRY alt_thunk_names1161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y73pqrEv,_ZTv0_n16_N3ccc8CC7x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y73pqrEv,_ZThn4_N3ccc8CC7x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y73abcEv,_ZTv0_n12_N3ccc8CC7x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y73abcEv,_ZThn4_N3ccc8CC7x14y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y7E = {  "_ZN3ccc8CC7x14y7E", // class name
  bases__ZN3ccc8CC7x14y7E, 2,
  &(vtc__ZN3ccc8CC7x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y7E),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  DD7x14y7  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD7x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x14y73pqrEv
  ~DD7x14y7(); // tgen
  DD7x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y7E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y73abcEv");}
void  ccc::DD7x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y73pqrEv");}
ccc::DD7x14y7 ::~DD7x14y7(){ note_dtor("_ZN3ccc8DD7x14y7E", this);} // tgen
ccc::DD7x14y7 ::DD7x14y7(){ note_ctor("_ZN3ccc8DD7x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y7E, buf);
    ::ccc::DD7x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y7E);
    dp->::ccc::DD7x14y7::~DD7x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y7E(Test__ZN3ccc8DD7x14y7E, "_ZN3ccc8DD7x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y7C1Ev();
extern void _ZN3ccc8DD7x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y7E[] = {
  NSPAIR(_ZN3ccc8DD7x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y7E[];
extern void _ZN3ccc8DD7x14y73abcEv();
extern void _ZN3ccc8DD7x14y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y73pqrEv,_ZTv0_n12_N3ccc8DD7x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y73pqrEv,_ZThn4_N3ccc8DD7x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y73pqrEv,_ZTv0_n12_N3ccc8DD7x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y7E[] = {
  {&(_ZTVN3ccc8DD7x14y7E[6]),  6,12},
  {&(_ZTVN3ccc8DD7x14y7E[6]),  6,12},
  {&(_ZTVN3ccc8DD7x14y7E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y7E[];
static VTBL_ENTRY alt_thunk_names1162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y73pqrEv,_ZTv0_n12_N3ccc8DD7x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y73pqrEv,_ZThn4_N3ccc8DD7x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y7E = {  "_ZN3ccc8DD7x14y7E", // class name
  bases__ZN3ccc8DD7x14y7E, 2,
  &(vtc__ZN3ccc8DD7x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y7E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y7E),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  CC7x14y8  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x14y83abcEv
  ~CC7x14y8(); // tgen
  CC7x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y8E) C1{ VBC2{ v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC7x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y83efgEv");}
void  ccc::CC7x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x14y83abcEv");}
ccc::CC7x14y8 ::~CC7x14y8(){ note_dtor("_ZN3ccc8CC7x14y8E", this);} // tgen
ccc::CC7x14y8 ::CC7x14y8(){ note_ctor("_ZN3ccc8CC7x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y8E, buf);
    ::ccc::CC7x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y8E);
    dp->::ccc::CC7x14y8::~CC7x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y8E(Test__ZN3ccc8CC7x14y8E, "_ZN3ccc8CC7x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y8C1Ev();
extern void _ZN3ccc8CC7x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y8E[] = {
  NSPAIR(_ZN3ccc8CC7x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC7x14y83efgEv();
extern void _ZN3ccc8CC7x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC7x14y83abcEv,_ZTv0_n12_N3ccc8CC7x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y83abcEv,_ZThn4_N3ccc8CC7x14y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC7x14y83abcEv,_ZTv0_n12_N3ccc8CC7x14y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y8E[] = {
  {&(_ZTVN3ccc8CC7x14y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC7x14y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y8E[];
static VTBL_ENTRY alt_thunk_names1163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC7x14y83abcEv,_ZTv0_n12_N3ccc8CC7x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y83abcEv,_ZThn4_N3ccc8CC7x14y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y8E = {  "_ZN3ccc8CC7x14y8E", // class name
  bases__ZN3ccc8CC7x14y8E, 2,
  &(vtc__ZN3ccc8CC7x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y8E),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  DD7x14y8  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD7x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD7x14y83abcEv
  ~DD7x14y8(); // tgen
  DD7x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y8E) C1{ VBC2{ v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD7x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y83efgEv");}
void  ccc::DD7x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x14y83abcEv");}
ccc::DD7x14y8 ::~DD7x14y8(){ note_dtor("_ZN3ccc8DD7x14y8E", this);} // tgen
ccc::DD7x14y8 ::DD7x14y8(){ note_ctor("_ZN3ccc8DD7x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y8E, buf);
    ::ccc::DD7x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y8E);
    dp->::ccc::DD7x14y8::~DD7x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y8E(Test__ZN3ccc8DD7x14y8E, "_ZN3ccc8DD7x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y8C1Ev();
extern void _ZN3ccc8DD7x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y8E[] = {
  NSPAIR(_ZN3ccc8DD7x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y8E[];
extern void _ZN3ccc8DD7x14y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x14y83efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y83efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y8E[] = {
  {&(_ZTVN3ccc8DD7x14y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y8E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y8E[];
Class_Descriptor cd__ZN3ccc8DD7x14y8E = {  "_ZN3ccc8DD7x14y8E", // class name
  bases__ZN3ccc8DD7x14y8E, 2,
  &(vtc__ZN3ccc8DD7x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y8E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y8E),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  CC7x14y9  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC7x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x14y93pqrEv
  ~CC7x14y9(); // tgen
  CC7x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x14y9E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC7x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x14y93efgEv");}
void  ccc::CC7x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x14y93pqrEv");}
ccc::CC7x14y9 ::~CC7x14y9(){ note_dtor("_ZN3ccc8CC7x14y9E", this);} // tgen
ccc::CC7x14y9 ::CC7x14y9(){ note_ctor("_ZN3ccc8CC7x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC7x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC7x14y9E, buf);
    ::ccc::CC7x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC7x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x14y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc8CC7x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC7x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x14y9E);
    dp->::ccc::CC7x14y9::~CC7x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x14y9E(Test__ZN3ccc8CC7x14y9E, "_ZN3ccc8CC7x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC7x14y9C1Ev();
extern void _ZN3ccc8CC7x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC7x14y9E[] = {
  NSPAIR(_ZN3ccc8CC7x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC7x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC7x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x14y9E[];
extern void _ZN3ccc8CC7x14y93pqrEv();
extern void _ZN3ccc8CC7x14y93efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC7x14y93pqrEv,_ZTv0_n16_N3ccc8CC7x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC7x14y93pqrEv,_ZThn4_N3ccc8CC7x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC7x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x14y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC7x14y93pqrEv,_ZTv0_n16_N3ccc8CC7x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x14y9E[] = {
  {&(_ZTVN3ccc8CC7x14y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC7x14y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x14y9E[];
static VTBL_ENTRY alt_thunk_names1164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC7x14y93pqrEv,_ZTv0_n16_N3ccc8CC7x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC7x14y93pqrEv,_ZThn4_N3ccc8CC7x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC7x14y9E = {  "_ZN3ccc8CC7x14y9E", // class name
  bases__ZN3ccc8CC7x14y9E, 2,
  &(vtc__ZN3ccc8CC7x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC7x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x14y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x14y9E),2, //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  DD7x14y9  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD7x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x14y93pqrEv
  ~DD7x14y9(); // tgen
  DD7x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD7x14y9E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD7x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x14y93efgEv");}
void  ccc::DD7x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x14y93pqrEv");}
ccc::DD7x14y9 ::~DD7x14y9(){ note_dtor("_ZN3ccc8DD7x14y9E", this);} // tgen
ccc::DD7x14y9 ::DD7x14y9(){ note_ctor("_ZN3ccc8DD7x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD7x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD7x14y9E, buf);
    ::ccc::DD7x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD7x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x14y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD7x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x14y9E);
    dp->::ccc::DD7x14y9::~DD7x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x14y9E(Test__ZN3ccc8DD7x14y9E, "_ZN3ccc8DD7x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD7x14y9C1Ev();
extern void _ZN3ccc8DD7x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD7x14y9E[] = {
  NSPAIR(_ZN3ccc8DD7x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD7x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD7x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x14y93pqrEv();
extern void _ZN3ccc8DD7x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD7x14y93pqrEv,_ZTv0_n12_N3ccc8DD7x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD7x14y93pqrEv,_ZThn4_N3ccc8DD7x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD7x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x14y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD7x14y93pqrEv,_ZTv0_n12_N3ccc8DD7x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x14y9E[] = {
  {&(_ZTVN3ccc8DD7x14y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD7x14y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x14y9E[];
static VTBL_ENTRY alt_thunk_names1165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD7x14y93pqrEv,_ZTv0_n12_N3ccc8DD7x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD7x14y93pqrEv,_ZThn4_N3ccc8DD7x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD7x14y9E = {  "_ZN3ccc8DD7x14y9E", // class name
  bases__ZN3ccc8DD7x14y9E, 2,
  &(vtc__ZN3ccc8DD7x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD7x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x14y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x14y9E),3, //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  CC7x14y10  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC7x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x14y103abcEv
  ~CC7x14y10(); // tgen
  CC7x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y10E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x14y103pqrEv");}
void  ccc::CC7x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x14y103abcEv");}
ccc::CC7x14y10 ::~CC7x14y10(){ note_dtor("_ZN3ccc9CC7x14y10E", this);} // tgen
ccc::CC7x14y10 ::CC7x14y10(){ note_ctor("_ZN3ccc9CC7x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC7x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x14y10E, buf);
    ::ccc::CC7x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x14y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC7x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x14y10E);
    dp->::ccc::CC7x14y10::~CC7x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x14y10E(Test__ZN3ccc9CC7x14y10E, "_ZN3ccc9CC7x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x14y10C1Ev();
extern void _ZN3ccc9CC7x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC7x14y10E[] = {
  NSPAIR(_ZN3ccc9CC7x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC7x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC7x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x14y10E[];
extern void _ZN3ccc9CC7x14y103pqrEv();
extern void _ZN3ccc9CC7x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x14y103abcEv,_ZTv0_n12_N3ccc9CC7x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y103abcEv,_ZThn4_N3ccc9CC7x14y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x14y103pqrEv,_ZTv0_n16_N3ccc9CC7x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y103pqrEv,_ZThn4_N3ccc9CC7x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x14y103abcEv,_ZTv0_n12_N3ccc9CC7x14y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x14y103pqrEv,_ZTv0_n16_N3ccc9CC7x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x14y10E[] = {
  {&(_ZTVN3ccc9CC7x14y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x14y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x14y10E[];
static VTBL_ENTRY alt_thunk_names1166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x14y103pqrEv,_ZTv0_n16_N3ccc9CC7x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x14y103pqrEv,_ZThn4_N3ccc9CC7x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x14y103abcEv,_ZTv0_n12_N3ccc9CC7x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x14y103abcEv,_ZThn4_N3ccc9CC7x14y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x14y10E = {  "_ZN3ccc9CC7x14y10E", // class name
  bases__ZN3ccc9CC7x14y10E, 2,
  &(vtc__ZN3ccc9CC7x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x14y10E),2, //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  DD7x14y10  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD7x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD7x14y103abcEv
  ~DD7x14y10(); // tgen
  DD7x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD7x14y10E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x14y103pqrEv");}
void  ccc::DD7x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x14y103abcEv");}
ccc::DD7x14y10 ::~DD7x14y10(){ note_dtor("_ZN3ccc9DD7x14y10E", this);} // tgen
ccc::DD7x14y10 ::DD7x14y10(){ note_ctor("_ZN3ccc9DD7x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD7x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x14y10E, buf);
    ::ccc::DD7x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x14y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD7x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x14y10E);
    dp->::ccc::DD7x14y10::~DD7x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x14y10E(Test__ZN3ccc9DD7x14y10E, "_ZN3ccc9DD7x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x14y10C1Ev();
extern void _ZN3ccc9DD7x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD7x14y10E[] = {
  NSPAIR(_ZN3ccc9DD7x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD7x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD7x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y10E[];
extern void _ZN3ccc9DD7x14y103abcEv();
extern void _ZN3ccc9DD7x14y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x14y103pqrEv,_ZTv0_n12_N3ccc9DD7x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x14y103pqrEv,_ZThn4_N3ccc9DD7x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x14y103pqrEv,_ZTv0_n12_N3ccc9DD7x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x14y10E[] = {
  {&(_ZTVN3ccc9DD7x14y10E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y10E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y10E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x14y10E[];
static VTBL_ENTRY alt_thunk_names1167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x14y103pqrEv,_ZTv0_n12_N3ccc9DD7x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x14y103pqrEv,_ZThn4_N3ccc9DD7x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x14y10E = {  "_ZN3ccc9DD7x14y10E", // class name
  bases__ZN3ccc9DD7x14y10E, 2,
  &(vtc__ZN3ccc9DD7x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x14y10E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x14y10E),3, //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  CC7x14y11  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC7x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x14y113efgEv
  ~CC7x14y11(); // tgen
  CC7x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y11E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC7x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x14y113pqrEv");}
void  ccc::CC7x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x14y113efgEv");}
ccc::CC7x14y11 ::~CC7x14y11(){ note_dtor("_ZN3ccc9CC7x14y11E", this);} // tgen
ccc::CC7x14y11 ::CC7x14y11(){ note_ctor("_ZN3ccc9CC7x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC7x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x14y11E, buf);
    ::ccc::CC7x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x14y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC7x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x14y11E);
    dp->::ccc::CC7x14y11::~CC7x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x14y11E(Test__ZN3ccc9CC7x14y11E, "_ZN3ccc9CC7x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x14y11C1Ev();
extern void _ZN3ccc9CC7x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC7x14y11E[] = {
  NSPAIR(_ZN3ccc9CC7x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC7x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC7x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x14y11E[];
extern void _ZN3ccc9CC7x14y113pqrEv();
extern void _ZN3ccc9CC7x14y113efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x14y113pqrEv,_ZTv0_n16_N3ccc9CC7x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y113pqrEv,_ZThn4_N3ccc9CC7x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x14y113pqrEv,_ZTv0_n16_N3ccc9CC7x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x14y11E[] = {
  {&(_ZTVN3ccc9CC7x14y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x14y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x14y11E[];
static VTBL_ENTRY alt_thunk_names1168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x14y113pqrEv,_ZTv0_n16_N3ccc9CC7x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x14y113pqrEv,_ZThn4_N3ccc9CC7x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x14y11E = {  "_ZN3ccc9CC7x14y11E", // class name
  bases__ZN3ccc9CC7x14y11E, 2,
  &(vtc__ZN3ccc9CC7x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x14y11E),2, //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  DD7x14y11  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD7x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD7x14y113efgEv
  ~DD7x14y11(); // tgen
  DD7x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD7x14y11E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD7x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x14y113pqrEv");}
void  ccc::DD7x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x14y113efgEv");}
ccc::DD7x14y11 ::~DD7x14y11(){ note_dtor("_ZN3ccc9DD7x14y11E", this);} // tgen
ccc::DD7x14y11 ::DD7x14y11(){ note_ctor("_ZN3ccc9DD7x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD7x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x14y11E, buf);
    ::ccc::DD7x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x14y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD7x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x14y11E);
    dp->::ccc::DD7x14y11::~DD7x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x14y11E(Test__ZN3ccc9DD7x14y11E, "_ZN3ccc9DD7x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x14y11C1Ev();
extern void _ZN3ccc9DD7x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD7x14y11E[] = {
  NSPAIR(_ZN3ccc9DD7x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD7x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD7x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x14y113pqrEv();
extern void _ZN3ccc9DD7x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x14y113pqrEv,_ZTv0_n12_N3ccc9DD7x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x14y113pqrEv,_ZThn4_N3ccc9DD7x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x14y113pqrEv,_ZTv0_n12_N3ccc9DD7x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x14y11E[] = {
  {&(_ZTVN3ccc9DD7x14y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x14y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x14y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x14y11E[];
static VTBL_ENTRY alt_thunk_names1169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x14y113pqrEv,_ZTv0_n12_N3ccc9DD7x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x14y113pqrEv,_ZThn4_N3ccc9DD7x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x14y11E = {  "_ZN3ccc9DD7x14y11E", // class name
  bases__ZN3ccc9DD7x14y11E, 2,
  &(vtc__ZN3ccc9DD7x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x14y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x14y11E),3, //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  CC7x14y12  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC7x14y123abcEv
  ~CC7x14y12(); // tgen
  CC7x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y12E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC7x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x14y123abcEv");}
ccc::CC7x14y12 ::~CC7x14y12(){ note_dtor("_ZN3ccc9CC7x14y12E", this);} // tgen
ccc::CC7x14y12 ::CC7x14y12(){ note_ctor("_ZN3ccc9CC7x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC7x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x14y12E, buf);
    ::ccc::CC7x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x14y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC7x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x14y12E);
    dp->::ccc::CC7x14y12::~CC7x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x14y12E(Test__ZN3ccc9CC7x14y12E, "_ZN3ccc9CC7x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x14y12C1Ev();
extern void _ZN3ccc9CC7x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC7x14y12E[] = {
  NSPAIR(_ZN3ccc9CC7x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC7x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC7x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC7x14y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC7x14y123abcEv,_ZTv0_n12_N3ccc9CC7x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y123abcEv,_ZThn4_N3ccc9CC7x14y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC7x14y123abcEv,_ZTv0_n12_N3ccc9CC7x14y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x14y12E[] = {
  {&(_ZTVN3ccc9CC7x14y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x14y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x14y12E[];
static VTBL_ENTRY alt_thunk_names1170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC7x14y123abcEv,_ZTv0_n12_N3ccc9CC7x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x14y123abcEv,_ZThn4_N3ccc9CC7x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x14y12E = {  "_ZN3ccc9CC7x14y12E", // class name
  bases__ZN3ccc9CC7x14y12E, 2,
  &(vtc__ZN3ccc9CC7x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x14y12E),2, //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  DD7x14y12  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD7x14y123abcEv
  ~DD7x14y12(); // tgen
  DD7x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD7x14y12E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD7x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x14y123abcEv");}
ccc::DD7x14y12 ::~DD7x14y12(){ note_dtor("_ZN3ccc9DD7x14y12E", this);} // tgen
ccc::DD7x14y12 ::DD7x14y12(){ note_ctor("_ZN3ccc9DD7x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD7x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x14y12E, buf);
    ::ccc::DD7x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x14y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD7x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x14y12E);
    dp->::ccc::DD7x14y12::~DD7x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x14y12E(Test__ZN3ccc9DD7x14y12E, "_ZN3ccc9DD7x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x14y12C1Ev();
extern void _ZN3ccc9DD7x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD7x14y12E[] = {
  NSPAIR(_ZN3ccc9DD7x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD7x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD7x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y12E[];
extern void _ZN3ccc9DD7x14y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x14y12E[] = {
  {&(_ZTVN3ccc9DD7x14y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x14y12E[];
Class_Descriptor cd__ZN3ccc9DD7x14y12E = {  "_ZN3ccc9DD7x14y12E", // class name
  bases__ZN3ccc9DD7x14y12E, 2,
  &(vtc__ZN3ccc9DD7x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x14y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x14y12E),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  CC7x14y13  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC7x14y133efgEv
  ~CC7x14y13(); // tgen
  CC7x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y13E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC7x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x14y133efgEv");}
ccc::CC7x14y13 ::~CC7x14y13(){ note_dtor("_ZN3ccc9CC7x14y13E", this);} // tgen
ccc::CC7x14y13 ::CC7x14y13(){ note_ctor("_ZN3ccc9CC7x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC7x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x14y13E, buf);
    ::ccc::CC7x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x14y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC7x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x14y13E);
    dp->::ccc::CC7x14y13::~CC7x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x14y13E(Test__ZN3ccc9CC7x14y13E, "_ZN3ccc9CC7x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x14y13C1Ev();
extern void _ZN3ccc9CC7x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC7x14y13E[] = {
  NSPAIR(_ZN3ccc9CC7x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC7x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC7x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC7x14y133efgEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x14y13E[] = {
  {&(_ZTVN3ccc9CC7x14y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC7x14y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x14y13E[];
Class_Descriptor cd__ZN3ccc9CC7x14y13E = {  "_ZN3ccc9CC7x14y13E", // class name
  bases__ZN3ccc9CC7x14y13E, 2,
  &(vtc__ZN3ccc9CC7x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x14y13E),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  DD7x14y13  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD7x14y133efgEv
  ~DD7x14y13(); // tgen
  DD7x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD7x14y13E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD7x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x14y133efgEv");}
ccc::DD7x14y13 ::~DD7x14y13(){ note_dtor("_ZN3ccc9DD7x14y13E", this);} // tgen
ccc::DD7x14y13 ::DD7x14y13(){ note_ctor("_ZN3ccc9DD7x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD7x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x14y13E, buf);
    ::ccc::DD7x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x14y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD7x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x14y13E);
    dp->::ccc::DD7x14y13::~DD7x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x14y13E(Test__ZN3ccc9DD7x14y13E, "_ZN3ccc9DD7x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x14y13C1Ev();
extern void _ZN3ccc9DD7x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD7x14y13E[] = {
  NSPAIR(_ZN3ccc9DD7x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD7x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD7x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9DD7x14y133efgEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x14y13E[] = {
  {&(_ZTVN3ccc9DD7x14y13E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x14y13E[6]),  6,13},
  {&(_ZTVN3ccc9DD7x14y13E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x14y13E[];
Class_Descriptor cd__ZN3ccc9DD7x14y13E = {  "_ZN3ccc9DD7x14y13E", // class name
  bases__ZN3ccc9DD7x14y13E, 2,
  &(vtc__ZN3ccc9DD7x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x14y13E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x14y13E),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  CC7x14y14  : virtual ::ccc::AA7 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC7x14y143pqrEv
  ~CC7x14y14(); // tgen
  CC7x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y14E) C1{ VBC2{ v2 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC7x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x14y143pqrEv");}
ccc::CC7x14y14 ::~CC7x14y14(){ note_dtor("_ZN3ccc9CC7x14y14E", this);} // tgen
ccc::CC7x14y14 ::CC7x14y14(){ note_ctor("_ZN3ccc9CC7x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC7x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x14y14E, buf);
    ::ccc::CC7x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x14y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC7x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x14y14E);
    dp->::ccc::CC7x14y14::~CC7x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x14y14E(Test__ZN3ccc9CC7x14y14E, "_ZN3ccc9CC7x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x14y14C1Ev();
extern void _ZN3ccc9CC7x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC7x14y14E[] = {
  NSPAIR(_ZN3ccc9CC7x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC7x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC7x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x14y14E[];
extern void _ZN3ccc9CC7x14y143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC7x14y143pqrEv,_ZTv0_n16_N3ccc9CC7x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC7x14y143pqrEv,_ZThn4_N3ccc9CC7x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x14y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC7x14y143pqrEv,_ZTv0_n16_N3ccc9CC7x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x14y14E[] = {
  {&(_ZTVN3ccc9CC7x14y14E[3]),  3,10},
  {&(_ZTVN3ccc9CC7x14y14E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x14y14E[];
static VTBL_ENTRY alt_thunk_names1171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC7x14y143pqrEv,_ZTv0_n16_N3ccc9CC7x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC7x14y143pqrEv,_ZThn4_N3ccc9CC7x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC7x14y14E = {  "_ZN3ccc9CC7x14y14E", // class name
  bases__ZN3ccc9CC7x14y14E, 2,
  &(vtc__ZN3ccc9CC7x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y14E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x14y14E),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  DD7x14y14  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD7x14y143pqrEv
  ~DD7x14y14(); // tgen
  DD7x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD7x14y14E) C1{ VBC2{ v2 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD7x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x14y143pqrEv");}
ccc::DD7x14y14 ::~DD7x14y14(){ note_dtor("_ZN3ccc9DD7x14y14E", this);} // tgen
ccc::DD7x14y14 ::DD7x14y14(){ note_ctor("_ZN3ccc9DD7x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD7x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x14y14E, buf);
    ::ccc::DD7x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x14y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD7x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x14y14E);
    dp->::ccc::DD7x14y14::~DD7x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x14y14E(Test__ZN3ccc9DD7x14y14E, "_ZN3ccc9DD7x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x14y14C1Ev();
extern void _ZN3ccc9DD7x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD7x14y14E[] = {
  NSPAIR(_ZN3ccc9DD7x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD7x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD7x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD7x14y143pqrEv,_ZTv0_n12_N3ccc9DD7x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD7x14y143pqrEv,_ZThn4_N3ccc9DD7x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD7x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x14y143pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD7x14y143pqrEv,_ZTv0_n12_N3ccc9DD7x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x14y14E[] = {
  {&(_ZTVN3ccc9DD7x14y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y14E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x14y14E[];
static VTBL_ENTRY alt_thunk_names1172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD7x14y143pqrEv,_ZTv0_n12_N3ccc9DD7x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD7x14y143pqrEv,_ZThn4_N3ccc9DD7x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD7x14y14E = {  "_ZN3ccc9DD7x14y14E", // class name
  bases__ZN3ccc9DD7x14y14E, 2,
  &(vtc__ZN3ccc9DD7x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x14y14E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x14y14E),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  CC7x14y15  : virtual ::ccc::AA7 , ::ccc::BB14 {
  ~CC7x14y15(); // tgen
  CC7x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x14y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC7x14y15 ::~CC7x14y15(){ note_dtor("_ZN3ccc9CC7x14y15E", this);} // tgen
ccc::CC7x14y15 ::CC7x14y15(){ note_ctor("_ZN3ccc9CC7x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC7x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC7x14y15E, buf);
    ::ccc::CC7x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC7x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x14y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), ABISELECT(8,4), "_ZN3ccc9CC7x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC7x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x14y15E);
    dp->::ccc::CC7x14y15::~CC7x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x14y15E(Test__ZN3ccc9CC7x14y15E, "_ZN3ccc9CC7x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC7x14y15C1Ev();
extern void _ZN3ccc9CC7x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC7x14y15E[] = {
  NSPAIR(_ZN3ccc9CC7x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC7x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC7x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x14y15E[] = {
  {&(_ZTVN3ccc9CC7x14y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC7x14y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x14y15E[];
Class_Descriptor cd__ZN3ccc9CC7x14y15E = {  "_ZN3ccc9CC7x14y15E", // class name
  bases__ZN3ccc9CC7x14y15E, 2,
  &(vtc__ZN3ccc9CC7x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC7x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x14y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x14y15E),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  DD7x14y15  : virtual ::ccc::AA7 , virtual ::ccc::BB14 {
  ~DD7x14y15(); // tgen
  DD7x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD7x14y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD7x14y15 ::~DD7x14y15(){ note_dtor("_ZN3ccc9DD7x14y15E", this);} // tgen
ccc::DD7x14y15 ::DD7x14y15(){ note_ctor("_ZN3ccc9DD7x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD7x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD7x14y15E, buf);
    ::ccc::DD7x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD7x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x14y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD7x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x14y15E);
    dp->::ccc::DD7x14y15::~DD7x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x14y15E(Test__ZN3ccc9DD7x14y15E, "_ZN3ccc9DD7x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD7x14y15C1Ev();
extern void _ZN3ccc9DD7x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD7x14y15E[] = {
  NSPAIR(_ZN3ccc9DD7x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD7x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD7x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x14y15E[] = {
  {&(_ZTVN3ccc9DD7x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD7x14y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x14y15E[];
Class_Descriptor cd__ZN3ccc9DD7x14y15E = {  "_ZN3ccc9DD7x14y15E", // class name
  bases__ZN3ccc9DD7x14y15E, 2,
  &(vtc__ZN3ccc9DD7x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD7x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x14y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x14y15E),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  CC7x15y0  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC7x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y03pqrEv
  ~CC7x15y0(); // tgen
  CC7x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y0E) C1{ VBC2{ v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y03abcEv");}
void  ccc::CC7x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y03efgEv");}
void  ccc::CC7x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y03pqrEv");}
ccc::CC7x15y0 ::~CC7x15y0(){ note_dtor("_ZN3ccc8CC7x15y0E", this);} // tgen
ccc::CC7x15y0 ::CC7x15y0(){ note_ctor("_ZN3ccc8CC7x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y0E, buf);
    ::ccc::CC7x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y0E);
    dp->::ccc::CC7x15y0::~CC7x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y0E(Test__ZN3ccc8CC7x15y0E, "_ZN3ccc8CC7x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y0C1Ev();
extern void _ZN3ccc8CC7x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y0E[] = {
  NSPAIR(_ZN3ccc8CC7x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y0E[];
extern void _ZN3ccc8CC7x15y03abcEv();
extern void _ZN3ccc8CC7x15y03pqrEv();
extern void _ZN3ccc8CC7x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y0E[] = {
  {&(_ZTVN3ccc8CC7x15y0E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y0E[];
Class_Descriptor cd__ZN3ccc8CC7x15y0E = {  "_ZN3ccc8CC7x15y0E", // class name
  bases__ZN3ccc8CC7x15y0E, 2,
  &(vtc__ZN3ccc8CC7x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y0  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD7x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD7x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x15y03pqrEv
  ~DD7x15y0(); // tgen
  DD7x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y0E) C1{ VBC2{ v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y03abcEv");}
void  ccc::DD7x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y03efgEv");}
void  ccc::DD7x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y03pqrEv");}
ccc::DD7x15y0 ::~DD7x15y0(){ note_dtor("_ZN3ccc8DD7x15y0E", this);} // tgen
ccc::DD7x15y0 ::DD7x15y0(){ note_ctor("_ZN3ccc8DD7x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y0E, buf);
    ::ccc::DD7x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y0E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y0E);
    dp->::ccc::DD7x15y0::~DD7x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y0E(Test__ZN3ccc8DD7x15y0E, "_ZN3ccc8DD7x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y0C1Ev();
extern void _ZN3ccc8DD7x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y0E[] = {
  NSPAIR(_ZN3ccc8DD7x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y0E[];
extern void _ZN3ccc8DD7x15y03abcEv();
extern void _ZN3ccc8DD7x15y03pqrEv();
extern void _ZN3ccc8DD7x15y03efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y03efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y0E[] = {
  {&(_ZTVN3ccc8DD7x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y0E[];
Class_Descriptor cd__ZN3ccc8DD7x15y0E = {  "_ZN3ccc8DD7x15y0E", // class name
  bases__ZN3ccc8DD7x15y0E, 2,
  &(vtc__ZN3ccc8DD7x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y1  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x15y13efgEv
  ~CC7x15y1(); // tgen
  CC7x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y1E) C1{ VBC2{ v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y13abcEv");}
void  ccc::CC7x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y13pqrEv");}
void  ccc::CC7x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y13efgEv");}
ccc::CC7x15y1 ::~CC7x15y1(){ note_dtor("_ZN3ccc8CC7x15y1E", this);} // tgen
ccc::CC7x15y1 ::CC7x15y1(){ note_ctor("_ZN3ccc8CC7x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y1E, buf);
    ::ccc::CC7x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y1E);
    dp->::ccc::CC7x15y1::~CC7x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y1E(Test__ZN3ccc8CC7x15y1E, "_ZN3ccc8CC7x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y1C1Ev();
extern void _ZN3ccc8CC7x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y1E[] = {
  NSPAIR(_ZN3ccc8CC7x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y1E[];
extern void _ZN3ccc8CC7x15y13abcEv();
extern void _ZN3ccc8CC7x15y13pqrEv();
extern void _ZN3ccc8CC7x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y1E[] = {
  {&(_ZTVN3ccc8CC7x15y1E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y1E[];
Class_Descriptor cd__ZN3ccc8CC7x15y1E = {  "_ZN3ccc8CC7x15y1E", // class name
  bases__ZN3ccc8CC7x15y1E, 2,
  &(vtc__ZN3ccc8CC7x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y1  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD7x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x15y13efgEv
  ~DD7x15y1(); // tgen
  DD7x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y1E) C1{ VBC2{ v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y13abcEv");}
void  ccc::DD7x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y13pqrEv");}
void  ccc::DD7x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y13efgEv");}
ccc::DD7x15y1 ::~DD7x15y1(){ note_dtor("_ZN3ccc8DD7x15y1E", this);} // tgen
ccc::DD7x15y1 ::DD7x15y1(){ note_ctor("_ZN3ccc8DD7x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y1E, buf);
    ::ccc::DD7x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y1E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y1E);
    dp->::ccc::DD7x15y1::~DD7x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y1E(Test__ZN3ccc8DD7x15y1E, "_ZN3ccc8DD7x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y1C1Ev();
extern void _ZN3ccc8DD7x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y1E[] = {
  NSPAIR(_ZN3ccc8DD7x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y1E[];
extern void _ZN3ccc8DD7x15y13abcEv();
extern void _ZN3ccc8DD7x15y13pqrEv();
extern void _ZN3ccc8DD7x15y13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y1E[] = {
  {&(_ZTVN3ccc8DD7x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y1E[];
Class_Descriptor cd__ZN3ccc8DD7x15y1E = {  "_ZN3ccc8DD7x15y1E", // class name
  bases__ZN3ccc8DD7x15y1E, 2,
  &(vtc__ZN3ccc8DD7x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y2  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC7x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y23pqrEv
  ~CC7x15y2(); // tgen
  CC7x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y2E) C1{ VBC2{ v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y23efgEv");}
void  ccc::CC7x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y23abcEv");}
void  ccc::CC7x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y23pqrEv");}
ccc::CC7x15y2 ::~CC7x15y2(){ note_dtor("_ZN3ccc8CC7x15y2E", this);} // tgen
ccc::CC7x15y2 ::CC7x15y2(){ note_ctor("_ZN3ccc8CC7x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y2E, buf);
    ::ccc::CC7x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y2E);
    dp->::ccc::CC7x15y2::~CC7x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y2E(Test__ZN3ccc8CC7x15y2E, "_ZN3ccc8CC7x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y2C1Ev();
extern void _ZN3ccc8CC7x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y2E[] = {
  NSPAIR(_ZN3ccc8CC7x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y2E[];
extern void _ZN3ccc8CC7x15y23abcEv();
extern void _ZN3ccc8CC7x15y23pqrEv();
extern void _ZN3ccc8CC7x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y2E[] = {
  {&(_ZTVN3ccc8CC7x15y2E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y2E[];
Class_Descriptor cd__ZN3ccc8CC7x15y2E = {  "_ZN3ccc8CC7x15y2E", // class name
  bases__ZN3ccc8CC7x15y2E, 2,
  &(vtc__ZN3ccc8CC7x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y2  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD7x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD7x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x15y23pqrEv
  ~DD7x15y2(); // tgen
  DD7x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y2E) C1{ VBC2{ v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y23efgEv");}
void  ccc::DD7x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y23abcEv");}
void  ccc::DD7x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y23pqrEv");}
ccc::DD7x15y2 ::~DD7x15y2(){ note_dtor("_ZN3ccc8DD7x15y2E", this);} // tgen
ccc::DD7x15y2 ::DD7x15y2(){ note_ctor("_ZN3ccc8DD7x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y2E, buf);
    ::ccc::DD7x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y2E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y2E);
    dp->::ccc::DD7x15y2::~DD7x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y2E(Test__ZN3ccc8DD7x15y2E, "_ZN3ccc8DD7x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y2C1Ev();
extern void _ZN3ccc8DD7x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y2E[] = {
  NSPAIR(_ZN3ccc8DD7x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y2E[];
extern void _ZN3ccc8DD7x15y23abcEv();
extern void _ZN3ccc8DD7x15y23pqrEv();
extern void _ZN3ccc8DD7x15y23efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y23efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y2E[] = {
  {&(_ZTVN3ccc8DD7x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y2E[];
Class_Descriptor cd__ZN3ccc8DD7x15y2E = {  "_ZN3ccc8DD7x15y2E", // class name
  bases__ZN3ccc8DD7x15y2E, 2,
  &(vtc__ZN3ccc8DD7x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y3  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x15y33abcEv
  ~CC7x15y3(); // tgen
  CC7x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y3E) C1{ VBC2{ v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y33efgEv");}
void  ccc::CC7x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y33pqrEv");}
void  ccc::CC7x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y33abcEv");}
ccc::CC7x15y3 ::~CC7x15y3(){ note_dtor("_ZN3ccc8CC7x15y3E", this);} // tgen
ccc::CC7x15y3 ::CC7x15y3(){ note_ctor("_ZN3ccc8CC7x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y3E, buf);
    ::ccc::CC7x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y3E);
    dp->::ccc::CC7x15y3::~CC7x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y3E(Test__ZN3ccc8CC7x15y3E, "_ZN3ccc8CC7x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y3C1Ev();
extern void _ZN3ccc8CC7x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y3E[] = {
  NSPAIR(_ZN3ccc8CC7x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y3E[];
extern void _ZN3ccc8CC7x15y33abcEv();
extern void _ZN3ccc8CC7x15y33pqrEv();
extern void _ZN3ccc8CC7x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y3E[] = {
  {&(_ZTVN3ccc8CC7x15y3E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y3E[];
Class_Descriptor cd__ZN3ccc8CC7x15y3E = {  "_ZN3ccc8CC7x15y3E", // class name
  bases__ZN3ccc8CC7x15y3E, 2,
  &(vtc__ZN3ccc8CC7x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y3  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD7x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x15y33abcEv
  ~DD7x15y3(); // tgen
  DD7x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y3E) C1{ VBC2{ v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y33efgEv");}
void  ccc::DD7x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y33pqrEv");}
void  ccc::DD7x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y33abcEv");}
ccc::DD7x15y3 ::~DD7x15y3(){ note_dtor("_ZN3ccc8DD7x15y3E", this);} // tgen
ccc::DD7x15y3 ::DD7x15y3(){ note_ctor("_ZN3ccc8DD7x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y3E, buf);
    ::ccc::DD7x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y3E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y3E);
    dp->::ccc::DD7x15y3::~DD7x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y3E(Test__ZN3ccc8DD7x15y3E, "_ZN3ccc8DD7x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y3C1Ev();
extern void _ZN3ccc8DD7x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y3E[] = {
  NSPAIR(_ZN3ccc8DD7x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y3E[];
extern void _ZN3ccc8DD7x15y33abcEv();
extern void _ZN3ccc8DD7x15y33pqrEv();
extern void _ZN3ccc8DD7x15y33efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y33efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y3E[] = {
  {&(_ZTVN3ccc8DD7x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y3E[];
Class_Descriptor cd__ZN3ccc8DD7x15y3E = {  "_ZN3ccc8DD7x15y3E", // class name
  bases__ZN3ccc8DD7x15y3E, 2,
  &(vtc__ZN3ccc8DD7x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y4  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC7x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC7x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC7x15y43efgEv
  ~CC7x15y4(); // tgen
  CC7x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y4E) C1{ VBC2{ v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y43pqrEv");}
void  ccc::CC7x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y43abcEv");}
void  ccc::CC7x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y43efgEv");}
ccc::CC7x15y4 ::~CC7x15y4(){ note_dtor("_ZN3ccc8CC7x15y4E", this);} // tgen
ccc::CC7x15y4 ::CC7x15y4(){ note_ctor("_ZN3ccc8CC7x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y4E, buf);
    ::ccc::CC7x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y4E);
    dp->::ccc::CC7x15y4::~CC7x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y4E(Test__ZN3ccc8CC7x15y4E, "_ZN3ccc8CC7x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y4C1Ev();
extern void _ZN3ccc8CC7x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y4E[] = {
  NSPAIR(_ZN3ccc8CC7x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y4E[];
extern void _ZN3ccc8CC7x15y43abcEv();
extern void _ZN3ccc8CC7x15y43pqrEv();
extern void _ZN3ccc8CC7x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y4E[] = {
  {&(_ZTVN3ccc8CC7x15y4E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y4E[];
Class_Descriptor cd__ZN3ccc8CC7x15y4E = {  "_ZN3ccc8CC7x15y4E", // class name
  bases__ZN3ccc8CC7x15y4E, 2,
  &(vtc__ZN3ccc8CC7x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y4  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD7x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD7x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD7x15y43efgEv
  ~DD7x15y4(); // tgen
  DD7x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y4E) C1{ VBC2{ v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y43pqrEv");}
void  ccc::DD7x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y43abcEv");}
void  ccc::DD7x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y43efgEv");}
ccc::DD7x15y4 ::~DD7x15y4(){ note_dtor("_ZN3ccc8DD7x15y4E", this);} // tgen
ccc::DD7x15y4 ::DD7x15y4(){ note_ctor("_ZN3ccc8DD7x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y4E, buf);
    ::ccc::DD7x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y4E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y4E);
    dp->::ccc::DD7x15y4::~DD7x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y4E(Test__ZN3ccc8DD7x15y4E, "_ZN3ccc8DD7x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y4C1Ev();
extern void _ZN3ccc8DD7x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y4E[] = {
  NSPAIR(_ZN3ccc8DD7x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y4E[];
extern void _ZN3ccc8DD7x15y43abcEv();
extern void _ZN3ccc8DD7x15y43pqrEv();
extern void _ZN3ccc8DD7x15y43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y4E[] = {
  {&(_ZTVN3ccc8DD7x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y4E[];
Class_Descriptor cd__ZN3ccc8DD7x15y4E = {  "_ZN3ccc8DD7x15y4E", // class name
  bases__ZN3ccc8DD7x15y4E, 2,
  &(vtc__ZN3ccc8DD7x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y5  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC7x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC7x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC7x15y53abcEv
  ~CC7x15y5(); // tgen
  CC7x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y5E) C1{ VBC2{ v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC7x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y53pqrEv");}
void  ccc::CC7x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y53efgEv");}
void  ccc::CC7x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y53abcEv");}
ccc::CC7x15y5 ::~CC7x15y5(){ note_dtor("_ZN3ccc8CC7x15y5E", this);} // tgen
ccc::CC7x15y5 ::CC7x15y5(){ note_ctor("_ZN3ccc8CC7x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y5E, buf);
    ::ccc::CC7x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y5E);
    dp->::ccc::CC7x15y5::~CC7x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y5E(Test__ZN3ccc8CC7x15y5E, "_ZN3ccc8CC7x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y5C1Ev();
extern void _ZN3ccc8CC7x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y5E[] = {
  NSPAIR(_ZN3ccc8CC7x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y5E[];
extern void _ZN3ccc8CC7x15y53abcEv();
extern void _ZN3ccc8CC7x15y53pqrEv();
extern void _ZN3ccc8CC7x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y5E[] = {
  {&(_ZTVN3ccc8CC7x15y5E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y5E[];
Class_Descriptor cd__ZN3ccc8CC7x15y5E = {  "_ZN3ccc8CC7x15y5E", // class name
  bases__ZN3ccc8CC7x15y5E, 2,
  &(vtc__ZN3ccc8CC7x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y5  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD7x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD7x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD7x15y53abcEv
  ~DD7x15y5(); // tgen
  DD7x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y5E) C1{ VBC2{ v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD7x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y53pqrEv");}
void  ccc::DD7x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y53efgEv");}
void  ccc::DD7x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y53abcEv");}
ccc::DD7x15y5 ::~DD7x15y5(){ note_dtor("_ZN3ccc8DD7x15y5E", this);} // tgen
ccc::DD7x15y5 ::DD7x15y5(){ note_ctor("_ZN3ccc8DD7x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y5E, buf);
    ::ccc::DD7x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y5E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y5E);
    dp->::ccc::DD7x15y5::~DD7x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y5E(Test__ZN3ccc8DD7x15y5E, "_ZN3ccc8DD7x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y5C1Ev();
extern void _ZN3ccc8DD7x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y5E[] = {
  NSPAIR(_ZN3ccc8DD7x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y5E[];
extern void _ZN3ccc8DD7x15y53abcEv();
extern void _ZN3ccc8DD7x15y53pqrEv();
extern void _ZN3ccc8DD7x15y53efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y53efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y5E[] = {
  {&(_ZTVN3ccc8DD7x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y5E[];
Class_Descriptor cd__ZN3ccc8DD7x15y5E = {  "_ZN3ccc8DD7x15y5E", // class name
  bases__ZN3ccc8DD7x15y5E, 2,
  &(vtc__ZN3ccc8DD7x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y6  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC7x15y63efgEv
  ~CC7x15y6(); // tgen
  CC7x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y6E) C1{ VBC2{ v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC7x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y63abcEv");}
void  ccc::CC7x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y63efgEv");}
ccc::CC7x15y6 ::~CC7x15y6(){ note_dtor("_ZN3ccc8CC7x15y6E", this);} // tgen
ccc::CC7x15y6 ::CC7x15y6(){ note_ctor("_ZN3ccc8CC7x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y6E, buf);
    ::ccc::CC7x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y6E);
    dp->::ccc::CC7x15y6::~CC7x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y6E(Test__ZN3ccc8CC7x15y6E, "_ZN3ccc8CC7x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y6C1Ev();
extern void _ZN3ccc8CC7x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y6E[] = {
  NSPAIR(_ZN3ccc8CC7x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y6E[];
extern void _ZN3ccc8CC7x15y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y6E[] = {
  {&(_ZTVN3ccc8CC7x15y6E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y6E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y6E[];
Class_Descriptor cd__ZN3ccc8CC7x15y6E = {  "_ZN3ccc8CC7x15y6E", // class name
  bases__ZN3ccc8CC7x15y6E, 2,
  &(vtc__ZN3ccc8CC7x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y6E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y6  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD7x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD7x15y63efgEv
  ~DD7x15y6(); // tgen
  DD7x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y6E) C1{ VBC2{ v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD7x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y63abcEv");}
void  ccc::DD7x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y63efgEv");}
ccc::DD7x15y6 ::~DD7x15y6(){ note_dtor("_ZN3ccc8DD7x15y6E", this);} // tgen
ccc::DD7x15y6 ::DD7x15y6(){ note_ctor("_ZN3ccc8DD7x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y6E, buf);
    ::ccc::DD7x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y6E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y6E);
    dp->::ccc::DD7x15y6::~DD7x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y6E(Test__ZN3ccc8DD7x15y6E, "_ZN3ccc8DD7x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y6C1Ev();
extern void _ZN3ccc8DD7x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y6E[] = {
  NSPAIR(_ZN3ccc8DD7x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y6E[];
extern void _ZN3ccc8DD7x15y63abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x15y63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y6E[] = {
  {&(_ZTVN3ccc8DD7x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y6E[];
Class_Descriptor cd__ZN3ccc8DD7x15y6E = {  "_ZN3ccc8DD7x15y6E", // class name
  bases__ZN3ccc8DD7x15y6E, 2,
  &(vtc__ZN3ccc8DD7x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y7  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC7x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y73pqrEv
  ~CC7x15y7(); // tgen
  CC7x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y7E) C1{ VBC2{ v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC7x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y73abcEv");}
void  ccc::CC7x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y73pqrEv");}
ccc::CC7x15y7 ::~CC7x15y7(){ note_dtor("_ZN3ccc8CC7x15y7E", this);} // tgen
ccc::CC7x15y7 ::CC7x15y7(){ note_ctor("_ZN3ccc8CC7x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y7E, buf);
    ::ccc::CC7x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y7E);
    dp->::ccc::CC7x15y7::~CC7x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y7E(Test__ZN3ccc8CC7x15y7E, "_ZN3ccc8CC7x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y7C1Ev();
extern void _ZN3ccc8CC7x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y7E[] = {
  NSPAIR(_ZN3ccc8CC7x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y7E[];
extern void _ZN3ccc8CC7x15y73abcEv();
extern void _ZN3ccc8CC7x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y7E[] = {
  {&(_ZTVN3ccc8CC7x15y7E[5]),  5,7},
  {&(_ZTVN3ccc8CC7x15y7E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y7E[];
Class_Descriptor cd__ZN3ccc8CC7x15y7E = {  "_ZN3ccc8CC7x15y7E", // class name
  bases__ZN3ccc8CC7x15y7E, 2,
  &(vtc__ZN3ccc8CC7x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y7E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y7  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD7x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD7x15y73pqrEv
  ~DD7x15y7(); // tgen
  DD7x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y7E) C1{ VBC2{ v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD7x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y73abcEv");}
void  ccc::DD7x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y73pqrEv");}
ccc::DD7x15y7 ::~DD7x15y7(){ note_dtor("_ZN3ccc8DD7x15y7E", this);} // tgen
ccc::DD7x15y7 ::DD7x15y7(){ note_ctor("_ZN3ccc8DD7x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y7E, buf);
    ::ccc::DD7x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y7E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y7E);
    dp->::ccc::DD7x15y7::~DD7x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y7E(Test__ZN3ccc8DD7x15y7E, "_ZN3ccc8DD7x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y7C1Ev();
extern void _ZN3ccc8DD7x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y7E[] = {
  NSPAIR(_ZN3ccc8DD7x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y7E[];
extern void _ZN3ccc8DD7x15y73abcEv();
extern void _ZN3ccc8DD7x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y7E[] = {
  {&(_ZTVN3ccc8DD7x15y7E[6]),  6,8},
  {&(_ZTVN3ccc8DD7x15y7E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y7E[];
Class_Descriptor cd__ZN3ccc8DD7x15y7E = {  "_ZN3ccc8DD7x15y7E", // class name
  bases__ZN3ccc8DD7x15y7E, 2,
  &(vtc__ZN3ccc8DD7x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y7E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y8  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC7x15y83abcEv
  ~CC7x15y8(); // tgen
  CC7x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y8E) C1{ VBC2{ v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC7x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y83efgEv");}
void  ccc::CC7x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC7x15y83abcEv");}
ccc::CC7x15y8 ::~CC7x15y8(){ note_dtor("_ZN3ccc8CC7x15y8E", this);} // tgen
ccc::CC7x15y8 ::CC7x15y8(){ note_ctor("_ZN3ccc8CC7x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y8E, buf);
    ::ccc::CC7x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y8E);
    dp->::ccc::CC7x15y8::~CC7x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y8E(Test__ZN3ccc8CC7x15y8E, "_ZN3ccc8CC7x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y8C1Ev();
extern void _ZN3ccc8CC7x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y8E[] = {
  NSPAIR(_ZN3ccc8CC7x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y8E[];
extern void _ZN3ccc8CC7x15y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8CC7x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y8E[] = {
  {&(_ZTVN3ccc8CC7x15y8E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y8E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y8E[];
Class_Descriptor cd__ZN3ccc8CC7x15y8E = {  "_ZN3ccc8CC7x15y8E", // class name
  bases__ZN3ccc8CC7x15y8E, 2,
  &(vtc__ZN3ccc8CC7x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y8E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y8  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD7x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD7x15y83abcEv
  ~DD7x15y8(); // tgen
  DD7x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y8E) C1{ VBC2{ v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD7x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y83efgEv");}
void  ccc::DD7x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD7x15y83abcEv");}
ccc::DD7x15y8 ::~DD7x15y8(){ note_dtor("_ZN3ccc8DD7x15y8E", this);} // tgen
ccc::DD7x15y8 ::DD7x15y8(){ note_ctor("_ZN3ccc8DD7x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y8E, buf);
    ::ccc::DD7x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y8E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y8E);
    dp->::ccc::DD7x15y8::~DD7x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y8E(Test__ZN3ccc8DD7x15y8E, "_ZN3ccc8DD7x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y8C1Ev();
extern void _ZN3ccc8DD7x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y8E[] = {
  NSPAIR(_ZN3ccc8DD7x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y8E[];
extern void _ZN3ccc8DD7x15y83abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc8DD7x15y83efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y83efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y8E[] = {
  {&(_ZTVN3ccc8DD7x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y8E[];
Class_Descriptor cd__ZN3ccc8DD7x15y8E = {  "_ZN3ccc8DD7x15y8E", // class name
  bases__ZN3ccc8DD7x15y8E, 2,
  &(vtc__ZN3ccc8DD7x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y9  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC7x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC7x15y93pqrEv
  ~CC7x15y9(); // tgen
  CC7x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC7x15y9E) C1{ VBC2{ v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC7x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC7x15y93efgEv");}
void  ccc::CC7x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC7x15y93pqrEv");}
ccc::CC7x15y9 ::~CC7x15y9(){ note_dtor("_ZN3ccc8CC7x15y9E", this);} // tgen
ccc::CC7x15y9 ::CC7x15y9(){ note_ctor("_ZN3ccc8CC7x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC7x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC7x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC7x15y9E, buf);
    ::ccc::CC7x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC7x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC7x15y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8CC7x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC7x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC7x15y9E);
    dp->::ccc::CC7x15y9::~CC7x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC7x15y9E(Test__ZN3ccc8CC7x15y9E, "_ZN3ccc8CC7x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC7x15y9C1Ev();
extern void _ZN3ccc8CC7x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC7x15y9E[] = {
  NSPAIR(_ZN3ccc8CC7x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC7x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC7x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC7x15y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8CC7x15y93pqrEv();
extern void _ZN3ccc8CC7x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC7x15y9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC7x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC7x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC7x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC7x15y9E[] = {
  {&(_ZTVN3ccc8CC7x15y9E[5]),  5,8},
  {&(_ZTVN3ccc8CC7x15y9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC7x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC7x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC7x15y9E[];
Class_Descriptor cd__ZN3ccc8CC7x15y9E = {  "_ZN3ccc8CC7x15y9E", // class name
  bases__ZN3ccc8CC7x15y9E, 2,
  &(vtc__ZN3ccc8CC7x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC7x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC7x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC7x15y9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC7x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y9  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD7x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD7x15y93pqrEv
  ~DD7x15y9(); // tgen
  DD7x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD7x15y9E) C1{ VBC2{ v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD7x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD7x15y93efgEv");}
void  ccc::DD7x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD7x15y93pqrEv");}
ccc::DD7x15y9 ::~DD7x15y9(){ note_dtor("_ZN3ccc8DD7x15y9E", this);} // tgen
ccc::DD7x15y9 ::DD7x15y9(){ note_ctor("_ZN3ccc8DD7x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD7x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD7x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD7x15y9E, buf);
    ::ccc::DD7x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD7x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD7x15y9E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc8DD7x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD7x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD7x15y9E);
    dp->::ccc::DD7x15y9::~DD7x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD7x15y9E(Test__ZN3ccc8DD7x15y9E, "_ZN3ccc8DD7x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD7x15y9C1Ev();
extern void _ZN3ccc8DD7x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD7x15y9E[] = {
  NSPAIR(_ZN3ccc8DD7x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD7x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD7x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD7x15y9E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc8DD7x15y93pqrEv();
extern void _ZN3ccc8DD7x15y93efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD7x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD7x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD7x15y93efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD7x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD7x15y9E[] = {
  {&(_ZTVN3ccc8DD7x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8DD7x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD7x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD7x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD7x15y9E[];
Class_Descriptor cd__ZN3ccc8DD7x15y9E = {  "_ZN3ccc8DD7x15y9E", // class name
  bases__ZN3ccc8DD7x15y9E, 2,
  &(vtc__ZN3ccc8DD7x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD7x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD7x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD7x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD7x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y10  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC7x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC7x15y103abcEv
  ~CC7x15y10(); // tgen
  CC7x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y10E) C1{ VBC2{ v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC7x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x15y103pqrEv");}
void  ccc::CC7x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x15y103abcEv");}
ccc::CC7x15y10 ::~CC7x15y10(){ note_dtor("_ZN3ccc9CC7x15y10E", this);} // tgen
ccc::CC7x15y10 ::CC7x15y10(){ note_ctor("_ZN3ccc9CC7x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC7x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC7x15y10E, buf);
    ::ccc::CC7x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC7x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x15y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9CC7x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC7x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x15y10E);
    dp->::ccc::CC7x15y10::~CC7x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x15y10E(Test__ZN3ccc9CC7x15y10E, "_ZN3ccc9CC7x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC7x15y10C1Ev();
extern void _ZN3ccc9CC7x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC7x15y10E[] = {
  NSPAIR(_ZN3ccc9CC7x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC7x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC7x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x15y10E[];
extern void _ZN3ccc9CC7x15y103abcEv();
extern void _ZN3ccc9CC7x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x15y10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x15y10E[] = {
  {&(_ZTVN3ccc9CC7x15y10E[5]),  5,7},
  {&(_ZTVN3ccc9CC7x15y10E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x15y10E[];
Class_Descriptor cd__ZN3ccc9CC7x15y10E = {  "_ZN3ccc9CC7x15y10E", // class name
  bases__ZN3ccc9CC7x15y10E, 2,
  &(vtc__ZN3ccc9CC7x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y10E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y10  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD7x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD7x15y103abcEv
  ~DD7x15y10(); // tgen
  DD7x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD7x15y10E) C1{ VBC2{ v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD7x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x15y103pqrEv");}
void  ccc::DD7x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x15y103abcEv");}
ccc::DD7x15y10 ::~DD7x15y10(){ note_dtor("_ZN3ccc9DD7x15y10E", this);} // tgen
ccc::DD7x15y10 ::DD7x15y10(){ note_ctor("_ZN3ccc9DD7x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD7x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD7x15y10E, buf);
    ::ccc::DD7x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD7x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x15y10E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD7x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x15y10E);
    dp->::ccc::DD7x15y10::~DD7x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x15y10E(Test__ZN3ccc9DD7x15y10E, "_ZN3ccc9DD7x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD7x15y10C1Ev();
extern void _ZN3ccc9DD7x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD7x15y10E[] = {
  NSPAIR(_ZN3ccc9DD7x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD7x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD7x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD7x15y10E[];
extern void _ZN3ccc9DD7x15y103abcEv();
extern void _ZN3ccc9DD7x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x15y10E[] = {
  {&(_ZTVN3ccc9DD7x15y10E[6]),  6,8},
  {&(_ZTVN3ccc9DD7x15y10E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x15y10E[];
Class_Descriptor cd__ZN3ccc9DD7x15y10E = {  "_ZN3ccc9DD7x15y10E", // class name
  bases__ZN3ccc9DD7x15y10E, 2,
  &(vtc__ZN3ccc9DD7x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD7x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x15y10E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y11  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC7x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC7x15y113efgEv
  ~CC7x15y11(); // tgen
  CC7x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y11E) C1{ VBC2{ v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC7x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x15y113pqrEv");}
void  ccc::CC7x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x15y113efgEv");}
ccc::CC7x15y11 ::~CC7x15y11(){ note_dtor("_ZN3ccc9CC7x15y11E", this);} // tgen
ccc::CC7x15y11 ::CC7x15y11(){ note_ctor("_ZN3ccc9CC7x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC7x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC7x15y11E, buf);
    ::ccc::CC7x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC7x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x15y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9CC7x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC7x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x15y11E);
    dp->::ccc::CC7x15y11::~CC7x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x15y11E(Test__ZN3ccc9CC7x15y11E, "_ZN3ccc9CC7x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC7x15y11C1Ev();
extern void _ZN3ccc9CC7x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC7x15y11E[] = {
  NSPAIR(_ZN3ccc9CC7x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC7x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC7x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x15y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x15y113pqrEv();
extern void _ZN3ccc9CC7x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x15y11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x15y11E[] = {
  {&(_ZTVN3ccc9CC7x15y11E[5]),  5,8},
  {&(_ZTVN3ccc9CC7x15y11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x15y11E[];
Class_Descriptor cd__ZN3ccc9CC7x15y11E = {  "_ZN3ccc9CC7x15y11E", // class name
  bases__ZN3ccc9CC7x15y11E, 2,
  &(vtc__ZN3ccc9CC7x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y11  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD7x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD7x15y113efgEv
  ~DD7x15y11(); // tgen
  DD7x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD7x15y11E) C1{ VBC2{ v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD7x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x15y113pqrEv");}
void  ccc::DD7x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x15y113efgEv");}
ccc::DD7x15y11 ::~DD7x15y11(){ note_dtor("_ZN3ccc9DD7x15y11E", this);} // tgen
ccc::DD7x15y11 ::DD7x15y11(){ note_ctor("_ZN3ccc9DD7x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD7x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD7x15y11E, buf);
    ::ccc::DD7x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD7x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x15y11E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD7x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x15y11E);
    dp->::ccc::DD7x15y11::~DD7x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x15y11E(Test__ZN3ccc9DD7x15y11E, "_ZN3ccc9DD7x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD7x15y11C1Ev();
extern void _ZN3ccc9DD7x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD7x15y11E[] = {
  NSPAIR(_ZN3ccc9DD7x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD7x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD7x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD7x15y11E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x15y113pqrEv();
extern void _ZN3ccc9DD7x15y113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x15y11E[] = {
  {&(_ZTVN3ccc9DD7x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9DD7x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x15y11E[];
Class_Descriptor cd__ZN3ccc9DD7x15y11E = {  "_ZN3ccc9DD7x15y11E", // class name
  bases__ZN3ccc9DD7x15y11E, 2,
  &(vtc__ZN3ccc9DD7x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD7x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y12  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC7x15y123abcEv
  ~CC7x15y12(); // tgen
  CC7x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y12E) C1{ VBC2{ v1 v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC7x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC7x15y123abcEv");}
ccc::CC7x15y12 ::~CC7x15y12(){ note_dtor("_ZN3ccc9CC7x15y12E", this);} // tgen
ccc::CC7x15y12 ::CC7x15y12(){ note_ctor("_ZN3ccc9CC7x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC7x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC7x15y12E, buf);
    ::ccc::CC7x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC7x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x15y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9CC7x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC7x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x15y12E);
    dp->::ccc::CC7x15y12::~CC7x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x15y12E(Test__ZN3ccc9CC7x15y12E, "_ZN3ccc9CC7x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC7x15y12C1Ev();
extern void _ZN3ccc9CC7x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC7x15y12E[] = {
  NSPAIR(_ZN3ccc9CC7x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC7x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC7x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x15y12E[];
extern void _ZN3ccc9CC7x15y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x15y12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x15y12E[] = {
  {&(_ZTVN3ccc9CC7x15y12E[5]),  5,7},
  {&(_ZTVN3ccc9CC7x15y12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x15y12E[];
Class_Descriptor cd__ZN3ccc9CC7x15y12E = {  "_ZN3ccc9CC7x15y12E", // class name
  bases__ZN3ccc9CC7x15y12E, 2,
  &(vtc__ZN3ccc9CC7x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y12  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD7x15y123abcEv
  ~DD7x15y12(); // tgen
  DD7x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD7x15y12E) C1{ VBC2{ v1 v2} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD7x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD7x15y123abcEv");}
ccc::DD7x15y12 ::~DD7x15y12(){ note_dtor("_ZN3ccc9DD7x15y12E", this);} // tgen
ccc::DD7x15y12 ::DD7x15y12(){ note_ctor("_ZN3ccc9DD7x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD7x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD7x15y12E, buf);
    ::ccc::DD7x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD7x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x15y12E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD7x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x15y12E);
    dp->::ccc::DD7x15y12::~DD7x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x15y12E(Test__ZN3ccc9DD7x15y12E, "_ZN3ccc9DD7x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD7x15y12C1Ev();
extern void _ZN3ccc9DD7x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD7x15y12E[] = {
  NSPAIR(_ZN3ccc9DD7x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD7x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD7x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD7x15y12E[];
extern void _ZN3ccc9DD7x15y123abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x15y12E[] = {
  {&(_ZTVN3ccc9DD7x15y12E[6]),  6,8},
  {&(_ZTVN3ccc9DD7x15y12E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x15y12E[];
Class_Descriptor cd__ZN3ccc9DD7x15y12E = {  "_ZN3ccc9DD7x15y12E", // class name
  bases__ZN3ccc9DD7x15y12E, 2,
  &(vtc__ZN3ccc9DD7x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD7x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x15y12E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y13  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC7x15y133efgEv
  ~CC7x15y13(); // tgen
  CC7x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y13E) C1{ VBC2{ v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC7x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC7x15y133efgEv");}
ccc::CC7x15y13 ::~CC7x15y13(){ note_dtor("_ZN3ccc9CC7x15y13E", this);} // tgen
ccc::CC7x15y13 ::CC7x15y13(){ note_ctor("_ZN3ccc9CC7x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC7x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC7x15y13E, buf);
    ::ccc::CC7x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC7x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x15y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9CC7x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC7x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x15y13E);
    dp->::ccc::CC7x15y13::~CC7x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x15y13E(Test__ZN3ccc9CC7x15y13E, "_ZN3ccc9CC7x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC7x15y13C1Ev();
extern void _ZN3ccc9CC7x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC7x15y13E[] = {
  NSPAIR(_ZN3ccc9CC7x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC7x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC7x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x15y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9CC7x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x15y13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x15y13E[] = {
  {&(_ZTVN3ccc9CC7x15y13E[5]),  5,8},
  {&(_ZTVN3ccc9CC7x15y13E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x15y13E[];
Class_Descriptor cd__ZN3ccc9CC7x15y13E = {  "_ZN3ccc9CC7x15y13E", // class name
  bases__ZN3ccc9CC7x15y13E, 2,
  &(vtc__ZN3ccc9CC7x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y13E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y13  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD7x15y133efgEv
  ~DD7x15y13(); // tgen
  DD7x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD7x15y13E) C1{ VBC2{ v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD7x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD7x15y133efgEv");}
ccc::DD7x15y13 ::~DD7x15y13(){ note_dtor("_ZN3ccc9DD7x15y13E", this);} // tgen
ccc::DD7x15y13 ::DD7x15y13(){ note_ctor("_ZN3ccc9DD7x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD7x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD7x15y13E, buf);
    ::ccc::DD7x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD7x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x15y13E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD7x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x15y13E);
    dp->::ccc::DD7x15y13::~DD7x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x15y13E(Test__ZN3ccc9DD7x15y13E, "_ZN3ccc9DD7x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD7x15y13C1Ev();
extern void _ZN3ccc9DD7x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD7x15y13E[] = {
  NSPAIR(_ZN3ccc9DD7x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD7x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD7x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD7x15y13E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
extern void _ZN3ccc9DD7x15y133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x15y13E[] = {
  {&(_ZTVN3ccc9DD7x15y13E[6]),  6,9},
  {&(_ZTVN3ccc9DD7x15y13E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x15y13E[];
Class_Descriptor cd__ZN3ccc9DD7x15y13E = {  "_ZN3ccc9DD7x15y13E", // class name
  bases__ZN3ccc9DD7x15y13E, 2,
  &(vtc__ZN3ccc9DD7x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD7x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x15y13E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y14  : virtual ::ccc::AA7 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC7x15y143pqrEv
  ~CC7x15y14(); // tgen
  CC7x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y14E) C1{ VBC2{ v2 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC7x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC7x15y143pqrEv");}
ccc::CC7x15y14 ::~CC7x15y14(){ note_dtor("_ZN3ccc9CC7x15y14E", this);} // tgen
ccc::CC7x15y14 ::CC7x15y14(){ note_ctor("_ZN3ccc9CC7x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC7x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC7x15y14E, buf);
    ::ccc::CC7x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC7x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x15y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9CC7x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC7x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x15y14E);
    dp->::ccc::CC7x15y14::~CC7x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x15y14E(Test__ZN3ccc9CC7x15y14E, "_ZN3ccc9CC7x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC7x15y14C1Ev();
extern void _ZN3ccc9CC7x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC7x15y14E[] = {
  NSPAIR(_ZN3ccc9CC7x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC7x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC7x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x15y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9CC7x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x15y14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC7x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x15y14E[] = {
  {&(_ZTVN3ccc9CC7x15y14E[5]),  5,7},
  {&(_ZTVN3ccc9CC7x15y14E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x15y14E[];
Class_Descriptor cd__ZN3ccc9CC7x15y14E = {  "_ZN3ccc9CC7x15y14E", // class name
  bases__ZN3ccc9CC7x15y14E, 2,
  &(vtc__ZN3ccc9CC7x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y14E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y14  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD7x15y143pqrEv
  ~DD7x15y14(); // tgen
  DD7x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD7x15y14E) C1{ VBC2{ v2 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD7x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD7x15y143pqrEv");}
ccc::DD7x15y14 ::~DD7x15y14(){ note_dtor("_ZN3ccc9DD7x15y14E", this);} // tgen
ccc::DD7x15y14 ::DD7x15y14(){ note_ctor("_ZN3ccc9DD7x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD7x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD7x15y14E, buf);
    ::ccc::DD7x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD7x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x15y14E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD7x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x15y14E);
    dp->::ccc::DD7x15y14::~DD7x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x15y14E(Test__ZN3ccc9DD7x15y14E, "_ZN3ccc9DD7x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD7x15y14C1Ev();
extern void _ZN3ccc9DD7x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD7x15y14E[] = {
  NSPAIR(_ZN3ccc9DD7x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD7x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD7x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD7x15y14E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc9DD7x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD7x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x15y14E[] = {
  {&(_ZTVN3ccc9DD7x15y14E[6]),  6,8},
  {&(_ZTVN3ccc9DD7x15y14E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x15y14E[];
Class_Descriptor cd__ZN3ccc9DD7x15y14E = {  "_ZN3ccc9DD7x15y14E", // class name
  bases__ZN3ccc9DD7x15y14E, 2,
  &(vtc__ZN3ccc9DD7x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD7x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x15y14E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC7x15y15  : virtual ::ccc::AA7 , ::ccc::BB15 {
  ~CC7x15y15(); // tgen
  CC7x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC7x15y15E) C1{ VBC2{ v1 v2} BC3{}}
}
namespace ccc { 
ccc::CC7x15y15 ::~CC7x15y15(){ note_dtor("_ZN3ccc9CC7x15y15E", this);} // tgen
ccc::CC7x15y15 ::CC7x15y15(){ note_ctor("_ZN3ccc9CC7x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC7x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC7x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC7x15y15E, buf);
    ::ccc::CC7x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC7x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC7x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC7x15y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9CC7x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC7x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC7x15y15E);
    dp->::ccc::CC7x15y15::~CC7x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC7x15y15E(Test__ZN3ccc9CC7x15y15E, "_ZN3ccc9CC7x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC7x15y15C1Ev();
extern void _ZN3ccc9CC7x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC7x15y15E[] = {
  NSPAIR(_ZN3ccc9CC7x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC7x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC7x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC7x15y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC7x15y15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC7x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC7x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC7x15y15E[] = {
  {&(_ZTVN3ccc9CC7x15y15E[5]),  5,7},
  {&(_ZTVN3ccc9CC7x15y15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC7x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC7x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC7x15y15E[];
Class_Descriptor cd__ZN3ccc9CC7x15y15E = {  "_ZN3ccc9CC7x15y15E", // class name
  bases__ZN3ccc9CC7x15y15E, 2,
  &(vtc__ZN3ccc9CC7x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC7x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC7x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC7x15y15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC7x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD7x15y15  : virtual ::ccc::AA7 , virtual ::ccc::BB15 {
  ~DD7x15y15(); // tgen
  DD7x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD7x15y15E) C1{ VBC2{ v1 v2} VBC3{}}
}
namespace ccc { 
ccc::DD7x15y15 ::~DD7x15y15(){ note_dtor("_ZN3ccc9DD7x15y15E", this);} // tgen
ccc::DD7x15y15 ::DD7x15y15(){ note_ctor("_ZN3ccc9DD7x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD7x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD7x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD7x15y15E, buf);
    ::ccc::DD7x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD7x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD7x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD7x15y15E)");
    check_base_class_offset(lv, (::ccc::AA7*), 0, "_ZN3ccc9DD7x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD7x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD7x15y15E);
    dp->::ccc::DD7x15y15::~DD7x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD7x15y15E(Test__ZN3ccc9DD7x15y15E, "_ZN3ccc9DD7x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD7x15y15C1Ev();
extern void _ZN3ccc9DD7x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD7x15y15E[] = {
  NSPAIR(_ZN3ccc9DD7x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD7x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA7E;
extern VTBL_ENTRY _ZTIN3ccc3AA7E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA7E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD7x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA7E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD7x15y15E[];
extern void _ZN3ccc3AA73abcEv();
extern void _ZN3ccc3AA73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD7x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD7x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3AA73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD7x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD7x15y15E[] = {
  {&(_ZTVN3ccc9DD7x15y15E[6]),  6,8},
  {&(_ZTVN3ccc9DD7x15y15E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD7x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD7x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD7x15y15E[];
Class_Descriptor cd__ZN3ccc9DD7x15y15E = {  "_ZN3ccc9DD7x15y15E", // class name
  bases__ZN3ccc9DD7x15y15E, 2,
  &(vtc__ZN3ccc9DD7x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD7x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD7x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD7x15y15E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD7x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x0y0  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y03pqrEv
  ~CC8x0y0(); // tgen
  CC8x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y0E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y03abcEv");}
void  ccc::CC8x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y03efgEv");}
void  ccc::CC8x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y03pqrEv");}
ccc::CC8x0y0 ::~CC8x0y0(){ note_dtor("_ZN3ccc7CC8x0y0E", this);} // tgen
ccc::CC8x0y0 ::CC8x0y0(){ note_ctor("_ZN3ccc7CC8x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y0E, buf);
    ::ccc::CC8x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y0E);
    dp->::ccc::CC8x0y0::~CC8x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y0E(Test__ZN3ccc7CC8x0y0E, "_ZN3ccc7CC8x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y0C1Ev();
extern void _ZN3ccc7CC8x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y0E[] = {
  NSPAIR(_ZN3ccc7CC8x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y0E[];
extern void _ZN3ccc7CC8x0y03abcEv();
extern void _ZN3ccc7CC8x0y03efgEv();
extern void _ZN3ccc7CC8x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y03efgEv,_ZTv0_n12_N3ccc7CC8x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y03efgEv,_ZThn4_N3ccc7CC8x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y03abcEv,_ZTv0_n16_N3ccc7CC8x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y03abcEv,_ZThn4_N3ccc7CC8x0y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y03efgEv,_ZTv0_n12_N3ccc7CC8x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y03abcEv,_ZTv0_n16_N3ccc7CC8x0y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y0E[] = {
  {&(_ZTVN3ccc7CC8x0y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y0E[];
static VTBL_ENTRY alt_thunk_names1173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y03abcEv,_ZTv0_n16_N3ccc7CC8x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y03abcEv,_ZThn4_N3ccc7CC8x0y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y03efgEv,_ZTv0_n12_N3ccc7CC8x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y03efgEv,_ZThn4_N3ccc7CC8x0y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y0E = {  "_ZN3ccc7CC8x0y0E", // class name
  bases__ZN3ccc7CC8x0y0E, 2,
  &(vtc__ZN3ccc7CC8x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y0E),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  DD8x0y0  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD8x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x0y03pqrEv
  ~DD8x0y0(); // tgen
  DD8x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y0E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y03abcEv");}
void  ccc::DD8x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y03efgEv");}
void  ccc::DD8x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y03pqrEv");}
ccc::DD8x0y0 ::~DD8x0y0(){ note_dtor("_ZN3ccc7DD8x0y0E", this);} // tgen
ccc::DD8x0y0 ::DD8x0y0(){ note_ctor("_ZN3ccc7DD8x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y0E, buf);
    ::ccc::DD8x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y0E);
    dp->::ccc::DD8x0y0::~DD8x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y0E(Test__ZN3ccc7DD8x0y0E, "_ZN3ccc7DD8x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y0C1Ev();
extern void _ZN3ccc7DD8x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y0E[] = {
  NSPAIR(_ZN3ccc7DD8x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y0E[];
extern void _ZN3ccc7DD8x0y03efgEv();
extern void _ZN3ccc7DD8x0y03abcEv();
extern void _ZN3ccc7DD8x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y03abcEv,_ZTv0_n12_N3ccc7DD8x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y03abcEv,_ZThn4_N3ccc7DD8x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y03efgEv,_ZTv0_n16_N3ccc7DD8x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y03efgEv,_ZThn4_N3ccc7DD8x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y03pqrEv,_ZTv0_n20_N3ccc7DD8x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y03pqrEv,_ZThn4_N3ccc7DD8x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y03abcEv,_ZTv0_n12_N3ccc7DD8x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y03efgEv,_ZTv0_n16_N3ccc7DD8x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y03pqrEv,_ZTv0_n20_N3ccc7DD8x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y0E[] = {
  {&(_ZTVN3ccc7DD8x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y0E[];
static VTBL_ENTRY alt_thunk_names1174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y03pqrEv,_ZTv0_n20_N3ccc7DD8x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y03pqrEv,_ZThn4_N3ccc7DD8x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y03efgEv,_ZTv0_n16_N3ccc7DD8x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y03efgEv,_ZThn4_N3ccc7DD8x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y03abcEv,_ZTv0_n12_N3ccc7DD8x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y03abcEv,_ZThn4_N3ccc7DD8x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y0E = {  "_ZN3ccc7DD8x0y0E", // class name
  bases__ZN3ccc7DD8x0y0E, 2,
  &(vtc__ZN3ccc7DD8x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y0E),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  CC8x0y1  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x0y13efgEv
  ~CC8x0y1(); // tgen
  CC8x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y1E) C1{ VBC2{ v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y13abcEv");}
void  ccc::CC8x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y13pqrEv");}
void  ccc::CC8x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y13efgEv");}
ccc::CC8x0y1 ::~CC8x0y1(){ note_dtor("_ZN3ccc7CC8x0y1E", this);} // tgen
ccc::CC8x0y1 ::CC8x0y1(){ note_ctor("_ZN3ccc7CC8x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y1E, buf);
    ::ccc::CC8x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y1E);
    dp->::ccc::CC8x0y1::~CC8x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y1E(Test__ZN3ccc7CC8x0y1E, "_ZN3ccc7CC8x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y1C1Ev();
extern void _ZN3ccc7CC8x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y1E[] = {
  NSPAIR(_ZN3ccc7CC8x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y1E[];
extern void _ZN3ccc7CC8x0y13abcEv();
extern void _ZN3ccc7CC8x0y13efgEv();
extern void _ZN3ccc7CC8x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y13efgEv,_ZTv0_n12_N3ccc7CC8x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y13efgEv,_ZThn4_N3ccc7CC8x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y13abcEv,_ZTv0_n16_N3ccc7CC8x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y13abcEv,_ZThn4_N3ccc7CC8x0y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y13efgEv,_ZTv0_n12_N3ccc7CC8x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y13abcEv,_ZTv0_n16_N3ccc7CC8x0y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y1E[] = {
  {&(_ZTVN3ccc7CC8x0y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y1E[];
static VTBL_ENTRY alt_thunk_names1175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y13abcEv,_ZTv0_n16_N3ccc7CC8x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y13abcEv,_ZThn4_N3ccc7CC8x0y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y13efgEv,_ZTv0_n12_N3ccc7CC8x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y13efgEv,_ZThn4_N3ccc7CC8x0y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y1E = {  "_ZN3ccc7CC8x0y1E", // class name
  bases__ZN3ccc7CC8x0y1E, 2,
  &(vtc__ZN3ccc7CC8x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y1E),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  DD8x0y1  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD8x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x0y13efgEv
  ~DD8x0y1(); // tgen
  DD8x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y1E) C1{ VBC2{ v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y13abcEv");}
void  ccc::DD8x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y13pqrEv");}
void  ccc::DD8x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y13efgEv");}
ccc::DD8x0y1 ::~DD8x0y1(){ note_dtor("_ZN3ccc7DD8x0y1E", this);} // tgen
ccc::DD8x0y1 ::DD8x0y1(){ note_ctor("_ZN3ccc7DD8x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y1E, buf);
    ::ccc::DD8x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y1E);
    dp->::ccc::DD8x0y1::~DD8x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y1E(Test__ZN3ccc7DD8x0y1E, "_ZN3ccc7DD8x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y1C1Ev();
extern void _ZN3ccc7DD8x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y1E[] = {
  NSPAIR(_ZN3ccc7DD8x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y1E[];
extern void _ZN3ccc7DD8x0y13efgEv();
extern void _ZN3ccc7DD8x0y13abcEv();
extern void _ZN3ccc7DD8x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y13abcEv,_ZTv0_n12_N3ccc7DD8x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y13abcEv,_ZThn4_N3ccc7DD8x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y13efgEv,_ZTv0_n16_N3ccc7DD8x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y13efgEv,_ZThn4_N3ccc7DD8x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y13pqrEv,_ZTv0_n20_N3ccc7DD8x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y13pqrEv,_ZThn4_N3ccc7DD8x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y13abcEv,_ZTv0_n12_N3ccc7DD8x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y13efgEv,_ZTv0_n16_N3ccc7DD8x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y13pqrEv,_ZTv0_n20_N3ccc7DD8x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y1E[] = {
  {&(_ZTVN3ccc7DD8x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y1E[];
static VTBL_ENTRY alt_thunk_names1176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y13pqrEv,_ZTv0_n20_N3ccc7DD8x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y13pqrEv,_ZThn4_N3ccc7DD8x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y13efgEv,_ZTv0_n16_N3ccc7DD8x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y13efgEv,_ZThn4_N3ccc7DD8x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y13abcEv,_ZTv0_n12_N3ccc7DD8x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y13abcEv,_ZThn4_N3ccc7DD8x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y1E = {  "_ZN3ccc7DD8x0y1E", // class name
  bases__ZN3ccc7DD8x0y1E, 2,
  &(vtc__ZN3ccc7DD8x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y1E),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  CC8x0y2  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y23pqrEv
  ~CC8x0y2(); // tgen
  CC8x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y2E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y23efgEv");}
void  ccc::CC8x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y23abcEv");}
void  ccc::CC8x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y23pqrEv");}
ccc::CC8x0y2 ::~CC8x0y2(){ note_dtor("_ZN3ccc7CC8x0y2E", this);} // tgen
ccc::CC8x0y2 ::CC8x0y2(){ note_ctor("_ZN3ccc7CC8x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y2E, buf);
    ::ccc::CC8x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y2E);
    dp->::ccc::CC8x0y2::~CC8x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y2E(Test__ZN3ccc7CC8x0y2E, "_ZN3ccc7CC8x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y2C1Ev();
extern void _ZN3ccc7CC8x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y2E[] = {
  NSPAIR(_ZN3ccc7CC8x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y2E[];
extern void _ZN3ccc7CC8x0y23abcEv();
extern void _ZN3ccc7CC8x0y23efgEv();
extern void _ZN3ccc7CC8x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y23efgEv,_ZTv0_n12_N3ccc7CC8x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y23efgEv,_ZThn4_N3ccc7CC8x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y23abcEv,_ZTv0_n16_N3ccc7CC8x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y23abcEv,_ZThn4_N3ccc7CC8x0y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y23efgEv,_ZTv0_n12_N3ccc7CC8x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y23abcEv,_ZTv0_n16_N3ccc7CC8x0y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y2E[] = {
  {&(_ZTVN3ccc7CC8x0y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y2E[];
static VTBL_ENTRY alt_thunk_names1177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y23abcEv,_ZTv0_n16_N3ccc7CC8x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y23abcEv,_ZThn4_N3ccc7CC8x0y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y23efgEv,_ZTv0_n12_N3ccc7CC8x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y23efgEv,_ZThn4_N3ccc7CC8x0y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y2E = {  "_ZN3ccc7CC8x0y2E", // class name
  bases__ZN3ccc7CC8x0y2E, 2,
  &(vtc__ZN3ccc7CC8x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y2E),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  DD8x0y2  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD8x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x0y23pqrEv
  ~DD8x0y2(); // tgen
  DD8x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y2E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y23efgEv");}
void  ccc::DD8x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y23abcEv");}
void  ccc::DD8x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y23pqrEv");}
ccc::DD8x0y2 ::~DD8x0y2(){ note_dtor("_ZN3ccc7DD8x0y2E", this);} // tgen
ccc::DD8x0y2 ::DD8x0y2(){ note_ctor("_ZN3ccc7DD8x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y2E, buf);
    ::ccc::DD8x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y2E);
    dp->::ccc::DD8x0y2::~DD8x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y2E(Test__ZN3ccc7DD8x0y2E, "_ZN3ccc7DD8x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y2C1Ev();
extern void _ZN3ccc7DD8x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y2E[] = {
  NSPAIR(_ZN3ccc7DD8x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y2E[];
extern void _ZN3ccc7DD8x0y23efgEv();
extern void _ZN3ccc7DD8x0y23abcEv();
extern void _ZN3ccc7DD8x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y23abcEv,_ZTv0_n12_N3ccc7DD8x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y23abcEv,_ZThn4_N3ccc7DD8x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y23efgEv,_ZTv0_n16_N3ccc7DD8x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y23efgEv,_ZThn4_N3ccc7DD8x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y23pqrEv,_ZTv0_n20_N3ccc7DD8x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y23pqrEv,_ZThn4_N3ccc7DD8x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y23abcEv,_ZTv0_n12_N3ccc7DD8x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y23efgEv,_ZTv0_n16_N3ccc7DD8x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y23pqrEv,_ZTv0_n20_N3ccc7DD8x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y2E[] = {
  {&(_ZTVN3ccc7DD8x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y2E[];
static VTBL_ENTRY alt_thunk_names1178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y23pqrEv,_ZTv0_n20_N3ccc7DD8x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y23pqrEv,_ZThn4_N3ccc7DD8x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y23efgEv,_ZTv0_n16_N3ccc7DD8x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y23efgEv,_ZThn4_N3ccc7DD8x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y23abcEv,_ZTv0_n12_N3ccc7DD8x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y23abcEv,_ZThn4_N3ccc7DD8x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y2E = {  "_ZN3ccc7DD8x0y2E", // class name
  bases__ZN3ccc7DD8x0y2E, 2,
  &(vtc__ZN3ccc7DD8x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y2E),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  CC8x0y3  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x0y33abcEv
  ~CC8x0y3(); // tgen
  CC8x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y3E) C1{ VBC2{ v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y33efgEv");}
void  ccc::CC8x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y33pqrEv");}
void  ccc::CC8x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y33abcEv");}
ccc::CC8x0y3 ::~CC8x0y3(){ note_dtor("_ZN3ccc7CC8x0y3E", this);} // tgen
ccc::CC8x0y3 ::CC8x0y3(){ note_ctor("_ZN3ccc7CC8x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y3E, buf);
    ::ccc::CC8x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y3E);
    dp->::ccc::CC8x0y3::~CC8x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y3E(Test__ZN3ccc7CC8x0y3E, "_ZN3ccc7CC8x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y3C1Ev();
extern void _ZN3ccc7CC8x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y3E[] = {
  NSPAIR(_ZN3ccc7CC8x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y3E[];
extern void _ZN3ccc7CC8x0y33abcEv();
extern void _ZN3ccc7CC8x0y33efgEv();
extern void _ZN3ccc7CC8x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y33efgEv,_ZTv0_n12_N3ccc7CC8x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y33efgEv,_ZThn4_N3ccc7CC8x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y33abcEv,_ZTv0_n16_N3ccc7CC8x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y33abcEv,_ZThn4_N3ccc7CC8x0y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y33efgEv,_ZTv0_n12_N3ccc7CC8x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y33abcEv,_ZTv0_n16_N3ccc7CC8x0y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y3E[] = {
  {&(_ZTVN3ccc7CC8x0y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y3E[];
static VTBL_ENTRY alt_thunk_names1179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y33abcEv,_ZTv0_n16_N3ccc7CC8x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y33abcEv,_ZThn4_N3ccc7CC8x0y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y33efgEv,_ZTv0_n12_N3ccc7CC8x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y33efgEv,_ZThn4_N3ccc7CC8x0y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y3E = {  "_ZN3ccc7CC8x0y3E", // class name
  bases__ZN3ccc7CC8x0y3E, 2,
  &(vtc__ZN3ccc7CC8x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y3E),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  DD8x0y3  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD8x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x0y33abcEv
  ~DD8x0y3(); // tgen
  DD8x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y3E) C1{ VBC2{ v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y33efgEv");}
void  ccc::DD8x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y33pqrEv");}
void  ccc::DD8x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y33abcEv");}
ccc::DD8x0y3 ::~DD8x0y3(){ note_dtor("_ZN3ccc7DD8x0y3E", this);} // tgen
ccc::DD8x0y3 ::DD8x0y3(){ note_ctor("_ZN3ccc7DD8x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y3E, buf);
    ::ccc::DD8x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y3E);
    dp->::ccc::DD8x0y3::~DD8x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y3E(Test__ZN3ccc7DD8x0y3E, "_ZN3ccc7DD8x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y3C1Ev();
extern void _ZN3ccc7DD8x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y3E[] = {
  NSPAIR(_ZN3ccc7DD8x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y3E[];
extern void _ZN3ccc7DD8x0y33efgEv();
extern void _ZN3ccc7DD8x0y33abcEv();
extern void _ZN3ccc7DD8x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y33abcEv,_ZTv0_n12_N3ccc7DD8x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y33abcEv,_ZThn4_N3ccc7DD8x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y33efgEv,_ZTv0_n16_N3ccc7DD8x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y33efgEv,_ZThn4_N3ccc7DD8x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y33pqrEv,_ZTv0_n20_N3ccc7DD8x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y33pqrEv,_ZThn4_N3ccc7DD8x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y33abcEv,_ZTv0_n12_N3ccc7DD8x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y33efgEv,_ZTv0_n16_N3ccc7DD8x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y33pqrEv,_ZTv0_n20_N3ccc7DD8x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y3E[] = {
  {&(_ZTVN3ccc7DD8x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y3E[];
static VTBL_ENTRY alt_thunk_names1180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y33pqrEv,_ZTv0_n20_N3ccc7DD8x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y33pqrEv,_ZThn4_N3ccc7DD8x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y33efgEv,_ZTv0_n16_N3ccc7DD8x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y33efgEv,_ZThn4_N3ccc7DD8x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y33abcEv,_ZTv0_n12_N3ccc7DD8x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y33abcEv,_ZThn4_N3ccc7DD8x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y3E = {  "_ZN3ccc7DD8x0y3E", // class name
  bases__ZN3ccc7DD8x0y3E, 2,
  &(vtc__ZN3ccc7DD8x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y3E),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  CC8x0y4  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC8x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x0y43efgEv
  ~CC8x0y4(); // tgen
  CC8x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y4E) C1{ VBC2{ v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y43pqrEv");}
void  ccc::CC8x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y43abcEv");}
void  ccc::CC8x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y43efgEv");}
ccc::CC8x0y4 ::~CC8x0y4(){ note_dtor("_ZN3ccc7CC8x0y4E", this);} // tgen
ccc::CC8x0y4 ::CC8x0y4(){ note_ctor("_ZN3ccc7CC8x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y4E, buf);
    ::ccc::CC8x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y4E);
    dp->::ccc::CC8x0y4::~CC8x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y4E(Test__ZN3ccc7CC8x0y4E, "_ZN3ccc7CC8x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y4C1Ev();
extern void _ZN3ccc7CC8x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y4E[] = {
  NSPAIR(_ZN3ccc7CC8x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y4E[];
extern void _ZN3ccc7CC8x0y43abcEv();
extern void _ZN3ccc7CC8x0y43efgEv();
extern void _ZN3ccc7CC8x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y43efgEv,_ZTv0_n12_N3ccc7CC8x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y43efgEv,_ZThn4_N3ccc7CC8x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y43abcEv,_ZTv0_n16_N3ccc7CC8x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y43abcEv,_ZThn4_N3ccc7CC8x0y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y43efgEv,_ZTv0_n12_N3ccc7CC8x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y43abcEv,_ZTv0_n16_N3ccc7CC8x0y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y4E[] = {
  {&(_ZTVN3ccc7CC8x0y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y4E[];
static VTBL_ENTRY alt_thunk_names1181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y43abcEv,_ZTv0_n16_N3ccc7CC8x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y43abcEv,_ZThn4_N3ccc7CC8x0y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y43efgEv,_ZTv0_n12_N3ccc7CC8x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y43efgEv,_ZThn4_N3ccc7CC8x0y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y4E = {  "_ZN3ccc7CC8x0y4E", // class name
  bases__ZN3ccc7CC8x0y4E, 2,
  &(vtc__ZN3ccc7CC8x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y4E),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  DD8x0y4  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD8x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x0y43efgEv
  ~DD8x0y4(); // tgen
  DD8x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y4E) C1{ VBC2{ v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y43pqrEv");}
void  ccc::DD8x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y43abcEv");}
void  ccc::DD8x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y43efgEv");}
ccc::DD8x0y4 ::~DD8x0y4(){ note_dtor("_ZN3ccc7DD8x0y4E", this);} // tgen
ccc::DD8x0y4 ::DD8x0y4(){ note_ctor("_ZN3ccc7DD8x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y4E, buf);
    ::ccc::DD8x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y4E);
    dp->::ccc::DD8x0y4::~DD8x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y4E(Test__ZN3ccc7DD8x0y4E, "_ZN3ccc7DD8x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y4C1Ev();
extern void _ZN3ccc7DD8x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y4E[] = {
  NSPAIR(_ZN3ccc7DD8x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y4E[];
extern void _ZN3ccc7DD8x0y43efgEv();
extern void _ZN3ccc7DD8x0y43abcEv();
extern void _ZN3ccc7DD8x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y43abcEv,_ZTv0_n12_N3ccc7DD8x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y43abcEv,_ZThn4_N3ccc7DD8x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y43efgEv,_ZTv0_n16_N3ccc7DD8x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y43efgEv,_ZThn4_N3ccc7DD8x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y43pqrEv,_ZTv0_n20_N3ccc7DD8x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y43pqrEv,_ZThn4_N3ccc7DD8x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y43abcEv,_ZTv0_n12_N3ccc7DD8x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y43efgEv,_ZTv0_n16_N3ccc7DD8x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y43pqrEv,_ZTv0_n20_N3ccc7DD8x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y4E[] = {
  {&(_ZTVN3ccc7DD8x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y4E[];
static VTBL_ENTRY alt_thunk_names1182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y43pqrEv,_ZTv0_n20_N3ccc7DD8x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y43pqrEv,_ZThn4_N3ccc7DD8x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y43efgEv,_ZTv0_n16_N3ccc7DD8x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y43efgEv,_ZThn4_N3ccc7DD8x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y43abcEv,_ZTv0_n12_N3ccc7DD8x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y43abcEv,_ZThn4_N3ccc7DD8x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y4E = {  "_ZN3ccc7DD8x0y4E", // class name
  bases__ZN3ccc7DD8x0y4E, 2,
  &(vtc__ZN3ccc7DD8x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y4E),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  CC8x0y5  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC8x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x0y53abcEv
  ~CC8x0y5(); // tgen
  CC8x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y5E) C1{ VBC2{ v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y53pqrEv");}
void  ccc::CC8x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y53efgEv");}
void  ccc::CC8x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y53abcEv");}
ccc::CC8x0y5 ::~CC8x0y5(){ note_dtor("_ZN3ccc7CC8x0y5E", this);} // tgen
ccc::CC8x0y5 ::CC8x0y5(){ note_ctor("_ZN3ccc7CC8x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y5E, buf);
    ::ccc::CC8x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y5E);
    dp->::ccc::CC8x0y5::~CC8x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y5E(Test__ZN3ccc7CC8x0y5E, "_ZN3ccc7CC8x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y5C1Ev();
extern void _ZN3ccc7CC8x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y5E[] = {
  NSPAIR(_ZN3ccc7CC8x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y5E[];
extern void _ZN3ccc7CC8x0y53abcEv();
extern void _ZN3ccc7CC8x0y53efgEv();
extern void _ZN3ccc7CC8x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y53efgEv,_ZTv0_n12_N3ccc7CC8x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y53efgEv,_ZThn4_N3ccc7CC8x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y53abcEv,_ZTv0_n16_N3ccc7CC8x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y53abcEv,_ZThn4_N3ccc7CC8x0y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y53efgEv,_ZTv0_n12_N3ccc7CC8x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y53abcEv,_ZTv0_n16_N3ccc7CC8x0y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y5E[] = {
  {&(_ZTVN3ccc7CC8x0y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y5E[];
static VTBL_ENTRY alt_thunk_names1183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y53abcEv,_ZTv0_n16_N3ccc7CC8x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y53abcEv,_ZThn4_N3ccc7CC8x0y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y53efgEv,_ZTv0_n12_N3ccc7CC8x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y53efgEv,_ZThn4_N3ccc7CC8x0y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y5E = {  "_ZN3ccc7CC8x0y5E", // class name
  bases__ZN3ccc7CC8x0y5E, 2,
  &(vtc__ZN3ccc7CC8x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y5E),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  DD8x0y5  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD8x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x0y53abcEv
  ~DD8x0y5(); // tgen
  DD8x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y5E) C1{ VBC2{ v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y53pqrEv");}
void  ccc::DD8x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y53efgEv");}
void  ccc::DD8x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y53abcEv");}
ccc::DD8x0y5 ::~DD8x0y5(){ note_dtor("_ZN3ccc7DD8x0y5E", this);} // tgen
ccc::DD8x0y5 ::DD8x0y5(){ note_ctor("_ZN3ccc7DD8x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y5E, buf);
    ::ccc::DD8x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y5E);
    dp->::ccc::DD8x0y5::~DD8x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y5E(Test__ZN3ccc7DD8x0y5E, "_ZN3ccc7DD8x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y5C1Ev();
extern void _ZN3ccc7DD8x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y5E[] = {
  NSPAIR(_ZN3ccc7DD8x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y5E[];
extern void _ZN3ccc7DD8x0y53efgEv();
extern void _ZN3ccc7DD8x0y53abcEv();
extern void _ZN3ccc7DD8x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y53abcEv,_ZTv0_n12_N3ccc7DD8x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y53abcEv,_ZThn4_N3ccc7DD8x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y53efgEv,_ZTv0_n16_N3ccc7DD8x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y53efgEv,_ZThn4_N3ccc7DD8x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y53pqrEv,_ZTv0_n20_N3ccc7DD8x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y53pqrEv,_ZThn4_N3ccc7DD8x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y53abcEv,_ZTv0_n12_N3ccc7DD8x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y53efgEv,_ZTv0_n16_N3ccc7DD8x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y53pqrEv,_ZTv0_n20_N3ccc7DD8x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y5E[] = {
  {&(_ZTVN3ccc7DD8x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y5E[];
static VTBL_ENTRY alt_thunk_names1184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y53pqrEv,_ZTv0_n20_N3ccc7DD8x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y53pqrEv,_ZThn4_N3ccc7DD8x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y53efgEv,_ZTv0_n16_N3ccc7DD8x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y53efgEv,_ZThn4_N3ccc7DD8x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y53abcEv,_ZTv0_n12_N3ccc7DD8x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y53abcEv,_ZThn4_N3ccc7DD8x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y5E = {  "_ZN3ccc7DD8x0y5E", // class name
  bases__ZN3ccc7DD8x0y5E, 2,
  &(vtc__ZN3ccc7DD8x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y5E),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  CC8x0y6  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x0y63efgEv
  ~CC8x0y6(); // tgen
  CC8x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y6E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y63abcEv");}
void  ccc::CC8x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y63efgEv");}
ccc::CC8x0y6 ::~CC8x0y6(){ note_dtor("_ZN3ccc7CC8x0y6E", this);} // tgen
ccc::CC8x0y6 ::CC8x0y6(){ note_ctor("_ZN3ccc7CC8x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y6E, buf);
    ::ccc::CC8x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y6E);
    dp->::ccc::CC8x0y6::~CC8x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y6E(Test__ZN3ccc7CC8x0y6E, "_ZN3ccc7CC8x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y6C1Ev();
extern void _ZN3ccc7CC8x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y6E[] = {
  NSPAIR(_ZN3ccc7CC8x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y6E[];
extern void _ZN3ccc7CC8x0y63abcEv();
extern void _ZN3ccc7CC8x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y63efgEv,_ZTv0_n12_N3ccc7CC8x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y63efgEv,_ZThn4_N3ccc7CC8x0y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y63abcEv,_ZTv0_n16_N3ccc7CC8x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y63abcEv,_ZThn4_N3ccc7CC8x0y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y63efgEv,_ZTv0_n12_N3ccc7CC8x0y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y63abcEv,_ZTv0_n16_N3ccc7CC8x0y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y6E[] = {
  {&(_ZTVN3ccc7CC8x0y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y6E[];
static VTBL_ENTRY alt_thunk_names1185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y63abcEv,_ZTv0_n16_N3ccc7CC8x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y63abcEv,_ZThn4_N3ccc7CC8x0y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y63efgEv,_ZTv0_n12_N3ccc7CC8x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y63efgEv,_ZThn4_N3ccc7CC8x0y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y6E = {  "_ZN3ccc7CC8x0y6E", // class name
  bases__ZN3ccc7CC8x0y6E, 2,
  &(vtc__ZN3ccc7CC8x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y6E),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  DD8x0y6  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD8x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x0y63efgEv
  ~DD8x0y6(); // tgen
  DD8x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y6E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y63abcEv");}
void  ccc::DD8x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y63efgEv");}
ccc::DD8x0y6 ::~DD8x0y6(){ note_dtor("_ZN3ccc7DD8x0y6E", this);} // tgen
ccc::DD8x0y6 ::DD8x0y6(){ note_ctor("_ZN3ccc7DD8x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y6E, buf);
    ::ccc::DD8x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y6E);
    dp->::ccc::DD8x0y6::~DD8x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y6E(Test__ZN3ccc7DD8x0y6E, "_ZN3ccc7DD8x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y6C1Ev();
extern void _ZN3ccc7DD8x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y6E[] = {
  NSPAIR(_ZN3ccc7DD8x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y6E[];
extern void _ZN3ccc7DD8x0y63efgEv();
extern void _ZN3ccc7DD8x0y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y63abcEv,_ZTv0_n12_N3ccc7DD8x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y63abcEv,_ZThn4_N3ccc7DD8x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y63efgEv,_ZTv0_n16_N3ccc7DD8x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y63efgEv,_ZThn4_N3ccc7DD8x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y63abcEv,_ZTv0_n12_N3ccc7DD8x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y63efgEv,_ZTv0_n16_N3ccc7DD8x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y6E[] = {
  {&(_ZTVN3ccc7DD8x0y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x0y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x0y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y6E[];
static VTBL_ENTRY alt_thunk_names1186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y63efgEv,_ZTv0_n16_N3ccc7DD8x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y63efgEv,_ZThn4_N3ccc7DD8x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y63abcEv,_ZTv0_n12_N3ccc7DD8x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y63abcEv,_ZThn4_N3ccc7DD8x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y6E = {  "_ZN3ccc7DD8x0y6E", // class name
  bases__ZN3ccc7DD8x0y6E, 2,
  &(vtc__ZN3ccc7DD8x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y6E),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  CC8x0y7  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC8x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y73pqrEv
  ~CC8x0y7(); // tgen
  CC8x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y7E) C1{ VBC2{ v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y73abcEv");}
void  ccc::CC8x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y73pqrEv");}
ccc::CC8x0y7 ::~CC8x0y7(){ note_dtor("_ZN3ccc7CC8x0y7E", this);} // tgen
ccc::CC8x0y7 ::CC8x0y7(){ note_ctor("_ZN3ccc7CC8x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y7E, buf);
    ::ccc::CC8x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y7E);
    dp->::ccc::CC8x0y7::~CC8x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y7E(Test__ZN3ccc7CC8x0y7E, "_ZN3ccc7CC8x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y7C1Ev();
extern void _ZN3ccc7CC8x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y7E[] = {
  NSPAIR(_ZN3ccc7CC8x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y7E[];
extern void _ZN3ccc7CC8x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC8x0y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y73abcEv,_ZTv0_n16_N3ccc7CC8x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y73abcEv,_ZThn4_N3ccc7CC8x0y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y73abcEv,_ZTv0_n16_N3ccc7CC8x0y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y7E[] = {
  {&(_ZTVN3ccc7CC8x0y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y7E[];
static VTBL_ENTRY alt_thunk_names1187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y73abcEv,_ZTv0_n16_N3ccc7CC8x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y73abcEv,_ZThn4_N3ccc7CC8x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y7E = {  "_ZN3ccc7CC8x0y7E", // class name
  bases__ZN3ccc7CC8x0y7E, 2,
  &(vtc__ZN3ccc7CC8x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y7E),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  DD8x0y7  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD8x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x0y73pqrEv
  ~DD8x0y7(); // tgen
  DD8x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y7E) C1{ VBC2{ v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y73abcEv");}
void  ccc::DD8x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y73pqrEv");}
ccc::DD8x0y7 ::~DD8x0y7(){ note_dtor("_ZN3ccc7DD8x0y7E", this);} // tgen
ccc::DD8x0y7 ::DD8x0y7(){ note_ctor("_ZN3ccc7DD8x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y7E, buf);
    ::ccc::DD8x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y7E);
    dp->::ccc::DD8x0y7::~DD8x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y7E(Test__ZN3ccc7DD8x0y7E, "_ZN3ccc7DD8x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y7C1Ev();
extern void _ZN3ccc7DD8x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y7E[] = {
  NSPAIR(_ZN3ccc7DD8x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x0y73abcEv();
extern void _ZN3ccc7DD8x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y73abcEv,_ZTv0_n12_N3ccc7DD8x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y73abcEv,_ZThn4_N3ccc7DD8x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y73pqrEv,_ZTv0_n20_N3ccc7DD8x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y73pqrEv,_ZThn4_N3ccc7DD8x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y73abcEv,_ZTv0_n12_N3ccc7DD8x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y73pqrEv,_ZTv0_n20_N3ccc7DD8x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y7E[] = {
  {&(_ZTVN3ccc7DD8x0y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y7E[];
static VTBL_ENTRY alt_thunk_names1188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y73pqrEv,_ZTv0_n20_N3ccc7DD8x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y73pqrEv,_ZThn4_N3ccc7DD8x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y73abcEv,_ZTv0_n12_N3ccc7DD8x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y73abcEv,_ZThn4_N3ccc7DD8x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y7E = {  "_ZN3ccc7DD8x0y7E", // class name
  bases__ZN3ccc7DD8x0y7E, 2,
  &(vtc__ZN3ccc7DD8x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y7E),3, //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  CC8x0y8  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x0y83abcEv
  ~CC8x0y8(); // tgen
  CC8x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y8E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y83efgEv");}
void  ccc::CC8x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x0y83abcEv");}
ccc::CC8x0y8 ::~CC8x0y8(){ note_dtor("_ZN3ccc7CC8x0y8E", this);} // tgen
ccc::CC8x0y8 ::CC8x0y8(){ note_ctor("_ZN3ccc7CC8x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y8E, buf);
    ::ccc::CC8x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y8E);
    dp->::ccc::CC8x0y8::~CC8x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y8E(Test__ZN3ccc7CC8x0y8E, "_ZN3ccc7CC8x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y8C1Ev();
extern void _ZN3ccc7CC8x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y8E[] = {
  NSPAIR(_ZN3ccc7CC8x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y8E[];
extern void _ZN3ccc7CC8x0y83abcEv();
extern void _ZN3ccc7CC8x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y83efgEv,_ZTv0_n12_N3ccc7CC8x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y83efgEv,_ZThn4_N3ccc7CC8x0y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x0y83abcEv,_ZTv0_n16_N3ccc7CC8x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y83abcEv,_ZThn4_N3ccc7CC8x0y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y83efgEv,_ZTv0_n12_N3ccc7CC8x0y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x0y83abcEv,_ZTv0_n16_N3ccc7CC8x0y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y8E[] = {
  {&(_ZTVN3ccc7CC8x0y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y8E[];
static VTBL_ENTRY alt_thunk_names1189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x0y83abcEv,_ZTv0_n16_N3ccc7CC8x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y83abcEv,_ZThn4_N3ccc7CC8x0y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y83efgEv,_ZTv0_n12_N3ccc7CC8x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y83efgEv,_ZThn4_N3ccc7CC8x0y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y8E = {  "_ZN3ccc7CC8x0y8E", // class name
  bases__ZN3ccc7CC8x0y8E, 2,
  &(vtc__ZN3ccc7CC8x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y8E),2, //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  DD8x0y8  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD8x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x0y83abcEv
  ~DD8x0y8(); // tgen
  DD8x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y8E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y83efgEv");}
void  ccc::DD8x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x0y83abcEv");}
ccc::DD8x0y8 ::~DD8x0y8(){ note_dtor("_ZN3ccc7DD8x0y8E", this);} // tgen
ccc::DD8x0y8 ::DD8x0y8(){ note_ctor("_ZN3ccc7DD8x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y8E, buf);
    ::ccc::DD8x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y8E);
    dp->::ccc::DD8x0y8::~DD8x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y8E(Test__ZN3ccc7DD8x0y8E, "_ZN3ccc7DD8x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y8C1Ev();
extern void _ZN3ccc7DD8x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y8E[] = {
  NSPAIR(_ZN3ccc7DD8x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y8E[];
extern void _ZN3ccc7DD8x0y83efgEv();
extern void _ZN3ccc7DD8x0y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x0y83abcEv,_ZTv0_n12_N3ccc7DD8x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y83abcEv,_ZThn4_N3ccc7DD8x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y83efgEv,_ZTv0_n16_N3ccc7DD8x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y83efgEv,_ZThn4_N3ccc7DD8x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x0y83abcEv,_ZTv0_n12_N3ccc7DD8x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y83efgEv,_ZTv0_n16_N3ccc7DD8x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y8E[] = {
  {&(_ZTVN3ccc7DD8x0y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x0y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x0y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y8E[];
static VTBL_ENTRY alt_thunk_names1190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y83efgEv,_ZTv0_n16_N3ccc7DD8x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y83efgEv,_ZThn4_N3ccc7DD8x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x0y83abcEv,_ZTv0_n12_N3ccc7DD8x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y83abcEv,_ZThn4_N3ccc7DD8x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y8E = {  "_ZN3ccc7DD8x0y8E", // class name
  bases__ZN3ccc7DD8x0y8E, 2,
  &(vtc__ZN3ccc7DD8x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y8E),3, //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  CC8x0y9  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC8x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x0y93pqrEv
  ~CC8x0y9(); // tgen
  CC8x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x0y9E) C1{ VBC2{ v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x0y93efgEv");}
void  ccc::CC8x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x0y93pqrEv");}
ccc::CC8x0y9 ::~CC8x0y9(){ note_dtor("_ZN3ccc7CC8x0y9E", this);} // tgen
ccc::CC8x0y9 ::CC8x0y9(){ note_ctor("_ZN3ccc7CC8x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x0y9E, buf);
    ::ccc::CC8x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x0y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC8x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x0y9E);
    dp->::ccc::CC8x0y9::~CC8x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x0y9E(Test__ZN3ccc7CC8x0y9E, "_ZN3ccc7CC8x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x0y9C1Ev();
extern void _ZN3ccc7CC8x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x0y9E[] = {
  NSPAIR(_ZN3ccc7CC8x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC8x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC8x0y93efgEv();
extern void _ZN3ccc7CC8x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x0y93efgEv,_ZTv0_n12_N3ccc7CC8x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x0y93efgEv,_ZThn4_N3ccc7CC8x0y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x0y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x0y93efgEv,_ZTv0_n12_N3ccc7CC8x0y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x0y9E[] = {
  {&(_ZTVN3ccc7CC8x0y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x0y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x0y9E[];
static VTBL_ENTRY alt_thunk_names1191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x0y93efgEv,_ZTv0_n12_N3ccc7CC8x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x0y93efgEv,_ZThn4_N3ccc7CC8x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x0y9E = {  "_ZN3ccc7CC8x0y9E", // class name
  bases__ZN3ccc7CC8x0y9E, 2,
  &(vtc__ZN3ccc7CC8x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x0y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x0y9E),2, //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  DD8x0y9  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD8x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x0y93pqrEv
  ~DD8x0y9(); // tgen
  DD8x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x0y9E) C1{ VBC2{ v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x0y93efgEv");}
void  ccc::DD8x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x0y93pqrEv");}
ccc::DD8x0y9 ::~DD8x0y9(){ note_dtor("_ZN3ccc7DD8x0y9E", this);} // tgen
ccc::DD8x0y9 ::DD8x0y9(){ note_ctor("_ZN3ccc7DD8x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x0y9E, buf);
    ::ccc::DD8x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x0y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD8x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x0y9E);
    dp->::ccc::DD8x0y9::~DD8x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x0y9E(Test__ZN3ccc7DD8x0y9E, "_ZN3ccc7DD8x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x0y9C1Ev();
extern void _ZN3ccc7DD8x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x0y9E[] = {
  NSPAIR(_ZN3ccc7DD8x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD8x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y9E[];
extern void _ZN3ccc7DD8x0y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x0y93efgEv,_ZTv0_n16_N3ccc7DD8x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y93efgEv,_ZThn4_N3ccc7DD8x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x0y93pqrEv,_ZTv0_n20_N3ccc7DD8x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x0y93pqrEv,_ZThn4_N3ccc7DD8x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x0y93efgEv,_ZTv0_n16_N3ccc7DD8x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x0y93pqrEv,_ZTv0_n20_N3ccc7DD8x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x0y9E[] = {
  {&(_ZTVN3ccc7DD8x0y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x0y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x0y9E[];
static VTBL_ENTRY alt_thunk_names1192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x0y93pqrEv,_ZTv0_n20_N3ccc7DD8x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y93pqrEv,_ZThn4_N3ccc7DD8x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x0y93efgEv,_ZTv0_n16_N3ccc7DD8x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x0y93efgEv,_ZThn4_N3ccc7DD8x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x0y9E = {  "_ZN3ccc7DD8x0y9E", // class name
  bases__ZN3ccc7DD8x0y9E, 2,
  &(vtc__ZN3ccc7DD8x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x0y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x0y9E),3, //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  CC8x0y10  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC8x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x0y103abcEv
  ~CC8x0y10(); // tgen
  CC8x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y10E) C1{ VBC2{ v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x0y103pqrEv");}
void  ccc::CC8x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x0y103abcEv");}
ccc::CC8x0y10 ::~CC8x0y10(){ note_dtor("_ZN3ccc8CC8x0y10E", this);} // tgen
ccc::CC8x0y10 ::CC8x0y10(){ note_ctor("_ZN3ccc8CC8x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x0y10E, buf);
    ::ccc::CC8x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x0y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC8x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x0y10E);
    dp->::ccc::CC8x0y10::~CC8x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x0y10E(Test__ZN3ccc8CC8x0y10E, "_ZN3ccc8CC8x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x0y10C1Ev();
extern void _ZN3ccc8CC8x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x0y10E[] = {
  NSPAIR(_ZN3ccc8CC8x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC8x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x0y10E[];
extern void _ZN3ccc8CC8x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC8x0y103pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x0y103abcEv,_ZTv0_n16_N3ccc8CC8x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y103abcEv,_ZThn4_N3ccc8CC8x0y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x0y103abcEv,_ZTv0_n16_N3ccc8CC8x0y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x0y10E[] = {
  {&(_ZTVN3ccc8CC8x0y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x0y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x0y10E[];
static VTBL_ENTRY alt_thunk_names1193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x0y103abcEv,_ZTv0_n16_N3ccc8CC8x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x0y103abcEv,_ZThn4_N3ccc8CC8x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x0y10E = {  "_ZN3ccc8CC8x0y10E", // class name
  bases__ZN3ccc8CC8x0y10E, 2,
  &(vtc__ZN3ccc8CC8x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x0y10E),2, //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  DD8x0y10  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD8x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x0y103abcEv
  ~DD8x0y10(); // tgen
  DD8x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x0y10E) C1{ VBC2{ v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x0y103pqrEv");}
void  ccc::DD8x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x0y103abcEv");}
ccc::DD8x0y10 ::~DD8x0y10(){ note_dtor("_ZN3ccc8DD8x0y10E", this);} // tgen
ccc::DD8x0y10 ::DD8x0y10(){ note_ctor("_ZN3ccc8DD8x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x0y10E, buf);
    ::ccc::DD8x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x0y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD8x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x0y10E);
    dp->::ccc::DD8x0y10::~DD8x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x0y10E(Test__ZN3ccc8DD8x0y10E, "_ZN3ccc8DD8x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x0y10C1Ev();
extern void _ZN3ccc8DD8x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x0y10E[] = {
  NSPAIR(_ZN3ccc8DD8x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD8x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x0y103abcEv();
extern void _ZN3ccc8DD8x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x0y103abcEv,_ZTv0_n12_N3ccc8DD8x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y103abcEv,_ZThn4_N3ccc8DD8x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x0y103pqrEv,_ZTv0_n20_N3ccc8DD8x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y103pqrEv,_ZThn4_N3ccc8DD8x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x0y103abcEv,_ZTv0_n12_N3ccc8DD8x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x0y103pqrEv,_ZTv0_n20_N3ccc8DD8x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x0y10E[] = {
  {&(_ZTVN3ccc8DD8x0y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x0y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x0y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x0y10E[];
static VTBL_ENTRY alt_thunk_names1194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x0y103pqrEv,_ZTv0_n20_N3ccc8DD8x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y103pqrEv,_ZThn4_N3ccc8DD8x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x0y103abcEv,_ZTv0_n12_N3ccc8DD8x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y103abcEv,_ZThn4_N3ccc8DD8x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x0y10E = {  "_ZN3ccc8DD8x0y10E", // class name
  bases__ZN3ccc8DD8x0y10E, 2,
  &(vtc__ZN3ccc8DD8x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x0y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x0y10E),3, //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  CC8x0y11  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC8x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x0y113efgEv
  ~CC8x0y11(); // tgen
  CC8x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y11E) C1{ VBC2{ v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x0y113pqrEv");}
void  ccc::CC8x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x0y113efgEv");}
ccc::CC8x0y11 ::~CC8x0y11(){ note_dtor("_ZN3ccc8CC8x0y11E", this);} // tgen
ccc::CC8x0y11 ::CC8x0y11(){ note_ctor("_ZN3ccc8CC8x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x0y11E, buf);
    ::ccc::CC8x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x0y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC8x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x0y11E);
    dp->::ccc::CC8x0y11::~CC8x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x0y11E(Test__ZN3ccc8CC8x0y11E, "_ZN3ccc8CC8x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x0y11C1Ev();
extern void _ZN3ccc8CC8x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x0y11E[] = {
  NSPAIR(_ZN3ccc8CC8x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC8x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC8x0y113efgEv();
extern void _ZN3ccc8CC8x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x0y113efgEv,_ZTv0_n12_N3ccc8CC8x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y113efgEv,_ZThn4_N3ccc8CC8x0y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x0y113efgEv,_ZTv0_n12_N3ccc8CC8x0y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x0y11E[] = {
  {&(_ZTVN3ccc8CC8x0y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x0y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x0y11E[];
static VTBL_ENTRY alt_thunk_names1195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x0y113efgEv,_ZTv0_n12_N3ccc8CC8x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x0y113efgEv,_ZThn4_N3ccc8CC8x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x0y11E = {  "_ZN3ccc8CC8x0y11E", // class name
  bases__ZN3ccc8CC8x0y11E, 2,
  &(vtc__ZN3ccc8CC8x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x0y11E),2, //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  DD8x0y11  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD8x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x0y113efgEv
  ~DD8x0y11(); // tgen
  DD8x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x0y11E) C1{ VBC2{ v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x0y113pqrEv");}
void  ccc::DD8x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x0y113efgEv");}
ccc::DD8x0y11 ::~DD8x0y11(){ note_dtor("_ZN3ccc8DD8x0y11E", this);} // tgen
ccc::DD8x0y11 ::DD8x0y11(){ note_ctor("_ZN3ccc8DD8x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x0y11E, buf);
    ::ccc::DD8x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x0y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD8x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x0y11E);
    dp->::ccc::DD8x0y11::~DD8x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x0y11E(Test__ZN3ccc8DD8x0y11E, "_ZN3ccc8DD8x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x0y11C1Ev();
extern void _ZN3ccc8DD8x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x0y11E[] = {
  NSPAIR(_ZN3ccc8DD8x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD8x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y11E[];
extern void _ZN3ccc8DD8x0y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x0y113efgEv,_ZTv0_n16_N3ccc8DD8x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y113efgEv,_ZThn4_N3ccc8DD8x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x0y113pqrEv,_ZTv0_n20_N3ccc8DD8x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y113pqrEv,_ZThn4_N3ccc8DD8x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x0y113efgEv,_ZTv0_n16_N3ccc8DD8x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x0y113pqrEv,_ZTv0_n20_N3ccc8DD8x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x0y11E[] = {
  {&(_ZTVN3ccc8DD8x0y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x0y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x0y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x0y11E[];
static VTBL_ENTRY alt_thunk_names1196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x0y113pqrEv,_ZTv0_n20_N3ccc8DD8x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y113pqrEv,_ZThn4_N3ccc8DD8x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x0y113efgEv,_ZTv0_n16_N3ccc8DD8x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y113efgEv,_ZThn4_N3ccc8DD8x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x0y11E = {  "_ZN3ccc8DD8x0y11E", // class name
  bases__ZN3ccc8DD8x0y11E, 2,
  &(vtc__ZN3ccc8DD8x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x0y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x0y11E),3, //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  CC8x0y12  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC8x0y123abcEv
  ~CC8x0y12(); // tgen
  CC8x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y12E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x0y123abcEv");}
ccc::CC8x0y12 ::~CC8x0y12(){ note_dtor("_ZN3ccc8CC8x0y12E", this);} // tgen
ccc::CC8x0y12 ::CC8x0y12(){ note_ctor("_ZN3ccc8CC8x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x0y12E, buf);
    ::ccc::CC8x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x0y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC8x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x0y12E);
    dp->::ccc::CC8x0y12::~CC8x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x0y12E(Test__ZN3ccc8CC8x0y12E, "_ZN3ccc8CC8x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x0y12C1Ev();
extern void _ZN3ccc8CC8x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x0y12E[] = {
  NSPAIR(_ZN3ccc8CC8x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC8x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x0y12E[];
extern void _ZN3ccc8CC8x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x0y123abcEv,_ZTv0_n16_N3ccc8CC8x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y123abcEv,_ZThn4_N3ccc8CC8x0y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x0y123abcEv,_ZTv0_n16_N3ccc8CC8x0y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x0y12E[] = {
  {&(_ZTVN3ccc8CC8x0y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x0y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x0y12E[];
static VTBL_ENTRY alt_thunk_names1197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x0y123abcEv,_ZTv0_n16_N3ccc8CC8x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x0y123abcEv,_ZThn4_N3ccc8CC8x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x0y12E = {  "_ZN3ccc8CC8x0y12E", // class name
  bases__ZN3ccc8CC8x0y12E, 2,
  &(vtc__ZN3ccc8CC8x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x0y12E),2, //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  DD8x0y12  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD8x0y123abcEv
  ~DD8x0y12(); // tgen
  DD8x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x0y12E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x0y123abcEv");}
ccc::DD8x0y12 ::~DD8x0y12(){ note_dtor("_ZN3ccc8DD8x0y12E", this);} // tgen
ccc::DD8x0y12 ::DD8x0y12(){ note_ctor("_ZN3ccc8DD8x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x0y12E, buf);
    ::ccc::DD8x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x0y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD8x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x0y12E);
    dp->::ccc::DD8x0y12::~DD8x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x0y12E(Test__ZN3ccc8DD8x0y12E, "_ZN3ccc8DD8x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x0y12C1Ev();
extern void _ZN3ccc8DD8x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x0y12E[] = {
  NSPAIR(_ZN3ccc8DD8x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD8x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x0y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x0y123abcEv,_ZTv0_n12_N3ccc8DD8x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y123abcEv,_ZThn4_N3ccc8DD8x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x0y123abcEv,_ZTv0_n12_N3ccc8DD8x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x0y12E[] = {
  {&(_ZTVN3ccc8DD8x0y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x0y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x0y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x0y12E[];
static VTBL_ENTRY alt_thunk_names1198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x0y123abcEv,_ZTv0_n12_N3ccc8DD8x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y123abcEv,_ZThn4_N3ccc8DD8x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x0y12E = {  "_ZN3ccc8DD8x0y12E", // class name
  bases__ZN3ccc8DD8x0y12E, 2,
  &(vtc__ZN3ccc8DD8x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x0y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x0y12E),3, //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  CC8x0y13  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC8x0y133efgEv
  ~CC8x0y13(); // tgen
  CC8x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC8x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x0y133efgEv");}
ccc::CC8x0y13 ::~CC8x0y13(){ note_dtor("_ZN3ccc8CC8x0y13E", this);} // tgen
ccc::CC8x0y13 ::CC8x0y13(){ note_ctor("_ZN3ccc8CC8x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x0y13E, buf);
    ::ccc::CC8x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x0y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC8x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x0y13E);
    dp->::ccc::CC8x0y13::~CC8x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x0y13E(Test__ZN3ccc8CC8x0y13E, "_ZN3ccc8CC8x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x0y13C1Ev();
extern void _ZN3ccc8CC8x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x0y13E[] = {
  NSPAIR(_ZN3ccc8CC8x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC8x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC8x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x0y133efgEv,_ZTv0_n12_N3ccc8CC8x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x0y133efgEv,_ZThn4_N3ccc8CC8x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x0y133efgEv,_ZTv0_n12_N3ccc8CC8x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x0y13E[] = {
  {&(_ZTVN3ccc8CC8x0y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x0y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x0y13E[];
static VTBL_ENTRY alt_thunk_names1199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x0y133efgEv,_ZTv0_n12_N3ccc8CC8x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x0y133efgEv,_ZThn4_N3ccc8CC8x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x0y13E = {  "_ZN3ccc8CC8x0y13E", // class name
  bases__ZN3ccc8CC8x0y13E, 2,
  &(vtc__ZN3ccc8CC8x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x0y13E),2, //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  DD8x0y13  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD8x0y133efgEv
  ~DD8x0y13(); // tgen
  DD8x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x0y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD8x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x0y133efgEv");}
ccc::DD8x0y13 ::~DD8x0y13(){ note_dtor("_ZN3ccc8DD8x0y13E", this);} // tgen
ccc::DD8x0y13 ::DD8x0y13(){ note_ctor("_ZN3ccc8DD8x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x0y13E, buf);
    ::ccc::DD8x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x0y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD8x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x0y13E);
    dp->::ccc::DD8x0y13::~DD8x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x0y13E(Test__ZN3ccc8DD8x0y13E, "_ZN3ccc8DD8x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x0y13C1Ev();
extern void _ZN3ccc8DD8x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x0y13E[] = {
  NSPAIR(_ZN3ccc8DD8x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD8x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y13E[];
extern void _ZN3ccc8DD8x0y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x0y133efgEv,_ZTv0_n16_N3ccc8DD8x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y133efgEv,_ZThn4_N3ccc8DD8x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x0y133efgEv,_ZTv0_n16_N3ccc8DD8x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x0y13E[] = {
  {&(_ZTVN3ccc8DD8x0y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x0y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x0y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x0y13E[];
static VTBL_ENTRY alt_thunk_names1200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x0y133efgEv,_ZTv0_n16_N3ccc8DD8x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y133efgEv,_ZThn4_N3ccc8DD8x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x0y13E = {  "_ZN3ccc8DD8x0y13E", // class name
  bases__ZN3ccc8DD8x0y13E, 2,
  &(vtc__ZN3ccc8DD8x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x0y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x0y13E),3, //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  CC8x0y14  : virtual ::ccc::AA8 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC8x0y143pqrEv
  ~CC8x0y14(); // tgen
  CC8x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC8x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x0y143pqrEv");}
ccc::CC8x0y14 ::~CC8x0y14(){ note_dtor("_ZN3ccc8CC8x0y14E", this);} // tgen
ccc::CC8x0y14 ::CC8x0y14(){ note_ctor("_ZN3ccc8CC8x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x0y14E, buf);
    ::ccc::CC8x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x0y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC8x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x0y14E);
    dp->::ccc::CC8x0y14::~CC8x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x0y14E(Test__ZN3ccc8CC8x0y14E, "_ZN3ccc8CC8x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x0y14C1Ev();
extern void _ZN3ccc8CC8x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x0y14E[] = {
  NSPAIR(_ZN3ccc8CC8x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC8x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC8x0y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x0y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x0y14E[] = {
  {&(_ZTVN3ccc8CC8x0y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x0y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x0y14E[];
Class_Descriptor cd__ZN3ccc8CC8x0y14E = {  "_ZN3ccc8CC8x0y14E", // class name
  bases__ZN3ccc8CC8x0y14E, 2,
  &(vtc__ZN3ccc8CC8x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x0y14E),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  DD8x0y14  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD8x0y143pqrEv
  ~DD8x0y14(); // tgen
  DD8x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x0y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD8x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x0y143pqrEv");}
ccc::DD8x0y14 ::~DD8x0y14(){ note_dtor("_ZN3ccc8DD8x0y14E", this);} // tgen
ccc::DD8x0y14 ::DD8x0y14(){ note_ctor("_ZN3ccc8DD8x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x0y14E, buf);
    ::ccc::DD8x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x0y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD8x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x0y14E);
    dp->::ccc::DD8x0y14::~DD8x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x0y14E(Test__ZN3ccc8DD8x0y14E, "_ZN3ccc8DD8x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x0y14C1Ev();
extern void _ZN3ccc8DD8x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x0y14E[] = {
  NSPAIR(_ZN3ccc8DD8x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD8x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x0y143pqrEv,_ZTv0_n20_N3ccc8DD8x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x0y143pqrEv,_ZThn4_N3ccc8DD8x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x0y143pqrEv,_ZTv0_n20_N3ccc8DD8x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x0y14E[] = {
  {&(_ZTVN3ccc8DD8x0y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x0y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x0y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x0y14E[];
static VTBL_ENTRY alt_thunk_names1201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x0y143pqrEv,_ZTv0_n20_N3ccc8DD8x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x0y143pqrEv,_ZThn4_N3ccc8DD8x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x0y14E = {  "_ZN3ccc8DD8x0y14E", // class name
  bases__ZN3ccc8DD8x0y14E, 2,
  &(vtc__ZN3ccc8DD8x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x0y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x0y14E),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  CC8x0y15  : virtual ::ccc::AA8 , ::ccc::BB0 {
  ~CC8x0y15(); // tgen
  CC8x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x0y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC8x0y15 ::~CC8x0y15(){ note_dtor("_ZN3ccc8CC8x0y15E", this);} // tgen
ccc::CC8x0y15 ::CC8x0y15(){ note_ctor("_ZN3ccc8CC8x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x0y15E, buf);
    ::ccc::CC8x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x0y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC8x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x0y15E);
    dp->::ccc::CC8x0y15::~CC8x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x0y15E(Test__ZN3ccc8CC8x0y15E, "_ZN3ccc8CC8x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x0y15C1Ev();
extern void _ZN3ccc8CC8x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x0y15E[] = {
  NSPAIR(_ZN3ccc8CC8x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC8x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x0y15E[] = {
  {&(_ZTVN3ccc8CC8x0y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x0y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x0y15E[];
Class_Descriptor cd__ZN3ccc8CC8x0y15E = {  "_ZN3ccc8CC8x0y15E", // class name
  bases__ZN3ccc8CC8x0y15E, 2,
  &(vtc__ZN3ccc8CC8x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x0y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x0y15E),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  DD8x0y15  : virtual ::ccc::AA8 , virtual ::ccc::BB0 {
  ~DD8x0y15(); // tgen
  DD8x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x0y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD8x0y15 ::~DD8x0y15(){ note_dtor("_ZN3ccc8DD8x0y15E", this);} // tgen
ccc::DD8x0y15 ::DD8x0y15(){ note_ctor("_ZN3ccc8DD8x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x0y15E, buf);
    ::ccc::DD8x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x0y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD8x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x0y15E);
    dp->::ccc::DD8x0y15::~DD8x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x0y15E(Test__ZN3ccc8DD8x0y15E, "_ZN3ccc8DD8x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x0y15C1Ev();
extern void _ZN3ccc8DD8x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x0y15E[] = {
  NSPAIR(_ZN3ccc8DD8x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD8x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x0y15E[] = {
  {&(_ZTVN3ccc8DD8x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x0y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x0y15E[];
Class_Descriptor cd__ZN3ccc8DD8x0y15E = {  "_ZN3ccc8DD8x0y15E", // class name
  bases__ZN3ccc8DD8x0y15E, 2,
  &(vtc__ZN3ccc8DD8x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x0y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x0y15E),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  CC8x1y0  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y03pqrEv
  ~CC8x1y0(); // tgen
  CC8x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y0E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y03abcEv");}
void  ccc::CC8x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y03efgEv");}
void  ccc::CC8x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y03pqrEv");}
ccc::CC8x1y0 ::~CC8x1y0(){ note_dtor("_ZN3ccc7CC8x1y0E", this);} // tgen
ccc::CC8x1y0 ::CC8x1y0(){ note_ctor("_ZN3ccc7CC8x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y0E, buf);
    ::ccc::CC8x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y0E);
    dp->::ccc::CC8x1y0::~CC8x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y0E(Test__ZN3ccc7CC8x1y0E, "_ZN3ccc7CC8x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y0C1Ev();
extern void _ZN3ccc7CC8x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y0E[] = {
  NSPAIR(_ZN3ccc7CC8x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y0E[];
extern void _ZN3ccc7CC8x1y03abcEv();
extern void _ZN3ccc7CC8x1y03pqrEv();
extern void _ZN3ccc7CC8x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y03efgEv,_ZTv0_n12_N3ccc7CC8x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y03efgEv,_ZThn4_N3ccc7CC8x1y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y03abcEv,_ZTv0_n16_N3ccc7CC8x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y03abcEv,_ZThn4_N3ccc7CC8x1y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y03efgEv,_ZTv0_n12_N3ccc7CC8x1y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y03abcEv,_ZTv0_n16_N3ccc7CC8x1y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y0E[] = {
  {&(_ZTVN3ccc7CC8x1y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y0E[];
static VTBL_ENTRY alt_thunk_names1202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y03abcEv,_ZTv0_n16_N3ccc7CC8x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y03abcEv,_ZThn4_N3ccc7CC8x1y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y03efgEv,_ZTv0_n12_N3ccc7CC8x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y03efgEv,_ZThn4_N3ccc7CC8x1y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y0E = {  "_ZN3ccc7CC8x1y0E", // class name
  bases__ZN3ccc7CC8x1y0E, 2,
  &(vtc__ZN3ccc7CC8x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y0E),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  DD8x1y0  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD8x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x1y03pqrEv
  ~DD8x1y0(); // tgen
  DD8x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y0E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y03abcEv");}
void  ccc::DD8x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y03efgEv");}
void  ccc::DD8x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y03pqrEv");}
ccc::DD8x1y0 ::~DD8x1y0(){ note_dtor("_ZN3ccc7DD8x1y0E", this);} // tgen
ccc::DD8x1y0 ::DD8x1y0(){ note_ctor("_ZN3ccc7DD8x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y0E, buf);
    ::ccc::DD8x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y0E);
    dp->::ccc::DD8x1y0::~DD8x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y0E(Test__ZN3ccc7DD8x1y0E, "_ZN3ccc7DD8x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y0C1Ev();
extern void _ZN3ccc7DD8x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y0E[] = {
  NSPAIR(_ZN3ccc7DD8x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y0E[];
extern void _ZN3ccc7DD8x1y03efgEv();
extern void _ZN3ccc7DD8x1y03abcEv();
extern void _ZN3ccc7DD8x1y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y03abcEv,_ZTv0_n12_N3ccc7DD8x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y03abcEv,_ZThn4_N3ccc7DD8x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y03pqrEv,_ZTv0_n16_N3ccc7DD8x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y03pqrEv,_ZThn4_N3ccc7DD8x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y03efgEv,_ZTv0_n20_N3ccc7DD8x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y03efgEv,_ZThn4_N3ccc7DD8x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y03abcEv,_ZTv0_n12_N3ccc7DD8x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y03pqrEv,_ZTv0_n16_N3ccc7DD8x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y03efgEv,_ZTv0_n20_N3ccc7DD8x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y0E[] = {
  {&(_ZTVN3ccc7DD8x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y0E[];
static VTBL_ENTRY alt_thunk_names1203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y03efgEv,_ZTv0_n20_N3ccc7DD8x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y03efgEv,_ZThn4_N3ccc7DD8x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y03pqrEv,_ZTv0_n16_N3ccc7DD8x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y03pqrEv,_ZThn4_N3ccc7DD8x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y03abcEv,_ZTv0_n12_N3ccc7DD8x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y03abcEv,_ZThn4_N3ccc7DD8x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y0E = {  "_ZN3ccc7DD8x1y0E", // class name
  bases__ZN3ccc7DD8x1y0E, 2,
  &(vtc__ZN3ccc7DD8x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y0E),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  CC8x1y1  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x1y13efgEv
  ~CC8x1y1(); // tgen
  CC8x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y1E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y13abcEv");}
void  ccc::CC8x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y13pqrEv");}
void  ccc::CC8x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y13efgEv");}
ccc::CC8x1y1 ::~CC8x1y1(){ note_dtor("_ZN3ccc7CC8x1y1E", this);} // tgen
ccc::CC8x1y1 ::CC8x1y1(){ note_ctor("_ZN3ccc7CC8x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y1E, buf);
    ::ccc::CC8x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y1E);
    dp->::ccc::CC8x1y1::~CC8x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y1E(Test__ZN3ccc7CC8x1y1E, "_ZN3ccc7CC8x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y1C1Ev();
extern void _ZN3ccc7CC8x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y1E[] = {
  NSPAIR(_ZN3ccc7CC8x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y1E[];
extern void _ZN3ccc7CC8x1y13abcEv();
extern void _ZN3ccc7CC8x1y13pqrEv();
extern void _ZN3ccc7CC8x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y13efgEv,_ZTv0_n12_N3ccc7CC8x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y13efgEv,_ZThn4_N3ccc7CC8x1y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y13abcEv,_ZTv0_n16_N3ccc7CC8x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y13abcEv,_ZThn4_N3ccc7CC8x1y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y13efgEv,_ZTv0_n12_N3ccc7CC8x1y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y13abcEv,_ZTv0_n16_N3ccc7CC8x1y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y1E[] = {
  {&(_ZTVN3ccc7CC8x1y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y1E[];
static VTBL_ENTRY alt_thunk_names1204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y13abcEv,_ZTv0_n16_N3ccc7CC8x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y13abcEv,_ZThn4_N3ccc7CC8x1y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y13efgEv,_ZTv0_n12_N3ccc7CC8x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y13efgEv,_ZThn4_N3ccc7CC8x1y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y1E = {  "_ZN3ccc7CC8x1y1E", // class name
  bases__ZN3ccc7CC8x1y1E, 2,
  &(vtc__ZN3ccc7CC8x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y1E),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  DD8x1y1  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD8x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x1y13efgEv
  ~DD8x1y1(); // tgen
  DD8x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y1E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y13abcEv");}
void  ccc::DD8x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y13pqrEv");}
void  ccc::DD8x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y13efgEv");}
ccc::DD8x1y1 ::~DD8x1y1(){ note_dtor("_ZN3ccc7DD8x1y1E", this);} // tgen
ccc::DD8x1y1 ::DD8x1y1(){ note_ctor("_ZN3ccc7DD8x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y1E, buf);
    ::ccc::DD8x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y1E);
    dp->::ccc::DD8x1y1::~DD8x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y1E(Test__ZN3ccc7DD8x1y1E, "_ZN3ccc7DD8x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y1C1Ev();
extern void _ZN3ccc7DD8x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y1E[] = {
  NSPAIR(_ZN3ccc7DD8x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y1E[];
extern void _ZN3ccc7DD8x1y13efgEv();
extern void _ZN3ccc7DD8x1y13abcEv();
extern void _ZN3ccc7DD8x1y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y13abcEv,_ZTv0_n12_N3ccc7DD8x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y13abcEv,_ZThn4_N3ccc7DD8x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y13pqrEv,_ZTv0_n16_N3ccc7DD8x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y13pqrEv,_ZThn4_N3ccc7DD8x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y13efgEv,_ZTv0_n20_N3ccc7DD8x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y13efgEv,_ZThn4_N3ccc7DD8x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y13abcEv,_ZTv0_n12_N3ccc7DD8x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y13pqrEv,_ZTv0_n16_N3ccc7DD8x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y13efgEv,_ZTv0_n20_N3ccc7DD8x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y1E[] = {
  {&(_ZTVN3ccc7DD8x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y1E[];
static VTBL_ENTRY alt_thunk_names1205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y13efgEv,_ZTv0_n20_N3ccc7DD8x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y13efgEv,_ZThn4_N3ccc7DD8x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y13pqrEv,_ZTv0_n16_N3ccc7DD8x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y13pqrEv,_ZThn4_N3ccc7DD8x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y13abcEv,_ZTv0_n12_N3ccc7DD8x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y13abcEv,_ZThn4_N3ccc7DD8x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y1E = {  "_ZN3ccc7DD8x1y1E", // class name
  bases__ZN3ccc7DD8x1y1E, 2,
  &(vtc__ZN3ccc7DD8x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y1E),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  CC8x1y2  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y23pqrEv
  ~CC8x1y2(); // tgen
  CC8x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y2E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y23efgEv");}
void  ccc::CC8x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y23abcEv");}
void  ccc::CC8x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y23pqrEv");}
ccc::CC8x1y2 ::~CC8x1y2(){ note_dtor("_ZN3ccc7CC8x1y2E", this);} // tgen
ccc::CC8x1y2 ::CC8x1y2(){ note_ctor("_ZN3ccc7CC8x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y2E, buf);
    ::ccc::CC8x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y2E);
    dp->::ccc::CC8x1y2::~CC8x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y2E(Test__ZN3ccc7CC8x1y2E, "_ZN3ccc7CC8x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y2C1Ev();
extern void _ZN3ccc7CC8x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y2E[] = {
  NSPAIR(_ZN3ccc7CC8x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y2E[];
extern void _ZN3ccc7CC8x1y23abcEv();
extern void _ZN3ccc7CC8x1y23pqrEv();
extern void _ZN3ccc7CC8x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y23efgEv,_ZTv0_n12_N3ccc7CC8x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y23efgEv,_ZThn4_N3ccc7CC8x1y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y23abcEv,_ZTv0_n16_N3ccc7CC8x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y23abcEv,_ZThn4_N3ccc7CC8x1y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y23efgEv,_ZTv0_n12_N3ccc7CC8x1y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y23abcEv,_ZTv0_n16_N3ccc7CC8x1y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y2E[] = {
  {&(_ZTVN3ccc7CC8x1y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y2E[];
static VTBL_ENTRY alt_thunk_names1206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y23abcEv,_ZTv0_n16_N3ccc7CC8x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y23abcEv,_ZThn4_N3ccc7CC8x1y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y23efgEv,_ZTv0_n12_N3ccc7CC8x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y23efgEv,_ZThn4_N3ccc7CC8x1y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y2E = {  "_ZN3ccc7CC8x1y2E", // class name
  bases__ZN3ccc7CC8x1y2E, 2,
  &(vtc__ZN3ccc7CC8x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y2E),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  DD8x1y2  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD8x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x1y23pqrEv
  ~DD8x1y2(); // tgen
  DD8x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y2E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y23efgEv");}
void  ccc::DD8x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y23abcEv");}
void  ccc::DD8x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y23pqrEv");}
ccc::DD8x1y2 ::~DD8x1y2(){ note_dtor("_ZN3ccc7DD8x1y2E", this);} // tgen
ccc::DD8x1y2 ::DD8x1y2(){ note_ctor("_ZN3ccc7DD8x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y2E, buf);
    ::ccc::DD8x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y2E);
    dp->::ccc::DD8x1y2::~DD8x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y2E(Test__ZN3ccc7DD8x1y2E, "_ZN3ccc7DD8x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y2C1Ev();
extern void _ZN3ccc7DD8x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y2E[] = {
  NSPAIR(_ZN3ccc7DD8x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y2E[];
extern void _ZN3ccc7DD8x1y23efgEv();
extern void _ZN3ccc7DD8x1y23abcEv();
extern void _ZN3ccc7DD8x1y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y23abcEv,_ZTv0_n12_N3ccc7DD8x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y23abcEv,_ZThn4_N3ccc7DD8x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y23pqrEv,_ZTv0_n16_N3ccc7DD8x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y23pqrEv,_ZThn4_N3ccc7DD8x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y23efgEv,_ZTv0_n20_N3ccc7DD8x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y23efgEv,_ZThn4_N3ccc7DD8x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y23abcEv,_ZTv0_n12_N3ccc7DD8x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y23pqrEv,_ZTv0_n16_N3ccc7DD8x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y23efgEv,_ZTv0_n20_N3ccc7DD8x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y2E[] = {
  {&(_ZTVN3ccc7DD8x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y2E[];
static VTBL_ENTRY alt_thunk_names1207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y23efgEv,_ZTv0_n20_N3ccc7DD8x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y23efgEv,_ZThn4_N3ccc7DD8x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y23pqrEv,_ZTv0_n16_N3ccc7DD8x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y23pqrEv,_ZThn4_N3ccc7DD8x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y23abcEv,_ZTv0_n12_N3ccc7DD8x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y23abcEv,_ZThn4_N3ccc7DD8x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y2E = {  "_ZN3ccc7DD8x1y2E", // class name
  bases__ZN3ccc7DD8x1y2E, 2,
  &(vtc__ZN3ccc7DD8x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y2E),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  CC8x1y3  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x1y33abcEv
  ~CC8x1y3(); // tgen
  CC8x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y3E) C1{ VBC2{ v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y33efgEv");}
void  ccc::CC8x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y33pqrEv");}
void  ccc::CC8x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y33abcEv");}
ccc::CC8x1y3 ::~CC8x1y3(){ note_dtor("_ZN3ccc7CC8x1y3E", this);} // tgen
ccc::CC8x1y3 ::CC8x1y3(){ note_ctor("_ZN3ccc7CC8x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y3E, buf);
    ::ccc::CC8x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y3E);
    dp->::ccc::CC8x1y3::~CC8x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y3E(Test__ZN3ccc7CC8x1y3E, "_ZN3ccc7CC8x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y3C1Ev();
extern void _ZN3ccc7CC8x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y3E[] = {
  NSPAIR(_ZN3ccc7CC8x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y3E[];
extern void _ZN3ccc7CC8x1y33abcEv();
extern void _ZN3ccc7CC8x1y33pqrEv();
extern void _ZN3ccc7CC8x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y33efgEv,_ZTv0_n12_N3ccc7CC8x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y33efgEv,_ZThn4_N3ccc7CC8x1y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y33abcEv,_ZTv0_n16_N3ccc7CC8x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y33abcEv,_ZThn4_N3ccc7CC8x1y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y33efgEv,_ZTv0_n12_N3ccc7CC8x1y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y33abcEv,_ZTv0_n16_N3ccc7CC8x1y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y3E[] = {
  {&(_ZTVN3ccc7CC8x1y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y3E[];
static VTBL_ENTRY alt_thunk_names1208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y33abcEv,_ZTv0_n16_N3ccc7CC8x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y33abcEv,_ZThn4_N3ccc7CC8x1y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y33efgEv,_ZTv0_n12_N3ccc7CC8x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y33efgEv,_ZThn4_N3ccc7CC8x1y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y3E = {  "_ZN3ccc7CC8x1y3E", // class name
  bases__ZN3ccc7CC8x1y3E, 2,
  &(vtc__ZN3ccc7CC8x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y3E),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  DD8x1y3  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD8x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x1y33abcEv
  ~DD8x1y3(); // tgen
  DD8x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y3E) C1{ VBC2{ v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y33efgEv");}
void  ccc::DD8x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y33pqrEv");}
void  ccc::DD8x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y33abcEv");}
ccc::DD8x1y3 ::~DD8x1y3(){ note_dtor("_ZN3ccc7DD8x1y3E", this);} // tgen
ccc::DD8x1y3 ::DD8x1y3(){ note_ctor("_ZN3ccc7DD8x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y3E, buf);
    ::ccc::DD8x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y3E);
    dp->::ccc::DD8x1y3::~DD8x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y3E(Test__ZN3ccc7DD8x1y3E, "_ZN3ccc7DD8x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y3C1Ev();
extern void _ZN3ccc7DD8x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y3E[] = {
  NSPAIR(_ZN3ccc7DD8x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y3E[];
extern void _ZN3ccc7DD8x1y33efgEv();
extern void _ZN3ccc7DD8x1y33abcEv();
extern void _ZN3ccc7DD8x1y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y33abcEv,_ZTv0_n12_N3ccc7DD8x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y33abcEv,_ZThn4_N3ccc7DD8x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y33pqrEv,_ZTv0_n16_N3ccc7DD8x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y33pqrEv,_ZThn4_N3ccc7DD8x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y33efgEv,_ZTv0_n20_N3ccc7DD8x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y33efgEv,_ZThn4_N3ccc7DD8x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y33abcEv,_ZTv0_n12_N3ccc7DD8x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y33pqrEv,_ZTv0_n16_N3ccc7DD8x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y33efgEv,_ZTv0_n20_N3ccc7DD8x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y3E[] = {
  {&(_ZTVN3ccc7DD8x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y3E[];
static VTBL_ENTRY alt_thunk_names1209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y33efgEv,_ZTv0_n20_N3ccc7DD8x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y33efgEv,_ZThn4_N3ccc7DD8x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y33pqrEv,_ZTv0_n16_N3ccc7DD8x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y33pqrEv,_ZThn4_N3ccc7DD8x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y33abcEv,_ZTv0_n12_N3ccc7DD8x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y33abcEv,_ZThn4_N3ccc7DD8x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y3E = {  "_ZN3ccc7DD8x1y3E", // class name
  bases__ZN3ccc7DD8x1y3E, 2,
  &(vtc__ZN3ccc7DD8x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y3E),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  CC8x1y4  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC8x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x1y43efgEv
  ~CC8x1y4(); // tgen
  CC8x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y4E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y43pqrEv");}
void  ccc::CC8x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y43abcEv");}
void  ccc::CC8x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y43efgEv");}
ccc::CC8x1y4 ::~CC8x1y4(){ note_dtor("_ZN3ccc7CC8x1y4E", this);} // tgen
ccc::CC8x1y4 ::CC8x1y4(){ note_ctor("_ZN3ccc7CC8x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y4E, buf);
    ::ccc::CC8x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y4E);
    dp->::ccc::CC8x1y4::~CC8x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y4E(Test__ZN3ccc7CC8x1y4E, "_ZN3ccc7CC8x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y4C1Ev();
extern void _ZN3ccc7CC8x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y4E[] = {
  NSPAIR(_ZN3ccc7CC8x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y4E[];
extern void _ZN3ccc7CC8x1y43abcEv();
extern void _ZN3ccc7CC8x1y43pqrEv();
extern void _ZN3ccc7CC8x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y43efgEv,_ZTv0_n12_N3ccc7CC8x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y43efgEv,_ZThn4_N3ccc7CC8x1y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y43abcEv,_ZTv0_n16_N3ccc7CC8x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y43abcEv,_ZThn4_N3ccc7CC8x1y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y43efgEv,_ZTv0_n12_N3ccc7CC8x1y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y43abcEv,_ZTv0_n16_N3ccc7CC8x1y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y4E[] = {
  {&(_ZTVN3ccc7CC8x1y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y4E[];
static VTBL_ENTRY alt_thunk_names1210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y43abcEv,_ZTv0_n16_N3ccc7CC8x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y43abcEv,_ZThn4_N3ccc7CC8x1y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y43efgEv,_ZTv0_n12_N3ccc7CC8x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y43efgEv,_ZThn4_N3ccc7CC8x1y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y4E = {  "_ZN3ccc7CC8x1y4E", // class name
  bases__ZN3ccc7CC8x1y4E, 2,
  &(vtc__ZN3ccc7CC8x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y4E),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  DD8x1y4  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD8x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x1y43efgEv
  ~DD8x1y4(); // tgen
  DD8x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y4E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y43pqrEv");}
void  ccc::DD8x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y43abcEv");}
void  ccc::DD8x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y43efgEv");}
ccc::DD8x1y4 ::~DD8x1y4(){ note_dtor("_ZN3ccc7DD8x1y4E", this);} // tgen
ccc::DD8x1y4 ::DD8x1y4(){ note_ctor("_ZN3ccc7DD8x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y4E, buf);
    ::ccc::DD8x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y4E);
    dp->::ccc::DD8x1y4::~DD8x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y4E(Test__ZN3ccc7DD8x1y4E, "_ZN3ccc7DD8x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y4C1Ev();
extern void _ZN3ccc7DD8x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y4E[] = {
  NSPAIR(_ZN3ccc7DD8x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y4E[];
extern void _ZN3ccc7DD8x1y43efgEv();
extern void _ZN3ccc7DD8x1y43abcEv();
extern void _ZN3ccc7DD8x1y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y43abcEv,_ZTv0_n12_N3ccc7DD8x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y43abcEv,_ZThn4_N3ccc7DD8x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y43pqrEv,_ZTv0_n16_N3ccc7DD8x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y43pqrEv,_ZThn4_N3ccc7DD8x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y43efgEv,_ZTv0_n20_N3ccc7DD8x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y43efgEv,_ZThn4_N3ccc7DD8x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y43abcEv,_ZTv0_n12_N3ccc7DD8x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y43pqrEv,_ZTv0_n16_N3ccc7DD8x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y43efgEv,_ZTv0_n20_N3ccc7DD8x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y4E[] = {
  {&(_ZTVN3ccc7DD8x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y4E[];
static VTBL_ENTRY alt_thunk_names1211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y43efgEv,_ZTv0_n20_N3ccc7DD8x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y43efgEv,_ZThn4_N3ccc7DD8x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y43pqrEv,_ZTv0_n16_N3ccc7DD8x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y43pqrEv,_ZThn4_N3ccc7DD8x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y43abcEv,_ZTv0_n12_N3ccc7DD8x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y43abcEv,_ZThn4_N3ccc7DD8x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y4E = {  "_ZN3ccc7DD8x1y4E", // class name
  bases__ZN3ccc7DD8x1y4E, 2,
  &(vtc__ZN3ccc7DD8x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y4E),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  CC8x1y5  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC8x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x1y53abcEv
  ~CC8x1y5(); // tgen
  CC8x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y5E) C1{ VBC2{ v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y53pqrEv");}
void  ccc::CC8x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y53efgEv");}
void  ccc::CC8x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y53abcEv");}
ccc::CC8x1y5 ::~CC8x1y5(){ note_dtor("_ZN3ccc7CC8x1y5E", this);} // tgen
ccc::CC8x1y5 ::CC8x1y5(){ note_ctor("_ZN3ccc7CC8x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y5E, buf);
    ::ccc::CC8x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y5E);
    dp->::ccc::CC8x1y5::~CC8x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y5E(Test__ZN3ccc7CC8x1y5E, "_ZN3ccc7CC8x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y5C1Ev();
extern void _ZN3ccc7CC8x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y5E[] = {
  NSPAIR(_ZN3ccc7CC8x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y5E[];
extern void _ZN3ccc7CC8x1y53abcEv();
extern void _ZN3ccc7CC8x1y53pqrEv();
extern void _ZN3ccc7CC8x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y53efgEv,_ZTv0_n12_N3ccc7CC8x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y53efgEv,_ZThn4_N3ccc7CC8x1y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y53abcEv,_ZTv0_n16_N3ccc7CC8x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y53abcEv,_ZThn4_N3ccc7CC8x1y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y53efgEv,_ZTv0_n12_N3ccc7CC8x1y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y53abcEv,_ZTv0_n16_N3ccc7CC8x1y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y5E[] = {
  {&(_ZTVN3ccc7CC8x1y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y5E[];
static VTBL_ENTRY alt_thunk_names1212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y53abcEv,_ZTv0_n16_N3ccc7CC8x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y53abcEv,_ZThn4_N3ccc7CC8x1y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y53efgEv,_ZTv0_n12_N3ccc7CC8x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y53efgEv,_ZThn4_N3ccc7CC8x1y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y5E = {  "_ZN3ccc7CC8x1y5E", // class name
  bases__ZN3ccc7CC8x1y5E, 2,
  &(vtc__ZN3ccc7CC8x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y5E),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  DD8x1y5  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD8x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x1y53abcEv
  ~DD8x1y5(); // tgen
  DD8x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y5E) C1{ VBC2{ v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y53pqrEv");}
void  ccc::DD8x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y53efgEv");}
void  ccc::DD8x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y53abcEv");}
ccc::DD8x1y5 ::~DD8x1y5(){ note_dtor("_ZN3ccc7DD8x1y5E", this);} // tgen
ccc::DD8x1y5 ::DD8x1y5(){ note_ctor("_ZN3ccc7DD8x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y5E, buf);
    ::ccc::DD8x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y5E);
    dp->::ccc::DD8x1y5::~DD8x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y5E(Test__ZN3ccc7DD8x1y5E, "_ZN3ccc7DD8x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y5C1Ev();
extern void _ZN3ccc7DD8x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y5E[] = {
  NSPAIR(_ZN3ccc7DD8x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y5E[];
extern void _ZN3ccc7DD8x1y53efgEv();
extern void _ZN3ccc7DD8x1y53abcEv();
extern void _ZN3ccc7DD8x1y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y53abcEv,_ZTv0_n12_N3ccc7DD8x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y53abcEv,_ZThn4_N3ccc7DD8x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y53pqrEv,_ZTv0_n16_N3ccc7DD8x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y53pqrEv,_ZThn4_N3ccc7DD8x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y53efgEv,_ZTv0_n20_N3ccc7DD8x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y53efgEv,_ZThn4_N3ccc7DD8x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y53abcEv,_ZTv0_n12_N3ccc7DD8x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y53pqrEv,_ZTv0_n16_N3ccc7DD8x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y53efgEv,_ZTv0_n20_N3ccc7DD8x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y5E[] = {
  {&(_ZTVN3ccc7DD8x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y5E[];
static VTBL_ENTRY alt_thunk_names1213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y53efgEv,_ZTv0_n20_N3ccc7DD8x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y53efgEv,_ZThn4_N3ccc7DD8x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y53pqrEv,_ZTv0_n16_N3ccc7DD8x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y53pqrEv,_ZThn4_N3ccc7DD8x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y53abcEv,_ZTv0_n12_N3ccc7DD8x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y53abcEv,_ZThn4_N3ccc7DD8x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y5E = {  "_ZN3ccc7DD8x1y5E", // class name
  bases__ZN3ccc7DD8x1y5E, 2,
  &(vtc__ZN3ccc7DD8x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y5E),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  CC8x1y6  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x1y63efgEv
  ~CC8x1y6(); // tgen
  CC8x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y6E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y63abcEv");}
void  ccc::CC8x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y63efgEv");}
ccc::CC8x1y6 ::~CC8x1y6(){ note_dtor("_ZN3ccc7CC8x1y6E", this);} // tgen
ccc::CC8x1y6 ::CC8x1y6(){ note_ctor("_ZN3ccc7CC8x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y6E, buf);
    ::ccc::CC8x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y6E);
    dp->::ccc::CC8x1y6::~CC8x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y6E(Test__ZN3ccc7CC8x1y6E, "_ZN3ccc7CC8x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y6C1Ev();
extern void _ZN3ccc7CC8x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y6E[] = {
  NSPAIR(_ZN3ccc7CC8x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y6E[];
extern void _ZN3ccc7CC8x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC8x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y63efgEv,_ZTv0_n12_N3ccc7CC8x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y63efgEv,_ZThn4_N3ccc7CC8x1y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y63abcEv,_ZTv0_n16_N3ccc7CC8x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y63abcEv,_ZThn4_N3ccc7CC8x1y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y63efgEv,_ZTv0_n12_N3ccc7CC8x1y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y63abcEv,_ZTv0_n16_N3ccc7CC8x1y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y6E[] = {
  {&(_ZTVN3ccc7CC8x1y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y6E[];
static VTBL_ENTRY alt_thunk_names1214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y63abcEv,_ZTv0_n16_N3ccc7CC8x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y63abcEv,_ZThn4_N3ccc7CC8x1y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y63efgEv,_ZTv0_n12_N3ccc7CC8x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y63efgEv,_ZThn4_N3ccc7CC8x1y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y6E = {  "_ZN3ccc7CC8x1y6E", // class name
  bases__ZN3ccc7CC8x1y6E, 2,
  &(vtc__ZN3ccc7CC8x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y6E),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  DD8x1y6  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD8x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x1y63efgEv
  ~DD8x1y6(); // tgen
  DD8x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y6E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y63abcEv");}
void  ccc::DD8x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y63efgEv");}
ccc::DD8x1y6 ::~DD8x1y6(){ note_dtor("_ZN3ccc7DD8x1y6E", this);} // tgen
ccc::DD8x1y6 ::DD8x1y6(){ note_ctor("_ZN3ccc7DD8x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y6E, buf);
    ::ccc::DD8x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y6E);
    dp->::ccc::DD8x1y6::~DD8x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y6E(Test__ZN3ccc7DD8x1y6E, "_ZN3ccc7DD8x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y6C1Ev();
extern void _ZN3ccc7DD8x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y6E[] = {
  NSPAIR(_ZN3ccc7DD8x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y6E[];
extern void _ZN3ccc7DD8x1y63efgEv();
extern void _ZN3ccc7DD8x1y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y63abcEv,_ZTv0_n12_N3ccc7DD8x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y63abcEv,_ZThn4_N3ccc7DD8x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y63efgEv,_ZTv0_n20_N3ccc7DD8x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y63efgEv,_ZThn4_N3ccc7DD8x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y63abcEv,_ZTv0_n12_N3ccc7DD8x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y63efgEv,_ZTv0_n20_N3ccc7DD8x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y6E[] = {
  {&(_ZTVN3ccc7DD8x1y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x1y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x1y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y6E[];
static VTBL_ENTRY alt_thunk_names1215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y63efgEv,_ZTv0_n20_N3ccc7DD8x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y63efgEv,_ZThn4_N3ccc7DD8x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y63abcEv,_ZTv0_n12_N3ccc7DD8x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y63abcEv,_ZThn4_N3ccc7DD8x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y6E = {  "_ZN3ccc7DD8x1y6E", // class name
  bases__ZN3ccc7DD8x1y6E, 2,
  &(vtc__ZN3ccc7DD8x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y6E),3, //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  CC8x1y7  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC8x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y73pqrEv
  ~CC8x1y7(); // tgen
  CC8x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y7E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y73abcEv");}
void  ccc::CC8x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y73pqrEv");}
ccc::CC8x1y7 ::~CC8x1y7(){ note_dtor("_ZN3ccc7CC8x1y7E", this);} // tgen
ccc::CC8x1y7 ::CC8x1y7(){ note_ctor("_ZN3ccc7CC8x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y7E, buf);
    ::ccc::CC8x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y7E);
    dp->::ccc::CC8x1y7::~CC8x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y7E(Test__ZN3ccc7CC8x1y7E, "_ZN3ccc7CC8x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y7C1Ev();
extern void _ZN3ccc7CC8x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y7E[] = {
  NSPAIR(_ZN3ccc7CC8x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y7E[];
extern void _ZN3ccc7CC8x1y73abcEv();
extern void _ZN3ccc7CC8x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y73abcEv,_ZTv0_n16_N3ccc7CC8x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y73abcEv,_ZThn4_N3ccc7CC8x1y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y73abcEv,_ZTv0_n16_N3ccc7CC8x1y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y7E[] = {
  {&(_ZTVN3ccc7CC8x1y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y7E[];
static VTBL_ENTRY alt_thunk_names1216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y73abcEv,_ZTv0_n16_N3ccc7CC8x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y73abcEv,_ZThn4_N3ccc7CC8x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y7E = {  "_ZN3ccc7CC8x1y7E", // class name
  bases__ZN3ccc7CC8x1y7E, 2,
  &(vtc__ZN3ccc7CC8x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y7E),2, //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  DD8x1y7  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD8x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x1y73pqrEv
  ~DD8x1y7(); // tgen
  DD8x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y7E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y73abcEv");}
void  ccc::DD8x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y73pqrEv");}
ccc::DD8x1y7 ::~DD8x1y7(){ note_dtor("_ZN3ccc7DD8x1y7E", this);} // tgen
ccc::DD8x1y7 ::DD8x1y7(){ note_ctor("_ZN3ccc7DD8x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y7E, buf);
    ::ccc::DD8x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y7E);
    dp->::ccc::DD8x1y7::~DD8x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y7E(Test__ZN3ccc7DD8x1y7E, "_ZN3ccc7DD8x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y7C1Ev();
extern void _ZN3ccc7DD8x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y7E[] = {
  NSPAIR(_ZN3ccc7DD8x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x1y73abcEv();
extern void _ZN3ccc7DD8x1y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y73abcEv,_ZTv0_n12_N3ccc7DD8x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y73abcEv,_ZThn4_N3ccc7DD8x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y73pqrEv,_ZTv0_n16_N3ccc7DD8x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y73pqrEv,_ZThn4_N3ccc7DD8x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y73abcEv,_ZTv0_n12_N3ccc7DD8x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y73pqrEv,_ZTv0_n16_N3ccc7DD8x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y7E[] = {
  {&(_ZTVN3ccc7DD8x1y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y7E[];
static VTBL_ENTRY alt_thunk_names1217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y73pqrEv,_ZTv0_n16_N3ccc7DD8x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y73pqrEv,_ZThn4_N3ccc7DD8x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y73abcEv,_ZTv0_n12_N3ccc7DD8x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y73abcEv,_ZThn4_N3ccc7DD8x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y7E = {  "_ZN3ccc7DD8x1y7E", // class name
  bases__ZN3ccc7DD8x1y7E, 2,
  &(vtc__ZN3ccc7DD8x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y7E),3, //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  CC8x1y8  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x1y83abcEv
  ~CC8x1y8(); // tgen
  CC8x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y8E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y83efgEv");}
void  ccc::CC8x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x1y83abcEv");}
ccc::CC8x1y8 ::~CC8x1y8(){ note_dtor("_ZN3ccc7CC8x1y8E", this);} // tgen
ccc::CC8x1y8 ::CC8x1y8(){ note_ctor("_ZN3ccc7CC8x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y8E, buf);
    ::ccc::CC8x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y8E);
    dp->::ccc::CC8x1y8::~CC8x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y8E(Test__ZN3ccc7CC8x1y8E, "_ZN3ccc7CC8x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y8C1Ev();
extern void _ZN3ccc7CC8x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y8E[] = {
  NSPAIR(_ZN3ccc7CC8x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y8E[];
extern void _ZN3ccc7CC8x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC8x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y83efgEv,_ZTv0_n12_N3ccc7CC8x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y83efgEv,_ZThn4_N3ccc7CC8x1y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x1y83abcEv,_ZTv0_n16_N3ccc7CC8x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y83abcEv,_ZThn4_N3ccc7CC8x1y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y83efgEv,_ZTv0_n12_N3ccc7CC8x1y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x1y83abcEv,_ZTv0_n16_N3ccc7CC8x1y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y8E[] = {
  {&(_ZTVN3ccc7CC8x1y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y8E[];
static VTBL_ENTRY alt_thunk_names1218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x1y83abcEv,_ZTv0_n16_N3ccc7CC8x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y83abcEv,_ZThn4_N3ccc7CC8x1y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y83efgEv,_ZTv0_n12_N3ccc7CC8x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y83efgEv,_ZThn4_N3ccc7CC8x1y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y8E = {  "_ZN3ccc7CC8x1y8E", // class name
  bases__ZN3ccc7CC8x1y8E, 2,
  &(vtc__ZN3ccc7CC8x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y8E),2, //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  DD8x1y8  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD8x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x1y83abcEv
  ~DD8x1y8(); // tgen
  DD8x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y8E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y83efgEv");}
void  ccc::DD8x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x1y83abcEv");}
ccc::DD8x1y8 ::~DD8x1y8(){ note_dtor("_ZN3ccc7DD8x1y8E", this);} // tgen
ccc::DD8x1y8 ::DD8x1y8(){ note_ctor("_ZN3ccc7DD8x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y8E, buf);
    ::ccc::DD8x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y8E);
    dp->::ccc::DD8x1y8::~DD8x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y8E(Test__ZN3ccc7DD8x1y8E, "_ZN3ccc7DD8x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y8C1Ev();
extern void _ZN3ccc7DD8x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y8E[] = {
  NSPAIR(_ZN3ccc7DD8x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y8E[];
extern void _ZN3ccc7DD8x1y83efgEv();
extern void _ZN3ccc7DD8x1y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x1y83abcEv,_ZTv0_n12_N3ccc7DD8x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y83abcEv,_ZThn4_N3ccc7DD8x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y83efgEv,_ZTv0_n20_N3ccc7DD8x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y83efgEv,_ZThn4_N3ccc7DD8x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x1y83abcEv,_ZTv0_n12_N3ccc7DD8x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y83efgEv,_ZTv0_n20_N3ccc7DD8x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y8E[] = {
  {&(_ZTVN3ccc7DD8x1y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x1y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x1y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y8E[];
static VTBL_ENTRY alt_thunk_names1219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y83efgEv,_ZTv0_n20_N3ccc7DD8x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y83efgEv,_ZThn4_N3ccc7DD8x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x1y83abcEv,_ZTv0_n12_N3ccc7DD8x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y83abcEv,_ZThn4_N3ccc7DD8x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y8E = {  "_ZN3ccc7DD8x1y8E", // class name
  bases__ZN3ccc7DD8x1y8E, 2,
  &(vtc__ZN3ccc7DD8x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y8E),3, //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  CC8x1y9  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC8x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x1y93pqrEv
  ~CC8x1y9(); // tgen
  CC8x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x1y9E) C1{ VBC2{ v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x1y93efgEv");}
void  ccc::CC8x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x1y93pqrEv");}
ccc::CC8x1y9 ::~CC8x1y9(){ note_dtor("_ZN3ccc7CC8x1y9E", this);} // tgen
ccc::CC8x1y9 ::CC8x1y9(){ note_ctor("_ZN3ccc7CC8x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x1y9E, buf);
    ::ccc::CC8x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x1y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC8x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x1y9E);
    dp->::ccc::CC8x1y9::~CC8x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x1y9E(Test__ZN3ccc7CC8x1y9E, "_ZN3ccc7CC8x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x1y9C1Ev();
extern void _ZN3ccc7CC8x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x1y9E[] = {
  NSPAIR(_ZN3ccc7CC8x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC8x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC8x1y93pqrEv();
extern void _ZN3ccc7CC8x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x1y93efgEv,_ZTv0_n12_N3ccc7CC8x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x1y93efgEv,_ZThn4_N3ccc7CC8x1y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x1y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x1y93efgEv,_ZTv0_n12_N3ccc7CC8x1y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x1y9E[] = {
  {&(_ZTVN3ccc7CC8x1y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x1y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x1y9E[];
static VTBL_ENTRY alt_thunk_names1220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x1y93efgEv,_ZTv0_n12_N3ccc7CC8x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x1y93efgEv,_ZThn4_N3ccc7CC8x1y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x1y9E = {  "_ZN3ccc7CC8x1y9E", // class name
  bases__ZN3ccc7CC8x1y9E, 2,
  &(vtc__ZN3ccc7CC8x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x1y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x1y9E),2, //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  DD8x1y9  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD8x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x1y93pqrEv
  ~DD8x1y9(); // tgen
  DD8x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x1y9E) C1{ VBC2{ v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x1y93efgEv");}
void  ccc::DD8x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x1y93pqrEv");}
ccc::DD8x1y9 ::~DD8x1y9(){ note_dtor("_ZN3ccc7DD8x1y9E", this);} // tgen
ccc::DD8x1y9 ::DD8x1y9(){ note_ctor("_ZN3ccc7DD8x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x1y9E, buf);
    ::ccc::DD8x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x1y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD8x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x1y9E);
    dp->::ccc::DD8x1y9::~DD8x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x1y9E(Test__ZN3ccc7DD8x1y9E, "_ZN3ccc7DD8x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x1y9C1Ev();
extern void _ZN3ccc7DD8x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x1y9E[] = {
  NSPAIR(_ZN3ccc7DD8x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD8x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y9E[];
extern void _ZN3ccc7DD8x1y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x1y93pqrEv,_ZTv0_n16_N3ccc7DD8x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y93pqrEv,_ZThn4_N3ccc7DD8x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x1y93efgEv,_ZTv0_n20_N3ccc7DD8x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x1y93efgEv,_ZThn4_N3ccc7DD8x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x1y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x1y93pqrEv,_ZTv0_n16_N3ccc7DD8x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x1y93efgEv,_ZTv0_n20_N3ccc7DD8x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x1y9E[] = {
  {&(_ZTVN3ccc7DD8x1y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x1y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x1y9E[];
static VTBL_ENTRY alt_thunk_names1221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x1y93efgEv,_ZTv0_n20_N3ccc7DD8x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y93efgEv,_ZThn4_N3ccc7DD8x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x1y93pqrEv,_ZTv0_n16_N3ccc7DD8x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x1y93pqrEv,_ZThn4_N3ccc7DD8x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x1y9E = {  "_ZN3ccc7DD8x1y9E", // class name
  bases__ZN3ccc7DD8x1y9E, 2,
  &(vtc__ZN3ccc7DD8x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x1y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x1y9E),3, //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  CC8x1y10  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC8x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x1y103abcEv
  ~CC8x1y10(); // tgen
  CC8x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y10E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x1y103pqrEv");}
void  ccc::CC8x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x1y103abcEv");}
ccc::CC8x1y10 ::~CC8x1y10(){ note_dtor("_ZN3ccc8CC8x1y10E", this);} // tgen
ccc::CC8x1y10 ::CC8x1y10(){ note_ctor("_ZN3ccc8CC8x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x1y10E, buf);
    ::ccc::CC8x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x1y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC8x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x1y10E);
    dp->::ccc::CC8x1y10::~CC8x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x1y10E(Test__ZN3ccc8CC8x1y10E, "_ZN3ccc8CC8x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x1y10C1Ev();
extern void _ZN3ccc8CC8x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x1y10E[] = {
  NSPAIR(_ZN3ccc8CC8x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC8x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x1y10E[];
extern void _ZN3ccc8CC8x1y103abcEv();
extern void _ZN3ccc8CC8x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x1y103abcEv,_ZTv0_n16_N3ccc8CC8x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y103abcEv,_ZThn4_N3ccc8CC8x1y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x1y103abcEv,_ZTv0_n16_N3ccc8CC8x1y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x1y10E[] = {
  {&(_ZTVN3ccc8CC8x1y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x1y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x1y10E[];
static VTBL_ENTRY alt_thunk_names1222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x1y103abcEv,_ZTv0_n16_N3ccc8CC8x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x1y103abcEv,_ZThn4_N3ccc8CC8x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x1y10E = {  "_ZN3ccc8CC8x1y10E", // class name
  bases__ZN3ccc8CC8x1y10E, 2,
  &(vtc__ZN3ccc8CC8x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x1y10E),2, //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  DD8x1y10  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD8x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x1y103abcEv
  ~DD8x1y10(); // tgen
  DD8x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x1y10E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x1y103pqrEv");}
void  ccc::DD8x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x1y103abcEv");}
ccc::DD8x1y10 ::~DD8x1y10(){ note_dtor("_ZN3ccc8DD8x1y10E", this);} // tgen
ccc::DD8x1y10 ::DD8x1y10(){ note_ctor("_ZN3ccc8DD8x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x1y10E, buf);
    ::ccc::DD8x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x1y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD8x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x1y10E);
    dp->::ccc::DD8x1y10::~DD8x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x1y10E(Test__ZN3ccc8DD8x1y10E, "_ZN3ccc8DD8x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x1y10C1Ev();
extern void _ZN3ccc8DD8x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x1y10E[] = {
  NSPAIR(_ZN3ccc8DD8x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD8x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x1y103abcEv();
extern void _ZN3ccc8DD8x1y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x1y103abcEv,_ZTv0_n12_N3ccc8DD8x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y103abcEv,_ZThn4_N3ccc8DD8x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x1y103pqrEv,_ZTv0_n16_N3ccc8DD8x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y103pqrEv,_ZThn4_N3ccc8DD8x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x1y103abcEv,_ZTv0_n12_N3ccc8DD8x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x1y103pqrEv,_ZTv0_n16_N3ccc8DD8x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x1y10E[] = {
  {&(_ZTVN3ccc8DD8x1y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x1y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x1y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x1y10E[];
static VTBL_ENTRY alt_thunk_names1223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x1y103pqrEv,_ZTv0_n16_N3ccc8DD8x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y103pqrEv,_ZThn4_N3ccc8DD8x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x1y103abcEv,_ZTv0_n12_N3ccc8DD8x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y103abcEv,_ZThn4_N3ccc8DD8x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x1y10E = {  "_ZN3ccc8DD8x1y10E", // class name
  bases__ZN3ccc8DD8x1y10E, 2,
  &(vtc__ZN3ccc8DD8x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x1y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x1y10E),3, //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  CC8x1y11  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC8x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x1y113efgEv
  ~CC8x1y11(); // tgen
  CC8x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y11E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x1y113pqrEv");}
void  ccc::CC8x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x1y113efgEv");}
ccc::CC8x1y11 ::~CC8x1y11(){ note_dtor("_ZN3ccc8CC8x1y11E", this);} // tgen
ccc::CC8x1y11 ::CC8x1y11(){ note_ctor("_ZN3ccc8CC8x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x1y11E, buf);
    ::ccc::CC8x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x1y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC8x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x1y11E);
    dp->::ccc::CC8x1y11::~CC8x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x1y11E(Test__ZN3ccc8CC8x1y11E, "_ZN3ccc8CC8x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x1y11C1Ev();
extern void _ZN3ccc8CC8x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x1y11E[] = {
  NSPAIR(_ZN3ccc8CC8x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC8x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC8x1y113pqrEv();
extern void _ZN3ccc8CC8x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x1y113efgEv,_ZTv0_n12_N3ccc8CC8x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y113efgEv,_ZThn4_N3ccc8CC8x1y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x1y113efgEv,_ZTv0_n12_N3ccc8CC8x1y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x1y11E[] = {
  {&(_ZTVN3ccc8CC8x1y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x1y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x1y11E[];
static VTBL_ENTRY alt_thunk_names1224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x1y113efgEv,_ZTv0_n12_N3ccc8CC8x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x1y113efgEv,_ZThn4_N3ccc8CC8x1y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x1y11E = {  "_ZN3ccc8CC8x1y11E", // class name
  bases__ZN3ccc8CC8x1y11E, 2,
  &(vtc__ZN3ccc8CC8x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x1y11E),2, //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  DD8x1y11  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD8x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x1y113efgEv
  ~DD8x1y11(); // tgen
  DD8x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x1y11E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x1y113pqrEv");}
void  ccc::DD8x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x1y113efgEv");}
ccc::DD8x1y11 ::~DD8x1y11(){ note_dtor("_ZN3ccc8DD8x1y11E", this);} // tgen
ccc::DD8x1y11 ::DD8x1y11(){ note_ctor("_ZN3ccc8DD8x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x1y11E, buf);
    ::ccc::DD8x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x1y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD8x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x1y11E);
    dp->::ccc::DD8x1y11::~DD8x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x1y11E(Test__ZN3ccc8DD8x1y11E, "_ZN3ccc8DD8x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x1y11C1Ev();
extern void _ZN3ccc8DD8x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x1y11E[] = {
  NSPAIR(_ZN3ccc8DD8x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD8x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y11E[];
extern void _ZN3ccc8DD8x1y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x1y113pqrEv,_ZTv0_n16_N3ccc8DD8x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y113pqrEv,_ZThn4_N3ccc8DD8x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x1y113efgEv,_ZTv0_n20_N3ccc8DD8x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y113efgEv,_ZThn4_N3ccc8DD8x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x1y113pqrEv,_ZTv0_n16_N3ccc8DD8x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x1y113efgEv,_ZTv0_n20_N3ccc8DD8x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x1y11E[] = {
  {&(_ZTVN3ccc8DD8x1y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x1y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x1y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x1y11E[];
static VTBL_ENTRY alt_thunk_names1225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x1y113efgEv,_ZTv0_n20_N3ccc8DD8x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y113efgEv,_ZThn4_N3ccc8DD8x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x1y113pqrEv,_ZTv0_n16_N3ccc8DD8x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y113pqrEv,_ZThn4_N3ccc8DD8x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x1y11E = {  "_ZN3ccc8DD8x1y11E", // class name
  bases__ZN3ccc8DD8x1y11E, 2,
  &(vtc__ZN3ccc8DD8x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x1y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x1y11E),3, //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  CC8x1y12  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC8x1y123abcEv
  ~CC8x1y12(); // tgen
  CC8x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y12E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x1y123abcEv");}
ccc::CC8x1y12 ::~CC8x1y12(){ note_dtor("_ZN3ccc8CC8x1y12E", this);} // tgen
ccc::CC8x1y12 ::CC8x1y12(){ note_ctor("_ZN3ccc8CC8x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x1y12E, buf);
    ::ccc::CC8x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x1y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC8x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x1y12E);
    dp->::ccc::CC8x1y12::~CC8x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x1y12E(Test__ZN3ccc8CC8x1y12E, "_ZN3ccc8CC8x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x1y12C1Ev();
extern void _ZN3ccc8CC8x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x1y12E[] = {
  NSPAIR(_ZN3ccc8CC8x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC8x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x1y12E[];
extern void _ZN3ccc8CC8x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x1y123abcEv,_ZTv0_n16_N3ccc8CC8x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y123abcEv,_ZThn4_N3ccc8CC8x1y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x1y123abcEv,_ZTv0_n16_N3ccc8CC8x1y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x1y12E[] = {
  {&(_ZTVN3ccc8CC8x1y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x1y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x1y12E[];
static VTBL_ENTRY alt_thunk_names1226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x1y123abcEv,_ZTv0_n16_N3ccc8CC8x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x1y123abcEv,_ZThn4_N3ccc8CC8x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x1y12E = {  "_ZN3ccc8CC8x1y12E", // class name
  bases__ZN3ccc8CC8x1y12E, 2,
  &(vtc__ZN3ccc8CC8x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x1y12E),2, //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  DD8x1y12  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD8x1y123abcEv
  ~DD8x1y12(); // tgen
  DD8x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x1y12E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x1y123abcEv");}
ccc::DD8x1y12 ::~DD8x1y12(){ note_dtor("_ZN3ccc8DD8x1y12E", this);} // tgen
ccc::DD8x1y12 ::DD8x1y12(){ note_ctor("_ZN3ccc8DD8x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x1y12E, buf);
    ::ccc::DD8x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x1y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD8x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x1y12E);
    dp->::ccc::DD8x1y12::~DD8x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x1y12E(Test__ZN3ccc8DD8x1y12E, "_ZN3ccc8DD8x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x1y12C1Ev();
extern void _ZN3ccc8DD8x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x1y12E[] = {
  NSPAIR(_ZN3ccc8DD8x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD8x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x1y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x1y123abcEv,_ZTv0_n12_N3ccc8DD8x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y123abcEv,_ZThn4_N3ccc8DD8x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x1y123abcEv,_ZTv0_n12_N3ccc8DD8x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x1y12E[] = {
  {&(_ZTVN3ccc8DD8x1y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x1y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x1y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x1y12E[];
static VTBL_ENTRY alt_thunk_names1227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x1y123abcEv,_ZTv0_n12_N3ccc8DD8x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y123abcEv,_ZThn4_N3ccc8DD8x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x1y12E = {  "_ZN3ccc8DD8x1y12E", // class name
  bases__ZN3ccc8DD8x1y12E, 2,
  &(vtc__ZN3ccc8DD8x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x1y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x1y12E),3, //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  CC8x1y13  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC8x1y133efgEv
  ~CC8x1y13(); // tgen
  CC8x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC8x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x1y133efgEv");}
ccc::CC8x1y13 ::~CC8x1y13(){ note_dtor("_ZN3ccc8CC8x1y13E", this);} // tgen
ccc::CC8x1y13 ::CC8x1y13(){ note_ctor("_ZN3ccc8CC8x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x1y13E, buf);
    ::ccc::CC8x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x1y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC8x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x1y13E);
    dp->::ccc::CC8x1y13::~CC8x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x1y13E(Test__ZN3ccc8CC8x1y13E, "_ZN3ccc8CC8x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x1y13C1Ev();
extern void _ZN3ccc8CC8x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x1y13E[] = {
  NSPAIR(_ZN3ccc8CC8x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC8x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC8x1y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x1y133efgEv,_ZTv0_n12_N3ccc8CC8x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x1y133efgEv,_ZThn4_N3ccc8CC8x1y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x1y133efgEv,_ZTv0_n12_N3ccc8CC8x1y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x1y13E[] = {
  {&(_ZTVN3ccc8CC8x1y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x1y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x1y13E[];
static VTBL_ENTRY alt_thunk_names1228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x1y133efgEv,_ZTv0_n12_N3ccc8CC8x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x1y133efgEv,_ZThn4_N3ccc8CC8x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x1y13E = {  "_ZN3ccc8CC8x1y13E", // class name
  bases__ZN3ccc8CC8x1y13E, 2,
  &(vtc__ZN3ccc8CC8x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x1y13E),2, //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  DD8x1y13  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD8x1y133efgEv
  ~DD8x1y13(); // tgen
  DD8x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x1y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD8x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x1y133efgEv");}
ccc::DD8x1y13 ::~DD8x1y13(){ note_dtor("_ZN3ccc8DD8x1y13E", this);} // tgen
ccc::DD8x1y13 ::DD8x1y13(){ note_ctor("_ZN3ccc8DD8x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x1y13E, buf);
    ::ccc::DD8x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x1y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD8x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x1y13E);
    dp->::ccc::DD8x1y13::~DD8x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x1y13E(Test__ZN3ccc8DD8x1y13E, "_ZN3ccc8DD8x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x1y13C1Ev();
extern void _ZN3ccc8DD8x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x1y13E[] = {
  NSPAIR(_ZN3ccc8DD8x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD8x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y13E[];
extern void _ZN3ccc8DD8x1y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x1y133efgEv,_ZTv0_n20_N3ccc8DD8x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y133efgEv,_ZThn4_N3ccc8DD8x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x1y133efgEv,_ZTv0_n20_N3ccc8DD8x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x1y13E[] = {
  {&(_ZTVN3ccc8DD8x1y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x1y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x1y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x1y13E[];
static VTBL_ENTRY alt_thunk_names1229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x1y133efgEv,_ZTv0_n20_N3ccc8DD8x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y133efgEv,_ZThn4_N3ccc8DD8x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x1y13E = {  "_ZN3ccc8DD8x1y13E", // class name
  bases__ZN3ccc8DD8x1y13E, 2,
  &(vtc__ZN3ccc8DD8x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x1y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x1y13E),3, //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  CC8x1y14  : virtual ::ccc::AA8 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC8x1y143pqrEv
  ~CC8x1y14(); // tgen
  CC8x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC8x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x1y143pqrEv");}
ccc::CC8x1y14 ::~CC8x1y14(){ note_dtor("_ZN3ccc8CC8x1y14E", this);} // tgen
ccc::CC8x1y14 ::CC8x1y14(){ note_ctor("_ZN3ccc8CC8x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x1y14E, buf);
    ::ccc::CC8x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x1y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC8x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x1y14E);
    dp->::ccc::CC8x1y14::~CC8x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x1y14E(Test__ZN3ccc8CC8x1y14E, "_ZN3ccc8CC8x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x1y14C1Ev();
extern void _ZN3ccc8CC8x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x1y14E[] = {
  NSPAIR(_ZN3ccc8CC8x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC8x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC8x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x1y14E[] = {
  {&(_ZTVN3ccc8CC8x1y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x1y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x1y14E[];
Class_Descriptor cd__ZN3ccc8CC8x1y14E = {  "_ZN3ccc8CC8x1y14E", // class name
  bases__ZN3ccc8CC8x1y14E, 2,
  &(vtc__ZN3ccc8CC8x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x1y14E),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  DD8x1y14  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD8x1y143pqrEv
  ~DD8x1y14(); // tgen
  DD8x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x1y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD8x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x1y143pqrEv");}
ccc::DD8x1y14 ::~DD8x1y14(){ note_dtor("_ZN3ccc8DD8x1y14E", this);} // tgen
ccc::DD8x1y14 ::DD8x1y14(){ note_ctor("_ZN3ccc8DD8x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x1y14E, buf);
    ::ccc::DD8x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x1y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD8x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x1y14E);
    dp->::ccc::DD8x1y14::~DD8x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x1y14E(Test__ZN3ccc8DD8x1y14E, "_ZN3ccc8DD8x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x1y14C1Ev();
extern void _ZN3ccc8DD8x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x1y14E[] = {
  NSPAIR(_ZN3ccc8DD8x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD8x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x1y143pqrEv,_ZTv0_n16_N3ccc8DD8x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x1y143pqrEv,_ZThn4_N3ccc8DD8x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x1y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x1y143pqrEv,_ZTv0_n16_N3ccc8DD8x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x1y14E[] = {
  {&(_ZTVN3ccc8DD8x1y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x1y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x1y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x1y14E[];
static VTBL_ENTRY alt_thunk_names1230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x1y143pqrEv,_ZTv0_n16_N3ccc8DD8x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x1y143pqrEv,_ZThn4_N3ccc8DD8x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x1y14E = {  "_ZN3ccc8DD8x1y14E", // class name
  bases__ZN3ccc8DD8x1y14E, 2,
  &(vtc__ZN3ccc8DD8x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x1y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x1y14E),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  CC8x1y15  : virtual ::ccc::AA8 , ::ccc::BB1 {
  ~CC8x1y15(); // tgen
  CC8x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x1y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC8x1y15 ::~CC8x1y15(){ note_dtor("_ZN3ccc8CC8x1y15E", this);} // tgen
ccc::CC8x1y15 ::CC8x1y15(){ note_ctor("_ZN3ccc8CC8x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x1y15E, buf);
    ::ccc::CC8x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x1y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC8x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x1y15E);
    dp->::ccc::CC8x1y15::~CC8x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x1y15E(Test__ZN3ccc8CC8x1y15E, "_ZN3ccc8CC8x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x1y15C1Ev();
extern void _ZN3ccc8CC8x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x1y15E[] = {
  NSPAIR(_ZN3ccc8CC8x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC8x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x1y15E[] = {
  {&(_ZTVN3ccc8CC8x1y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x1y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x1y15E[];
Class_Descriptor cd__ZN3ccc8CC8x1y15E = {  "_ZN3ccc8CC8x1y15E", // class name
  bases__ZN3ccc8CC8x1y15E, 2,
  &(vtc__ZN3ccc8CC8x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x1y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x1y15E),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  DD8x1y15  : virtual ::ccc::AA8 , virtual ::ccc::BB1 {
  ~DD8x1y15(); // tgen
  DD8x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x1y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD8x1y15 ::~DD8x1y15(){ note_dtor("_ZN3ccc8DD8x1y15E", this);} // tgen
ccc::DD8x1y15 ::DD8x1y15(){ note_ctor("_ZN3ccc8DD8x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x1y15E, buf);
    ::ccc::DD8x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x1y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD8x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x1y15E);
    dp->::ccc::DD8x1y15::~DD8x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x1y15E(Test__ZN3ccc8DD8x1y15E, "_ZN3ccc8DD8x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x1y15C1Ev();
extern void _ZN3ccc8DD8x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x1y15E[] = {
  NSPAIR(_ZN3ccc8DD8x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD8x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x1y15E[] = {
  {&(_ZTVN3ccc8DD8x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x1y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x1y15E[];
Class_Descriptor cd__ZN3ccc8DD8x1y15E = {  "_ZN3ccc8DD8x1y15E", // class name
  bases__ZN3ccc8DD8x1y15E, 2,
  &(vtc__ZN3ccc8DD8x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x1y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x1y15E),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  CC8x2y0  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y03pqrEv
  ~CC8x2y0(); // tgen
  CC8x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y0E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y03abcEv");}
void  ccc::CC8x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y03efgEv");}
void  ccc::CC8x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y03pqrEv");}
ccc::CC8x2y0 ::~CC8x2y0(){ note_dtor("_ZN3ccc7CC8x2y0E", this);} // tgen
ccc::CC8x2y0 ::CC8x2y0(){ note_ctor("_ZN3ccc7CC8x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y0E, buf);
    ::ccc::CC8x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y0E);
    dp->::ccc::CC8x2y0::~CC8x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y0E(Test__ZN3ccc7CC8x2y0E, "_ZN3ccc7CC8x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y0C1Ev();
extern void _ZN3ccc7CC8x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y0E[] = {
  NSPAIR(_ZN3ccc7CC8x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y0E[];
extern void _ZN3ccc7CC8x2y03efgEv();
extern void _ZN3ccc7CC8x2y03abcEv();
extern void _ZN3ccc7CC8x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y03efgEv,_ZTv0_n12_N3ccc7CC8x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y03efgEv,_ZThn4_N3ccc7CC8x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y03abcEv,_ZTv0_n16_N3ccc7CC8x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y03abcEv,_ZThn4_N3ccc7CC8x2y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y03efgEv,_ZTv0_n12_N3ccc7CC8x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y03abcEv,_ZTv0_n16_N3ccc7CC8x2y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y0E[] = {
  {&(_ZTVN3ccc7CC8x2y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y0E[];
static VTBL_ENTRY alt_thunk_names1231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y03abcEv,_ZTv0_n16_N3ccc7CC8x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y03abcEv,_ZThn4_N3ccc7CC8x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y03efgEv,_ZTv0_n12_N3ccc7CC8x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y03efgEv,_ZThn4_N3ccc7CC8x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y0E = {  "_ZN3ccc7CC8x2y0E", // class name
  bases__ZN3ccc7CC8x2y0E, 2,
  &(vtc__ZN3ccc7CC8x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y0E),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  DD8x2y0  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD8x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x2y03pqrEv
  ~DD8x2y0(); // tgen
  DD8x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y0E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y03abcEv");}
void  ccc::DD8x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y03efgEv");}
void  ccc::DD8x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y03pqrEv");}
ccc::DD8x2y0 ::~DD8x2y0(){ note_dtor("_ZN3ccc7DD8x2y0E", this);} // tgen
ccc::DD8x2y0 ::DD8x2y0(){ note_ctor("_ZN3ccc7DD8x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y0E, buf);
    ::ccc::DD8x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y0E);
    dp->::ccc::DD8x2y0::~DD8x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y0E(Test__ZN3ccc7DD8x2y0E, "_ZN3ccc7DD8x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y0C1Ev();
extern void _ZN3ccc7DD8x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y0E[] = {
  NSPAIR(_ZN3ccc7DD8x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y0E[];
extern void _ZN3ccc7DD8x2y03efgEv();
extern void _ZN3ccc7DD8x2y03abcEv();
extern void _ZN3ccc7DD8x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y03efgEv,_ZTv0_n12_N3ccc7DD8x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y03efgEv,_ZThn4_N3ccc7DD8x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y03abcEv,_ZTv0_n16_N3ccc7DD8x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y03abcEv,_ZThn4_N3ccc7DD8x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y03pqrEv,_ZTv0_n20_N3ccc7DD8x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y03pqrEv,_ZThn4_N3ccc7DD8x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y03efgEv,_ZTv0_n12_N3ccc7DD8x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y03abcEv,_ZTv0_n16_N3ccc7DD8x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y03pqrEv,_ZTv0_n20_N3ccc7DD8x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y0E[] = {
  {&(_ZTVN3ccc7DD8x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y0E[];
static VTBL_ENTRY alt_thunk_names1232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y03pqrEv,_ZTv0_n20_N3ccc7DD8x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y03pqrEv,_ZThn4_N3ccc7DD8x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y03abcEv,_ZTv0_n16_N3ccc7DD8x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y03abcEv,_ZThn4_N3ccc7DD8x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y03efgEv,_ZTv0_n12_N3ccc7DD8x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y03efgEv,_ZThn4_N3ccc7DD8x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y0E = {  "_ZN3ccc7DD8x2y0E", // class name
  bases__ZN3ccc7DD8x2y0E, 2,
  &(vtc__ZN3ccc7DD8x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y0E),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  CC8x2y1  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x2y13efgEv
  ~CC8x2y1(); // tgen
  CC8x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y1E) C1{ VBC2{ v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y13abcEv");}
void  ccc::CC8x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y13pqrEv");}
void  ccc::CC8x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y13efgEv");}
ccc::CC8x2y1 ::~CC8x2y1(){ note_dtor("_ZN3ccc7CC8x2y1E", this);} // tgen
ccc::CC8x2y1 ::CC8x2y1(){ note_ctor("_ZN3ccc7CC8x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y1E, buf);
    ::ccc::CC8x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y1E);
    dp->::ccc::CC8x2y1::~CC8x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y1E(Test__ZN3ccc7CC8x2y1E, "_ZN3ccc7CC8x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y1C1Ev();
extern void _ZN3ccc7CC8x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y1E[] = {
  NSPAIR(_ZN3ccc7CC8x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y1E[];
extern void _ZN3ccc7CC8x2y13efgEv();
extern void _ZN3ccc7CC8x2y13abcEv();
extern void _ZN3ccc7CC8x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y13efgEv,_ZTv0_n12_N3ccc7CC8x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y13efgEv,_ZThn4_N3ccc7CC8x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y13abcEv,_ZTv0_n16_N3ccc7CC8x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y13abcEv,_ZThn4_N3ccc7CC8x2y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y13efgEv,_ZTv0_n12_N3ccc7CC8x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y13abcEv,_ZTv0_n16_N3ccc7CC8x2y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y1E[] = {
  {&(_ZTVN3ccc7CC8x2y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y1E[];
static VTBL_ENTRY alt_thunk_names1233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y13abcEv,_ZTv0_n16_N3ccc7CC8x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y13abcEv,_ZThn4_N3ccc7CC8x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y13efgEv,_ZTv0_n12_N3ccc7CC8x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y13efgEv,_ZThn4_N3ccc7CC8x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y1E = {  "_ZN3ccc7CC8x2y1E", // class name
  bases__ZN3ccc7CC8x2y1E, 2,
  &(vtc__ZN3ccc7CC8x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y1E),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  DD8x2y1  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD8x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x2y13efgEv
  ~DD8x2y1(); // tgen
  DD8x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y1E) C1{ VBC2{ v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y13abcEv");}
void  ccc::DD8x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y13pqrEv");}
void  ccc::DD8x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y13efgEv");}
ccc::DD8x2y1 ::~DD8x2y1(){ note_dtor("_ZN3ccc7DD8x2y1E", this);} // tgen
ccc::DD8x2y1 ::DD8x2y1(){ note_ctor("_ZN3ccc7DD8x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y1E, buf);
    ::ccc::DD8x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y1E);
    dp->::ccc::DD8x2y1::~DD8x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y1E(Test__ZN3ccc7DD8x2y1E, "_ZN3ccc7DD8x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y1C1Ev();
extern void _ZN3ccc7DD8x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y1E[] = {
  NSPAIR(_ZN3ccc7DD8x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y1E[];
extern void _ZN3ccc7DD8x2y13efgEv();
extern void _ZN3ccc7DD8x2y13abcEv();
extern void _ZN3ccc7DD8x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y13efgEv,_ZTv0_n12_N3ccc7DD8x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y13efgEv,_ZThn4_N3ccc7DD8x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y13abcEv,_ZTv0_n16_N3ccc7DD8x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y13abcEv,_ZThn4_N3ccc7DD8x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y13pqrEv,_ZTv0_n20_N3ccc7DD8x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y13pqrEv,_ZThn4_N3ccc7DD8x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y13efgEv,_ZTv0_n12_N3ccc7DD8x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y13abcEv,_ZTv0_n16_N3ccc7DD8x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y13pqrEv,_ZTv0_n20_N3ccc7DD8x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y1E[] = {
  {&(_ZTVN3ccc7DD8x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y1E[];
static VTBL_ENTRY alt_thunk_names1234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y13pqrEv,_ZTv0_n20_N3ccc7DD8x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y13pqrEv,_ZThn4_N3ccc7DD8x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y13abcEv,_ZTv0_n16_N3ccc7DD8x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y13abcEv,_ZThn4_N3ccc7DD8x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y13efgEv,_ZTv0_n12_N3ccc7DD8x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y13efgEv,_ZThn4_N3ccc7DD8x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y1E = {  "_ZN3ccc7DD8x2y1E", // class name
  bases__ZN3ccc7DD8x2y1E, 2,
  &(vtc__ZN3ccc7DD8x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y1E),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  CC8x2y2  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y23pqrEv
  ~CC8x2y2(); // tgen
  CC8x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y2E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y23efgEv");}
void  ccc::CC8x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y23abcEv");}
void  ccc::CC8x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y23pqrEv");}
ccc::CC8x2y2 ::~CC8x2y2(){ note_dtor("_ZN3ccc7CC8x2y2E", this);} // tgen
ccc::CC8x2y2 ::CC8x2y2(){ note_ctor("_ZN3ccc7CC8x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y2E, buf);
    ::ccc::CC8x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y2E);
    dp->::ccc::CC8x2y2::~CC8x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y2E(Test__ZN3ccc7CC8x2y2E, "_ZN3ccc7CC8x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y2C1Ev();
extern void _ZN3ccc7CC8x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y2E[] = {
  NSPAIR(_ZN3ccc7CC8x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y2E[];
extern void _ZN3ccc7CC8x2y23efgEv();
extern void _ZN3ccc7CC8x2y23abcEv();
extern void _ZN3ccc7CC8x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y23efgEv,_ZTv0_n12_N3ccc7CC8x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y23efgEv,_ZThn4_N3ccc7CC8x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y23abcEv,_ZTv0_n16_N3ccc7CC8x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y23abcEv,_ZThn4_N3ccc7CC8x2y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y23efgEv,_ZTv0_n12_N3ccc7CC8x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y23abcEv,_ZTv0_n16_N3ccc7CC8x2y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y2E[] = {
  {&(_ZTVN3ccc7CC8x2y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y2E[];
static VTBL_ENTRY alt_thunk_names1235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y23abcEv,_ZTv0_n16_N3ccc7CC8x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y23abcEv,_ZThn4_N3ccc7CC8x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y23efgEv,_ZTv0_n12_N3ccc7CC8x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y23efgEv,_ZThn4_N3ccc7CC8x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y2E = {  "_ZN3ccc7CC8x2y2E", // class name
  bases__ZN3ccc7CC8x2y2E, 2,
  &(vtc__ZN3ccc7CC8x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y2E),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  DD8x2y2  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD8x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x2y23pqrEv
  ~DD8x2y2(); // tgen
  DD8x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y2E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y23efgEv");}
void  ccc::DD8x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y23abcEv");}
void  ccc::DD8x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y23pqrEv");}
ccc::DD8x2y2 ::~DD8x2y2(){ note_dtor("_ZN3ccc7DD8x2y2E", this);} // tgen
ccc::DD8x2y2 ::DD8x2y2(){ note_ctor("_ZN3ccc7DD8x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y2E, buf);
    ::ccc::DD8x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y2E);
    dp->::ccc::DD8x2y2::~DD8x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y2E(Test__ZN3ccc7DD8x2y2E, "_ZN3ccc7DD8x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y2C1Ev();
extern void _ZN3ccc7DD8x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y2E[] = {
  NSPAIR(_ZN3ccc7DD8x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y2E[];
extern void _ZN3ccc7DD8x2y23efgEv();
extern void _ZN3ccc7DD8x2y23abcEv();
extern void _ZN3ccc7DD8x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y23efgEv,_ZTv0_n12_N3ccc7DD8x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y23efgEv,_ZThn4_N3ccc7DD8x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y23abcEv,_ZTv0_n16_N3ccc7DD8x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y23abcEv,_ZThn4_N3ccc7DD8x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y23pqrEv,_ZTv0_n20_N3ccc7DD8x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y23pqrEv,_ZThn4_N3ccc7DD8x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y23efgEv,_ZTv0_n12_N3ccc7DD8x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y23abcEv,_ZTv0_n16_N3ccc7DD8x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y23pqrEv,_ZTv0_n20_N3ccc7DD8x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y2E[] = {
  {&(_ZTVN3ccc7DD8x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y2E[];
static VTBL_ENTRY alt_thunk_names1236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y23pqrEv,_ZTv0_n20_N3ccc7DD8x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y23pqrEv,_ZThn4_N3ccc7DD8x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y23abcEv,_ZTv0_n16_N3ccc7DD8x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y23abcEv,_ZThn4_N3ccc7DD8x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y23efgEv,_ZTv0_n12_N3ccc7DD8x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y23efgEv,_ZThn4_N3ccc7DD8x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y2E = {  "_ZN3ccc7DD8x2y2E", // class name
  bases__ZN3ccc7DD8x2y2E, 2,
  &(vtc__ZN3ccc7DD8x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y2E),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  CC8x2y3  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x2y33abcEv
  ~CC8x2y3(); // tgen
  CC8x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y3E) C1{ VBC2{ v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y33efgEv");}
void  ccc::CC8x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y33pqrEv");}
void  ccc::CC8x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y33abcEv");}
ccc::CC8x2y3 ::~CC8x2y3(){ note_dtor("_ZN3ccc7CC8x2y3E", this);} // tgen
ccc::CC8x2y3 ::CC8x2y3(){ note_ctor("_ZN3ccc7CC8x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y3E, buf);
    ::ccc::CC8x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y3E);
    dp->::ccc::CC8x2y3::~CC8x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y3E(Test__ZN3ccc7CC8x2y3E, "_ZN3ccc7CC8x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y3C1Ev();
extern void _ZN3ccc7CC8x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y3E[] = {
  NSPAIR(_ZN3ccc7CC8x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y3E[];
extern void _ZN3ccc7CC8x2y33efgEv();
extern void _ZN3ccc7CC8x2y33abcEv();
extern void _ZN3ccc7CC8x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y33efgEv,_ZTv0_n12_N3ccc7CC8x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y33efgEv,_ZThn4_N3ccc7CC8x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y33abcEv,_ZTv0_n16_N3ccc7CC8x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y33abcEv,_ZThn4_N3ccc7CC8x2y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y33efgEv,_ZTv0_n12_N3ccc7CC8x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y33abcEv,_ZTv0_n16_N3ccc7CC8x2y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y3E[] = {
  {&(_ZTVN3ccc7CC8x2y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y3E[];
static VTBL_ENTRY alt_thunk_names1237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y33abcEv,_ZTv0_n16_N3ccc7CC8x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y33abcEv,_ZThn4_N3ccc7CC8x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y33efgEv,_ZTv0_n12_N3ccc7CC8x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y33efgEv,_ZThn4_N3ccc7CC8x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y3E = {  "_ZN3ccc7CC8x2y3E", // class name
  bases__ZN3ccc7CC8x2y3E, 2,
  &(vtc__ZN3ccc7CC8x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y3E),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  DD8x2y3  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD8x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x2y33abcEv
  ~DD8x2y3(); // tgen
  DD8x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y3E) C1{ VBC2{ v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y33efgEv");}
void  ccc::DD8x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y33pqrEv");}
void  ccc::DD8x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y33abcEv");}
ccc::DD8x2y3 ::~DD8x2y3(){ note_dtor("_ZN3ccc7DD8x2y3E", this);} // tgen
ccc::DD8x2y3 ::DD8x2y3(){ note_ctor("_ZN3ccc7DD8x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y3E, buf);
    ::ccc::DD8x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y3E);
    dp->::ccc::DD8x2y3::~DD8x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y3E(Test__ZN3ccc7DD8x2y3E, "_ZN3ccc7DD8x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y3C1Ev();
extern void _ZN3ccc7DD8x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y3E[] = {
  NSPAIR(_ZN3ccc7DD8x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y3E[];
extern void _ZN3ccc7DD8x2y33efgEv();
extern void _ZN3ccc7DD8x2y33abcEv();
extern void _ZN3ccc7DD8x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y33efgEv,_ZTv0_n12_N3ccc7DD8x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y33efgEv,_ZThn4_N3ccc7DD8x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y33abcEv,_ZTv0_n16_N3ccc7DD8x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y33abcEv,_ZThn4_N3ccc7DD8x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y33pqrEv,_ZTv0_n20_N3ccc7DD8x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y33pqrEv,_ZThn4_N3ccc7DD8x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y33efgEv,_ZTv0_n12_N3ccc7DD8x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y33abcEv,_ZTv0_n16_N3ccc7DD8x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y33pqrEv,_ZTv0_n20_N3ccc7DD8x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y3E[] = {
  {&(_ZTVN3ccc7DD8x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y3E[];
static VTBL_ENTRY alt_thunk_names1238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y33pqrEv,_ZTv0_n20_N3ccc7DD8x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y33pqrEv,_ZThn4_N3ccc7DD8x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y33abcEv,_ZTv0_n16_N3ccc7DD8x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y33abcEv,_ZThn4_N3ccc7DD8x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y33efgEv,_ZTv0_n12_N3ccc7DD8x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y33efgEv,_ZThn4_N3ccc7DD8x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y3E = {  "_ZN3ccc7DD8x2y3E", // class name
  bases__ZN3ccc7DD8x2y3E, 2,
  &(vtc__ZN3ccc7DD8x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y3E),3, //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  CC8x2y4  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC8x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x2y43efgEv
  ~CC8x2y4(); // tgen
  CC8x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y4E) C1{ VBC2{ v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y43pqrEv");}
void  ccc::CC8x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y43abcEv");}
void  ccc::CC8x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y43efgEv");}
ccc::CC8x2y4 ::~CC8x2y4(){ note_dtor("_ZN3ccc7CC8x2y4E", this);} // tgen
ccc::CC8x2y4 ::CC8x2y4(){ note_ctor("_ZN3ccc7CC8x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y4E, buf);
    ::ccc::CC8x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y4E);
    dp->::ccc::CC8x2y4::~CC8x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y4E(Test__ZN3ccc7CC8x2y4E, "_ZN3ccc7CC8x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y4C1Ev();
extern void _ZN3ccc7CC8x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y4E[] = {
  NSPAIR(_ZN3ccc7CC8x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y4E[];
extern void _ZN3ccc7CC8x2y43efgEv();
extern void _ZN3ccc7CC8x2y43abcEv();
extern void _ZN3ccc7CC8x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y43efgEv,_ZTv0_n12_N3ccc7CC8x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y43efgEv,_ZThn4_N3ccc7CC8x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y43abcEv,_ZTv0_n16_N3ccc7CC8x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y43abcEv,_ZThn4_N3ccc7CC8x2y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y43efgEv,_ZTv0_n12_N3ccc7CC8x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y43abcEv,_ZTv0_n16_N3ccc7CC8x2y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y4E[] = {
  {&(_ZTVN3ccc7CC8x2y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y4E[];
static VTBL_ENTRY alt_thunk_names1239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y43abcEv,_ZTv0_n16_N3ccc7CC8x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y43abcEv,_ZThn4_N3ccc7CC8x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y43efgEv,_ZTv0_n12_N3ccc7CC8x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y43efgEv,_ZThn4_N3ccc7CC8x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y4E = {  "_ZN3ccc7CC8x2y4E", // class name
  bases__ZN3ccc7CC8x2y4E, 2,
  &(vtc__ZN3ccc7CC8x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y4E),2, //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  DD8x2y4  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD8x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x2y43efgEv
  ~DD8x2y4(); // tgen
  DD8x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y4E) C1{ VBC2{ v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y43pqrEv");}
void  ccc::DD8x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y43abcEv");}
void  ccc::DD8x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y43efgEv");}
ccc::DD8x2y4 ::~DD8x2y4(){ note_dtor("_ZN3ccc7DD8x2y4E", this);} // tgen
ccc::DD8x2y4 ::DD8x2y4(){ note_ctor("_ZN3ccc7DD8x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y4E, buf);
    ::ccc::DD8x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y4E);
    dp->::ccc::DD8x2y4::~DD8x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y4E(Test__ZN3ccc7DD8x2y4E, "_ZN3ccc7DD8x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y4C1Ev();
extern void _ZN3ccc7DD8x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y4E[] = {
  NSPAIR(_ZN3ccc7DD8x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y4E[];
extern void _ZN3ccc7DD8x2y43efgEv();
extern void _ZN3ccc7DD8x2y43abcEv();
extern void _ZN3ccc7DD8x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y43efgEv,_ZTv0_n12_N3ccc7DD8x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y43efgEv,_ZThn4_N3ccc7DD8x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y43abcEv,_ZTv0_n16_N3ccc7DD8x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y43abcEv,_ZThn4_N3ccc7DD8x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y43pqrEv,_ZTv0_n20_N3ccc7DD8x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y43pqrEv,_ZThn4_N3ccc7DD8x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y43efgEv,_ZTv0_n12_N3ccc7DD8x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y43abcEv,_ZTv0_n16_N3ccc7DD8x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y43pqrEv,_ZTv0_n20_N3ccc7DD8x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y4E[] = {
  {&(_ZTVN3ccc7DD8x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y4E[];
static VTBL_ENTRY alt_thunk_names1240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y43pqrEv,_ZTv0_n20_N3ccc7DD8x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y43pqrEv,_ZThn4_N3ccc7DD8x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y43abcEv,_ZTv0_n16_N3ccc7DD8x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y43abcEv,_ZThn4_N3ccc7DD8x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y43efgEv,_ZTv0_n12_N3ccc7DD8x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y43efgEv,_ZThn4_N3ccc7DD8x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y4E = {  "_ZN3ccc7DD8x2y4E", // class name
  bases__ZN3ccc7DD8x2y4E, 2,
  &(vtc__ZN3ccc7DD8x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y4E),3, //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  CC8x2y5  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC8x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x2y53abcEv
  ~CC8x2y5(); // tgen
  CC8x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y5E) C1{ VBC2{ v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y53pqrEv");}
void  ccc::CC8x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y53efgEv");}
void  ccc::CC8x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y53abcEv");}
ccc::CC8x2y5 ::~CC8x2y5(){ note_dtor("_ZN3ccc7CC8x2y5E", this);} // tgen
ccc::CC8x2y5 ::CC8x2y5(){ note_ctor("_ZN3ccc7CC8x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y5E, buf);
    ::ccc::CC8x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y5E);
    dp->::ccc::CC8x2y5::~CC8x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y5E(Test__ZN3ccc7CC8x2y5E, "_ZN3ccc7CC8x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y5C1Ev();
extern void _ZN3ccc7CC8x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y5E[] = {
  NSPAIR(_ZN3ccc7CC8x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y5E[];
extern void _ZN3ccc7CC8x2y53efgEv();
extern void _ZN3ccc7CC8x2y53abcEv();
extern void _ZN3ccc7CC8x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y53efgEv,_ZTv0_n12_N3ccc7CC8x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y53efgEv,_ZThn4_N3ccc7CC8x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y53abcEv,_ZTv0_n16_N3ccc7CC8x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y53abcEv,_ZThn4_N3ccc7CC8x2y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y53efgEv,_ZTv0_n12_N3ccc7CC8x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y53abcEv,_ZTv0_n16_N3ccc7CC8x2y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y5E[] = {
  {&(_ZTVN3ccc7CC8x2y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y5E[];
static VTBL_ENTRY alt_thunk_names1241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y53abcEv,_ZTv0_n16_N3ccc7CC8x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y53abcEv,_ZThn4_N3ccc7CC8x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y53efgEv,_ZTv0_n12_N3ccc7CC8x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y53efgEv,_ZThn4_N3ccc7CC8x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y5E = {  "_ZN3ccc7CC8x2y5E", // class name
  bases__ZN3ccc7CC8x2y5E, 2,
  &(vtc__ZN3ccc7CC8x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y5E),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  DD8x2y5  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD8x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x2y53abcEv
  ~DD8x2y5(); // tgen
  DD8x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y5E) C1{ VBC2{ v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y53pqrEv");}
void  ccc::DD8x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y53efgEv");}
void  ccc::DD8x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y53abcEv");}
ccc::DD8x2y5 ::~DD8x2y5(){ note_dtor("_ZN3ccc7DD8x2y5E", this);} // tgen
ccc::DD8x2y5 ::DD8x2y5(){ note_ctor("_ZN3ccc7DD8x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y5E, buf);
    ::ccc::DD8x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y5E);
    dp->::ccc::DD8x2y5::~DD8x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y5E(Test__ZN3ccc7DD8x2y5E, "_ZN3ccc7DD8x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y5C1Ev();
extern void _ZN3ccc7DD8x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y5E[] = {
  NSPAIR(_ZN3ccc7DD8x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y5E[];
extern void _ZN3ccc7DD8x2y53efgEv();
extern void _ZN3ccc7DD8x2y53abcEv();
extern void _ZN3ccc7DD8x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y53efgEv,_ZTv0_n12_N3ccc7DD8x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y53efgEv,_ZThn4_N3ccc7DD8x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y53abcEv,_ZTv0_n16_N3ccc7DD8x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y53abcEv,_ZThn4_N3ccc7DD8x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y53pqrEv,_ZTv0_n20_N3ccc7DD8x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y53pqrEv,_ZThn4_N3ccc7DD8x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y53efgEv,_ZTv0_n12_N3ccc7DD8x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y53abcEv,_ZTv0_n16_N3ccc7DD8x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y53pqrEv,_ZTv0_n20_N3ccc7DD8x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y5E[] = {
  {&(_ZTVN3ccc7DD8x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y5E[];
static VTBL_ENTRY alt_thunk_names1242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y53pqrEv,_ZTv0_n20_N3ccc7DD8x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y53pqrEv,_ZThn4_N3ccc7DD8x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y53abcEv,_ZTv0_n16_N3ccc7DD8x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y53abcEv,_ZThn4_N3ccc7DD8x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y53efgEv,_ZTv0_n12_N3ccc7DD8x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y53efgEv,_ZThn4_N3ccc7DD8x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y5E = {  "_ZN3ccc7DD8x2y5E", // class name
  bases__ZN3ccc7DD8x2y5E, 2,
  &(vtc__ZN3ccc7DD8x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y5E),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  CC8x2y6  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x2y63efgEv
  ~CC8x2y6(); // tgen
  CC8x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y6E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y63abcEv");}
void  ccc::CC8x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y63efgEv");}
ccc::CC8x2y6 ::~CC8x2y6(){ note_dtor("_ZN3ccc7CC8x2y6E", this);} // tgen
ccc::CC8x2y6 ::CC8x2y6(){ note_ctor("_ZN3ccc7CC8x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y6E, buf);
    ::ccc::CC8x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y6E);
    dp->::ccc::CC8x2y6::~CC8x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y6E(Test__ZN3ccc7CC8x2y6E, "_ZN3ccc7CC8x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y6C1Ev();
extern void _ZN3ccc7CC8x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y6E[] = {
  NSPAIR(_ZN3ccc7CC8x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y6E[];
extern void _ZN3ccc7CC8x2y63efgEv();
extern void _ZN3ccc7CC8x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y63efgEv,_ZTv0_n12_N3ccc7CC8x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y63efgEv,_ZThn4_N3ccc7CC8x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y63abcEv,_ZTv0_n16_N3ccc7CC8x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y63abcEv,_ZThn4_N3ccc7CC8x2y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y63efgEv,_ZTv0_n12_N3ccc7CC8x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y63abcEv,_ZTv0_n16_N3ccc7CC8x2y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y6E[] = {
  {&(_ZTVN3ccc7CC8x2y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y6E[];
static VTBL_ENTRY alt_thunk_names1243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y63abcEv,_ZTv0_n16_N3ccc7CC8x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y63abcEv,_ZThn4_N3ccc7CC8x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y63efgEv,_ZTv0_n12_N3ccc7CC8x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y63efgEv,_ZThn4_N3ccc7CC8x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y6E = {  "_ZN3ccc7CC8x2y6E", // class name
  bases__ZN3ccc7CC8x2y6E, 2,
  &(vtc__ZN3ccc7CC8x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y6E),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  DD8x2y6  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD8x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x2y63efgEv
  ~DD8x2y6(); // tgen
  DD8x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y6E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y63abcEv");}
void  ccc::DD8x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y63efgEv");}
ccc::DD8x2y6 ::~DD8x2y6(){ note_dtor("_ZN3ccc7DD8x2y6E", this);} // tgen
ccc::DD8x2y6 ::DD8x2y6(){ note_ctor("_ZN3ccc7DD8x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y6E, buf);
    ::ccc::DD8x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y6E);
    dp->::ccc::DD8x2y6::~DD8x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y6E(Test__ZN3ccc7DD8x2y6E, "_ZN3ccc7DD8x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y6C1Ev();
extern void _ZN3ccc7DD8x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y6E[] = {
  NSPAIR(_ZN3ccc7DD8x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y6E[];
extern void _ZN3ccc7DD8x2y63efgEv();
extern void _ZN3ccc7DD8x2y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y63efgEv,_ZTv0_n12_N3ccc7DD8x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y63efgEv,_ZThn4_N3ccc7DD8x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y63abcEv,_ZTv0_n16_N3ccc7DD8x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y63abcEv,_ZThn4_N3ccc7DD8x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y63efgEv,_ZTv0_n12_N3ccc7DD8x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y63abcEv,_ZTv0_n16_N3ccc7DD8x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y6E[] = {
  {&(_ZTVN3ccc7DD8x2y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x2y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x2y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y6E[];
static VTBL_ENTRY alt_thunk_names1244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y63abcEv,_ZTv0_n16_N3ccc7DD8x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y63abcEv,_ZThn4_N3ccc7DD8x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y63efgEv,_ZTv0_n12_N3ccc7DD8x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y63efgEv,_ZThn4_N3ccc7DD8x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y6E = {  "_ZN3ccc7DD8x2y6E", // class name
  bases__ZN3ccc7DD8x2y6E, 2,
  &(vtc__ZN3ccc7DD8x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y6E),3, //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  CC8x2y7  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC8x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y73pqrEv
  ~CC8x2y7(); // tgen
  CC8x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y7E) C1{ VBC2{ v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y73abcEv");}
void  ccc::CC8x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y73pqrEv");}
ccc::CC8x2y7 ::~CC8x2y7(){ note_dtor("_ZN3ccc7CC8x2y7E", this);} // tgen
ccc::CC8x2y7 ::CC8x2y7(){ note_ctor("_ZN3ccc7CC8x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y7E, buf);
    ::ccc::CC8x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y7E);
    dp->::ccc::CC8x2y7::~CC8x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y7E(Test__ZN3ccc7CC8x2y7E, "_ZN3ccc7CC8x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y7C1Ev();
extern void _ZN3ccc7CC8x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y7E[] = {
  NSPAIR(_ZN3ccc7CC8x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC8x2y73abcEv();
extern void _ZN3ccc7CC8x2y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y73abcEv,_ZTv0_n16_N3ccc7CC8x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y73abcEv,_ZThn4_N3ccc7CC8x2y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y73abcEv,_ZTv0_n16_N3ccc7CC8x2y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y7E[] = {
  {&(_ZTVN3ccc7CC8x2y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y7E[];
static VTBL_ENTRY alt_thunk_names1245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y73abcEv,_ZTv0_n16_N3ccc7CC8x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y73abcEv,_ZThn4_N3ccc7CC8x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y7E = {  "_ZN3ccc7CC8x2y7E", // class name
  bases__ZN3ccc7CC8x2y7E, 2,
  &(vtc__ZN3ccc7CC8x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y7E),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  DD8x2y7  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD8x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x2y73pqrEv
  ~DD8x2y7(); // tgen
  DD8x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y7E) C1{ VBC2{ v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y73abcEv");}
void  ccc::DD8x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y73pqrEv");}
ccc::DD8x2y7 ::~DD8x2y7(){ note_dtor("_ZN3ccc7DD8x2y7E", this);} // tgen
ccc::DD8x2y7 ::DD8x2y7(){ note_ctor("_ZN3ccc7DD8x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y7E, buf);
    ::ccc::DD8x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y7E);
    dp->::ccc::DD8x2y7::~DD8x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y7E(Test__ZN3ccc7DD8x2y7E, "_ZN3ccc7DD8x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y7C1Ev();
extern void _ZN3ccc7DD8x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y7E[] = {
  NSPAIR(_ZN3ccc7DD8x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x2y73abcEv();
extern void _ZN3ccc7DD8x2y73pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y73abcEv,_ZTv0_n16_N3ccc7DD8x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y73abcEv,_ZThn4_N3ccc7DD8x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y73pqrEv,_ZTv0_n20_N3ccc7DD8x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y73pqrEv,_ZThn4_N3ccc7DD8x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y73abcEv,_ZTv0_n16_N3ccc7DD8x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y73pqrEv,_ZTv0_n20_N3ccc7DD8x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y7E[] = {
  {&(_ZTVN3ccc7DD8x2y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y7E[];
static VTBL_ENTRY alt_thunk_names1246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y73pqrEv,_ZTv0_n20_N3ccc7DD8x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y73pqrEv,_ZThn4_N3ccc7DD8x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y73abcEv,_ZTv0_n16_N3ccc7DD8x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y73abcEv,_ZThn4_N3ccc7DD8x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y7E = {  "_ZN3ccc7DD8x2y7E", // class name
  bases__ZN3ccc7DD8x2y7E, 2,
  &(vtc__ZN3ccc7DD8x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y7E),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  CC8x2y8  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x2y83abcEv
  ~CC8x2y8(); // tgen
  CC8x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y8E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y83efgEv");}
void  ccc::CC8x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x2y83abcEv");}
ccc::CC8x2y8 ::~CC8x2y8(){ note_dtor("_ZN3ccc7CC8x2y8E", this);} // tgen
ccc::CC8x2y8 ::CC8x2y8(){ note_ctor("_ZN3ccc7CC8x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y8E, buf);
    ::ccc::CC8x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y8E);
    dp->::ccc::CC8x2y8::~CC8x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y8E(Test__ZN3ccc7CC8x2y8E, "_ZN3ccc7CC8x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y8C1Ev();
extern void _ZN3ccc7CC8x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y8E[] = {
  NSPAIR(_ZN3ccc7CC8x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y8E[];
extern void _ZN3ccc7CC8x2y83efgEv();
extern void _ZN3ccc7CC8x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y83efgEv,_ZTv0_n12_N3ccc7CC8x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y83efgEv,_ZThn4_N3ccc7CC8x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x2y83abcEv,_ZTv0_n16_N3ccc7CC8x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y83abcEv,_ZThn4_N3ccc7CC8x2y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y83efgEv,_ZTv0_n12_N3ccc7CC8x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x2y83abcEv,_ZTv0_n16_N3ccc7CC8x2y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y8E[] = {
  {&(_ZTVN3ccc7CC8x2y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y8E[];
static VTBL_ENTRY alt_thunk_names1247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x2y83abcEv,_ZTv0_n16_N3ccc7CC8x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y83abcEv,_ZThn4_N3ccc7CC8x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y83efgEv,_ZTv0_n12_N3ccc7CC8x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y83efgEv,_ZThn4_N3ccc7CC8x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y8E = {  "_ZN3ccc7CC8x2y8E", // class name
  bases__ZN3ccc7CC8x2y8E, 2,
  &(vtc__ZN3ccc7CC8x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y8E),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  DD8x2y8  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD8x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x2y83abcEv
  ~DD8x2y8(); // tgen
  DD8x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y8E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y83efgEv");}
void  ccc::DD8x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x2y83abcEv");}
ccc::DD8x2y8 ::~DD8x2y8(){ note_dtor("_ZN3ccc7DD8x2y8E", this);} // tgen
ccc::DD8x2y8 ::DD8x2y8(){ note_ctor("_ZN3ccc7DD8x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y8E, buf);
    ::ccc::DD8x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y8E);
    dp->::ccc::DD8x2y8::~DD8x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y8E(Test__ZN3ccc7DD8x2y8E, "_ZN3ccc7DD8x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y8C1Ev();
extern void _ZN3ccc7DD8x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y8E[] = {
  NSPAIR(_ZN3ccc7DD8x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y8E[];
extern void _ZN3ccc7DD8x2y83efgEv();
extern void _ZN3ccc7DD8x2y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y83efgEv,_ZTv0_n12_N3ccc7DD8x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y83efgEv,_ZThn4_N3ccc7DD8x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x2y83abcEv,_ZTv0_n16_N3ccc7DD8x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y83abcEv,_ZThn4_N3ccc7DD8x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y83efgEv,_ZTv0_n12_N3ccc7DD8x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x2y83abcEv,_ZTv0_n16_N3ccc7DD8x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y8E[] = {
  {&(_ZTVN3ccc7DD8x2y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x2y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x2y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y8E[];
static VTBL_ENTRY alt_thunk_names1248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x2y83abcEv,_ZTv0_n16_N3ccc7DD8x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y83abcEv,_ZThn4_N3ccc7DD8x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y83efgEv,_ZTv0_n12_N3ccc7DD8x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y83efgEv,_ZThn4_N3ccc7DD8x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y8E = {  "_ZN3ccc7DD8x2y8E", // class name
  bases__ZN3ccc7DD8x2y8E, 2,
  &(vtc__ZN3ccc7DD8x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y8E),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  CC8x2y9  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC8x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x2y93pqrEv
  ~CC8x2y9(); // tgen
  CC8x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x2y9E) C1{ VBC2{ v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x2y93efgEv");}
void  ccc::CC8x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x2y93pqrEv");}
ccc::CC8x2y9 ::~CC8x2y9(){ note_dtor("_ZN3ccc7CC8x2y9E", this);} // tgen
ccc::CC8x2y9 ::CC8x2y9(){ note_ctor("_ZN3ccc7CC8x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x2y9E, buf);
    ::ccc::CC8x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x2y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC8x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x2y9E);
    dp->::ccc::CC8x2y9::~CC8x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x2y9E(Test__ZN3ccc7CC8x2y9E, "_ZN3ccc7CC8x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x2y9C1Ev();
extern void _ZN3ccc7CC8x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x2y9E[] = {
  NSPAIR(_ZN3ccc7CC8x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC8x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x2y9E[];
extern void _ZN3ccc7CC8x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC8x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x2y93efgEv,_ZTv0_n12_N3ccc7CC8x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x2y93efgEv,_ZThn4_N3ccc7CC8x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x2y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x2y93efgEv,_ZTv0_n12_N3ccc7CC8x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x2y9E[] = {
  {&(_ZTVN3ccc7CC8x2y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x2y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x2y9E[];
static VTBL_ENTRY alt_thunk_names1249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x2y93efgEv,_ZTv0_n12_N3ccc7CC8x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x2y93efgEv,_ZThn4_N3ccc7CC8x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x2y9E = {  "_ZN3ccc7CC8x2y9E", // class name
  bases__ZN3ccc7CC8x2y9E, 2,
  &(vtc__ZN3ccc7CC8x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x2y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x2y9E),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  DD8x2y9  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD8x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x2y93pqrEv
  ~DD8x2y9(); // tgen
  DD8x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x2y9E) C1{ VBC2{ v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x2y93efgEv");}
void  ccc::DD8x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x2y93pqrEv");}
ccc::DD8x2y9 ::~DD8x2y9(){ note_dtor("_ZN3ccc7DD8x2y9E", this);} // tgen
ccc::DD8x2y9 ::DD8x2y9(){ note_ctor("_ZN3ccc7DD8x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x2y9E, buf);
    ::ccc::DD8x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x2y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD8x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x2y9E);
    dp->::ccc::DD8x2y9::~DD8x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x2y9E(Test__ZN3ccc7DD8x2y9E, "_ZN3ccc7DD8x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x2y9C1Ev();
extern void _ZN3ccc7DD8x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x2y9E[] = {
  NSPAIR(_ZN3ccc7DD8x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD8x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y9E[];
extern void _ZN3ccc7DD8x2y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x2y93efgEv,_ZTv0_n12_N3ccc7DD8x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y93efgEv,_ZThn4_N3ccc7DD8x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x2y93pqrEv,_ZTv0_n20_N3ccc7DD8x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x2y93pqrEv,_ZThn4_N3ccc7DD8x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x2y93efgEv,_ZTv0_n12_N3ccc7DD8x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x2y93pqrEv,_ZTv0_n20_N3ccc7DD8x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x2y9E[] = {
  {&(_ZTVN3ccc7DD8x2y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x2y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x2y9E[];
static VTBL_ENTRY alt_thunk_names1250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x2y93pqrEv,_ZTv0_n20_N3ccc7DD8x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y93pqrEv,_ZThn4_N3ccc7DD8x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x2y93efgEv,_ZTv0_n12_N3ccc7DD8x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x2y93efgEv,_ZThn4_N3ccc7DD8x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x2y9E = {  "_ZN3ccc7DD8x2y9E", // class name
  bases__ZN3ccc7DD8x2y9E, 2,
  &(vtc__ZN3ccc7DD8x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x2y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x2y9E),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  CC8x2y10  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC8x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x2y103abcEv
  ~CC8x2y10(); // tgen
  CC8x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y10E) C1{ VBC2{ v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x2y103pqrEv");}
void  ccc::CC8x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x2y103abcEv");}
ccc::CC8x2y10 ::~CC8x2y10(){ note_dtor("_ZN3ccc8CC8x2y10E", this);} // tgen
ccc::CC8x2y10 ::CC8x2y10(){ note_ctor("_ZN3ccc8CC8x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x2y10E, buf);
    ::ccc::CC8x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x2y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC8x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x2y10E);
    dp->::ccc::CC8x2y10::~CC8x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x2y10E(Test__ZN3ccc8CC8x2y10E, "_ZN3ccc8CC8x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x2y10C1Ev();
extern void _ZN3ccc8CC8x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x2y10E[] = {
  NSPAIR(_ZN3ccc8CC8x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC8x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC8x2y103abcEv();
extern void _ZN3ccc8CC8x2y103pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x2y103abcEv,_ZTv0_n16_N3ccc8CC8x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y103abcEv,_ZThn4_N3ccc8CC8x2y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x2y103abcEv,_ZTv0_n16_N3ccc8CC8x2y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x2y10E[] = {
  {&(_ZTVN3ccc8CC8x2y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x2y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x2y10E[];
static VTBL_ENTRY alt_thunk_names1251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x2y103abcEv,_ZTv0_n16_N3ccc8CC8x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x2y103abcEv,_ZThn4_N3ccc8CC8x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x2y10E = {  "_ZN3ccc8CC8x2y10E", // class name
  bases__ZN3ccc8CC8x2y10E, 2,
  &(vtc__ZN3ccc8CC8x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x2y10E),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  DD8x2y10  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD8x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x2y103abcEv
  ~DD8x2y10(); // tgen
  DD8x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x2y10E) C1{ VBC2{ v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x2y103pqrEv");}
void  ccc::DD8x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x2y103abcEv");}
ccc::DD8x2y10 ::~DD8x2y10(){ note_dtor("_ZN3ccc8DD8x2y10E", this);} // tgen
ccc::DD8x2y10 ::DD8x2y10(){ note_ctor("_ZN3ccc8DD8x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x2y10E, buf);
    ::ccc::DD8x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x2y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD8x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x2y10E);
    dp->::ccc::DD8x2y10::~DD8x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x2y10E(Test__ZN3ccc8DD8x2y10E, "_ZN3ccc8DD8x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x2y10C1Ev();
extern void _ZN3ccc8DD8x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x2y10E[] = {
  NSPAIR(_ZN3ccc8DD8x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD8x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x2y103abcEv();
extern void _ZN3ccc8DD8x2y103pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x2y103abcEv,_ZTv0_n16_N3ccc8DD8x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y103abcEv,_ZThn4_N3ccc8DD8x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x2y103pqrEv,_ZTv0_n20_N3ccc8DD8x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y103pqrEv,_ZThn4_N3ccc8DD8x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x2y103abcEv,_ZTv0_n16_N3ccc8DD8x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x2y103pqrEv,_ZTv0_n20_N3ccc8DD8x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x2y10E[] = {
  {&(_ZTVN3ccc8DD8x2y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x2y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x2y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x2y10E[];
static VTBL_ENTRY alt_thunk_names1252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x2y103pqrEv,_ZTv0_n20_N3ccc8DD8x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y103pqrEv,_ZThn4_N3ccc8DD8x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x2y103abcEv,_ZTv0_n16_N3ccc8DD8x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y103abcEv,_ZThn4_N3ccc8DD8x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x2y10E = {  "_ZN3ccc8DD8x2y10E", // class name
  bases__ZN3ccc8DD8x2y10E, 2,
  &(vtc__ZN3ccc8DD8x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x2y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x2y10E),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  CC8x2y11  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC8x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x2y113efgEv
  ~CC8x2y11(); // tgen
  CC8x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y11E) C1{ VBC2{ v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x2y113pqrEv");}
void  ccc::CC8x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x2y113efgEv");}
ccc::CC8x2y11 ::~CC8x2y11(){ note_dtor("_ZN3ccc8CC8x2y11E", this);} // tgen
ccc::CC8x2y11 ::CC8x2y11(){ note_ctor("_ZN3ccc8CC8x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x2y11E, buf);
    ::ccc::CC8x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x2y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC8x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x2y11E);
    dp->::ccc::CC8x2y11::~CC8x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x2y11E(Test__ZN3ccc8CC8x2y11E, "_ZN3ccc8CC8x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x2y11C1Ev();
extern void _ZN3ccc8CC8x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x2y11E[] = {
  NSPAIR(_ZN3ccc8CC8x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC8x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x2y11E[];
extern void _ZN3ccc8CC8x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC8x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x2y113efgEv,_ZTv0_n12_N3ccc8CC8x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y113efgEv,_ZThn4_N3ccc8CC8x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x2y113efgEv,_ZTv0_n12_N3ccc8CC8x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x2y11E[] = {
  {&(_ZTVN3ccc8CC8x2y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x2y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x2y11E[];
static VTBL_ENTRY alt_thunk_names1253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x2y113efgEv,_ZTv0_n12_N3ccc8CC8x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x2y113efgEv,_ZThn4_N3ccc8CC8x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x2y11E = {  "_ZN3ccc8CC8x2y11E", // class name
  bases__ZN3ccc8CC8x2y11E, 2,
  &(vtc__ZN3ccc8CC8x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x2y11E),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  DD8x2y11  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD8x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x2y113efgEv
  ~DD8x2y11(); // tgen
  DD8x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x2y11E) C1{ VBC2{ v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x2y113pqrEv");}
void  ccc::DD8x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x2y113efgEv");}
ccc::DD8x2y11 ::~DD8x2y11(){ note_dtor("_ZN3ccc8DD8x2y11E", this);} // tgen
ccc::DD8x2y11 ::DD8x2y11(){ note_ctor("_ZN3ccc8DD8x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x2y11E, buf);
    ::ccc::DD8x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x2y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD8x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x2y11E);
    dp->::ccc::DD8x2y11::~DD8x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x2y11E(Test__ZN3ccc8DD8x2y11E, "_ZN3ccc8DD8x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x2y11C1Ev();
extern void _ZN3ccc8DD8x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x2y11E[] = {
  NSPAIR(_ZN3ccc8DD8x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD8x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y11E[];
extern void _ZN3ccc8DD8x2y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x2y113efgEv,_ZTv0_n12_N3ccc8DD8x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y113efgEv,_ZThn4_N3ccc8DD8x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x2y113pqrEv,_ZTv0_n20_N3ccc8DD8x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y113pqrEv,_ZThn4_N3ccc8DD8x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x2y113efgEv,_ZTv0_n12_N3ccc8DD8x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x2y113pqrEv,_ZTv0_n20_N3ccc8DD8x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x2y11E[] = {
  {&(_ZTVN3ccc8DD8x2y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x2y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x2y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x2y11E[];
static VTBL_ENTRY alt_thunk_names1254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x2y113pqrEv,_ZTv0_n20_N3ccc8DD8x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y113pqrEv,_ZThn4_N3ccc8DD8x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x2y113efgEv,_ZTv0_n12_N3ccc8DD8x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y113efgEv,_ZThn4_N3ccc8DD8x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x2y11E = {  "_ZN3ccc8DD8x2y11E", // class name
  bases__ZN3ccc8DD8x2y11E, 2,
  &(vtc__ZN3ccc8DD8x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x2y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x2y11E),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  CC8x2y12  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC8x2y123abcEv
  ~CC8x2y12(); // tgen
  CC8x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y12E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC8x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x2y123abcEv");}
ccc::CC8x2y12 ::~CC8x2y12(){ note_dtor("_ZN3ccc8CC8x2y12E", this);} // tgen
ccc::CC8x2y12 ::CC8x2y12(){ note_ctor("_ZN3ccc8CC8x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x2y12E, buf);
    ::ccc::CC8x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x2y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC8x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x2y12E);
    dp->::ccc::CC8x2y12::~CC8x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x2y12E(Test__ZN3ccc8CC8x2y12E, "_ZN3ccc8CC8x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x2y12C1Ev();
extern void _ZN3ccc8CC8x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x2y12E[] = {
  NSPAIR(_ZN3ccc8CC8x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC8x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC8x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x2y123abcEv,_ZTv0_n16_N3ccc8CC8x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y123abcEv,_ZThn4_N3ccc8CC8x2y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x2y123abcEv,_ZTv0_n16_N3ccc8CC8x2y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x2y12E[] = {
  {&(_ZTVN3ccc8CC8x2y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x2y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x2y12E[];
static VTBL_ENTRY alt_thunk_names1255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x2y123abcEv,_ZTv0_n16_N3ccc8CC8x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x2y123abcEv,_ZThn4_N3ccc8CC8x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x2y12E = {  "_ZN3ccc8CC8x2y12E", // class name
  bases__ZN3ccc8CC8x2y12E, 2,
  &(vtc__ZN3ccc8CC8x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x2y12E),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  DD8x2y12  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD8x2y123abcEv
  ~DD8x2y12(); // tgen
  DD8x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x2y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD8x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x2y123abcEv");}
ccc::DD8x2y12 ::~DD8x2y12(){ note_dtor("_ZN3ccc8DD8x2y12E", this);} // tgen
ccc::DD8x2y12 ::DD8x2y12(){ note_ctor("_ZN3ccc8DD8x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x2y12E, buf);
    ::ccc::DD8x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x2y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD8x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x2y12E);
    dp->::ccc::DD8x2y12::~DD8x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x2y12E(Test__ZN3ccc8DD8x2y12E, "_ZN3ccc8DD8x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x2y12C1Ev();
extern void _ZN3ccc8DD8x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x2y12E[] = {
  NSPAIR(_ZN3ccc8DD8x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD8x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x2y123abcEv,_ZTv0_n16_N3ccc8DD8x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y123abcEv,_ZThn4_N3ccc8DD8x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x2y123abcEv,_ZTv0_n16_N3ccc8DD8x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x2y12E[] = {
  {&(_ZTVN3ccc8DD8x2y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x2y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x2y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x2y12E[];
static VTBL_ENTRY alt_thunk_names1256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x2y123abcEv,_ZTv0_n16_N3ccc8DD8x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y123abcEv,_ZThn4_N3ccc8DD8x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x2y12E = {  "_ZN3ccc8DD8x2y12E", // class name
  bases__ZN3ccc8DD8x2y12E, 2,
  &(vtc__ZN3ccc8DD8x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x2y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x2y12E),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  CC8x2y13  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC8x2y133efgEv
  ~CC8x2y13(); // tgen
  CC8x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x2y133efgEv");}
ccc::CC8x2y13 ::~CC8x2y13(){ note_dtor("_ZN3ccc8CC8x2y13E", this);} // tgen
ccc::CC8x2y13 ::CC8x2y13(){ note_ctor("_ZN3ccc8CC8x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x2y13E, buf);
    ::ccc::CC8x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x2y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC8x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x2y13E);
    dp->::ccc::CC8x2y13::~CC8x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x2y13E(Test__ZN3ccc8CC8x2y13E, "_ZN3ccc8CC8x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x2y13C1Ev();
extern void _ZN3ccc8CC8x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x2y13E[] = {
  NSPAIR(_ZN3ccc8CC8x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC8x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x2y13E[];
extern void _ZN3ccc8CC8x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x2y133efgEv,_ZTv0_n12_N3ccc8CC8x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x2y133efgEv,_ZThn4_N3ccc8CC8x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x2y133efgEv,_ZTv0_n12_N3ccc8CC8x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x2y13E[] = {
  {&(_ZTVN3ccc8CC8x2y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x2y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x2y13E[];
static VTBL_ENTRY alt_thunk_names1257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x2y133efgEv,_ZTv0_n12_N3ccc8CC8x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x2y133efgEv,_ZThn4_N3ccc8CC8x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x2y13E = {  "_ZN3ccc8CC8x2y13E", // class name
  bases__ZN3ccc8CC8x2y13E, 2,
  &(vtc__ZN3ccc8CC8x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x2y13E),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  DD8x2y13  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD8x2y133efgEv
  ~DD8x2y13(); // tgen
  DD8x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x2y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x2y133efgEv");}
ccc::DD8x2y13 ::~DD8x2y13(){ note_dtor("_ZN3ccc8DD8x2y13E", this);} // tgen
ccc::DD8x2y13 ::DD8x2y13(){ note_ctor("_ZN3ccc8DD8x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x2y13E, buf);
    ::ccc::DD8x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x2y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD8x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x2y13E);
    dp->::ccc::DD8x2y13::~DD8x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x2y13E(Test__ZN3ccc8DD8x2y13E, "_ZN3ccc8DD8x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x2y13C1Ev();
extern void _ZN3ccc8DD8x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x2y13E[] = {
  NSPAIR(_ZN3ccc8DD8x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD8x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y13E[];
extern void _ZN3ccc8DD8x2y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x2y133efgEv,_ZTv0_n12_N3ccc8DD8x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y133efgEv,_ZThn4_N3ccc8DD8x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x2y133efgEv,_ZTv0_n12_N3ccc8DD8x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x2y13E[] = {
  {&(_ZTVN3ccc8DD8x2y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x2y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x2y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x2y13E[];
static VTBL_ENTRY alt_thunk_names1258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x2y133efgEv,_ZTv0_n12_N3ccc8DD8x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y133efgEv,_ZThn4_N3ccc8DD8x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x2y13E = {  "_ZN3ccc8DD8x2y13E", // class name
  bases__ZN3ccc8DD8x2y13E, 2,
  &(vtc__ZN3ccc8DD8x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x2y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x2y13E),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  CC8x2y14  : virtual ::ccc::AA8 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC8x2y143pqrEv
  ~CC8x2y14(); // tgen
  CC8x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC8x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x2y143pqrEv");}
ccc::CC8x2y14 ::~CC8x2y14(){ note_dtor("_ZN3ccc8CC8x2y14E", this);} // tgen
ccc::CC8x2y14 ::CC8x2y14(){ note_ctor("_ZN3ccc8CC8x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x2y14E, buf);
    ::ccc::CC8x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x2y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC8x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x2y14E);
    dp->::ccc::CC8x2y14::~CC8x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x2y14E(Test__ZN3ccc8CC8x2y14E, "_ZN3ccc8CC8x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x2y14C1Ev();
extern void _ZN3ccc8CC8x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x2y14E[] = {
  NSPAIR(_ZN3ccc8CC8x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC8x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC8x2y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x2y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x2y14E[] = {
  {&(_ZTVN3ccc8CC8x2y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x2y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x2y14E[];
Class_Descriptor cd__ZN3ccc8CC8x2y14E = {  "_ZN3ccc8CC8x2y14E", // class name
  bases__ZN3ccc8CC8x2y14E, 2,
  &(vtc__ZN3ccc8CC8x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x2y14E),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  DD8x2y14  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD8x2y143pqrEv
  ~DD8x2y14(); // tgen
  DD8x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x2y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD8x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x2y143pqrEv");}
ccc::DD8x2y14 ::~DD8x2y14(){ note_dtor("_ZN3ccc8DD8x2y14E", this);} // tgen
ccc::DD8x2y14 ::DD8x2y14(){ note_ctor("_ZN3ccc8DD8x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x2y14E, buf);
    ::ccc::DD8x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x2y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD8x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x2y14E);
    dp->::ccc::DD8x2y14::~DD8x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x2y14E(Test__ZN3ccc8DD8x2y14E, "_ZN3ccc8DD8x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x2y14C1Ev();
extern void _ZN3ccc8DD8x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x2y14E[] = {
  NSPAIR(_ZN3ccc8DD8x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD8x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x2y143pqrEv,_ZTv0_n20_N3ccc8DD8x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x2y143pqrEv,_ZThn4_N3ccc8DD8x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x2y143pqrEv,_ZTv0_n20_N3ccc8DD8x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x2y14E[] = {
  {&(_ZTVN3ccc8DD8x2y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x2y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x2y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x2y14E[];
static VTBL_ENTRY alt_thunk_names1259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x2y143pqrEv,_ZTv0_n20_N3ccc8DD8x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x2y143pqrEv,_ZThn4_N3ccc8DD8x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x2y14E = {  "_ZN3ccc8DD8x2y14E", // class name
  bases__ZN3ccc8DD8x2y14E, 2,
  &(vtc__ZN3ccc8DD8x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x2y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x2y14E),3, //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  CC8x2y15  : virtual ::ccc::AA8 , ::ccc::BB2 {
  ~CC8x2y15(); // tgen
  CC8x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x2y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC8x2y15 ::~CC8x2y15(){ note_dtor("_ZN3ccc8CC8x2y15E", this);} // tgen
ccc::CC8x2y15 ::CC8x2y15(){ note_ctor("_ZN3ccc8CC8x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x2y15E, buf);
    ::ccc::CC8x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x2y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC8x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x2y15E);
    dp->::ccc::CC8x2y15::~CC8x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x2y15E(Test__ZN3ccc8CC8x2y15E, "_ZN3ccc8CC8x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x2y15C1Ev();
extern void _ZN3ccc8CC8x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x2y15E[] = {
  NSPAIR(_ZN3ccc8CC8x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC8x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x2y15E[] = {
  {&(_ZTVN3ccc8CC8x2y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x2y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x2y15E[];
Class_Descriptor cd__ZN3ccc8CC8x2y15E = {  "_ZN3ccc8CC8x2y15E", // class name
  bases__ZN3ccc8CC8x2y15E, 2,
  &(vtc__ZN3ccc8CC8x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x2y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x2y15E),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  DD8x2y15  : virtual ::ccc::AA8 , virtual ::ccc::BB2 {
  ~DD8x2y15(); // tgen
  DD8x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x2y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD8x2y15 ::~DD8x2y15(){ note_dtor("_ZN3ccc8DD8x2y15E", this);} // tgen
ccc::DD8x2y15 ::DD8x2y15(){ note_ctor("_ZN3ccc8DD8x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x2y15E, buf);
    ::ccc::DD8x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x2y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD8x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x2y15E);
    dp->::ccc::DD8x2y15::~DD8x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x2y15E(Test__ZN3ccc8DD8x2y15E, "_ZN3ccc8DD8x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x2y15C1Ev();
extern void _ZN3ccc8DD8x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x2y15E[] = {
  NSPAIR(_ZN3ccc8DD8x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD8x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x2y15E[] = {
  {&(_ZTVN3ccc8DD8x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x2y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x2y15E[];
Class_Descriptor cd__ZN3ccc8DD8x2y15E = {  "_ZN3ccc8DD8x2y15E", // class name
  bases__ZN3ccc8DD8x2y15E, 2,
  &(vtc__ZN3ccc8DD8x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x2y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x2y15E),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  CC8x3y0  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y03pqrEv
  ~CC8x3y0(); // tgen
  CC8x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y0E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y03abcEv");}
void  ccc::CC8x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y03efgEv");}
void  ccc::CC8x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y03pqrEv");}
ccc::CC8x3y0 ::~CC8x3y0(){ note_dtor("_ZN3ccc7CC8x3y0E", this);} // tgen
ccc::CC8x3y0 ::CC8x3y0(){ note_ctor("_ZN3ccc7CC8x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y0E, buf);
    ::ccc::CC8x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y0E);
    dp->::ccc::CC8x3y0::~CC8x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y0E(Test__ZN3ccc7CC8x3y0E, "_ZN3ccc7CC8x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y0C1Ev();
extern void _ZN3ccc7CC8x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y0E[] = {
  NSPAIR(_ZN3ccc7CC8x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y0E[];
extern void _ZN3ccc7CC8x3y03efgEv();
extern void _ZN3ccc7CC8x3y03pqrEv();
extern void _ZN3ccc7CC8x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y03efgEv,_ZTv0_n12_N3ccc7CC8x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y03efgEv,_ZThn4_N3ccc7CC8x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y03abcEv,_ZTv0_n16_N3ccc7CC8x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y03abcEv,_ZThn4_N3ccc7CC8x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y03efgEv,_ZTv0_n12_N3ccc7CC8x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y03abcEv,_ZTv0_n16_N3ccc7CC8x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y0E[] = {
  {&(_ZTVN3ccc7CC8x3y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y0E[];
static VTBL_ENTRY alt_thunk_names1260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y03abcEv,_ZTv0_n16_N3ccc7CC8x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y03abcEv,_ZThn4_N3ccc7CC8x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y03efgEv,_ZTv0_n12_N3ccc7CC8x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y03efgEv,_ZThn4_N3ccc7CC8x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y0E = {  "_ZN3ccc7CC8x3y0E", // class name
  bases__ZN3ccc7CC8x3y0E, 2,
  &(vtc__ZN3ccc7CC8x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y0E),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  DD8x3y0  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD8x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x3y03pqrEv
  ~DD8x3y0(); // tgen
  DD8x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y0E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y03abcEv");}
void  ccc::DD8x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y03efgEv");}
void  ccc::DD8x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y03pqrEv");}
ccc::DD8x3y0 ::~DD8x3y0(){ note_dtor("_ZN3ccc7DD8x3y0E", this);} // tgen
ccc::DD8x3y0 ::DD8x3y0(){ note_ctor("_ZN3ccc7DD8x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y0E, buf);
    ::ccc::DD8x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y0E);
    dp->::ccc::DD8x3y0::~DD8x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y0E(Test__ZN3ccc7DD8x3y0E, "_ZN3ccc7DD8x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y0C1Ev();
extern void _ZN3ccc7DD8x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y0E[] = {
  NSPAIR(_ZN3ccc7DD8x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y0E[];
extern void _ZN3ccc7DD8x3y03efgEv();
extern void _ZN3ccc7DD8x3y03abcEv();
extern void _ZN3ccc7DD8x3y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y03efgEv,_ZTv0_n12_N3ccc7DD8x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y03efgEv,_ZThn4_N3ccc7DD8x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y03pqrEv,_ZTv0_n16_N3ccc7DD8x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y03pqrEv,_ZThn4_N3ccc7DD8x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y03abcEv,_ZTv0_n20_N3ccc7DD8x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y03abcEv,_ZThn4_N3ccc7DD8x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y03efgEv,_ZTv0_n12_N3ccc7DD8x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y03pqrEv,_ZTv0_n16_N3ccc7DD8x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y03abcEv,_ZTv0_n20_N3ccc7DD8x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y0E[] = {
  {&(_ZTVN3ccc7DD8x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y0E[];
static VTBL_ENTRY alt_thunk_names1261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y03abcEv,_ZTv0_n20_N3ccc7DD8x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y03abcEv,_ZThn4_N3ccc7DD8x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y03pqrEv,_ZTv0_n16_N3ccc7DD8x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y03pqrEv,_ZThn4_N3ccc7DD8x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y03efgEv,_ZTv0_n12_N3ccc7DD8x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y03efgEv,_ZThn4_N3ccc7DD8x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y0E = {  "_ZN3ccc7DD8x3y0E", // class name
  bases__ZN3ccc7DD8x3y0E, 2,
  &(vtc__ZN3ccc7DD8x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y0E),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  CC8x3y1  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x3y13efgEv
  ~CC8x3y1(); // tgen
  CC8x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y1E) C1{ VBC2{ v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y13abcEv");}
void  ccc::CC8x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y13pqrEv");}
void  ccc::CC8x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y13efgEv");}
ccc::CC8x3y1 ::~CC8x3y1(){ note_dtor("_ZN3ccc7CC8x3y1E", this);} // tgen
ccc::CC8x3y1 ::CC8x3y1(){ note_ctor("_ZN3ccc7CC8x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y1E, buf);
    ::ccc::CC8x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y1E);
    dp->::ccc::CC8x3y1::~CC8x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y1E(Test__ZN3ccc7CC8x3y1E, "_ZN3ccc7CC8x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y1C1Ev();
extern void _ZN3ccc7CC8x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y1E[] = {
  NSPAIR(_ZN3ccc7CC8x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y1E[];
extern void _ZN3ccc7CC8x3y13efgEv();
extern void _ZN3ccc7CC8x3y13pqrEv();
extern void _ZN3ccc7CC8x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y13efgEv,_ZTv0_n12_N3ccc7CC8x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y13efgEv,_ZThn4_N3ccc7CC8x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y13abcEv,_ZTv0_n16_N3ccc7CC8x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y13abcEv,_ZThn4_N3ccc7CC8x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y13efgEv,_ZTv0_n12_N3ccc7CC8x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y13abcEv,_ZTv0_n16_N3ccc7CC8x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y1E[] = {
  {&(_ZTVN3ccc7CC8x3y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y1E[];
static VTBL_ENTRY alt_thunk_names1262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y13abcEv,_ZTv0_n16_N3ccc7CC8x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y13abcEv,_ZThn4_N3ccc7CC8x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y13efgEv,_ZTv0_n12_N3ccc7CC8x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y13efgEv,_ZThn4_N3ccc7CC8x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y1E = {  "_ZN3ccc7CC8x3y1E", // class name
  bases__ZN3ccc7CC8x3y1E, 2,
  &(vtc__ZN3ccc7CC8x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y1E),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  DD8x3y1  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD8x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x3y13efgEv
  ~DD8x3y1(); // tgen
  DD8x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y1E) C1{ VBC2{ v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y13abcEv");}
void  ccc::DD8x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y13pqrEv");}
void  ccc::DD8x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y13efgEv");}
ccc::DD8x3y1 ::~DD8x3y1(){ note_dtor("_ZN3ccc7DD8x3y1E", this);} // tgen
ccc::DD8x3y1 ::DD8x3y1(){ note_ctor("_ZN3ccc7DD8x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y1E, buf);
    ::ccc::DD8x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y1E);
    dp->::ccc::DD8x3y1::~DD8x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y1E(Test__ZN3ccc7DD8x3y1E, "_ZN3ccc7DD8x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y1C1Ev();
extern void _ZN3ccc7DD8x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y1E[] = {
  NSPAIR(_ZN3ccc7DD8x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y1E[];
extern void _ZN3ccc7DD8x3y13efgEv();
extern void _ZN3ccc7DD8x3y13abcEv();
extern void _ZN3ccc7DD8x3y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y13efgEv,_ZTv0_n12_N3ccc7DD8x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y13efgEv,_ZThn4_N3ccc7DD8x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y13pqrEv,_ZTv0_n16_N3ccc7DD8x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y13pqrEv,_ZThn4_N3ccc7DD8x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y13abcEv,_ZTv0_n20_N3ccc7DD8x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y13abcEv,_ZThn4_N3ccc7DD8x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y13efgEv,_ZTv0_n12_N3ccc7DD8x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y13pqrEv,_ZTv0_n16_N3ccc7DD8x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y13abcEv,_ZTv0_n20_N3ccc7DD8x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y1E[] = {
  {&(_ZTVN3ccc7DD8x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y1E[];
static VTBL_ENTRY alt_thunk_names1263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y13abcEv,_ZTv0_n20_N3ccc7DD8x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y13abcEv,_ZThn4_N3ccc7DD8x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y13pqrEv,_ZTv0_n16_N3ccc7DD8x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y13pqrEv,_ZThn4_N3ccc7DD8x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y13efgEv,_ZTv0_n12_N3ccc7DD8x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y13efgEv,_ZThn4_N3ccc7DD8x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y1E = {  "_ZN3ccc7DD8x3y1E", // class name
  bases__ZN3ccc7DD8x3y1E, 2,
  &(vtc__ZN3ccc7DD8x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y1E),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  CC8x3y2  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y23pqrEv
  ~CC8x3y2(); // tgen
  CC8x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y2E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y23efgEv");}
void  ccc::CC8x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y23abcEv");}
void  ccc::CC8x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y23pqrEv");}
ccc::CC8x3y2 ::~CC8x3y2(){ note_dtor("_ZN3ccc7CC8x3y2E", this);} // tgen
ccc::CC8x3y2 ::CC8x3y2(){ note_ctor("_ZN3ccc7CC8x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y2E, buf);
    ::ccc::CC8x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y2E);
    dp->::ccc::CC8x3y2::~CC8x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y2E(Test__ZN3ccc7CC8x3y2E, "_ZN3ccc7CC8x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y2C1Ev();
extern void _ZN3ccc7CC8x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y2E[] = {
  NSPAIR(_ZN3ccc7CC8x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y2E[];
extern void _ZN3ccc7CC8x3y23efgEv();
extern void _ZN3ccc7CC8x3y23pqrEv();
extern void _ZN3ccc7CC8x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y23efgEv,_ZTv0_n12_N3ccc7CC8x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y23efgEv,_ZThn4_N3ccc7CC8x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y23abcEv,_ZTv0_n16_N3ccc7CC8x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y23abcEv,_ZThn4_N3ccc7CC8x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y23efgEv,_ZTv0_n12_N3ccc7CC8x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y23abcEv,_ZTv0_n16_N3ccc7CC8x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y2E[] = {
  {&(_ZTVN3ccc7CC8x3y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y2E[];
static VTBL_ENTRY alt_thunk_names1264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y23abcEv,_ZTv0_n16_N3ccc7CC8x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y23abcEv,_ZThn4_N3ccc7CC8x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y23efgEv,_ZTv0_n12_N3ccc7CC8x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y23efgEv,_ZThn4_N3ccc7CC8x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y2E = {  "_ZN3ccc7CC8x3y2E", // class name
  bases__ZN3ccc7CC8x3y2E, 2,
  &(vtc__ZN3ccc7CC8x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y2E),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  DD8x3y2  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD8x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x3y23pqrEv
  ~DD8x3y2(); // tgen
  DD8x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y2E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y23efgEv");}
void  ccc::DD8x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y23abcEv");}
void  ccc::DD8x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y23pqrEv");}
ccc::DD8x3y2 ::~DD8x3y2(){ note_dtor("_ZN3ccc7DD8x3y2E", this);} // tgen
ccc::DD8x3y2 ::DD8x3y2(){ note_ctor("_ZN3ccc7DD8x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y2E, buf);
    ::ccc::DD8x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y2E);
    dp->::ccc::DD8x3y2::~DD8x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y2E(Test__ZN3ccc7DD8x3y2E, "_ZN3ccc7DD8x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y2C1Ev();
extern void _ZN3ccc7DD8x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y2E[] = {
  NSPAIR(_ZN3ccc7DD8x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y2E[];
extern void _ZN3ccc7DD8x3y23efgEv();
extern void _ZN3ccc7DD8x3y23abcEv();
extern void _ZN3ccc7DD8x3y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y23efgEv,_ZTv0_n12_N3ccc7DD8x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y23efgEv,_ZThn4_N3ccc7DD8x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y23pqrEv,_ZTv0_n16_N3ccc7DD8x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y23pqrEv,_ZThn4_N3ccc7DD8x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y23abcEv,_ZTv0_n20_N3ccc7DD8x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y23abcEv,_ZThn4_N3ccc7DD8x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y23efgEv,_ZTv0_n12_N3ccc7DD8x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y23pqrEv,_ZTv0_n16_N3ccc7DD8x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y23abcEv,_ZTv0_n20_N3ccc7DD8x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y2E[] = {
  {&(_ZTVN3ccc7DD8x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y2E[];
static VTBL_ENTRY alt_thunk_names1265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y23abcEv,_ZTv0_n20_N3ccc7DD8x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y23abcEv,_ZThn4_N3ccc7DD8x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y23pqrEv,_ZTv0_n16_N3ccc7DD8x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y23pqrEv,_ZThn4_N3ccc7DD8x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y23efgEv,_ZTv0_n12_N3ccc7DD8x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y23efgEv,_ZThn4_N3ccc7DD8x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y2E = {  "_ZN3ccc7DD8x3y2E", // class name
  bases__ZN3ccc7DD8x3y2E, 2,
  &(vtc__ZN3ccc7DD8x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y2E),3, //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  CC8x3y3  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x3y33abcEv
  ~CC8x3y3(); // tgen
  CC8x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y3E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y33efgEv");}
void  ccc::CC8x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y33pqrEv");}
void  ccc::CC8x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y33abcEv");}
ccc::CC8x3y3 ::~CC8x3y3(){ note_dtor("_ZN3ccc7CC8x3y3E", this);} // tgen
ccc::CC8x3y3 ::CC8x3y3(){ note_ctor("_ZN3ccc7CC8x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y3E, buf);
    ::ccc::CC8x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y3E);
    dp->::ccc::CC8x3y3::~CC8x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y3E(Test__ZN3ccc7CC8x3y3E, "_ZN3ccc7CC8x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y3C1Ev();
extern void _ZN3ccc7CC8x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y3E[] = {
  NSPAIR(_ZN3ccc7CC8x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y3E[];
extern void _ZN3ccc7CC8x3y33efgEv();
extern void _ZN3ccc7CC8x3y33pqrEv();
extern void _ZN3ccc7CC8x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y33efgEv,_ZTv0_n12_N3ccc7CC8x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y33efgEv,_ZThn4_N3ccc7CC8x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y33abcEv,_ZTv0_n16_N3ccc7CC8x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y33abcEv,_ZThn4_N3ccc7CC8x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y33efgEv,_ZTv0_n12_N3ccc7CC8x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y33abcEv,_ZTv0_n16_N3ccc7CC8x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y3E[] = {
  {&(_ZTVN3ccc7CC8x3y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y3E[];
static VTBL_ENTRY alt_thunk_names1266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y33abcEv,_ZTv0_n16_N3ccc7CC8x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y33abcEv,_ZThn4_N3ccc7CC8x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y33efgEv,_ZTv0_n12_N3ccc7CC8x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y33efgEv,_ZThn4_N3ccc7CC8x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y3E = {  "_ZN3ccc7CC8x3y3E", // class name
  bases__ZN3ccc7CC8x3y3E, 2,
  &(vtc__ZN3ccc7CC8x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y3E),2, //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  DD8x3y3  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD8x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x3y33abcEv
  ~DD8x3y3(); // tgen
  DD8x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y3E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y33efgEv");}
void  ccc::DD8x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y33pqrEv");}
void  ccc::DD8x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y33abcEv");}
ccc::DD8x3y3 ::~DD8x3y3(){ note_dtor("_ZN3ccc7DD8x3y3E", this);} // tgen
ccc::DD8x3y3 ::DD8x3y3(){ note_ctor("_ZN3ccc7DD8x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y3E, buf);
    ::ccc::DD8x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y3E);
    dp->::ccc::DD8x3y3::~DD8x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y3E(Test__ZN3ccc7DD8x3y3E, "_ZN3ccc7DD8x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y3C1Ev();
extern void _ZN3ccc7DD8x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y3E[] = {
  NSPAIR(_ZN3ccc7DD8x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y3E[];
extern void _ZN3ccc7DD8x3y33efgEv();
extern void _ZN3ccc7DD8x3y33abcEv();
extern void _ZN3ccc7DD8x3y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y33efgEv,_ZTv0_n12_N3ccc7DD8x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y33efgEv,_ZThn4_N3ccc7DD8x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y33pqrEv,_ZTv0_n16_N3ccc7DD8x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y33pqrEv,_ZThn4_N3ccc7DD8x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y33abcEv,_ZTv0_n20_N3ccc7DD8x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y33abcEv,_ZThn4_N3ccc7DD8x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y33efgEv,_ZTv0_n12_N3ccc7DD8x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y33pqrEv,_ZTv0_n16_N3ccc7DD8x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y33abcEv,_ZTv0_n20_N3ccc7DD8x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y3E[] = {
  {&(_ZTVN3ccc7DD8x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y3E[];
static VTBL_ENTRY alt_thunk_names1267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y33abcEv,_ZTv0_n20_N3ccc7DD8x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y33abcEv,_ZThn4_N3ccc7DD8x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y33pqrEv,_ZTv0_n16_N3ccc7DD8x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y33pqrEv,_ZThn4_N3ccc7DD8x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y33efgEv,_ZTv0_n12_N3ccc7DD8x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y33efgEv,_ZThn4_N3ccc7DD8x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y3E = {  "_ZN3ccc7DD8x3y3E", // class name
  bases__ZN3ccc7DD8x3y3E, 2,
  &(vtc__ZN3ccc7DD8x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y3E),3, //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  CC8x3y4  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC8x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x3y43efgEv
  ~CC8x3y4(); // tgen
  CC8x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y4E) C1{ VBC2{ v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y43pqrEv");}
void  ccc::CC8x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y43abcEv");}
void  ccc::CC8x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y43efgEv");}
ccc::CC8x3y4 ::~CC8x3y4(){ note_dtor("_ZN3ccc7CC8x3y4E", this);} // tgen
ccc::CC8x3y4 ::CC8x3y4(){ note_ctor("_ZN3ccc7CC8x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y4E, buf);
    ::ccc::CC8x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y4E);
    dp->::ccc::CC8x3y4::~CC8x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y4E(Test__ZN3ccc7CC8x3y4E, "_ZN3ccc7CC8x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y4C1Ev();
extern void _ZN3ccc7CC8x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y4E[] = {
  NSPAIR(_ZN3ccc7CC8x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y4E[];
extern void _ZN3ccc7CC8x3y43efgEv();
extern void _ZN3ccc7CC8x3y43pqrEv();
extern void _ZN3ccc7CC8x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y43efgEv,_ZTv0_n12_N3ccc7CC8x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y43efgEv,_ZThn4_N3ccc7CC8x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y43abcEv,_ZTv0_n16_N3ccc7CC8x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y43abcEv,_ZThn4_N3ccc7CC8x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y43efgEv,_ZTv0_n12_N3ccc7CC8x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y43abcEv,_ZTv0_n16_N3ccc7CC8x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y4E[] = {
  {&(_ZTVN3ccc7CC8x3y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y4E[];
static VTBL_ENTRY alt_thunk_names1268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y43abcEv,_ZTv0_n16_N3ccc7CC8x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y43abcEv,_ZThn4_N3ccc7CC8x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y43efgEv,_ZTv0_n12_N3ccc7CC8x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y43efgEv,_ZThn4_N3ccc7CC8x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y4E = {  "_ZN3ccc7CC8x3y4E", // class name
  bases__ZN3ccc7CC8x3y4E, 2,
  &(vtc__ZN3ccc7CC8x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y4E),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  DD8x3y4  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD8x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x3y43efgEv
  ~DD8x3y4(); // tgen
  DD8x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y4E) C1{ VBC2{ v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y43pqrEv");}
void  ccc::DD8x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y43abcEv");}
void  ccc::DD8x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y43efgEv");}
ccc::DD8x3y4 ::~DD8x3y4(){ note_dtor("_ZN3ccc7DD8x3y4E", this);} // tgen
ccc::DD8x3y4 ::DD8x3y4(){ note_ctor("_ZN3ccc7DD8x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y4E, buf);
    ::ccc::DD8x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y4E);
    dp->::ccc::DD8x3y4::~DD8x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y4E(Test__ZN3ccc7DD8x3y4E, "_ZN3ccc7DD8x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y4C1Ev();
extern void _ZN3ccc7DD8x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y4E[] = {
  NSPAIR(_ZN3ccc7DD8x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y4E[];
extern void _ZN3ccc7DD8x3y43efgEv();
extern void _ZN3ccc7DD8x3y43abcEv();
extern void _ZN3ccc7DD8x3y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y43efgEv,_ZTv0_n12_N3ccc7DD8x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y43efgEv,_ZThn4_N3ccc7DD8x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y43pqrEv,_ZTv0_n16_N3ccc7DD8x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y43pqrEv,_ZThn4_N3ccc7DD8x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y43abcEv,_ZTv0_n20_N3ccc7DD8x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y43abcEv,_ZThn4_N3ccc7DD8x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y43efgEv,_ZTv0_n12_N3ccc7DD8x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y43pqrEv,_ZTv0_n16_N3ccc7DD8x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y43abcEv,_ZTv0_n20_N3ccc7DD8x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y4E[] = {
  {&(_ZTVN3ccc7DD8x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y4E[];
static VTBL_ENTRY alt_thunk_names1269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y43abcEv,_ZTv0_n20_N3ccc7DD8x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y43abcEv,_ZThn4_N3ccc7DD8x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y43pqrEv,_ZTv0_n16_N3ccc7DD8x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y43pqrEv,_ZThn4_N3ccc7DD8x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y43efgEv,_ZTv0_n12_N3ccc7DD8x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y43efgEv,_ZThn4_N3ccc7DD8x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y4E = {  "_ZN3ccc7DD8x3y4E", // class name
  bases__ZN3ccc7DD8x3y4E, 2,
  &(vtc__ZN3ccc7DD8x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y4E),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  CC8x3y5  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC8x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x3y53abcEv
  ~CC8x3y5(); // tgen
  CC8x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y5E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y53pqrEv");}
void  ccc::CC8x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y53efgEv");}
void  ccc::CC8x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y53abcEv");}
ccc::CC8x3y5 ::~CC8x3y5(){ note_dtor("_ZN3ccc7CC8x3y5E", this);} // tgen
ccc::CC8x3y5 ::CC8x3y5(){ note_ctor("_ZN3ccc7CC8x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y5E, buf);
    ::ccc::CC8x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y5E);
    dp->::ccc::CC8x3y5::~CC8x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y5E(Test__ZN3ccc7CC8x3y5E, "_ZN3ccc7CC8x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y5C1Ev();
extern void _ZN3ccc7CC8x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y5E[] = {
  NSPAIR(_ZN3ccc7CC8x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y5E[];
extern void _ZN3ccc7CC8x3y53efgEv();
extern void _ZN3ccc7CC8x3y53pqrEv();
extern void _ZN3ccc7CC8x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y53efgEv,_ZTv0_n12_N3ccc7CC8x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y53efgEv,_ZThn4_N3ccc7CC8x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y53abcEv,_ZTv0_n16_N3ccc7CC8x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y53abcEv,_ZThn4_N3ccc7CC8x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y53efgEv,_ZTv0_n12_N3ccc7CC8x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y53abcEv,_ZTv0_n16_N3ccc7CC8x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y5E[] = {
  {&(_ZTVN3ccc7CC8x3y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y5E[];
static VTBL_ENTRY alt_thunk_names1270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y53abcEv,_ZTv0_n16_N3ccc7CC8x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y53abcEv,_ZThn4_N3ccc7CC8x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y53efgEv,_ZTv0_n12_N3ccc7CC8x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y53efgEv,_ZThn4_N3ccc7CC8x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y5E = {  "_ZN3ccc7CC8x3y5E", // class name
  bases__ZN3ccc7CC8x3y5E, 2,
  &(vtc__ZN3ccc7CC8x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y5E),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  DD8x3y5  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD8x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x3y53abcEv
  ~DD8x3y5(); // tgen
  DD8x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y5E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y53pqrEv");}
void  ccc::DD8x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y53efgEv");}
void  ccc::DD8x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y53abcEv");}
ccc::DD8x3y5 ::~DD8x3y5(){ note_dtor("_ZN3ccc7DD8x3y5E", this);} // tgen
ccc::DD8x3y5 ::DD8x3y5(){ note_ctor("_ZN3ccc7DD8x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y5E, buf);
    ::ccc::DD8x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y5E);
    dp->::ccc::DD8x3y5::~DD8x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y5E(Test__ZN3ccc7DD8x3y5E, "_ZN3ccc7DD8x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y5C1Ev();
extern void _ZN3ccc7DD8x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y5E[] = {
  NSPAIR(_ZN3ccc7DD8x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y5E[];
extern void _ZN3ccc7DD8x3y53efgEv();
extern void _ZN3ccc7DD8x3y53abcEv();
extern void _ZN3ccc7DD8x3y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y53efgEv,_ZTv0_n12_N3ccc7DD8x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y53efgEv,_ZThn4_N3ccc7DD8x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y53pqrEv,_ZTv0_n16_N3ccc7DD8x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y53pqrEv,_ZThn4_N3ccc7DD8x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y53abcEv,_ZTv0_n20_N3ccc7DD8x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y53abcEv,_ZThn4_N3ccc7DD8x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y53efgEv,_ZTv0_n12_N3ccc7DD8x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y53pqrEv,_ZTv0_n16_N3ccc7DD8x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y53abcEv,_ZTv0_n20_N3ccc7DD8x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y5E[] = {
  {&(_ZTVN3ccc7DD8x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y5E[];
static VTBL_ENTRY alt_thunk_names1271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y53abcEv,_ZTv0_n20_N3ccc7DD8x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y53abcEv,_ZThn4_N3ccc7DD8x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y53pqrEv,_ZTv0_n16_N3ccc7DD8x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y53pqrEv,_ZThn4_N3ccc7DD8x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y53efgEv,_ZTv0_n12_N3ccc7DD8x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y53efgEv,_ZThn4_N3ccc7DD8x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y5E = {  "_ZN3ccc7DD8x3y5E", // class name
  bases__ZN3ccc7DD8x3y5E, 2,
  &(vtc__ZN3ccc7DD8x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y5E),3, //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  CC8x3y6  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x3y63efgEv
  ~CC8x3y6(); // tgen
  CC8x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y6E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y63abcEv");}
void  ccc::CC8x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y63efgEv");}
ccc::CC8x3y6 ::~CC8x3y6(){ note_dtor("_ZN3ccc7CC8x3y6E", this);} // tgen
ccc::CC8x3y6 ::CC8x3y6(){ note_ctor("_ZN3ccc7CC8x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y6E, buf);
    ::ccc::CC8x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y6E);
    dp->::ccc::CC8x3y6::~CC8x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y6E(Test__ZN3ccc7CC8x3y6E, "_ZN3ccc7CC8x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y6C1Ev();
extern void _ZN3ccc7CC8x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y6E[] = {
  NSPAIR(_ZN3ccc7CC8x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y6E[];
extern void _ZN3ccc7CC8x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC8x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y63efgEv,_ZTv0_n12_N3ccc7CC8x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y63efgEv,_ZThn4_N3ccc7CC8x3y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y63abcEv,_ZTv0_n16_N3ccc7CC8x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y63abcEv,_ZThn4_N3ccc7CC8x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y63efgEv,_ZTv0_n12_N3ccc7CC8x3y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y63abcEv,_ZTv0_n16_N3ccc7CC8x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y6E[] = {
  {&(_ZTVN3ccc7CC8x3y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y6E[];
static VTBL_ENTRY alt_thunk_names1272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y63abcEv,_ZTv0_n16_N3ccc7CC8x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y63abcEv,_ZThn4_N3ccc7CC8x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y63efgEv,_ZTv0_n12_N3ccc7CC8x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y63efgEv,_ZThn4_N3ccc7CC8x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y6E = {  "_ZN3ccc7CC8x3y6E", // class name
  bases__ZN3ccc7CC8x3y6E, 2,
  &(vtc__ZN3ccc7CC8x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y6E),2, //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  DD8x3y6  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD8x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x3y63efgEv
  ~DD8x3y6(); // tgen
  DD8x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y6E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y63abcEv");}
void  ccc::DD8x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y63efgEv");}
ccc::DD8x3y6 ::~DD8x3y6(){ note_dtor("_ZN3ccc7DD8x3y6E", this);} // tgen
ccc::DD8x3y6 ::DD8x3y6(){ note_ctor("_ZN3ccc7DD8x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y6E, buf);
    ::ccc::DD8x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y6E);
    dp->::ccc::DD8x3y6::~DD8x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y6E(Test__ZN3ccc7DD8x3y6E, "_ZN3ccc7DD8x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y6C1Ev();
extern void _ZN3ccc7DD8x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y6E[] = {
  NSPAIR(_ZN3ccc7DD8x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y6E[];
extern void _ZN3ccc7DD8x3y63efgEv();
extern void _ZN3ccc7DD8x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y63efgEv,_ZTv0_n12_N3ccc7DD8x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y63efgEv,_ZThn4_N3ccc7DD8x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y63abcEv,_ZTv0_n20_N3ccc7DD8x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y63abcEv,_ZThn4_N3ccc7DD8x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y63efgEv,_ZTv0_n12_N3ccc7DD8x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y63abcEv,_ZTv0_n20_N3ccc7DD8x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y6E[] = {
  {&(_ZTVN3ccc7DD8x3y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x3y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x3y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y6E[];
static VTBL_ENTRY alt_thunk_names1273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y63abcEv,_ZTv0_n20_N3ccc7DD8x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y63abcEv,_ZThn4_N3ccc7DD8x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y63efgEv,_ZTv0_n12_N3ccc7DD8x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y63efgEv,_ZThn4_N3ccc7DD8x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y6E = {  "_ZN3ccc7DD8x3y6E", // class name
  bases__ZN3ccc7DD8x3y6E, 2,
  &(vtc__ZN3ccc7DD8x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y6E),3, //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  CC8x3y7  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC8x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y73pqrEv
  ~CC8x3y7(); // tgen
  CC8x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y7E) C1{ VBC2{ v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y73abcEv");}
void  ccc::CC8x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y73pqrEv");}
ccc::CC8x3y7 ::~CC8x3y7(){ note_dtor("_ZN3ccc7CC8x3y7E", this);} // tgen
ccc::CC8x3y7 ::CC8x3y7(){ note_ctor("_ZN3ccc7CC8x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y7E, buf);
    ::ccc::CC8x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y7E);
    dp->::ccc::CC8x3y7::~CC8x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y7E(Test__ZN3ccc7CC8x3y7E, "_ZN3ccc7CC8x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y7C1Ev();
extern void _ZN3ccc7CC8x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y7E[] = {
  NSPAIR(_ZN3ccc7CC8x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC8x3y73pqrEv();
extern void _ZN3ccc7CC8x3y73abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y73abcEv,_ZTv0_n16_N3ccc7CC8x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y73abcEv,_ZThn4_N3ccc7CC8x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y73abcEv,_ZTv0_n16_N3ccc7CC8x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y7E[] = {
  {&(_ZTVN3ccc7CC8x3y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y7E[];
static VTBL_ENTRY alt_thunk_names1274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y73abcEv,_ZTv0_n16_N3ccc7CC8x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y73abcEv,_ZThn4_N3ccc7CC8x3y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y7E = {  "_ZN3ccc7CC8x3y7E", // class name
  bases__ZN3ccc7CC8x3y7E, 2,
  &(vtc__ZN3ccc7CC8x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y7E),2, //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  DD8x3y7  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD8x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x3y73pqrEv
  ~DD8x3y7(); // tgen
  DD8x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y7E) C1{ VBC2{ v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y73abcEv");}
void  ccc::DD8x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y73pqrEv");}
ccc::DD8x3y7 ::~DD8x3y7(){ note_dtor("_ZN3ccc7DD8x3y7E", this);} // tgen
ccc::DD8x3y7 ::DD8x3y7(){ note_ctor("_ZN3ccc7DD8x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y7E, buf);
    ::ccc::DD8x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y7E);
    dp->::ccc::DD8x3y7::~DD8x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y7E(Test__ZN3ccc7DD8x3y7E, "_ZN3ccc7DD8x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y7C1Ev();
extern void _ZN3ccc7DD8x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y7E[] = {
  NSPAIR(_ZN3ccc7DD8x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x3y73abcEv();
extern void _ZN3ccc7DD8x3y73pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y73pqrEv,_ZTv0_n16_N3ccc7DD8x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y73pqrEv,_ZThn4_N3ccc7DD8x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y73abcEv,_ZTv0_n20_N3ccc7DD8x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y73abcEv,_ZThn4_N3ccc7DD8x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y73pqrEv,_ZTv0_n16_N3ccc7DD8x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y73abcEv,_ZTv0_n20_N3ccc7DD8x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y7E[] = {
  {&(_ZTVN3ccc7DD8x3y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y7E[];
static VTBL_ENTRY alt_thunk_names1275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y73abcEv,_ZTv0_n20_N3ccc7DD8x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y73abcEv,_ZThn4_N3ccc7DD8x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y73pqrEv,_ZTv0_n16_N3ccc7DD8x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y73pqrEv,_ZThn4_N3ccc7DD8x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y7E = {  "_ZN3ccc7DD8x3y7E", // class name
  bases__ZN3ccc7DD8x3y7E, 2,
  &(vtc__ZN3ccc7DD8x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y7E),3, //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  CC8x3y8  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x3y83abcEv
  ~CC8x3y8(); // tgen
  CC8x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y8E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y83efgEv");}
void  ccc::CC8x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x3y83abcEv");}
ccc::CC8x3y8 ::~CC8x3y8(){ note_dtor("_ZN3ccc7CC8x3y8E", this);} // tgen
ccc::CC8x3y8 ::CC8x3y8(){ note_ctor("_ZN3ccc7CC8x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y8E, buf);
    ::ccc::CC8x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y8E);
    dp->::ccc::CC8x3y8::~CC8x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y8E(Test__ZN3ccc7CC8x3y8E, "_ZN3ccc7CC8x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y8C1Ev();
extern void _ZN3ccc7CC8x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y8E[] = {
  NSPAIR(_ZN3ccc7CC8x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y8E[];
extern void _ZN3ccc7CC8x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC8x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y83efgEv,_ZTv0_n12_N3ccc7CC8x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y83efgEv,_ZThn4_N3ccc7CC8x3y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x3y83abcEv,_ZTv0_n16_N3ccc7CC8x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y83abcEv,_ZThn4_N3ccc7CC8x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y83efgEv,_ZTv0_n12_N3ccc7CC8x3y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x3y83abcEv,_ZTv0_n16_N3ccc7CC8x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y8E[] = {
  {&(_ZTVN3ccc7CC8x3y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y8E[];
static VTBL_ENTRY alt_thunk_names1276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x3y83abcEv,_ZTv0_n16_N3ccc7CC8x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y83abcEv,_ZThn4_N3ccc7CC8x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y83efgEv,_ZTv0_n12_N3ccc7CC8x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y83efgEv,_ZThn4_N3ccc7CC8x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y8E = {  "_ZN3ccc7CC8x3y8E", // class name
  bases__ZN3ccc7CC8x3y8E, 2,
  &(vtc__ZN3ccc7CC8x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y8E),2, //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  DD8x3y8  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD8x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x3y83abcEv
  ~DD8x3y8(); // tgen
  DD8x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y8E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y83efgEv");}
void  ccc::DD8x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x3y83abcEv");}
ccc::DD8x3y8 ::~DD8x3y8(){ note_dtor("_ZN3ccc7DD8x3y8E", this);} // tgen
ccc::DD8x3y8 ::DD8x3y8(){ note_ctor("_ZN3ccc7DD8x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y8E, buf);
    ::ccc::DD8x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y8E);
    dp->::ccc::DD8x3y8::~DD8x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y8E(Test__ZN3ccc7DD8x3y8E, "_ZN3ccc7DD8x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y8C1Ev();
extern void _ZN3ccc7DD8x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y8E[] = {
  NSPAIR(_ZN3ccc7DD8x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y8E[];
extern void _ZN3ccc7DD8x3y83efgEv();
extern void _ZN3ccc7DD8x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y83efgEv,_ZTv0_n12_N3ccc7DD8x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y83efgEv,_ZThn4_N3ccc7DD8x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x3y83abcEv,_ZTv0_n20_N3ccc7DD8x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y83abcEv,_ZThn4_N3ccc7DD8x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y83efgEv,_ZTv0_n12_N3ccc7DD8x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x3y83abcEv,_ZTv0_n20_N3ccc7DD8x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y8E[] = {
  {&(_ZTVN3ccc7DD8x3y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x3y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x3y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y8E[];
static VTBL_ENTRY alt_thunk_names1277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x3y83abcEv,_ZTv0_n20_N3ccc7DD8x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y83abcEv,_ZThn4_N3ccc7DD8x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y83efgEv,_ZTv0_n12_N3ccc7DD8x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y83efgEv,_ZThn4_N3ccc7DD8x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y8E = {  "_ZN3ccc7DD8x3y8E", // class name
  bases__ZN3ccc7DD8x3y8E, 2,
  &(vtc__ZN3ccc7DD8x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y8E),3, //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  CC8x3y9  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC8x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x3y93pqrEv
  ~CC8x3y9(); // tgen
  CC8x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x3y9E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x3y93efgEv");}
void  ccc::CC8x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x3y93pqrEv");}
ccc::CC8x3y9 ::~CC8x3y9(){ note_dtor("_ZN3ccc7CC8x3y9E", this);} // tgen
ccc::CC8x3y9 ::CC8x3y9(){ note_ctor("_ZN3ccc7CC8x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x3y9E, buf);
    ::ccc::CC8x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x3y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC8x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x3y9E);
    dp->::ccc::CC8x3y9::~CC8x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x3y9E(Test__ZN3ccc7CC8x3y9E, "_ZN3ccc7CC8x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x3y9C1Ev();
extern void _ZN3ccc7CC8x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x3y9E[] = {
  NSPAIR(_ZN3ccc7CC8x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC8x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x3y9E[];
extern void _ZN3ccc7CC8x3y93efgEv();
extern void _ZN3ccc7CC8x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x3y93efgEv,_ZTv0_n12_N3ccc7CC8x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x3y93efgEv,_ZThn4_N3ccc7CC8x3y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x3y93efgEv,_ZTv0_n12_N3ccc7CC8x3y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x3y9E[] = {
  {&(_ZTVN3ccc7CC8x3y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x3y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x3y9E[];
static VTBL_ENTRY alt_thunk_names1278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x3y93efgEv,_ZTv0_n12_N3ccc7CC8x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x3y93efgEv,_ZThn4_N3ccc7CC8x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x3y9E = {  "_ZN3ccc7CC8x3y9E", // class name
  bases__ZN3ccc7CC8x3y9E, 2,
  &(vtc__ZN3ccc7CC8x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x3y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x3y9E),2, //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  DD8x3y9  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD8x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x3y93pqrEv
  ~DD8x3y9(); // tgen
  DD8x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x3y9E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x3y93efgEv");}
void  ccc::DD8x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x3y93pqrEv");}
ccc::DD8x3y9 ::~DD8x3y9(){ note_dtor("_ZN3ccc7DD8x3y9E", this);} // tgen
ccc::DD8x3y9 ::DD8x3y9(){ note_ctor("_ZN3ccc7DD8x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x3y9E, buf);
    ::ccc::DD8x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x3y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD8x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x3y9E);
    dp->::ccc::DD8x3y9::~DD8x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x3y9E(Test__ZN3ccc7DD8x3y9E, "_ZN3ccc7DD8x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x3y9C1Ev();
extern void _ZN3ccc7DD8x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x3y9E[] = {
  NSPAIR(_ZN3ccc7DD8x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD8x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y9E[];
extern void _ZN3ccc7DD8x3y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x3y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x3y93efgEv,_ZTv0_n12_N3ccc7DD8x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y93efgEv,_ZThn4_N3ccc7DD8x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x3y93pqrEv,_ZTv0_n16_N3ccc7DD8x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x3y93pqrEv,_ZThn4_N3ccc7DD8x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x3y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x3y93efgEv,_ZTv0_n12_N3ccc7DD8x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x3y93pqrEv,_ZTv0_n16_N3ccc7DD8x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x3y9E[] = {
  {&(_ZTVN3ccc7DD8x3y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x3y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x3y9E[];
static VTBL_ENTRY alt_thunk_names1279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x3y93pqrEv,_ZTv0_n16_N3ccc7DD8x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y93pqrEv,_ZThn4_N3ccc7DD8x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x3y93efgEv,_ZTv0_n12_N3ccc7DD8x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x3y93efgEv,_ZThn4_N3ccc7DD8x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x3y9E = {  "_ZN3ccc7DD8x3y9E", // class name
  bases__ZN3ccc7DD8x3y9E, 2,
  &(vtc__ZN3ccc7DD8x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x3y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x3y9E),3, //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  CC8x3y10  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC8x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x3y103abcEv
  ~CC8x3y10(); // tgen
  CC8x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y10E) C1{ VBC2{ v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x3y103pqrEv");}
void  ccc::CC8x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x3y103abcEv");}
ccc::CC8x3y10 ::~CC8x3y10(){ note_dtor("_ZN3ccc8CC8x3y10E", this);} // tgen
ccc::CC8x3y10 ::CC8x3y10(){ note_ctor("_ZN3ccc8CC8x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x3y10E, buf);
    ::ccc::CC8x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x3y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC8x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x3y10E);
    dp->::ccc::CC8x3y10::~CC8x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x3y10E(Test__ZN3ccc8CC8x3y10E, "_ZN3ccc8CC8x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x3y10C1Ev();
extern void _ZN3ccc8CC8x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x3y10E[] = {
  NSPAIR(_ZN3ccc8CC8x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC8x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC8x3y103pqrEv();
extern void _ZN3ccc8CC8x3y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x3y103abcEv,_ZTv0_n16_N3ccc8CC8x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y103abcEv,_ZThn4_N3ccc8CC8x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x3y103abcEv,_ZTv0_n16_N3ccc8CC8x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x3y10E[] = {
  {&(_ZTVN3ccc8CC8x3y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x3y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x3y10E[];
static VTBL_ENTRY alt_thunk_names1280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x3y103abcEv,_ZTv0_n16_N3ccc8CC8x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x3y103abcEv,_ZThn4_N3ccc8CC8x3y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x3y10E = {  "_ZN3ccc8CC8x3y10E", // class name
  bases__ZN3ccc8CC8x3y10E, 2,
  &(vtc__ZN3ccc8CC8x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x3y10E),2, //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  DD8x3y10  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD8x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x3y103abcEv
  ~DD8x3y10(); // tgen
  DD8x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x3y10E) C1{ VBC2{ v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x3y103pqrEv");}
void  ccc::DD8x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x3y103abcEv");}
ccc::DD8x3y10 ::~DD8x3y10(){ note_dtor("_ZN3ccc8DD8x3y10E", this);} // tgen
ccc::DD8x3y10 ::DD8x3y10(){ note_ctor("_ZN3ccc8DD8x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x3y10E, buf);
    ::ccc::DD8x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x3y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD8x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x3y10E);
    dp->::ccc::DD8x3y10::~DD8x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x3y10E(Test__ZN3ccc8DD8x3y10E, "_ZN3ccc8DD8x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x3y10C1Ev();
extern void _ZN3ccc8DD8x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x3y10E[] = {
  NSPAIR(_ZN3ccc8DD8x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD8x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x3y103abcEv();
extern void _ZN3ccc8DD8x3y103pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x3y103pqrEv,_ZTv0_n16_N3ccc8DD8x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y103pqrEv,_ZThn4_N3ccc8DD8x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x3y103abcEv,_ZTv0_n20_N3ccc8DD8x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y103abcEv,_ZThn4_N3ccc8DD8x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x3y103pqrEv,_ZTv0_n16_N3ccc8DD8x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x3y103abcEv,_ZTv0_n20_N3ccc8DD8x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x3y10E[] = {
  {&(_ZTVN3ccc8DD8x3y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x3y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x3y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x3y10E[];
static VTBL_ENTRY alt_thunk_names1281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x3y103abcEv,_ZTv0_n20_N3ccc8DD8x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y103abcEv,_ZThn4_N3ccc8DD8x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x3y103pqrEv,_ZTv0_n16_N3ccc8DD8x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y103pqrEv,_ZThn4_N3ccc8DD8x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x3y10E = {  "_ZN3ccc8DD8x3y10E", // class name
  bases__ZN3ccc8DD8x3y10E, 2,
  &(vtc__ZN3ccc8DD8x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x3y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x3y10E),3, //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  CC8x3y11  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC8x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x3y113efgEv
  ~CC8x3y11(); // tgen
  CC8x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y11E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x3y113pqrEv");}
void  ccc::CC8x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x3y113efgEv");}
ccc::CC8x3y11 ::~CC8x3y11(){ note_dtor("_ZN3ccc8CC8x3y11E", this);} // tgen
ccc::CC8x3y11 ::CC8x3y11(){ note_ctor("_ZN3ccc8CC8x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x3y11E, buf);
    ::ccc::CC8x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x3y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC8x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x3y11E);
    dp->::ccc::CC8x3y11::~CC8x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x3y11E(Test__ZN3ccc8CC8x3y11E, "_ZN3ccc8CC8x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x3y11C1Ev();
extern void _ZN3ccc8CC8x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x3y11E[] = {
  NSPAIR(_ZN3ccc8CC8x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC8x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x3y11E[];
extern void _ZN3ccc8CC8x3y113efgEv();
extern void _ZN3ccc8CC8x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x3y113efgEv,_ZTv0_n12_N3ccc8CC8x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y113efgEv,_ZThn4_N3ccc8CC8x3y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x3y113efgEv,_ZTv0_n12_N3ccc8CC8x3y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x3y11E[] = {
  {&(_ZTVN3ccc8CC8x3y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x3y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x3y11E[];
static VTBL_ENTRY alt_thunk_names1282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x3y113efgEv,_ZTv0_n12_N3ccc8CC8x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x3y113efgEv,_ZThn4_N3ccc8CC8x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x3y11E = {  "_ZN3ccc8CC8x3y11E", // class name
  bases__ZN3ccc8CC8x3y11E, 2,
  &(vtc__ZN3ccc8CC8x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x3y11E),2, //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  DD8x3y11  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD8x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x3y113efgEv
  ~DD8x3y11(); // tgen
  DD8x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x3y11E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x3y113pqrEv");}
void  ccc::DD8x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x3y113efgEv");}
ccc::DD8x3y11 ::~DD8x3y11(){ note_dtor("_ZN3ccc8DD8x3y11E", this);} // tgen
ccc::DD8x3y11 ::DD8x3y11(){ note_ctor("_ZN3ccc8DD8x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x3y11E, buf);
    ::ccc::DD8x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x3y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD8x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x3y11E);
    dp->::ccc::DD8x3y11::~DD8x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x3y11E(Test__ZN3ccc8DD8x3y11E, "_ZN3ccc8DD8x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x3y11C1Ev();
extern void _ZN3ccc8DD8x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x3y11E[] = {
  NSPAIR(_ZN3ccc8DD8x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD8x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y11E[];
extern void _ZN3ccc8DD8x3y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x3y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x3y113efgEv,_ZTv0_n12_N3ccc8DD8x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y113efgEv,_ZThn4_N3ccc8DD8x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x3y113pqrEv,_ZTv0_n16_N3ccc8DD8x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y113pqrEv,_ZThn4_N3ccc8DD8x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x3y113efgEv,_ZTv0_n12_N3ccc8DD8x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x3y113pqrEv,_ZTv0_n16_N3ccc8DD8x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x3y11E[] = {
  {&(_ZTVN3ccc8DD8x3y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x3y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x3y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x3y11E[];
static VTBL_ENTRY alt_thunk_names1283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x3y113pqrEv,_ZTv0_n16_N3ccc8DD8x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y113pqrEv,_ZThn4_N3ccc8DD8x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x3y113efgEv,_ZTv0_n12_N3ccc8DD8x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y113efgEv,_ZThn4_N3ccc8DD8x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x3y11E = {  "_ZN3ccc8DD8x3y11E", // class name
  bases__ZN3ccc8DD8x3y11E, 2,
  &(vtc__ZN3ccc8DD8x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x3y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x3y11E),3, //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  CC8x3y12  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC8x3y123abcEv
  ~CC8x3y12(); // tgen
  CC8x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y12E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC8x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x3y123abcEv");}
ccc::CC8x3y12 ::~CC8x3y12(){ note_dtor("_ZN3ccc8CC8x3y12E", this);} // tgen
ccc::CC8x3y12 ::CC8x3y12(){ note_ctor("_ZN3ccc8CC8x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x3y12E, buf);
    ::ccc::CC8x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x3y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC8x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x3y12E);
    dp->::ccc::CC8x3y12::~CC8x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x3y12E(Test__ZN3ccc8CC8x3y12E, "_ZN3ccc8CC8x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x3y12C1Ev();
extern void _ZN3ccc8CC8x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x3y12E[] = {
  NSPAIR(_ZN3ccc8CC8x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC8x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC8x3y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x3y123abcEv,_ZTv0_n16_N3ccc8CC8x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y123abcEv,_ZThn4_N3ccc8CC8x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x3y123abcEv,_ZTv0_n16_N3ccc8CC8x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x3y12E[] = {
  {&(_ZTVN3ccc8CC8x3y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x3y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x3y12E[];
static VTBL_ENTRY alt_thunk_names1284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x3y123abcEv,_ZTv0_n16_N3ccc8CC8x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x3y123abcEv,_ZThn4_N3ccc8CC8x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x3y12E = {  "_ZN3ccc8CC8x3y12E", // class name
  bases__ZN3ccc8CC8x3y12E, 2,
  &(vtc__ZN3ccc8CC8x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x3y12E),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  DD8x3y12  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD8x3y123abcEv
  ~DD8x3y12(); // tgen
  DD8x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x3y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD8x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x3y123abcEv");}
ccc::DD8x3y12 ::~DD8x3y12(){ note_dtor("_ZN3ccc8DD8x3y12E", this);} // tgen
ccc::DD8x3y12 ::DD8x3y12(){ note_ctor("_ZN3ccc8DD8x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x3y12E, buf);
    ::ccc::DD8x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x3y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD8x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x3y12E);
    dp->::ccc::DD8x3y12::~DD8x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x3y12E(Test__ZN3ccc8DD8x3y12E, "_ZN3ccc8DD8x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x3y12C1Ev();
extern void _ZN3ccc8DD8x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x3y12E[] = {
  NSPAIR(_ZN3ccc8DD8x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD8x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x3y123abcEv,_ZTv0_n20_N3ccc8DD8x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y123abcEv,_ZThn4_N3ccc8DD8x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x3y123abcEv,_ZTv0_n20_N3ccc8DD8x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x3y12E[] = {
  {&(_ZTVN3ccc8DD8x3y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x3y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x3y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x3y12E[];
static VTBL_ENTRY alt_thunk_names1285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x3y123abcEv,_ZTv0_n20_N3ccc8DD8x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y123abcEv,_ZThn4_N3ccc8DD8x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x3y12E = {  "_ZN3ccc8DD8x3y12E", // class name
  bases__ZN3ccc8DD8x3y12E, 2,
  &(vtc__ZN3ccc8DD8x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x3y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x3y12E),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  CC8x3y13  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC8x3y133efgEv
  ~CC8x3y13(); // tgen
  CC8x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x3y133efgEv");}
ccc::CC8x3y13 ::~CC8x3y13(){ note_dtor("_ZN3ccc8CC8x3y13E", this);} // tgen
ccc::CC8x3y13 ::CC8x3y13(){ note_ctor("_ZN3ccc8CC8x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x3y13E, buf);
    ::ccc::CC8x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x3y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC8x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x3y13E);
    dp->::ccc::CC8x3y13::~CC8x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x3y13E(Test__ZN3ccc8CC8x3y13E, "_ZN3ccc8CC8x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x3y13C1Ev();
extern void _ZN3ccc8CC8x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x3y13E[] = {
  NSPAIR(_ZN3ccc8CC8x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC8x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x3y13E[];
extern void _ZN3ccc8CC8x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x3y133efgEv,_ZTv0_n12_N3ccc8CC8x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x3y133efgEv,_ZThn4_N3ccc8CC8x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x3y133efgEv,_ZTv0_n12_N3ccc8CC8x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x3y13E[] = {
  {&(_ZTVN3ccc8CC8x3y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x3y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x3y13E[];
static VTBL_ENTRY alt_thunk_names1286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x3y133efgEv,_ZTv0_n12_N3ccc8CC8x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x3y133efgEv,_ZThn4_N3ccc8CC8x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x3y13E = {  "_ZN3ccc8CC8x3y13E", // class name
  bases__ZN3ccc8CC8x3y13E, 2,
  &(vtc__ZN3ccc8CC8x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x3y13E),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  DD8x3y13  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD8x3y133efgEv
  ~DD8x3y13(); // tgen
  DD8x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x3y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x3y133efgEv");}
ccc::DD8x3y13 ::~DD8x3y13(){ note_dtor("_ZN3ccc8DD8x3y13E", this);} // tgen
ccc::DD8x3y13 ::DD8x3y13(){ note_ctor("_ZN3ccc8DD8x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x3y13E, buf);
    ::ccc::DD8x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x3y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD8x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x3y13E);
    dp->::ccc::DD8x3y13::~DD8x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x3y13E(Test__ZN3ccc8DD8x3y13E, "_ZN3ccc8DD8x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x3y13C1Ev();
extern void _ZN3ccc8DD8x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x3y13E[] = {
  NSPAIR(_ZN3ccc8DD8x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD8x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y13E[];
extern void _ZN3ccc8DD8x3y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x3y133efgEv,_ZTv0_n12_N3ccc8DD8x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y133efgEv,_ZThn4_N3ccc8DD8x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x3y133efgEv,_ZTv0_n12_N3ccc8DD8x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x3y13E[] = {
  {&(_ZTVN3ccc8DD8x3y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x3y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x3y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x3y13E[];
static VTBL_ENTRY alt_thunk_names1287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x3y133efgEv,_ZTv0_n12_N3ccc8DD8x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y133efgEv,_ZThn4_N3ccc8DD8x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x3y13E = {  "_ZN3ccc8DD8x3y13E", // class name
  bases__ZN3ccc8DD8x3y13E, 2,
  &(vtc__ZN3ccc8DD8x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x3y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x3y13E),3, //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  CC8x3y14  : virtual ::ccc::AA8 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC8x3y143pqrEv
  ~CC8x3y14(); // tgen
  CC8x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC8x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x3y143pqrEv");}
ccc::CC8x3y14 ::~CC8x3y14(){ note_dtor("_ZN3ccc8CC8x3y14E", this);} // tgen
ccc::CC8x3y14 ::CC8x3y14(){ note_ctor("_ZN3ccc8CC8x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x3y14E, buf);
    ::ccc::CC8x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x3y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC8x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x3y14E);
    dp->::ccc::CC8x3y14::~CC8x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x3y14E(Test__ZN3ccc8CC8x3y14E, "_ZN3ccc8CC8x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x3y14C1Ev();
extern void _ZN3ccc8CC8x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x3y14E[] = {
  NSPAIR(_ZN3ccc8CC8x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC8x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC8x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x3y14E[] = {
  {&(_ZTVN3ccc8CC8x3y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x3y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x3y14E[];
Class_Descriptor cd__ZN3ccc8CC8x3y14E = {  "_ZN3ccc8CC8x3y14E", // class name
  bases__ZN3ccc8CC8x3y14E, 2,
  &(vtc__ZN3ccc8CC8x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x3y14E),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  DD8x3y14  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD8x3y143pqrEv
  ~DD8x3y14(); // tgen
  DD8x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x3y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD8x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x3y143pqrEv");}
ccc::DD8x3y14 ::~DD8x3y14(){ note_dtor("_ZN3ccc8DD8x3y14E", this);} // tgen
ccc::DD8x3y14 ::DD8x3y14(){ note_ctor("_ZN3ccc8DD8x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x3y14E, buf);
    ::ccc::DD8x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x3y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD8x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x3y14E);
    dp->::ccc::DD8x3y14::~DD8x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x3y14E(Test__ZN3ccc8DD8x3y14E, "_ZN3ccc8DD8x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x3y14C1Ev();
extern void _ZN3ccc8DD8x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x3y14E[] = {
  NSPAIR(_ZN3ccc8DD8x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD8x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x3y143pqrEv,_ZTv0_n16_N3ccc8DD8x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x3y143pqrEv,_ZThn4_N3ccc8DD8x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x3y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x3y143pqrEv,_ZTv0_n16_N3ccc8DD8x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x3y14E[] = {
  {&(_ZTVN3ccc8DD8x3y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x3y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x3y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x3y14E[];
static VTBL_ENTRY alt_thunk_names1288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x3y143pqrEv,_ZTv0_n16_N3ccc8DD8x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x3y143pqrEv,_ZThn4_N3ccc8DD8x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x3y14E = {  "_ZN3ccc8DD8x3y14E", // class name
  bases__ZN3ccc8DD8x3y14E, 2,
  &(vtc__ZN3ccc8DD8x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x3y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x3y14E),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  CC8x3y15  : virtual ::ccc::AA8 , ::ccc::BB3 {
  ~CC8x3y15(); // tgen
  CC8x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x3y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC8x3y15 ::~CC8x3y15(){ note_dtor("_ZN3ccc8CC8x3y15E", this);} // tgen
ccc::CC8x3y15 ::CC8x3y15(){ note_ctor("_ZN3ccc8CC8x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x3y15E, buf);
    ::ccc::CC8x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x3y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC8x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x3y15E);
    dp->::ccc::CC8x3y15::~CC8x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x3y15E(Test__ZN3ccc8CC8x3y15E, "_ZN3ccc8CC8x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x3y15C1Ev();
extern void _ZN3ccc8CC8x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x3y15E[] = {
  NSPAIR(_ZN3ccc8CC8x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC8x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x3y15E[] = {
  {&(_ZTVN3ccc8CC8x3y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x3y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x3y15E[];
Class_Descriptor cd__ZN3ccc8CC8x3y15E = {  "_ZN3ccc8CC8x3y15E", // class name
  bases__ZN3ccc8CC8x3y15E, 2,
  &(vtc__ZN3ccc8CC8x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x3y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x3y15E),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  DD8x3y15  : virtual ::ccc::AA8 , virtual ::ccc::BB3 {
  ~DD8x3y15(); // tgen
  DD8x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x3y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD8x3y15 ::~DD8x3y15(){ note_dtor("_ZN3ccc8DD8x3y15E", this);} // tgen
ccc::DD8x3y15 ::DD8x3y15(){ note_ctor("_ZN3ccc8DD8x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x3y15E, buf);
    ::ccc::DD8x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x3y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD8x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x3y15E);
    dp->::ccc::DD8x3y15::~DD8x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x3y15E(Test__ZN3ccc8DD8x3y15E, "_ZN3ccc8DD8x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x3y15C1Ev();
extern void _ZN3ccc8DD8x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x3y15E[] = {
  NSPAIR(_ZN3ccc8DD8x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD8x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x3y15E[] = {
  {&(_ZTVN3ccc8DD8x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x3y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x3y15E[];
Class_Descriptor cd__ZN3ccc8DD8x3y15E = {  "_ZN3ccc8DD8x3y15E", // class name
  bases__ZN3ccc8DD8x3y15E, 2,
  &(vtc__ZN3ccc8DD8x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x3y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x3y15E),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  CC8x4y0  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y03pqrEv
  ~CC8x4y0(); // tgen
  CC8x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y0E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y03abcEv");}
void  ccc::CC8x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y03efgEv");}
void  ccc::CC8x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y03pqrEv");}
ccc::CC8x4y0 ::~CC8x4y0(){ note_dtor("_ZN3ccc7CC8x4y0E", this);} // tgen
ccc::CC8x4y0 ::CC8x4y0(){ note_ctor("_ZN3ccc7CC8x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y0E, buf);
    ::ccc::CC8x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y0E);
    dp->::ccc::CC8x4y0::~CC8x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y0E(Test__ZN3ccc7CC8x4y0E, "_ZN3ccc7CC8x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y0C1Ev();
extern void _ZN3ccc7CC8x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y0E[] = {
  NSPAIR(_ZN3ccc7CC8x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y0E[];
extern void _ZN3ccc7CC8x4y03pqrEv();
extern void _ZN3ccc7CC8x4y03abcEv();
extern void _ZN3ccc7CC8x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y03efgEv,_ZTv0_n12_N3ccc7CC8x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y03efgEv,_ZThn4_N3ccc7CC8x4y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y03abcEv,_ZTv0_n16_N3ccc7CC8x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y03abcEv,_ZThn4_N3ccc7CC8x4y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y03efgEv,_ZTv0_n12_N3ccc7CC8x4y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y03abcEv,_ZTv0_n16_N3ccc7CC8x4y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y0E[] = {
  {&(_ZTVN3ccc7CC8x4y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y0E[];
static VTBL_ENTRY alt_thunk_names1289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y03abcEv,_ZTv0_n16_N3ccc7CC8x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y03abcEv,_ZThn4_N3ccc7CC8x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y03efgEv,_ZTv0_n12_N3ccc7CC8x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y03efgEv,_ZThn4_N3ccc7CC8x4y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y0E = {  "_ZN3ccc7CC8x4y0E", // class name
  bases__ZN3ccc7CC8x4y0E, 2,
  &(vtc__ZN3ccc7CC8x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y0E),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  DD8x4y0  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD8x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x4y03pqrEv
  ~DD8x4y0(); // tgen
  DD8x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y0E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y03abcEv");}
void  ccc::DD8x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y03efgEv");}
void  ccc::DD8x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y03pqrEv");}
ccc::DD8x4y0 ::~DD8x4y0(){ note_dtor("_ZN3ccc7DD8x4y0E", this);} // tgen
ccc::DD8x4y0 ::DD8x4y0(){ note_ctor("_ZN3ccc7DD8x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y0E, buf);
    ::ccc::DD8x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y0E);
    dp->::ccc::DD8x4y0::~DD8x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y0E(Test__ZN3ccc7DD8x4y0E, "_ZN3ccc7DD8x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y0C1Ev();
extern void _ZN3ccc7DD8x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y0E[] = {
  NSPAIR(_ZN3ccc7DD8x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y0E[];
extern void _ZN3ccc7DD8x4y03efgEv();
extern void _ZN3ccc7DD8x4y03abcEv();
extern void _ZN3ccc7DD8x4y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y03pqrEv,_ZTv0_n12_N3ccc7DD8x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y03pqrEv,_ZThn4_N3ccc7DD8x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y03abcEv,_ZTv0_n16_N3ccc7DD8x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y03abcEv,_ZThn4_N3ccc7DD8x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y03efgEv,_ZTv0_n20_N3ccc7DD8x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y03efgEv,_ZThn4_N3ccc7DD8x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y03pqrEv,_ZTv0_n12_N3ccc7DD8x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y03abcEv,_ZTv0_n16_N3ccc7DD8x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y03efgEv,_ZTv0_n20_N3ccc7DD8x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y0E[] = {
  {&(_ZTVN3ccc7DD8x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y0E[];
static VTBL_ENTRY alt_thunk_names1290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y03efgEv,_ZTv0_n20_N3ccc7DD8x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y03efgEv,_ZThn4_N3ccc7DD8x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y03abcEv,_ZTv0_n16_N3ccc7DD8x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y03abcEv,_ZThn4_N3ccc7DD8x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y03pqrEv,_ZTv0_n12_N3ccc7DD8x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y03pqrEv,_ZThn4_N3ccc7DD8x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y0E = {  "_ZN3ccc7DD8x4y0E", // class name
  bases__ZN3ccc7DD8x4y0E, 2,
  &(vtc__ZN3ccc7DD8x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y0E),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  CC8x4y1  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x4y13efgEv
  ~CC8x4y1(); // tgen
  CC8x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y1E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y13abcEv");}
void  ccc::CC8x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y13pqrEv");}
void  ccc::CC8x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y13efgEv");}
ccc::CC8x4y1 ::~CC8x4y1(){ note_dtor("_ZN3ccc7CC8x4y1E", this);} // tgen
ccc::CC8x4y1 ::CC8x4y1(){ note_ctor("_ZN3ccc7CC8x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y1E, buf);
    ::ccc::CC8x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y1E);
    dp->::ccc::CC8x4y1::~CC8x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y1E(Test__ZN3ccc7CC8x4y1E, "_ZN3ccc7CC8x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y1C1Ev();
extern void _ZN3ccc7CC8x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y1E[] = {
  NSPAIR(_ZN3ccc7CC8x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y1E[];
extern void _ZN3ccc7CC8x4y13pqrEv();
extern void _ZN3ccc7CC8x4y13abcEv();
extern void _ZN3ccc7CC8x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y13efgEv,_ZTv0_n12_N3ccc7CC8x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y13efgEv,_ZThn4_N3ccc7CC8x4y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y13abcEv,_ZTv0_n16_N3ccc7CC8x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y13abcEv,_ZThn4_N3ccc7CC8x4y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y13efgEv,_ZTv0_n12_N3ccc7CC8x4y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y13abcEv,_ZTv0_n16_N3ccc7CC8x4y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y1E[] = {
  {&(_ZTVN3ccc7CC8x4y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y1E[];
static VTBL_ENTRY alt_thunk_names1291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y13abcEv,_ZTv0_n16_N3ccc7CC8x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y13abcEv,_ZThn4_N3ccc7CC8x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y13efgEv,_ZTv0_n12_N3ccc7CC8x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y13efgEv,_ZThn4_N3ccc7CC8x4y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y1E = {  "_ZN3ccc7CC8x4y1E", // class name
  bases__ZN3ccc7CC8x4y1E, 2,
  &(vtc__ZN3ccc7CC8x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y1E),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  DD8x4y1  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD8x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x4y13efgEv
  ~DD8x4y1(); // tgen
  DD8x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y1E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y13abcEv");}
void  ccc::DD8x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y13pqrEv");}
void  ccc::DD8x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y13efgEv");}
ccc::DD8x4y1 ::~DD8x4y1(){ note_dtor("_ZN3ccc7DD8x4y1E", this);} // tgen
ccc::DD8x4y1 ::DD8x4y1(){ note_ctor("_ZN3ccc7DD8x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y1E, buf);
    ::ccc::DD8x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y1E);
    dp->::ccc::DD8x4y1::~DD8x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y1E(Test__ZN3ccc7DD8x4y1E, "_ZN3ccc7DD8x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y1C1Ev();
extern void _ZN3ccc7DD8x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y1E[] = {
  NSPAIR(_ZN3ccc7DD8x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y1E[];
extern void _ZN3ccc7DD8x4y13efgEv();
extern void _ZN3ccc7DD8x4y13abcEv();
extern void _ZN3ccc7DD8x4y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y13pqrEv,_ZTv0_n12_N3ccc7DD8x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y13pqrEv,_ZThn4_N3ccc7DD8x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y13abcEv,_ZTv0_n16_N3ccc7DD8x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y13abcEv,_ZThn4_N3ccc7DD8x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y13efgEv,_ZTv0_n20_N3ccc7DD8x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y13efgEv,_ZThn4_N3ccc7DD8x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y13pqrEv,_ZTv0_n12_N3ccc7DD8x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y13abcEv,_ZTv0_n16_N3ccc7DD8x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y13efgEv,_ZTv0_n20_N3ccc7DD8x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y1E[] = {
  {&(_ZTVN3ccc7DD8x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y1E[];
static VTBL_ENTRY alt_thunk_names1292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y13efgEv,_ZTv0_n20_N3ccc7DD8x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y13efgEv,_ZThn4_N3ccc7DD8x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y13abcEv,_ZTv0_n16_N3ccc7DD8x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y13abcEv,_ZThn4_N3ccc7DD8x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y13pqrEv,_ZTv0_n12_N3ccc7DD8x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y13pqrEv,_ZThn4_N3ccc7DD8x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y1E = {  "_ZN3ccc7DD8x4y1E", // class name
  bases__ZN3ccc7DD8x4y1E, 2,
  &(vtc__ZN3ccc7DD8x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y1E),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  CC8x4y2  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y23pqrEv
  ~CC8x4y2(); // tgen
  CC8x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y2E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y23efgEv");}
void  ccc::CC8x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y23abcEv");}
void  ccc::CC8x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y23pqrEv");}
ccc::CC8x4y2 ::~CC8x4y2(){ note_dtor("_ZN3ccc7CC8x4y2E", this);} // tgen
ccc::CC8x4y2 ::CC8x4y2(){ note_ctor("_ZN3ccc7CC8x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y2E, buf);
    ::ccc::CC8x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y2E);
    dp->::ccc::CC8x4y2::~CC8x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y2E(Test__ZN3ccc7CC8x4y2E, "_ZN3ccc7CC8x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y2C1Ev();
extern void _ZN3ccc7CC8x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y2E[] = {
  NSPAIR(_ZN3ccc7CC8x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y2E[];
extern void _ZN3ccc7CC8x4y23pqrEv();
extern void _ZN3ccc7CC8x4y23abcEv();
extern void _ZN3ccc7CC8x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y23efgEv,_ZTv0_n12_N3ccc7CC8x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y23efgEv,_ZThn4_N3ccc7CC8x4y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y23abcEv,_ZTv0_n16_N3ccc7CC8x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y23abcEv,_ZThn4_N3ccc7CC8x4y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y23efgEv,_ZTv0_n12_N3ccc7CC8x4y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y23abcEv,_ZTv0_n16_N3ccc7CC8x4y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y2E[] = {
  {&(_ZTVN3ccc7CC8x4y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y2E[];
static VTBL_ENTRY alt_thunk_names1293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y23abcEv,_ZTv0_n16_N3ccc7CC8x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y23abcEv,_ZThn4_N3ccc7CC8x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y23efgEv,_ZTv0_n12_N3ccc7CC8x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y23efgEv,_ZThn4_N3ccc7CC8x4y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y2E = {  "_ZN3ccc7CC8x4y2E", // class name
  bases__ZN3ccc7CC8x4y2E, 2,
  &(vtc__ZN3ccc7CC8x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y2E),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  DD8x4y2  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD8x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x4y23pqrEv
  ~DD8x4y2(); // tgen
  DD8x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y2E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y23efgEv");}
void  ccc::DD8x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y23abcEv");}
void  ccc::DD8x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y23pqrEv");}
ccc::DD8x4y2 ::~DD8x4y2(){ note_dtor("_ZN3ccc7DD8x4y2E", this);} // tgen
ccc::DD8x4y2 ::DD8x4y2(){ note_ctor("_ZN3ccc7DD8x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y2E, buf);
    ::ccc::DD8x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y2E);
    dp->::ccc::DD8x4y2::~DD8x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y2E(Test__ZN3ccc7DD8x4y2E, "_ZN3ccc7DD8x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y2C1Ev();
extern void _ZN3ccc7DD8x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y2E[] = {
  NSPAIR(_ZN3ccc7DD8x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y2E[];
extern void _ZN3ccc7DD8x4y23efgEv();
extern void _ZN3ccc7DD8x4y23abcEv();
extern void _ZN3ccc7DD8x4y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y23pqrEv,_ZTv0_n12_N3ccc7DD8x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y23pqrEv,_ZThn4_N3ccc7DD8x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y23abcEv,_ZTv0_n16_N3ccc7DD8x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y23abcEv,_ZThn4_N3ccc7DD8x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y23efgEv,_ZTv0_n20_N3ccc7DD8x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y23efgEv,_ZThn4_N3ccc7DD8x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y23pqrEv,_ZTv0_n12_N3ccc7DD8x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y23abcEv,_ZTv0_n16_N3ccc7DD8x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y23efgEv,_ZTv0_n20_N3ccc7DD8x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y2E[] = {
  {&(_ZTVN3ccc7DD8x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y2E[];
static VTBL_ENTRY alt_thunk_names1294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y23efgEv,_ZTv0_n20_N3ccc7DD8x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y23efgEv,_ZThn4_N3ccc7DD8x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y23abcEv,_ZTv0_n16_N3ccc7DD8x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y23abcEv,_ZThn4_N3ccc7DD8x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y23pqrEv,_ZTv0_n12_N3ccc7DD8x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y23pqrEv,_ZThn4_N3ccc7DD8x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y2E = {  "_ZN3ccc7DD8x4y2E", // class name
  bases__ZN3ccc7DD8x4y2E, 2,
  &(vtc__ZN3ccc7DD8x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y2E),3, //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  CC8x4y3  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x4y33abcEv
  ~CC8x4y3(); // tgen
  CC8x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y3E) C1{ VBC2{ v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y33efgEv");}
void  ccc::CC8x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y33pqrEv");}
void  ccc::CC8x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y33abcEv");}
ccc::CC8x4y3 ::~CC8x4y3(){ note_dtor("_ZN3ccc7CC8x4y3E", this);} // tgen
ccc::CC8x4y3 ::CC8x4y3(){ note_ctor("_ZN3ccc7CC8x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y3E, buf);
    ::ccc::CC8x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y3E);
    dp->::ccc::CC8x4y3::~CC8x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y3E(Test__ZN3ccc7CC8x4y3E, "_ZN3ccc7CC8x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y3C1Ev();
extern void _ZN3ccc7CC8x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y3E[] = {
  NSPAIR(_ZN3ccc7CC8x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y3E[];
extern void _ZN3ccc7CC8x4y33pqrEv();
extern void _ZN3ccc7CC8x4y33abcEv();
extern void _ZN3ccc7CC8x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y33efgEv,_ZTv0_n12_N3ccc7CC8x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y33efgEv,_ZThn4_N3ccc7CC8x4y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y33abcEv,_ZTv0_n16_N3ccc7CC8x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y33abcEv,_ZThn4_N3ccc7CC8x4y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y33efgEv,_ZTv0_n12_N3ccc7CC8x4y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y33abcEv,_ZTv0_n16_N3ccc7CC8x4y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y3E[] = {
  {&(_ZTVN3ccc7CC8x4y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y3E[];
static VTBL_ENTRY alt_thunk_names1295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y33abcEv,_ZTv0_n16_N3ccc7CC8x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y33abcEv,_ZThn4_N3ccc7CC8x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y33efgEv,_ZTv0_n12_N3ccc7CC8x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y33efgEv,_ZThn4_N3ccc7CC8x4y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y3E = {  "_ZN3ccc7CC8x4y3E", // class name
  bases__ZN3ccc7CC8x4y3E, 2,
  &(vtc__ZN3ccc7CC8x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y3E),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  DD8x4y3  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD8x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x4y33abcEv
  ~DD8x4y3(); // tgen
  DD8x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y3E) C1{ VBC2{ v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y33efgEv");}
void  ccc::DD8x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y33pqrEv");}
void  ccc::DD8x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y33abcEv");}
ccc::DD8x4y3 ::~DD8x4y3(){ note_dtor("_ZN3ccc7DD8x4y3E", this);} // tgen
ccc::DD8x4y3 ::DD8x4y3(){ note_ctor("_ZN3ccc7DD8x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y3E, buf);
    ::ccc::DD8x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y3E);
    dp->::ccc::DD8x4y3::~DD8x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y3E(Test__ZN3ccc7DD8x4y3E, "_ZN3ccc7DD8x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y3C1Ev();
extern void _ZN3ccc7DD8x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y3E[] = {
  NSPAIR(_ZN3ccc7DD8x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y3E[];
extern void _ZN3ccc7DD8x4y33efgEv();
extern void _ZN3ccc7DD8x4y33abcEv();
extern void _ZN3ccc7DD8x4y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y33pqrEv,_ZTv0_n12_N3ccc7DD8x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y33pqrEv,_ZThn4_N3ccc7DD8x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y33abcEv,_ZTv0_n16_N3ccc7DD8x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y33abcEv,_ZThn4_N3ccc7DD8x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y33efgEv,_ZTv0_n20_N3ccc7DD8x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y33efgEv,_ZThn4_N3ccc7DD8x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y33pqrEv,_ZTv0_n12_N3ccc7DD8x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y33abcEv,_ZTv0_n16_N3ccc7DD8x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y33efgEv,_ZTv0_n20_N3ccc7DD8x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y3E[] = {
  {&(_ZTVN3ccc7DD8x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y3E[];
static VTBL_ENTRY alt_thunk_names1296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y33efgEv,_ZTv0_n20_N3ccc7DD8x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y33efgEv,_ZThn4_N3ccc7DD8x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y33abcEv,_ZTv0_n16_N3ccc7DD8x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y33abcEv,_ZThn4_N3ccc7DD8x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y33pqrEv,_ZTv0_n12_N3ccc7DD8x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y33pqrEv,_ZThn4_N3ccc7DD8x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y3E = {  "_ZN3ccc7DD8x4y3E", // class name
  bases__ZN3ccc7DD8x4y3E, 2,
  &(vtc__ZN3ccc7DD8x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y3E),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  CC8x4y4  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC8x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x4y43efgEv
  ~CC8x4y4(); // tgen
  CC8x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y4E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y43pqrEv");}
void  ccc::CC8x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y43abcEv");}
void  ccc::CC8x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y43efgEv");}
ccc::CC8x4y4 ::~CC8x4y4(){ note_dtor("_ZN3ccc7CC8x4y4E", this);} // tgen
ccc::CC8x4y4 ::CC8x4y4(){ note_ctor("_ZN3ccc7CC8x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y4E, buf);
    ::ccc::CC8x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y4E);
    dp->::ccc::CC8x4y4::~CC8x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y4E(Test__ZN3ccc7CC8x4y4E, "_ZN3ccc7CC8x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y4C1Ev();
extern void _ZN3ccc7CC8x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y4E[] = {
  NSPAIR(_ZN3ccc7CC8x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y4E[];
extern void _ZN3ccc7CC8x4y43pqrEv();
extern void _ZN3ccc7CC8x4y43abcEv();
extern void _ZN3ccc7CC8x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y43efgEv,_ZTv0_n12_N3ccc7CC8x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y43efgEv,_ZThn4_N3ccc7CC8x4y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y43abcEv,_ZTv0_n16_N3ccc7CC8x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y43abcEv,_ZThn4_N3ccc7CC8x4y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y43efgEv,_ZTv0_n12_N3ccc7CC8x4y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y43abcEv,_ZTv0_n16_N3ccc7CC8x4y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y4E[] = {
  {&(_ZTVN3ccc7CC8x4y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y4E[];
static VTBL_ENTRY alt_thunk_names1297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y43abcEv,_ZTv0_n16_N3ccc7CC8x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y43abcEv,_ZThn4_N3ccc7CC8x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y43efgEv,_ZTv0_n12_N3ccc7CC8x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y43efgEv,_ZThn4_N3ccc7CC8x4y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y4E = {  "_ZN3ccc7CC8x4y4E", // class name
  bases__ZN3ccc7CC8x4y4E, 2,
  &(vtc__ZN3ccc7CC8x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y4E),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  DD8x4y4  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD8x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x4y43efgEv
  ~DD8x4y4(); // tgen
  DD8x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y4E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y43pqrEv");}
void  ccc::DD8x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y43abcEv");}
void  ccc::DD8x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y43efgEv");}
ccc::DD8x4y4 ::~DD8x4y4(){ note_dtor("_ZN3ccc7DD8x4y4E", this);} // tgen
ccc::DD8x4y4 ::DD8x4y4(){ note_ctor("_ZN3ccc7DD8x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y4E, buf);
    ::ccc::DD8x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y4E);
    dp->::ccc::DD8x4y4::~DD8x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y4E(Test__ZN3ccc7DD8x4y4E, "_ZN3ccc7DD8x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y4C1Ev();
extern void _ZN3ccc7DD8x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y4E[] = {
  NSPAIR(_ZN3ccc7DD8x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y4E[];
extern void _ZN3ccc7DD8x4y43efgEv();
extern void _ZN3ccc7DD8x4y43abcEv();
extern void _ZN3ccc7DD8x4y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y43pqrEv,_ZTv0_n12_N3ccc7DD8x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y43pqrEv,_ZThn4_N3ccc7DD8x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y43abcEv,_ZTv0_n16_N3ccc7DD8x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y43abcEv,_ZThn4_N3ccc7DD8x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y43efgEv,_ZTv0_n20_N3ccc7DD8x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y43efgEv,_ZThn4_N3ccc7DD8x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y43pqrEv,_ZTv0_n12_N3ccc7DD8x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y43abcEv,_ZTv0_n16_N3ccc7DD8x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y43efgEv,_ZTv0_n20_N3ccc7DD8x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y4E[] = {
  {&(_ZTVN3ccc7DD8x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y4E[];
static VTBL_ENTRY alt_thunk_names1298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y43efgEv,_ZTv0_n20_N3ccc7DD8x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y43efgEv,_ZThn4_N3ccc7DD8x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y43abcEv,_ZTv0_n16_N3ccc7DD8x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y43abcEv,_ZThn4_N3ccc7DD8x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y43pqrEv,_ZTv0_n12_N3ccc7DD8x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y43pqrEv,_ZThn4_N3ccc7DD8x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y4E = {  "_ZN3ccc7DD8x4y4E", // class name
  bases__ZN3ccc7DD8x4y4E, 2,
  &(vtc__ZN3ccc7DD8x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y4E),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  CC8x4y5  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC8x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x4y53abcEv
  ~CC8x4y5(); // tgen
  CC8x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y5E) C1{ VBC2{ v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y53pqrEv");}
void  ccc::CC8x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y53efgEv");}
void  ccc::CC8x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y53abcEv");}
ccc::CC8x4y5 ::~CC8x4y5(){ note_dtor("_ZN3ccc7CC8x4y5E", this);} // tgen
ccc::CC8x4y5 ::CC8x4y5(){ note_ctor("_ZN3ccc7CC8x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y5E, buf);
    ::ccc::CC8x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y5E);
    dp->::ccc::CC8x4y5::~CC8x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y5E(Test__ZN3ccc7CC8x4y5E, "_ZN3ccc7CC8x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y5C1Ev();
extern void _ZN3ccc7CC8x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y5E[] = {
  NSPAIR(_ZN3ccc7CC8x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y5E[];
extern void _ZN3ccc7CC8x4y53pqrEv();
extern void _ZN3ccc7CC8x4y53abcEv();
extern void _ZN3ccc7CC8x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y53efgEv,_ZTv0_n12_N3ccc7CC8x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y53efgEv,_ZThn4_N3ccc7CC8x4y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y53abcEv,_ZTv0_n16_N3ccc7CC8x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y53abcEv,_ZThn4_N3ccc7CC8x4y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y53efgEv,_ZTv0_n12_N3ccc7CC8x4y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y53abcEv,_ZTv0_n16_N3ccc7CC8x4y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y5E[] = {
  {&(_ZTVN3ccc7CC8x4y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y5E[];
static VTBL_ENTRY alt_thunk_names1299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y53abcEv,_ZTv0_n16_N3ccc7CC8x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y53abcEv,_ZThn4_N3ccc7CC8x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y53efgEv,_ZTv0_n12_N3ccc7CC8x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y53efgEv,_ZThn4_N3ccc7CC8x4y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y5E = {  "_ZN3ccc7CC8x4y5E", // class name
  bases__ZN3ccc7CC8x4y5E, 2,
  &(vtc__ZN3ccc7CC8x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y5E),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  DD8x4y5  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD8x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x4y53abcEv
  ~DD8x4y5(); // tgen
  DD8x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y5E) C1{ VBC2{ v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y53pqrEv");}
void  ccc::DD8x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y53efgEv");}
void  ccc::DD8x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y53abcEv");}
ccc::DD8x4y5 ::~DD8x4y5(){ note_dtor("_ZN3ccc7DD8x4y5E", this);} // tgen
ccc::DD8x4y5 ::DD8x4y5(){ note_ctor("_ZN3ccc7DD8x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y5E, buf);
    ::ccc::DD8x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y5E);
    dp->::ccc::DD8x4y5::~DD8x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y5E(Test__ZN3ccc7DD8x4y5E, "_ZN3ccc7DD8x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y5C1Ev();
extern void _ZN3ccc7DD8x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y5E[] = {
  NSPAIR(_ZN3ccc7DD8x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y5E[];
extern void _ZN3ccc7DD8x4y53efgEv();
extern void _ZN3ccc7DD8x4y53abcEv();
extern void _ZN3ccc7DD8x4y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y53pqrEv,_ZTv0_n12_N3ccc7DD8x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y53pqrEv,_ZThn4_N3ccc7DD8x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y53abcEv,_ZTv0_n16_N3ccc7DD8x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y53abcEv,_ZThn4_N3ccc7DD8x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y53efgEv,_ZTv0_n20_N3ccc7DD8x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y53efgEv,_ZThn4_N3ccc7DD8x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y53pqrEv,_ZTv0_n12_N3ccc7DD8x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y53abcEv,_ZTv0_n16_N3ccc7DD8x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y53efgEv,_ZTv0_n20_N3ccc7DD8x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y5E[] = {
  {&(_ZTVN3ccc7DD8x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y5E[];
static VTBL_ENTRY alt_thunk_names1300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y53efgEv,_ZTv0_n20_N3ccc7DD8x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y53efgEv,_ZThn4_N3ccc7DD8x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y53abcEv,_ZTv0_n16_N3ccc7DD8x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y53abcEv,_ZThn4_N3ccc7DD8x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y53pqrEv,_ZTv0_n12_N3ccc7DD8x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y53pqrEv,_ZThn4_N3ccc7DD8x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y5E = {  "_ZN3ccc7DD8x4y5E", // class name
  bases__ZN3ccc7DD8x4y5E, 2,
  &(vtc__ZN3ccc7DD8x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y5E),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  CC8x4y6  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x4y63efgEv
  ~CC8x4y6(); // tgen
  CC8x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y6E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y63abcEv");}
void  ccc::CC8x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y63efgEv");}
ccc::CC8x4y6 ::~CC8x4y6(){ note_dtor("_ZN3ccc7CC8x4y6E", this);} // tgen
ccc::CC8x4y6 ::CC8x4y6(){ note_ctor("_ZN3ccc7CC8x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y6E, buf);
    ::ccc::CC8x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y6E);
    dp->::ccc::CC8x4y6::~CC8x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y6E(Test__ZN3ccc7CC8x4y6E, "_ZN3ccc7CC8x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y6C1Ev();
extern void _ZN3ccc7CC8x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y6E[] = {
  NSPAIR(_ZN3ccc7CC8x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC8x4y63abcEv();
extern void _ZN3ccc7CC8x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y63efgEv,_ZTv0_n12_N3ccc7CC8x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y63efgEv,_ZThn4_N3ccc7CC8x4y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y63abcEv,_ZTv0_n16_N3ccc7CC8x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y63abcEv,_ZThn4_N3ccc7CC8x4y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y63efgEv,_ZTv0_n12_N3ccc7CC8x4y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y63abcEv,_ZTv0_n16_N3ccc7CC8x4y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y6E[] = {
  {&(_ZTVN3ccc7CC8x4y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y6E[];
static VTBL_ENTRY alt_thunk_names1301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y63abcEv,_ZTv0_n16_N3ccc7CC8x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y63abcEv,_ZThn4_N3ccc7CC8x4y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y63efgEv,_ZTv0_n12_N3ccc7CC8x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y63efgEv,_ZThn4_N3ccc7CC8x4y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y6E = {  "_ZN3ccc7CC8x4y6E", // class name
  bases__ZN3ccc7CC8x4y6E, 2,
  &(vtc__ZN3ccc7CC8x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y6E),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  DD8x4y6  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD8x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x4y63efgEv
  ~DD8x4y6(); // tgen
  DD8x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y6E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y63abcEv");}
void  ccc::DD8x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y63efgEv");}
ccc::DD8x4y6 ::~DD8x4y6(){ note_dtor("_ZN3ccc7DD8x4y6E", this);} // tgen
ccc::DD8x4y6 ::DD8x4y6(){ note_ctor("_ZN3ccc7DD8x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y6E, buf);
    ::ccc::DD8x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y6E);
    dp->::ccc::DD8x4y6::~DD8x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y6E(Test__ZN3ccc7DD8x4y6E, "_ZN3ccc7DD8x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y6C1Ev();
extern void _ZN3ccc7DD8x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y6E[] = {
  NSPAIR(_ZN3ccc7DD8x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y6E[];
extern void _ZN3ccc7DD8x4y63efgEv();
extern void _ZN3ccc7DD8x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y63abcEv,_ZTv0_n16_N3ccc7DD8x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y63abcEv,_ZThn4_N3ccc7DD8x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y63efgEv,_ZTv0_n20_N3ccc7DD8x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y63efgEv,_ZThn4_N3ccc7DD8x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y63abcEv,_ZTv0_n16_N3ccc7DD8x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y63efgEv,_ZTv0_n20_N3ccc7DD8x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y6E[] = {
  {&(_ZTVN3ccc7DD8x4y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x4y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x4y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y6E[];
static VTBL_ENTRY alt_thunk_names1302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y63efgEv,_ZTv0_n20_N3ccc7DD8x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y63efgEv,_ZThn4_N3ccc7DD8x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y63abcEv,_ZTv0_n16_N3ccc7DD8x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y63abcEv,_ZThn4_N3ccc7DD8x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y6E = {  "_ZN3ccc7DD8x4y6E", // class name
  bases__ZN3ccc7DD8x4y6E, 2,
  &(vtc__ZN3ccc7DD8x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y6E),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  CC8x4y7  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC8x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y73pqrEv
  ~CC8x4y7(); // tgen
  CC8x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y7E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y73abcEv");}
void  ccc::CC8x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y73pqrEv");}
ccc::CC8x4y7 ::~CC8x4y7(){ note_dtor("_ZN3ccc7CC8x4y7E", this);} // tgen
ccc::CC8x4y7 ::CC8x4y7(){ note_ctor("_ZN3ccc7CC8x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y7E, buf);
    ::ccc::CC8x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y7E);
    dp->::ccc::CC8x4y7::~CC8x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y7E(Test__ZN3ccc7CC8x4y7E, "_ZN3ccc7CC8x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y7C1Ev();
extern void _ZN3ccc7CC8x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y7E[] = {
  NSPAIR(_ZN3ccc7CC8x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y7E[];
extern void _ZN3ccc7CC8x4y73pqrEv();
extern void _ZN3ccc7CC8x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y73abcEv,_ZTv0_n16_N3ccc7CC8x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y73abcEv,_ZThn4_N3ccc7CC8x4y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y73abcEv,_ZTv0_n16_N3ccc7CC8x4y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y7E[] = {
  {&(_ZTVN3ccc7CC8x4y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y7E[];
static VTBL_ENTRY alt_thunk_names1303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y73abcEv,_ZTv0_n16_N3ccc7CC8x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y73abcEv,_ZThn4_N3ccc7CC8x4y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y7E = {  "_ZN3ccc7CC8x4y7E", // class name
  bases__ZN3ccc7CC8x4y7E, 2,
  &(vtc__ZN3ccc7CC8x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y7E),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  DD8x4y7  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD8x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x4y73pqrEv
  ~DD8x4y7(); // tgen
  DD8x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y7E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y73abcEv");}
void  ccc::DD8x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y73pqrEv");}
ccc::DD8x4y7 ::~DD8x4y7(){ note_dtor("_ZN3ccc7DD8x4y7E", this);} // tgen
ccc::DD8x4y7 ::DD8x4y7(){ note_ctor("_ZN3ccc7DD8x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y7E, buf);
    ::ccc::DD8x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y7E);
    dp->::ccc::DD8x4y7::~DD8x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y7E(Test__ZN3ccc7DD8x4y7E, "_ZN3ccc7DD8x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y7C1Ev();
extern void _ZN3ccc7DD8x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y7E[] = {
  NSPAIR(_ZN3ccc7DD8x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x4y73abcEv();
extern void _ZN3ccc7DD8x4y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y73pqrEv,_ZTv0_n12_N3ccc7DD8x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y73pqrEv,_ZThn4_N3ccc7DD8x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y73abcEv,_ZTv0_n16_N3ccc7DD8x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y73abcEv,_ZThn4_N3ccc7DD8x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y73pqrEv,_ZTv0_n12_N3ccc7DD8x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y73abcEv,_ZTv0_n16_N3ccc7DD8x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y7E[] = {
  {&(_ZTVN3ccc7DD8x4y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y7E[];
static VTBL_ENTRY alt_thunk_names1304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y73abcEv,_ZTv0_n16_N3ccc7DD8x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y73abcEv,_ZThn4_N3ccc7DD8x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y73pqrEv,_ZTv0_n12_N3ccc7DD8x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y73pqrEv,_ZThn4_N3ccc7DD8x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y7E = {  "_ZN3ccc7DD8x4y7E", // class name
  bases__ZN3ccc7DD8x4y7E, 2,
  &(vtc__ZN3ccc7DD8x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y7E),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  CC8x4y8  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x4y83abcEv
  ~CC8x4y8(); // tgen
  CC8x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y8E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y83efgEv");}
void  ccc::CC8x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x4y83abcEv");}
ccc::CC8x4y8 ::~CC8x4y8(){ note_dtor("_ZN3ccc7CC8x4y8E", this);} // tgen
ccc::CC8x4y8 ::CC8x4y8(){ note_ctor("_ZN3ccc7CC8x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y8E, buf);
    ::ccc::CC8x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y8E);
    dp->::ccc::CC8x4y8::~CC8x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y8E(Test__ZN3ccc7CC8x4y8E, "_ZN3ccc7CC8x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y8C1Ev();
extern void _ZN3ccc7CC8x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y8E[] = {
  NSPAIR(_ZN3ccc7CC8x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC8x4y83abcEv();
extern void _ZN3ccc7CC8x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y83efgEv,_ZTv0_n12_N3ccc7CC8x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y83efgEv,_ZThn4_N3ccc7CC8x4y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x4y83abcEv,_ZTv0_n16_N3ccc7CC8x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y83abcEv,_ZThn4_N3ccc7CC8x4y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y83efgEv,_ZTv0_n12_N3ccc7CC8x4y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x4y83abcEv,_ZTv0_n16_N3ccc7CC8x4y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y8E[] = {
  {&(_ZTVN3ccc7CC8x4y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y8E[];
static VTBL_ENTRY alt_thunk_names1305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x4y83abcEv,_ZTv0_n16_N3ccc7CC8x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y83abcEv,_ZThn4_N3ccc7CC8x4y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y83efgEv,_ZTv0_n12_N3ccc7CC8x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y83efgEv,_ZThn4_N3ccc7CC8x4y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y8E = {  "_ZN3ccc7CC8x4y8E", // class name
  bases__ZN3ccc7CC8x4y8E, 2,
  &(vtc__ZN3ccc7CC8x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y8E),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  DD8x4y8  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD8x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x4y83abcEv
  ~DD8x4y8(); // tgen
  DD8x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y8E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y83efgEv");}
void  ccc::DD8x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x4y83abcEv");}
ccc::DD8x4y8 ::~DD8x4y8(){ note_dtor("_ZN3ccc7DD8x4y8E", this);} // tgen
ccc::DD8x4y8 ::DD8x4y8(){ note_ctor("_ZN3ccc7DD8x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y8E, buf);
    ::ccc::DD8x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y8E);
    dp->::ccc::DD8x4y8::~DD8x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y8E(Test__ZN3ccc7DD8x4y8E, "_ZN3ccc7DD8x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y8C1Ev();
extern void _ZN3ccc7DD8x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y8E[] = {
  NSPAIR(_ZN3ccc7DD8x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y8E[];
extern void _ZN3ccc7DD8x4y83efgEv();
extern void _ZN3ccc7DD8x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x4y83abcEv,_ZTv0_n16_N3ccc7DD8x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y83abcEv,_ZThn4_N3ccc7DD8x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y83efgEv,_ZTv0_n20_N3ccc7DD8x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y83efgEv,_ZThn4_N3ccc7DD8x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x4y83abcEv,_ZTv0_n16_N3ccc7DD8x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y83efgEv,_ZTv0_n20_N3ccc7DD8x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y8E[] = {
  {&(_ZTVN3ccc7DD8x4y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x4y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x4y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y8E[];
static VTBL_ENTRY alt_thunk_names1306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y83efgEv,_ZTv0_n20_N3ccc7DD8x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y83efgEv,_ZThn4_N3ccc7DD8x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x4y83abcEv,_ZTv0_n16_N3ccc7DD8x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y83abcEv,_ZThn4_N3ccc7DD8x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y8E = {  "_ZN3ccc7DD8x4y8E", // class name
  bases__ZN3ccc7DD8x4y8E, 2,
  &(vtc__ZN3ccc7DD8x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y8E),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  CC8x4y9  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC8x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x4y93pqrEv
  ~CC8x4y9(); // tgen
  CC8x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x4y9E) C1{ VBC2{ v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x4y93efgEv");}
void  ccc::CC8x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x4y93pqrEv");}
ccc::CC8x4y9 ::~CC8x4y9(){ note_dtor("_ZN3ccc7CC8x4y9E", this);} // tgen
ccc::CC8x4y9 ::CC8x4y9(){ note_ctor("_ZN3ccc7CC8x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x4y9E, buf);
    ::ccc::CC8x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x4y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC8x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x4y9E);
    dp->::ccc::CC8x4y9::~CC8x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x4y9E(Test__ZN3ccc7CC8x4y9E, "_ZN3ccc7CC8x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x4y9C1Ev();
extern void _ZN3ccc7CC8x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x4y9E[] = {
  NSPAIR(_ZN3ccc7CC8x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC8x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x4y9E[];
extern void _ZN3ccc7CC8x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC8x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x4y93efgEv,_ZTv0_n12_N3ccc7CC8x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x4y93efgEv,_ZThn4_N3ccc7CC8x4y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x4y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x4y93efgEv,_ZTv0_n12_N3ccc7CC8x4y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x4y9E[] = {
  {&(_ZTVN3ccc7CC8x4y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x4y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x4y9E[];
static VTBL_ENTRY alt_thunk_names1307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x4y93efgEv,_ZTv0_n12_N3ccc7CC8x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x4y93efgEv,_ZThn4_N3ccc7CC8x4y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x4y9E = {  "_ZN3ccc7CC8x4y9E", // class name
  bases__ZN3ccc7CC8x4y9E, 2,
  &(vtc__ZN3ccc7CC8x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x4y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x4y9E),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  DD8x4y9  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD8x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x4y93pqrEv
  ~DD8x4y9(); // tgen
  DD8x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x4y9E) C1{ VBC2{ v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x4y93efgEv");}
void  ccc::DD8x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x4y93pqrEv");}
ccc::DD8x4y9 ::~DD8x4y9(){ note_dtor("_ZN3ccc7DD8x4y9E", this);} // tgen
ccc::DD8x4y9 ::DD8x4y9(){ note_ctor("_ZN3ccc7DD8x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x4y9E, buf);
    ::ccc::DD8x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x4y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD8x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x4y9E);
    dp->::ccc::DD8x4y9::~DD8x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x4y9E(Test__ZN3ccc7DD8x4y9E, "_ZN3ccc7DD8x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x4y9C1Ev();
extern void _ZN3ccc7DD8x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x4y9E[] = {
  NSPAIR(_ZN3ccc7DD8x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD8x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y9E[];
extern void _ZN3ccc7DD8x4y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x4y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x4y93pqrEv,_ZTv0_n12_N3ccc7DD8x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y93pqrEv,_ZThn4_N3ccc7DD8x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x4y93efgEv,_ZTv0_n20_N3ccc7DD8x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x4y93efgEv,_ZThn4_N3ccc7DD8x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x4y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x4y93pqrEv,_ZTv0_n12_N3ccc7DD8x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x4y93efgEv,_ZTv0_n20_N3ccc7DD8x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x4y9E[] = {
  {&(_ZTVN3ccc7DD8x4y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x4y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x4y9E[];
static VTBL_ENTRY alt_thunk_names1308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x4y93efgEv,_ZTv0_n20_N3ccc7DD8x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y93efgEv,_ZThn4_N3ccc7DD8x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x4y93pqrEv,_ZTv0_n12_N3ccc7DD8x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x4y93pqrEv,_ZThn4_N3ccc7DD8x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x4y9E = {  "_ZN3ccc7DD8x4y9E", // class name
  bases__ZN3ccc7DD8x4y9E, 2,
  &(vtc__ZN3ccc7DD8x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x4y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x4y9E),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  CC8x4y10  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC8x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x4y103abcEv
  ~CC8x4y10(); // tgen
  CC8x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y10E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x4y103pqrEv");}
void  ccc::CC8x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x4y103abcEv");}
ccc::CC8x4y10 ::~CC8x4y10(){ note_dtor("_ZN3ccc8CC8x4y10E", this);} // tgen
ccc::CC8x4y10 ::CC8x4y10(){ note_ctor("_ZN3ccc8CC8x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x4y10E, buf);
    ::ccc::CC8x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x4y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC8x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x4y10E);
    dp->::ccc::CC8x4y10::~CC8x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x4y10E(Test__ZN3ccc8CC8x4y10E, "_ZN3ccc8CC8x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x4y10C1Ev();
extern void _ZN3ccc8CC8x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x4y10E[] = {
  NSPAIR(_ZN3ccc8CC8x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC8x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x4y10E[];
extern void _ZN3ccc8CC8x4y103pqrEv();
extern void _ZN3ccc8CC8x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x4y103abcEv,_ZTv0_n16_N3ccc8CC8x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y103abcEv,_ZThn4_N3ccc8CC8x4y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x4y103abcEv,_ZTv0_n16_N3ccc8CC8x4y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x4y10E[] = {
  {&(_ZTVN3ccc8CC8x4y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x4y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x4y10E[];
static VTBL_ENTRY alt_thunk_names1309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x4y103abcEv,_ZTv0_n16_N3ccc8CC8x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x4y103abcEv,_ZThn4_N3ccc8CC8x4y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x4y10E = {  "_ZN3ccc8CC8x4y10E", // class name
  bases__ZN3ccc8CC8x4y10E, 2,
  &(vtc__ZN3ccc8CC8x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x4y10E),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  DD8x4y10  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD8x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x4y103abcEv
  ~DD8x4y10(); // tgen
  DD8x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x4y10E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x4y103pqrEv");}
void  ccc::DD8x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x4y103abcEv");}
ccc::DD8x4y10 ::~DD8x4y10(){ note_dtor("_ZN3ccc8DD8x4y10E", this);} // tgen
ccc::DD8x4y10 ::DD8x4y10(){ note_ctor("_ZN3ccc8DD8x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x4y10E, buf);
    ::ccc::DD8x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x4y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD8x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x4y10E);
    dp->::ccc::DD8x4y10::~DD8x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x4y10E(Test__ZN3ccc8DD8x4y10E, "_ZN3ccc8DD8x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x4y10C1Ev();
extern void _ZN3ccc8DD8x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x4y10E[] = {
  NSPAIR(_ZN3ccc8DD8x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD8x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x4y103abcEv();
extern void _ZN3ccc8DD8x4y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x4y103pqrEv,_ZTv0_n12_N3ccc8DD8x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y103pqrEv,_ZThn4_N3ccc8DD8x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x4y103abcEv,_ZTv0_n16_N3ccc8DD8x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y103abcEv,_ZThn4_N3ccc8DD8x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x4y103pqrEv,_ZTv0_n12_N3ccc8DD8x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x4y103abcEv,_ZTv0_n16_N3ccc8DD8x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x4y10E[] = {
  {&(_ZTVN3ccc8DD8x4y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x4y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x4y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x4y10E[];
static VTBL_ENTRY alt_thunk_names1310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x4y103abcEv,_ZTv0_n16_N3ccc8DD8x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y103abcEv,_ZThn4_N3ccc8DD8x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x4y103pqrEv,_ZTv0_n12_N3ccc8DD8x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y103pqrEv,_ZThn4_N3ccc8DD8x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x4y10E = {  "_ZN3ccc8DD8x4y10E", // class name
  bases__ZN3ccc8DD8x4y10E, 2,
  &(vtc__ZN3ccc8DD8x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x4y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x4y10E),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  CC8x4y11  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC8x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x4y113efgEv
  ~CC8x4y11(); // tgen
  CC8x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y11E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x4y113pqrEv");}
void  ccc::CC8x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x4y113efgEv");}
ccc::CC8x4y11 ::~CC8x4y11(){ note_dtor("_ZN3ccc8CC8x4y11E", this);} // tgen
ccc::CC8x4y11 ::CC8x4y11(){ note_ctor("_ZN3ccc8CC8x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x4y11E, buf);
    ::ccc::CC8x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x4y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC8x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x4y11E);
    dp->::ccc::CC8x4y11::~CC8x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x4y11E(Test__ZN3ccc8CC8x4y11E, "_ZN3ccc8CC8x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x4y11C1Ev();
extern void _ZN3ccc8CC8x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x4y11E[] = {
  NSPAIR(_ZN3ccc8CC8x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC8x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x4y11E[];
extern void _ZN3ccc8CC8x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC8x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x4y113efgEv,_ZTv0_n12_N3ccc8CC8x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y113efgEv,_ZThn4_N3ccc8CC8x4y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x4y113efgEv,_ZTv0_n12_N3ccc8CC8x4y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x4y11E[] = {
  {&(_ZTVN3ccc8CC8x4y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x4y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x4y11E[];
static VTBL_ENTRY alt_thunk_names1311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x4y113efgEv,_ZTv0_n12_N3ccc8CC8x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x4y113efgEv,_ZThn4_N3ccc8CC8x4y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x4y11E = {  "_ZN3ccc8CC8x4y11E", // class name
  bases__ZN3ccc8CC8x4y11E, 2,
  &(vtc__ZN3ccc8CC8x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x4y11E),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  DD8x4y11  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD8x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x4y113efgEv
  ~DD8x4y11(); // tgen
  DD8x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x4y11E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x4y113pqrEv");}
void  ccc::DD8x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x4y113efgEv");}
ccc::DD8x4y11 ::~DD8x4y11(){ note_dtor("_ZN3ccc8DD8x4y11E", this);} // tgen
ccc::DD8x4y11 ::DD8x4y11(){ note_ctor("_ZN3ccc8DD8x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x4y11E, buf);
    ::ccc::DD8x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x4y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD8x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x4y11E);
    dp->::ccc::DD8x4y11::~DD8x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x4y11E(Test__ZN3ccc8DD8x4y11E, "_ZN3ccc8DD8x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x4y11C1Ev();
extern void _ZN3ccc8DD8x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x4y11E[] = {
  NSPAIR(_ZN3ccc8DD8x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD8x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y11E[];
extern void _ZN3ccc8DD8x4y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x4y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x4y113pqrEv,_ZTv0_n12_N3ccc8DD8x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y113pqrEv,_ZThn4_N3ccc8DD8x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x4y113efgEv,_ZTv0_n20_N3ccc8DD8x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y113efgEv,_ZThn4_N3ccc8DD8x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x4y113pqrEv,_ZTv0_n12_N3ccc8DD8x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x4y113efgEv,_ZTv0_n20_N3ccc8DD8x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x4y11E[] = {
  {&(_ZTVN3ccc8DD8x4y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x4y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x4y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x4y11E[];
static VTBL_ENTRY alt_thunk_names1312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x4y113efgEv,_ZTv0_n20_N3ccc8DD8x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y113efgEv,_ZThn4_N3ccc8DD8x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x4y113pqrEv,_ZTv0_n12_N3ccc8DD8x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y113pqrEv,_ZThn4_N3ccc8DD8x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x4y11E = {  "_ZN3ccc8DD8x4y11E", // class name
  bases__ZN3ccc8DD8x4y11E, 2,
  &(vtc__ZN3ccc8DD8x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x4y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x4y11E),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  CC8x4y12  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC8x4y123abcEv
  ~CC8x4y12(); // tgen
  CC8x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y12E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC8x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x4y123abcEv");}
ccc::CC8x4y12 ::~CC8x4y12(){ note_dtor("_ZN3ccc8CC8x4y12E", this);} // tgen
ccc::CC8x4y12 ::CC8x4y12(){ note_ctor("_ZN3ccc8CC8x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x4y12E, buf);
    ::ccc::CC8x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x4y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC8x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x4y12E);
    dp->::ccc::CC8x4y12::~CC8x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x4y12E(Test__ZN3ccc8CC8x4y12E, "_ZN3ccc8CC8x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x4y12C1Ev();
extern void _ZN3ccc8CC8x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x4y12E[] = {
  NSPAIR(_ZN3ccc8CC8x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC8x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC8x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x4y123abcEv,_ZTv0_n16_N3ccc8CC8x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y123abcEv,_ZThn4_N3ccc8CC8x4y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x4y123abcEv,_ZTv0_n16_N3ccc8CC8x4y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x4y12E[] = {
  {&(_ZTVN3ccc8CC8x4y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x4y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x4y12E[];
static VTBL_ENTRY alt_thunk_names1313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x4y123abcEv,_ZTv0_n16_N3ccc8CC8x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x4y123abcEv,_ZThn4_N3ccc8CC8x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x4y12E = {  "_ZN3ccc8CC8x4y12E", // class name
  bases__ZN3ccc8CC8x4y12E, 2,
  &(vtc__ZN3ccc8CC8x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x4y12E),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  DD8x4y12  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD8x4y123abcEv
  ~DD8x4y12(); // tgen
  DD8x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x4y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD8x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x4y123abcEv");}
ccc::DD8x4y12 ::~DD8x4y12(){ note_dtor("_ZN3ccc8DD8x4y12E", this);} // tgen
ccc::DD8x4y12 ::DD8x4y12(){ note_ctor("_ZN3ccc8DD8x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x4y12E, buf);
    ::ccc::DD8x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x4y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD8x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x4y12E);
    dp->::ccc::DD8x4y12::~DD8x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x4y12E(Test__ZN3ccc8DD8x4y12E, "_ZN3ccc8DD8x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x4y12C1Ev();
extern void _ZN3ccc8DD8x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x4y12E[] = {
  NSPAIR(_ZN3ccc8DD8x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD8x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x4y123abcEv,_ZTv0_n16_N3ccc8DD8x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y123abcEv,_ZThn4_N3ccc8DD8x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x4y123abcEv,_ZTv0_n16_N3ccc8DD8x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x4y12E[] = {
  {&(_ZTVN3ccc8DD8x4y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x4y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x4y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x4y12E[];
static VTBL_ENTRY alt_thunk_names1314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x4y123abcEv,_ZTv0_n16_N3ccc8DD8x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y123abcEv,_ZThn4_N3ccc8DD8x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x4y12E = {  "_ZN3ccc8DD8x4y12E", // class name
  bases__ZN3ccc8DD8x4y12E, 2,
  &(vtc__ZN3ccc8DD8x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x4y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x4y12E),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  CC8x4y13  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC8x4y133efgEv
  ~CC8x4y13(); // tgen
  CC8x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC8x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x4y133efgEv");}
ccc::CC8x4y13 ::~CC8x4y13(){ note_dtor("_ZN3ccc8CC8x4y13E", this);} // tgen
ccc::CC8x4y13 ::CC8x4y13(){ note_ctor("_ZN3ccc8CC8x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x4y13E, buf);
    ::ccc::CC8x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x4y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC8x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x4y13E);
    dp->::ccc::CC8x4y13::~CC8x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x4y13E(Test__ZN3ccc8CC8x4y13E, "_ZN3ccc8CC8x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x4y13C1Ev();
extern void _ZN3ccc8CC8x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x4y13E[] = {
  NSPAIR(_ZN3ccc8CC8x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC8x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC8x4y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x4y133efgEv,_ZTv0_n12_N3ccc8CC8x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x4y133efgEv,_ZThn4_N3ccc8CC8x4y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x4y133efgEv,_ZTv0_n12_N3ccc8CC8x4y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x4y13E[] = {
  {&(_ZTVN3ccc8CC8x4y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x4y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x4y13E[];
static VTBL_ENTRY alt_thunk_names1315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x4y133efgEv,_ZTv0_n12_N3ccc8CC8x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x4y133efgEv,_ZThn4_N3ccc8CC8x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x4y13E = {  "_ZN3ccc8CC8x4y13E", // class name
  bases__ZN3ccc8CC8x4y13E, 2,
  &(vtc__ZN3ccc8CC8x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x4y13E),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  DD8x4y13  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD8x4y133efgEv
  ~DD8x4y13(); // tgen
  DD8x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x4y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD8x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x4y133efgEv");}
ccc::DD8x4y13 ::~DD8x4y13(){ note_dtor("_ZN3ccc8DD8x4y13E", this);} // tgen
ccc::DD8x4y13 ::DD8x4y13(){ note_ctor("_ZN3ccc8DD8x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x4y13E, buf);
    ::ccc::DD8x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x4y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD8x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x4y13E);
    dp->::ccc::DD8x4y13::~DD8x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x4y13E(Test__ZN3ccc8DD8x4y13E, "_ZN3ccc8DD8x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x4y13C1Ev();
extern void _ZN3ccc8DD8x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x4y13E[] = {
  NSPAIR(_ZN3ccc8DD8x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD8x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y13E[];
extern void _ZN3ccc8DD8x4y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x4y133efgEv,_ZTv0_n20_N3ccc8DD8x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y133efgEv,_ZThn4_N3ccc8DD8x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x4y133efgEv,_ZTv0_n20_N3ccc8DD8x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x4y13E[] = {
  {&(_ZTVN3ccc8DD8x4y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x4y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x4y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x4y13E[];
static VTBL_ENTRY alt_thunk_names1316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x4y133efgEv,_ZTv0_n20_N3ccc8DD8x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y133efgEv,_ZThn4_N3ccc8DD8x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x4y13E = {  "_ZN3ccc8DD8x4y13E", // class name
  bases__ZN3ccc8DD8x4y13E, 2,
  &(vtc__ZN3ccc8DD8x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x4y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x4y13E),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  CC8x4y14  : virtual ::ccc::AA8 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC8x4y143pqrEv
  ~CC8x4y14(); // tgen
  CC8x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC8x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x4y143pqrEv");}
ccc::CC8x4y14 ::~CC8x4y14(){ note_dtor("_ZN3ccc8CC8x4y14E", this);} // tgen
ccc::CC8x4y14 ::CC8x4y14(){ note_ctor("_ZN3ccc8CC8x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x4y14E, buf);
    ::ccc::CC8x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x4y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC8x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x4y14E);
    dp->::ccc::CC8x4y14::~CC8x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x4y14E(Test__ZN3ccc8CC8x4y14E, "_ZN3ccc8CC8x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x4y14C1Ev();
extern void _ZN3ccc8CC8x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x4y14E[] = {
  NSPAIR(_ZN3ccc8CC8x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC8x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x4y14E[];
extern void _ZN3ccc8CC8x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x4y14E[] = {
  {&(_ZTVN3ccc8CC8x4y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x4y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x4y14E[];
Class_Descriptor cd__ZN3ccc8CC8x4y14E = {  "_ZN3ccc8CC8x4y14E", // class name
  bases__ZN3ccc8CC8x4y14E, 2,
  &(vtc__ZN3ccc8CC8x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x4y14E),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  DD8x4y14  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD8x4y143pqrEv
  ~DD8x4y14(); // tgen
  DD8x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x4y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD8x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x4y143pqrEv");}
ccc::DD8x4y14 ::~DD8x4y14(){ note_dtor("_ZN3ccc8DD8x4y14E", this);} // tgen
ccc::DD8x4y14 ::DD8x4y14(){ note_ctor("_ZN3ccc8DD8x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x4y14E, buf);
    ::ccc::DD8x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x4y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD8x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x4y14E);
    dp->::ccc::DD8x4y14::~DD8x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x4y14E(Test__ZN3ccc8DD8x4y14E, "_ZN3ccc8DD8x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x4y14C1Ev();
extern void _ZN3ccc8DD8x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x4y14E[] = {
  NSPAIR(_ZN3ccc8DD8x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD8x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x4y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x4y143pqrEv,_ZTv0_n12_N3ccc8DD8x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x4y143pqrEv,_ZThn4_N3ccc8DD8x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x4y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x4y143pqrEv,_ZTv0_n12_N3ccc8DD8x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x4y14E[] = {
  {&(_ZTVN3ccc8DD8x4y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x4y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x4y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x4y14E[];
static VTBL_ENTRY alt_thunk_names1317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x4y143pqrEv,_ZTv0_n12_N3ccc8DD8x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x4y143pqrEv,_ZThn4_N3ccc8DD8x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x4y14E = {  "_ZN3ccc8DD8x4y14E", // class name
  bases__ZN3ccc8DD8x4y14E, 2,
  &(vtc__ZN3ccc8DD8x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x4y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x4y14E),3, //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  CC8x4y15  : virtual ::ccc::AA8 , ::ccc::BB4 {
  ~CC8x4y15(); // tgen
  CC8x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x4y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC8x4y15 ::~CC8x4y15(){ note_dtor("_ZN3ccc8CC8x4y15E", this);} // tgen
ccc::CC8x4y15 ::CC8x4y15(){ note_ctor("_ZN3ccc8CC8x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x4y15E, buf);
    ::ccc::CC8x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x4y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC8x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x4y15E);
    dp->::ccc::CC8x4y15::~CC8x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x4y15E(Test__ZN3ccc8CC8x4y15E, "_ZN3ccc8CC8x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x4y15C1Ev();
extern void _ZN3ccc8CC8x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x4y15E[] = {
  NSPAIR(_ZN3ccc8CC8x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC8x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x4y15E[] = {
  {&(_ZTVN3ccc8CC8x4y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x4y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x4y15E[];
Class_Descriptor cd__ZN3ccc8CC8x4y15E = {  "_ZN3ccc8CC8x4y15E", // class name
  bases__ZN3ccc8CC8x4y15E, 2,
  &(vtc__ZN3ccc8CC8x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x4y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x4y15E),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  DD8x4y15  : virtual ::ccc::AA8 , virtual ::ccc::BB4 {
  ~DD8x4y15(); // tgen
  DD8x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x4y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD8x4y15 ::~DD8x4y15(){ note_dtor("_ZN3ccc8DD8x4y15E", this);} // tgen
ccc::DD8x4y15 ::DD8x4y15(){ note_ctor("_ZN3ccc8DD8x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x4y15E, buf);
    ::ccc::DD8x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x4y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD8x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x4y15E);
    dp->::ccc::DD8x4y15::~DD8x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x4y15E(Test__ZN3ccc8DD8x4y15E, "_ZN3ccc8DD8x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x4y15C1Ev();
extern void _ZN3ccc8DD8x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x4y15E[] = {
  NSPAIR(_ZN3ccc8DD8x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD8x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x4y15E[] = {
  {&(_ZTVN3ccc8DD8x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x4y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x4y15E[];
Class_Descriptor cd__ZN3ccc8DD8x4y15E = {  "_ZN3ccc8DD8x4y15E", // class name
  bases__ZN3ccc8DD8x4y15E, 2,
  &(vtc__ZN3ccc8DD8x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x4y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x4y15E),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  CC8x5y0  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y03pqrEv
  ~CC8x5y0(); // tgen
  CC8x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y0E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y03abcEv");}
void  ccc::CC8x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y03efgEv");}
void  ccc::CC8x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y03pqrEv");}
ccc::CC8x5y0 ::~CC8x5y0(){ note_dtor("_ZN3ccc7CC8x5y0E", this);} // tgen
ccc::CC8x5y0 ::CC8x5y0(){ note_ctor("_ZN3ccc7CC8x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y0E, buf);
    ::ccc::CC8x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y0E);
    dp->::ccc::CC8x5y0::~CC8x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y0E(Test__ZN3ccc7CC8x5y0E, "_ZN3ccc7CC8x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y0C1Ev();
extern void _ZN3ccc7CC8x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y0E[] = {
  NSPAIR(_ZN3ccc7CC8x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y0E[];
extern void _ZN3ccc7CC8x5y03pqrEv();
extern void _ZN3ccc7CC8x5y03efgEv();
extern void _ZN3ccc7CC8x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y03efgEv,_ZTv0_n12_N3ccc7CC8x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y03efgEv,_ZThn4_N3ccc7CC8x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y03abcEv,_ZTv0_n16_N3ccc7CC8x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y03abcEv,_ZThn4_N3ccc7CC8x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y03efgEv,_ZTv0_n12_N3ccc7CC8x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y03abcEv,_ZTv0_n16_N3ccc7CC8x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y0E[] = {
  {&(_ZTVN3ccc7CC8x5y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y0E[];
static VTBL_ENTRY alt_thunk_names1318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y03abcEv,_ZTv0_n16_N3ccc7CC8x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y03abcEv,_ZThn4_N3ccc7CC8x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y03efgEv,_ZTv0_n12_N3ccc7CC8x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y03efgEv,_ZThn4_N3ccc7CC8x5y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y0E = {  "_ZN3ccc7CC8x5y0E", // class name
  bases__ZN3ccc7CC8x5y0E, 2,
  &(vtc__ZN3ccc7CC8x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y0E),2, //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  DD8x5y0  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD8x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x5y03pqrEv
  ~DD8x5y0(); // tgen
  DD8x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y0E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y03abcEv");}
void  ccc::DD8x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y03efgEv");}
void  ccc::DD8x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y03pqrEv");}
ccc::DD8x5y0 ::~DD8x5y0(){ note_dtor("_ZN3ccc7DD8x5y0E", this);} // tgen
ccc::DD8x5y0 ::DD8x5y0(){ note_ctor("_ZN3ccc7DD8x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y0E, buf);
    ::ccc::DD8x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y0E);
    dp->::ccc::DD8x5y0::~DD8x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y0E(Test__ZN3ccc7DD8x5y0E, "_ZN3ccc7DD8x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y0C1Ev();
extern void _ZN3ccc7DD8x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y0E[] = {
  NSPAIR(_ZN3ccc7DD8x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y0E[];
extern void _ZN3ccc7DD8x5y03efgEv();
extern void _ZN3ccc7DD8x5y03abcEv();
extern void _ZN3ccc7DD8x5y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y03pqrEv,_ZTv0_n12_N3ccc7DD8x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y03pqrEv,_ZThn4_N3ccc7DD8x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y03efgEv,_ZTv0_n16_N3ccc7DD8x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y03efgEv,_ZThn4_N3ccc7DD8x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y03abcEv,_ZTv0_n20_N3ccc7DD8x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y03abcEv,_ZThn4_N3ccc7DD8x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y03pqrEv,_ZTv0_n12_N3ccc7DD8x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y03efgEv,_ZTv0_n16_N3ccc7DD8x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y03abcEv,_ZTv0_n20_N3ccc7DD8x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y0E[] = {
  {&(_ZTVN3ccc7DD8x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y0E[];
static VTBL_ENTRY alt_thunk_names1319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y03abcEv,_ZTv0_n20_N3ccc7DD8x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y03abcEv,_ZThn4_N3ccc7DD8x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y03efgEv,_ZTv0_n16_N3ccc7DD8x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y03efgEv,_ZThn4_N3ccc7DD8x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y03pqrEv,_ZTv0_n12_N3ccc7DD8x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y03pqrEv,_ZThn4_N3ccc7DD8x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y0E = {  "_ZN3ccc7DD8x5y0E", // class name
  bases__ZN3ccc7DD8x5y0E, 2,
  &(vtc__ZN3ccc7DD8x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y0E),3, //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  CC8x5y1  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x5y13efgEv
  ~CC8x5y1(); // tgen
  CC8x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y1E) C1{ VBC2{ v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y13abcEv");}
void  ccc::CC8x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y13pqrEv");}
void  ccc::CC8x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y13efgEv");}
ccc::CC8x5y1 ::~CC8x5y1(){ note_dtor("_ZN3ccc7CC8x5y1E", this);} // tgen
ccc::CC8x5y1 ::CC8x5y1(){ note_ctor("_ZN3ccc7CC8x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y1E, buf);
    ::ccc::CC8x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y1E);
    dp->::ccc::CC8x5y1::~CC8x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y1E(Test__ZN3ccc7CC8x5y1E, "_ZN3ccc7CC8x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y1C1Ev();
extern void _ZN3ccc7CC8x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y1E[] = {
  NSPAIR(_ZN3ccc7CC8x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y1E[];
extern void _ZN3ccc7CC8x5y13pqrEv();
extern void _ZN3ccc7CC8x5y13efgEv();
extern void _ZN3ccc7CC8x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y13efgEv,_ZTv0_n12_N3ccc7CC8x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y13efgEv,_ZThn4_N3ccc7CC8x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y13abcEv,_ZTv0_n16_N3ccc7CC8x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y13abcEv,_ZThn4_N3ccc7CC8x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y13efgEv,_ZTv0_n12_N3ccc7CC8x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y13abcEv,_ZTv0_n16_N3ccc7CC8x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y1E[] = {
  {&(_ZTVN3ccc7CC8x5y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y1E[];
static VTBL_ENTRY alt_thunk_names1320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y13abcEv,_ZTv0_n16_N3ccc7CC8x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y13abcEv,_ZThn4_N3ccc7CC8x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y13efgEv,_ZTv0_n12_N3ccc7CC8x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y13efgEv,_ZThn4_N3ccc7CC8x5y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y1E = {  "_ZN3ccc7CC8x5y1E", // class name
  bases__ZN3ccc7CC8x5y1E, 2,
  &(vtc__ZN3ccc7CC8x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y1E),2, //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  DD8x5y1  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD8x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x5y13efgEv
  ~DD8x5y1(); // tgen
  DD8x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y1E) C1{ VBC2{ v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y13abcEv");}
void  ccc::DD8x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y13pqrEv");}
void  ccc::DD8x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y13efgEv");}
ccc::DD8x5y1 ::~DD8x5y1(){ note_dtor("_ZN3ccc7DD8x5y1E", this);} // tgen
ccc::DD8x5y1 ::DD8x5y1(){ note_ctor("_ZN3ccc7DD8x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y1E, buf);
    ::ccc::DD8x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y1E);
    dp->::ccc::DD8x5y1::~DD8x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y1E(Test__ZN3ccc7DD8x5y1E, "_ZN3ccc7DD8x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y1C1Ev();
extern void _ZN3ccc7DD8x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y1E[] = {
  NSPAIR(_ZN3ccc7DD8x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y1E[];
extern void _ZN3ccc7DD8x5y13efgEv();
extern void _ZN3ccc7DD8x5y13abcEv();
extern void _ZN3ccc7DD8x5y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y13pqrEv,_ZTv0_n12_N3ccc7DD8x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y13pqrEv,_ZThn4_N3ccc7DD8x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y13efgEv,_ZTv0_n16_N3ccc7DD8x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y13efgEv,_ZThn4_N3ccc7DD8x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y13abcEv,_ZTv0_n20_N3ccc7DD8x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y13abcEv,_ZThn4_N3ccc7DD8x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y13pqrEv,_ZTv0_n12_N3ccc7DD8x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y13efgEv,_ZTv0_n16_N3ccc7DD8x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y13abcEv,_ZTv0_n20_N3ccc7DD8x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y1E[] = {
  {&(_ZTVN3ccc7DD8x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y1E[];
static VTBL_ENTRY alt_thunk_names1321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y13abcEv,_ZTv0_n20_N3ccc7DD8x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y13abcEv,_ZThn4_N3ccc7DD8x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y13efgEv,_ZTv0_n16_N3ccc7DD8x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y13efgEv,_ZThn4_N3ccc7DD8x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y13pqrEv,_ZTv0_n12_N3ccc7DD8x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y13pqrEv,_ZThn4_N3ccc7DD8x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y1E = {  "_ZN3ccc7DD8x5y1E", // class name
  bases__ZN3ccc7DD8x5y1E, 2,
  &(vtc__ZN3ccc7DD8x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y1E),3, //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  CC8x5y2  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y23pqrEv
  ~CC8x5y2(); // tgen
  CC8x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y2E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y23efgEv");}
void  ccc::CC8x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y23abcEv");}
void  ccc::CC8x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y23pqrEv");}
ccc::CC8x5y2 ::~CC8x5y2(){ note_dtor("_ZN3ccc7CC8x5y2E", this);} // tgen
ccc::CC8x5y2 ::CC8x5y2(){ note_ctor("_ZN3ccc7CC8x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y2E, buf);
    ::ccc::CC8x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y2E);
    dp->::ccc::CC8x5y2::~CC8x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y2E(Test__ZN3ccc7CC8x5y2E, "_ZN3ccc7CC8x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y2C1Ev();
extern void _ZN3ccc7CC8x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y2E[] = {
  NSPAIR(_ZN3ccc7CC8x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y2E[];
extern void _ZN3ccc7CC8x5y23pqrEv();
extern void _ZN3ccc7CC8x5y23efgEv();
extern void _ZN3ccc7CC8x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y23efgEv,_ZTv0_n12_N3ccc7CC8x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y23efgEv,_ZThn4_N3ccc7CC8x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y23abcEv,_ZTv0_n16_N3ccc7CC8x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y23abcEv,_ZThn4_N3ccc7CC8x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y23efgEv,_ZTv0_n12_N3ccc7CC8x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y23abcEv,_ZTv0_n16_N3ccc7CC8x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y2E[] = {
  {&(_ZTVN3ccc7CC8x5y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y2E[];
static VTBL_ENTRY alt_thunk_names1322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y23abcEv,_ZTv0_n16_N3ccc7CC8x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y23abcEv,_ZThn4_N3ccc7CC8x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y23efgEv,_ZTv0_n12_N3ccc7CC8x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y23efgEv,_ZThn4_N3ccc7CC8x5y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y2E = {  "_ZN3ccc7CC8x5y2E", // class name
  bases__ZN3ccc7CC8x5y2E, 2,
  &(vtc__ZN3ccc7CC8x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y2E),2, //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  DD8x5y2  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD8x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x5y23pqrEv
  ~DD8x5y2(); // tgen
  DD8x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y2E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y23efgEv");}
void  ccc::DD8x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y23abcEv");}
void  ccc::DD8x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y23pqrEv");}
ccc::DD8x5y2 ::~DD8x5y2(){ note_dtor("_ZN3ccc7DD8x5y2E", this);} // tgen
ccc::DD8x5y2 ::DD8x5y2(){ note_ctor("_ZN3ccc7DD8x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y2E, buf);
    ::ccc::DD8x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y2E);
    dp->::ccc::DD8x5y2::~DD8x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y2E(Test__ZN3ccc7DD8x5y2E, "_ZN3ccc7DD8x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y2C1Ev();
extern void _ZN3ccc7DD8x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y2E[] = {
  NSPAIR(_ZN3ccc7DD8x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y2E[];
extern void _ZN3ccc7DD8x5y23efgEv();
extern void _ZN3ccc7DD8x5y23abcEv();
extern void _ZN3ccc7DD8x5y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y23pqrEv,_ZTv0_n12_N3ccc7DD8x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y23pqrEv,_ZThn4_N3ccc7DD8x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y23efgEv,_ZTv0_n16_N3ccc7DD8x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y23efgEv,_ZThn4_N3ccc7DD8x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y23abcEv,_ZTv0_n20_N3ccc7DD8x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y23abcEv,_ZThn4_N3ccc7DD8x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y23pqrEv,_ZTv0_n12_N3ccc7DD8x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y23efgEv,_ZTv0_n16_N3ccc7DD8x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y23abcEv,_ZTv0_n20_N3ccc7DD8x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y2E[] = {
  {&(_ZTVN3ccc7DD8x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y2E[];
static VTBL_ENTRY alt_thunk_names1323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y23abcEv,_ZTv0_n20_N3ccc7DD8x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y23abcEv,_ZThn4_N3ccc7DD8x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y23efgEv,_ZTv0_n16_N3ccc7DD8x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y23efgEv,_ZThn4_N3ccc7DD8x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y23pqrEv,_ZTv0_n12_N3ccc7DD8x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y23pqrEv,_ZThn4_N3ccc7DD8x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y2E = {  "_ZN3ccc7DD8x5y2E", // class name
  bases__ZN3ccc7DD8x5y2E, 2,
  &(vtc__ZN3ccc7DD8x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y2E),3, //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  CC8x5y3  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x5y33abcEv
  ~CC8x5y3(); // tgen
  CC8x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y3E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y33efgEv");}
void  ccc::CC8x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y33pqrEv");}
void  ccc::CC8x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y33abcEv");}
ccc::CC8x5y3 ::~CC8x5y3(){ note_dtor("_ZN3ccc7CC8x5y3E", this);} // tgen
ccc::CC8x5y3 ::CC8x5y3(){ note_ctor("_ZN3ccc7CC8x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y3E, buf);
    ::ccc::CC8x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y3E);
    dp->::ccc::CC8x5y3::~CC8x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y3E(Test__ZN3ccc7CC8x5y3E, "_ZN3ccc7CC8x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y3C1Ev();
extern void _ZN3ccc7CC8x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y3E[] = {
  NSPAIR(_ZN3ccc7CC8x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y3E[];
extern void _ZN3ccc7CC8x5y33pqrEv();
extern void _ZN3ccc7CC8x5y33efgEv();
extern void _ZN3ccc7CC8x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y33efgEv,_ZTv0_n12_N3ccc7CC8x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y33efgEv,_ZThn4_N3ccc7CC8x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y33abcEv,_ZTv0_n16_N3ccc7CC8x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y33abcEv,_ZThn4_N3ccc7CC8x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y33efgEv,_ZTv0_n12_N3ccc7CC8x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y33abcEv,_ZTv0_n16_N3ccc7CC8x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y3E[] = {
  {&(_ZTVN3ccc7CC8x5y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y3E[];
static VTBL_ENTRY alt_thunk_names1324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y33abcEv,_ZTv0_n16_N3ccc7CC8x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y33abcEv,_ZThn4_N3ccc7CC8x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y33efgEv,_ZTv0_n12_N3ccc7CC8x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y33efgEv,_ZThn4_N3ccc7CC8x5y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y3E = {  "_ZN3ccc7CC8x5y3E", // class name
  bases__ZN3ccc7CC8x5y3E, 2,
  &(vtc__ZN3ccc7CC8x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y3E),2, //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  DD8x5y3  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD8x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x5y33abcEv
  ~DD8x5y3(); // tgen
  DD8x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y3E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y33efgEv");}
void  ccc::DD8x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y33pqrEv");}
void  ccc::DD8x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y33abcEv");}
ccc::DD8x5y3 ::~DD8x5y3(){ note_dtor("_ZN3ccc7DD8x5y3E", this);} // tgen
ccc::DD8x5y3 ::DD8x5y3(){ note_ctor("_ZN3ccc7DD8x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y3E, buf);
    ::ccc::DD8x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y3E);
    dp->::ccc::DD8x5y3::~DD8x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y3E(Test__ZN3ccc7DD8x5y3E, "_ZN3ccc7DD8x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y3C1Ev();
extern void _ZN3ccc7DD8x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y3E[] = {
  NSPAIR(_ZN3ccc7DD8x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y3E[];
extern void _ZN3ccc7DD8x5y33efgEv();
extern void _ZN3ccc7DD8x5y33abcEv();
extern void _ZN3ccc7DD8x5y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y33pqrEv,_ZTv0_n12_N3ccc7DD8x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y33pqrEv,_ZThn4_N3ccc7DD8x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y33efgEv,_ZTv0_n16_N3ccc7DD8x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y33efgEv,_ZThn4_N3ccc7DD8x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y33abcEv,_ZTv0_n20_N3ccc7DD8x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y33abcEv,_ZThn4_N3ccc7DD8x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y33pqrEv,_ZTv0_n12_N3ccc7DD8x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y33efgEv,_ZTv0_n16_N3ccc7DD8x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y33abcEv,_ZTv0_n20_N3ccc7DD8x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y3E[] = {
  {&(_ZTVN3ccc7DD8x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y3E[];
static VTBL_ENTRY alt_thunk_names1325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y33abcEv,_ZTv0_n20_N3ccc7DD8x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y33abcEv,_ZThn4_N3ccc7DD8x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y33efgEv,_ZTv0_n16_N3ccc7DD8x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y33efgEv,_ZThn4_N3ccc7DD8x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y33pqrEv,_ZTv0_n12_N3ccc7DD8x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y33pqrEv,_ZThn4_N3ccc7DD8x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y3E = {  "_ZN3ccc7DD8x5y3E", // class name
  bases__ZN3ccc7DD8x5y3E, 2,
  &(vtc__ZN3ccc7DD8x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y3E),3, //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  CC8x5y4  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC8x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x5y43efgEv
  ~CC8x5y4(); // tgen
  CC8x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y4E) C1{ VBC2{ v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y43pqrEv");}
void  ccc::CC8x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y43abcEv");}
void  ccc::CC8x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y43efgEv");}
ccc::CC8x5y4 ::~CC8x5y4(){ note_dtor("_ZN3ccc7CC8x5y4E", this);} // tgen
ccc::CC8x5y4 ::CC8x5y4(){ note_ctor("_ZN3ccc7CC8x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y4E, buf);
    ::ccc::CC8x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y4E);
    dp->::ccc::CC8x5y4::~CC8x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y4E(Test__ZN3ccc7CC8x5y4E, "_ZN3ccc7CC8x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y4C1Ev();
extern void _ZN3ccc7CC8x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y4E[] = {
  NSPAIR(_ZN3ccc7CC8x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y4E[];
extern void _ZN3ccc7CC8x5y43pqrEv();
extern void _ZN3ccc7CC8x5y43efgEv();
extern void _ZN3ccc7CC8x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y43efgEv,_ZTv0_n12_N3ccc7CC8x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y43efgEv,_ZThn4_N3ccc7CC8x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y43abcEv,_ZTv0_n16_N3ccc7CC8x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y43abcEv,_ZThn4_N3ccc7CC8x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y43efgEv,_ZTv0_n12_N3ccc7CC8x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y43abcEv,_ZTv0_n16_N3ccc7CC8x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y4E[] = {
  {&(_ZTVN3ccc7CC8x5y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y4E[];
static VTBL_ENTRY alt_thunk_names1326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y43abcEv,_ZTv0_n16_N3ccc7CC8x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y43abcEv,_ZThn4_N3ccc7CC8x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y43efgEv,_ZTv0_n12_N3ccc7CC8x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y43efgEv,_ZThn4_N3ccc7CC8x5y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y4E = {  "_ZN3ccc7CC8x5y4E", // class name
  bases__ZN3ccc7CC8x5y4E, 2,
  &(vtc__ZN3ccc7CC8x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y4E),2, //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  DD8x5y4  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD8x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x5y43efgEv
  ~DD8x5y4(); // tgen
  DD8x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y4E) C1{ VBC2{ v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y43pqrEv");}
void  ccc::DD8x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y43abcEv");}
void  ccc::DD8x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y43efgEv");}
ccc::DD8x5y4 ::~DD8x5y4(){ note_dtor("_ZN3ccc7DD8x5y4E", this);} // tgen
ccc::DD8x5y4 ::DD8x5y4(){ note_ctor("_ZN3ccc7DD8x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y4E, buf);
    ::ccc::DD8x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y4E);
    dp->::ccc::DD8x5y4::~DD8x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y4E(Test__ZN3ccc7DD8x5y4E, "_ZN3ccc7DD8x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y4C1Ev();
extern void _ZN3ccc7DD8x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y4E[] = {
  NSPAIR(_ZN3ccc7DD8x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y4E[];
extern void _ZN3ccc7DD8x5y43efgEv();
extern void _ZN3ccc7DD8x5y43abcEv();
extern void _ZN3ccc7DD8x5y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y43pqrEv,_ZTv0_n12_N3ccc7DD8x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y43pqrEv,_ZThn4_N3ccc7DD8x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y43efgEv,_ZTv0_n16_N3ccc7DD8x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y43efgEv,_ZThn4_N3ccc7DD8x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y43abcEv,_ZTv0_n20_N3ccc7DD8x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y43abcEv,_ZThn4_N3ccc7DD8x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y43pqrEv,_ZTv0_n12_N3ccc7DD8x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y43efgEv,_ZTv0_n16_N3ccc7DD8x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y43abcEv,_ZTv0_n20_N3ccc7DD8x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y4E[] = {
  {&(_ZTVN3ccc7DD8x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y4E[];
static VTBL_ENTRY alt_thunk_names1327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y43abcEv,_ZTv0_n20_N3ccc7DD8x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y43abcEv,_ZThn4_N3ccc7DD8x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y43efgEv,_ZTv0_n16_N3ccc7DD8x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y43efgEv,_ZThn4_N3ccc7DD8x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y43pqrEv,_ZTv0_n12_N3ccc7DD8x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y43pqrEv,_ZThn4_N3ccc7DD8x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y4E = {  "_ZN3ccc7DD8x5y4E", // class name
  bases__ZN3ccc7DD8x5y4E, 2,
  &(vtc__ZN3ccc7DD8x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y4E),3, //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  CC8x5y5  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC8x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x5y53abcEv
  ~CC8x5y5(); // tgen
  CC8x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y5E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y53pqrEv");}
void  ccc::CC8x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y53efgEv");}
void  ccc::CC8x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y53abcEv");}
ccc::CC8x5y5 ::~CC8x5y5(){ note_dtor("_ZN3ccc7CC8x5y5E", this);} // tgen
ccc::CC8x5y5 ::CC8x5y5(){ note_ctor("_ZN3ccc7CC8x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y5E, buf);
    ::ccc::CC8x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y5E);
    dp->::ccc::CC8x5y5::~CC8x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y5E(Test__ZN3ccc7CC8x5y5E, "_ZN3ccc7CC8x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y5C1Ev();
extern void _ZN3ccc7CC8x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y5E[] = {
  NSPAIR(_ZN3ccc7CC8x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y5E[];
extern void _ZN3ccc7CC8x5y53pqrEv();
extern void _ZN3ccc7CC8x5y53efgEv();
extern void _ZN3ccc7CC8x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y53efgEv,_ZTv0_n12_N3ccc7CC8x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y53efgEv,_ZThn4_N3ccc7CC8x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y53abcEv,_ZTv0_n16_N3ccc7CC8x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y53abcEv,_ZThn4_N3ccc7CC8x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y53efgEv,_ZTv0_n12_N3ccc7CC8x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y53abcEv,_ZTv0_n16_N3ccc7CC8x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y5E[] = {
  {&(_ZTVN3ccc7CC8x5y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y5E[];
static VTBL_ENTRY alt_thunk_names1328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y53abcEv,_ZTv0_n16_N3ccc7CC8x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y53abcEv,_ZThn4_N3ccc7CC8x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y53efgEv,_ZTv0_n12_N3ccc7CC8x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y53efgEv,_ZThn4_N3ccc7CC8x5y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y5E = {  "_ZN3ccc7CC8x5y5E", // class name
  bases__ZN3ccc7CC8x5y5E, 2,
  &(vtc__ZN3ccc7CC8x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y5E),2, //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  DD8x5y5  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD8x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x5y53abcEv
  ~DD8x5y5(); // tgen
  DD8x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y5E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y53pqrEv");}
void  ccc::DD8x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y53efgEv");}
void  ccc::DD8x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y53abcEv");}
ccc::DD8x5y5 ::~DD8x5y5(){ note_dtor("_ZN3ccc7DD8x5y5E", this);} // tgen
ccc::DD8x5y5 ::DD8x5y5(){ note_ctor("_ZN3ccc7DD8x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y5E, buf);
    ::ccc::DD8x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y5E);
    dp->::ccc::DD8x5y5::~DD8x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y5E(Test__ZN3ccc7DD8x5y5E, "_ZN3ccc7DD8x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y5C1Ev();
extern void _ZN3ccc7DD8x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y5E[] = {
  NSPAIR(_ZN3ccc7DD8x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y5E[];
extern void _ZN3ccc7DD8x5y53efgEv();
extern void _ZN3ccc7DD8x5y53abcEv();
extern void _ZN3ccc7DD8x5y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y53pqrEv,_ZTv0_n12_N3ccc7DD8x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y53pqrEv,_ZThn4_N3ccc7DD8x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y53efgEv,_ZTv0_n16_N3ccc7DD8x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y53efgEv,_ZThn4_N3ccc7DD8x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y53abcEv,_ZTv0_n20_N3ccc7DD8x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y53abcEv,_ZThn4_N3ccc7DD8x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y53pqrEv,_ZTv0_n12_N3ccc7DD8x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y53efgEv,_ZTv0_n16_N3ccc7DD8x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y53abcEv,_ZTv0_n20_N3ccc7DD8x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y5E[] = {
  {&(_ZTVN3ccc7DD8x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y5E[];
static VTBL_ENTRY alt_thunk_names1329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y53abcEv,_ZTv0_n20_N3ccc7DD8x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y53abcEv,_ZThn4_N3ccc7DD8x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y53efgEv,_ZTv0_n16_N3ccc7DD8x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y53efgEv,_ZThn4_N3ccc7DD8x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y53pqrEv,_ZTv0_n12_N3ccc7DD8x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y53pqrEv,_ZThn4_N3ccc7DD8x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y5E = {  "_ZN3ccc7DD8x5y5E", // class name
  bases__ZN3ccc7DD8x5y5E, 2,
  &(vtc__ZN3ccc7DD8x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y5E),3, //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  CC8x5y6  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x5y63efgEv
  ~CC8x5y6(); // tgen
  CC8x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y6E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y63abcEv");}
void  ccc::CC8x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y63efgEv");}
ccc::CC8x5y6 ::~CC8x5y6(){ note_dtor("_ZN3ccc7CC8x5y6E", this);} // tgen
ccc::CC8x5y6 ::CC8x5y6(){ note_ctor("_ZN3ccc7CC8x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y6E, buf);
    ::ccc::CC8x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y6E);
    dp->::ccc::CC8x5y6::~CC8x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y6E(Test__ZN3ccc7CC8x5y6E, "_ZN3ccc7CC8x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y6C1Ev();
extern void _ZN3ccc7CC8x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y6E[] = {
  NSPAIR(_ZN3ccc7CC8x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC8x5y63efgEv();
extern void _ZN3ccc7CC8x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y63efgEv,_ZTv0_n12_N3ccc7CC8x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y63efgEv,_ZThn4_N3ccc7CC8x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y63abcEv,_ZTv0_n16_N3ccc7CC8x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y63abcEv,_ZThn4_N3ccc7CC8x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y63efgEv,_ZTv0_n12_N3ccc7CC8x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y63abcEv,_ZTv0_n16_N3ccc7CC8x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y6E[] = {
  {&(_ZTVN3ccc7CC8x5y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y6E[];
static VTBL_ENTRY alt_thunk_names1330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y63abcEv,_ZTv0_n16_N3ccc7CC8x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y63abcEv,_ZThn4_N3ccc7CC8x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y63efgEv,_ZTv0_n12_N3ccc7CC8x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y63efgEv,_ZThn4_N3ccc7CC8x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y6E = {  "_ZN3ccc7CC8x5y6E", // class name
  bases__ZN3ccc7CC8x5y6E, 2,
  &(vtc__ZN3ccc7CC8x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y6E),2, //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  DD8x5y6  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD8x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x5y63efgEv
  ~DD8x5y6(); // tgen
  DD8x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y6E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y63abcEv");}
void  ccc::DD8x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y63efgEv");}
ccc::DD8x5y6 ::~DD8x5y6(){ note_dtor("_ZN3ccc7DD8x5y6E", this);} // tgen
ccc::DD8x5y6 ::DD8x5y6(){ note_ctor("_ZN3ccc7DD8x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y6E, buf);
    ::ccc::DD8x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y6E);
    dp->::ccc::DD8x5y6::~DD8x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y6E(Test__ZN3ccc7DD8x5y6E, "_ZN3ccc7DD8x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y6C1Ev();
extern void _ZN3ccc7DD8x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y6E[] = {
  NSPAIR(_ZN3ccc7DD8x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y6E[];
extern void _ZN3ccc7DD8x5y63efgEv();
extern void _ZN3ccc7DD8x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y63efgEv,_ZTv0_n16_N3ccc7DD8x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y63efgEv,_ZThn4_N3ccc7DD8x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y63abcEv,_ZTv0_n20_N3ccc7DD8x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y63abcEv,_ZThn4_N3ccc7DD8x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y63efgEv,_ZTv0_n16_N3ccc7DD8x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y63abcEv,_ZTv0_n20_N3ccc7DD8x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y6E[] = {
  {&(_ZTVN3ccc7DD8x5y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x5y6E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x5y6E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y6E[];
static VTBL_ENTRY alt_thunk_names1331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y63abcEv,_ZTv0_n20_N3ccc7DD8x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y63abcEv,_ZThn4_N3ccc7DD8x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y63efgEv,_ZTv0_n16_N3ccc7DD8x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y63efgEv,_ZThn4_N3ccc7DD8x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y6E = {  "_ZN3ccc7DD8x5y6E", // class name
  bases__ZN3ccc7DD8x5y6E, 2,
  &(vtc__ZN3ccc7DD8x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y6E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y6E),3, //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  CC8x5y7  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC8x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y73pqrEv
  ~CC8x5y7(); // tgen
  CC8x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y7E) C1{ VBC2{ v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y73abcEv");}
void  ccc::CC8x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y73pqrEv");}
ccc::CC8x5y7 ::~CC8x5y7(){ note_dtor("_ZN3ccc7CC8x5y7E", this);} // tgen
ccc::CC8x5y7 ::CC8x5y7(){ note_ctor("_ZN3ccc7CC8x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y7E, buf);
    ::ccc::CC8x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y7E);
    dp->::ccc::CC8x5y7::~CC8x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y7E(Test__ZN3ccc7CC8x5y7E, "_ZN3ccc7CC8x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y7C1Ev();
extern void _ZN3ccc7CC8x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y7E[] = {
  NSPAIR(_ZN3ccc7CC8x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y7E[];
extern void _ZN3ccc7CC8x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC8x5y73abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y73abcEv,_ZTv0_n16_N3ccc7CC8x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y73abcEv,_ZThn4_N3ccc7CC8x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y73abcEv,_ZTv0_n16_N3ccc7CC8x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y7E[] = {
  {&(_ZTVN3ccc7CC8x5y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y7E[];
static VTBL_ENTRY alt_thunk_names1332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y73abcEv,_ZTv0_n16_N3ccc7CC8x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y73abcEv,_ZThn4_N3ccc7CC8x5y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y7E = {  "_ZN3ccc7CC8x5y7E", // class name
  bases__ZN3ccc7CC8x5y7E, 2,
  &(vtc__ZN3ccc7CC8x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y7E),2, //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  DD8x5y7  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD8x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x5y73pqrEv
  ~DD8x5y7(); // tgen
  DD8x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y7E) C1{ VBC2{ v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y73abcEv");}
void  ccc::DD8x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y73pqrEv");}
ccc::DD8x5y7 ::~DD8x5y7(){ note_dtor("_ZN3ccc7DD8x5y7E", this);} // tgen
ccc::DD8x5y7 ::DD8x5y7(){ note_ctor("_ZN3ccc7DD8x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y7E, buf);
    ::ccc::DD8x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y7E);
    dp->::ccc::DD8x5y7::~DD8x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y7E(Test__ZN3ccc7DD8x5y7E, "_ZN3ccc7DD8x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y7C1Ev();
extern void _ZN3ccc7DD8x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y7E[] = {
  NSPAIR(_ZN3ccc7DD8x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x5y73abcEv();
extern void _ZN3ccc7DD8x5y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y73pqrEv,_ZTv0_n12_N3ccc7DD8x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y73pqrEv,_ZThn4_N3ccc7DD8x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y73abcEv,_ZTv0_n20_N3ccc7DD8x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y73abcEv,_ZThn4_N3ccc7DD8x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y73pqrEv,_ZTv0_n12_N3ccc7DD8x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y73abcEv,_ZTv0_n20_N3ccc7DD8x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y7E[] = {
  {&(_ZTVN3ccc7DD8x5y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y7E[];
static VTBL_ENTRY alt_thunk_names1333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y73abcEv,_ZTv0_n20_N3ccc7DD8x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y73abcEv,_ZThn4_N3ccc7DD8x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y73pqrEv,_ZTv0_n12_N3ccc7DD8x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y73pqrEv,_ZThn4_N3ccc7DD8x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y7E = {  "_ZN3ccc7DD8x5y7E", // class name
  bases__ZN3ccc7DD8x5y7E, 2,
  &(vtc__ZN3ccc7DD8x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y7E),3, //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  CC8x5y8  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x5y83abcEv
  ~CC8x5y8(); // tgen
  CC8x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y8E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y83efgEv");}
void  ccc::CC8x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x5y83abcEv");}
ccc::CC8x5y8 ::~CC8x5y8(){ note_dtor("_ZN3ccc7CC8x5y8E", this);} // tgen
ccc::CC8x5y8 ::CC8x5y8(){ note_ctor("_ZN3ccc7CC8x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y8E, buf);
    ::ccc::CC8x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y8E);
    dp->::ccc::CC8x5y8::~CC8x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y8E(Test__ZN3ccc7CC8x5y8E, "_ZN3ccc7CC8x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y8C1Ev();
extern void _ZN3ccc7CC8x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y8E[] = {
  NSPAIR(_ZN3ccc7CC8x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC8x5y83efgEv();
extern void _ZN3ccc7CC8x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y83efgEv,_ZTv0_n12_N3ccc7CC8x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y83efgEv,_ZThn4_N3ccc7CC8x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x5y83abcEv,_ZTv0_n16_N3ccc7CC8x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y83abcEv,_ZThn4_N3ccc7CC8x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y83efgEv,_ZTv0_n12_N3ccc7CC8x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x5y83abcEv,_ZTv0_n16_N3ccc7CC8x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y8E[] = {
  {&(_ZTVN3ccc7CC8x5y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y8E[];
static VTBL_ENTRY alt_thunk_names1334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x5y83abcEv,_ZTv0_n16_N3ccc7CC8x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y83abcEv,_ZThn4_N3ccc7CC8x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y83efgEv,_ZTv0_n12_N3ccc7CC8x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y83efgEv,_ZThn4_N3ccc7CC8x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y8E = {  "_ZN3ccc7CC8x5y8E", // class name
  bases__ZN3ccc7CC8x5y8E, 2,
  &(vtc__ZN3ccc7CC8x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y8E),2, //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  DD8x5y8  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD8x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x5y83abcEv
  ~DD8x5y8(); // tgen
  DD8x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y8E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y83efgEv");}
void  ccc::DD8x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x5y83abcEv");}
ccc::DD8x5y8 ::~DD8x5y8(){ note_dtor("_ZN3ccc7DD8x5y8E", this);} // tgen
ccc::DD8x5y8 ::DD8x5y8(){ note_ctor("_ZN3ccc7DD8x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y8E, buf);
    ::ccc::DD8x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y8E);
    dp->::ccc::DD8x5y8::~DD8x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y8E(Test__ZN3ccc7DD8x5y8E, "_ZN3ccc7DD8x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y8C1Ev();
extern void _ZN3ccc7DD8x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y8E[] = {
  NSPAIR(_ZN3ccc7DD8x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y8E[];
extern void _ZN3ccc7DD8x5y83efgEv();
extern void _ZN3ccc7DD8x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y83efgEv,_ZTv0_n16_N3ccc7DD8x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y83efgEv,_ZThn4_N3ccc7DD8x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD8x5y83abcEv,_ZTv0_n20_N3ccc7DD8x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y83abcEv,_ZThn4_N3ccc7DD8x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y83efgEv,_ZTv0_n16_N3ccc7DD8x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD8x5y83abcEv,_ZTv0_n20_N3ccc7DD8x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y8E[] = {
  {&(_ZTVN3ccc7DD8x5y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x5y8E[6]),  6,16},
  {&(_ZTVN3ccc7DD8x5y8E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y8E[];
static VTBL_ENTRY alt_thunk_names1335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD8x5y83abcEv,_ZTv0_n20_N3ccc7DD8x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y83abcEv,_ZThn4_N3ccc7DD8x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y83efgEv,_ZTv0_n16_N3ccc7DD8x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y83efgEv,_ZThn4_N3ccc7DD8x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y8E = {  "_ZN3ccc7DD8x5y8E", // class name
  bases__ZN3ccc7DD8x5y8E, 2,
  &(vtc__ZN3ccc7DD8x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y8E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y8E),3, //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  CC8x5y9  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC8x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x5y93pqrEv
  ~CC8x5y9(); // tgen
  CC8x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x5y9E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x5y93efgEv");}
void  ccc::CC8x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x5y93pqrEv");}
ccc::CC8x5y9 ::~CC8x5y9(){ note_dtor("_ZN3ccc7CC8x5y9E", this);} // tgen
ccc::CC8x5y9 ::CC8x5y9(){ note_ctor("_ZN3ccc7CC8x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x5y9E, buf);
    ::ccc::CC8x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x5y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC8x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x5y9E);
    dp->::ccc::CC8x5y9::~CC8x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x5y9E(Test__ZN3ccc7CC8x5y9E, "_ZN3ccc7CC8x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x5y9C1Ev();
extern void _ZN3ccc7CC8x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x5y9E[] = {
  NSPAIR(_ZN3ccc7CC8x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC8x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x5y9E[];
extern void _ZN3ccc7CC8x5y93pqrEv();
extern void _ZN3ccc7CC8x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x5y93efgEv,_ZTv0_n12_N3ccc7CC8x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x5y93efgEv,_ZThn4_N3ccc7CC8x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x5y93efgEv,_ZTv0_n12_N3ccc7CC8x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x5y9E[] = {
  {&(_ZTVN3ccc7CC8x5y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x5y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x5y9E[];
static VTBL_ENTRY alt_thunk_names1336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x5y93efgEv,_ZTv0_n12_N3ccc7CC8x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x5y93efgEv,_ZThn4_N3ccc7CC8x5y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x5y9E = {  "_ZN3ccc7CC8x5y9E", // class name
  bases__ZN3ccc7CC8x5y9E, 2,
  &(vtc__ZN3ccc7CC8x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x5y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x5y9E),2, //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  DD8x5y9  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD8x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x5y93pqrEv
  ~DD8x5y9(); // tgen
  DD8x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x5y9E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x5y93efgEv");}
void  ccc::DD8x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x5y93pqrEv");}
ccc::DD8x5y9 ::~DD8x5y9(){ note_dtor("_ZN3ccc7DD8x5y9E", this);} // tgen
ccc::DD8x5y9 ::DD8x5y9(){ note_ctor("_ZN3ccc7DD8x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x5y9E, buf);
    ::ccc::DD8x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x5y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD8x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x5y9E);
    dp->::ccc::DD8x5y9::~DD8x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x5y9E(Test__ZN3ccc7DD8x5y9E, "_ZN3ccc7DD8x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x5y9C1Ev();
extern void _ZN3ccc7DD8x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x5y9E[] = {
  NSPAIR(_ZN3ccc7DD8x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD8x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y9E[];
extern void _ZN3ccc7DD8x5y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x5y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x5y93pqrEv,_ZTv0_n12_N3ccc7DD8x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y93pqrEv,_ZThn4_N3ccc7DD8x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x5y93efgEv,_ZTv0_n16_N3ccc7DD8x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x5y93efgEv,_ZThn4_N3ccc7DD8x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x5y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x5y93pqrEv,_ZTv0_n12_N3ccc7DD8x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x5y93efgEv,_ZTv0_n16_N3ccc7DD8x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x5y9E[] = {
  {&(_ZTVN3ccc7DD8x5y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y9E[6]),  6,17},
  {&(_ZTVN3ccc7DD8x5y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x5y9E[];
static VTBL_ENTRY alt_thunk_names1337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x5y93efgEv,_ZTv0_n16_N3ccc7DD8x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y93efgEv,_ZThn4_N3ccc7DD8x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x5y93pqrEv,_ZTv0_n12_N3ccc7DD8x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x5y93pqrEv,_ZThn4_N3ccc7DD8x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x5y9E = {  "_ZN3ccc7DD8x5y9E", // class name
  bases__ZN3ccc7DD8x5y9E, 2,
  &(vtc__ZN3ccc7DD8x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x5y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x5y9E),3, //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  CC8x5y10  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC8x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x5y103abcEv
  ~CC8x5y10(); // tgen
  CC8x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y10E) C1{ VBC2{ v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x5y103pqrEv");}
void  ccc::CC8x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x5y103abcEv");}
ccc::CC8x5y10 ::~CC8x5y10(){ note_dtor("_ZN3ccc8CC8x5y10E", this);} // tgen
ccc::CC8x5y10 ::CC8x5y10(){ note_ctor("_ZN3ccc8CC8x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x5y10E, buf);
    ::ccc::CC8x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x5y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC8x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x5y10E);
    dp->::ccc::CC8x5y10::~CC8x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x5y10E(Test__ZN3ccc8CC8x5y10E, "_ZN3ccc8CC8x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x5y10C1Ev();
extern void _ZN3ccc8CC8x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x5y10E[] = {
  NSPAIR(_ZN3ccc8CC8x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC8x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x5y10E[];
extern void _ZN3ccc8CC8x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC8x5y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x5y103abcEv,_ZTv0_n16_N3ccc8CC8x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y103abcEv,_ZThn4_N3ccc8CC8x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x5y103abcEv,_ZTv0_n16_N3ccc8CC8x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x5y10E[] = {
  {&(_ZTVN3ccc8CC8x5y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x5y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x5y10E[];
static VTBL_ENTRY alt_thunk_names1338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x5y103abcEv,_ZTv0_n16_N3ccc8CC8x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x5y103abcEv,_ZThn4_N3ccc8CC8x5y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x5y10E = {  "_ZN3ccc8CC8x5y10E", // class name
  bases__ZN3ccc8CC8x5y10E, 2,
  &(vtc__ZN3ccc8CC8x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x5y10E),2, //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  DD8x5y10  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD8x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x5y103abcEv
  ~DD8x5y10(); // tgen
  DD8x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x5y10E) C1{ VBC2{ v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x5y103pqrEv");}
void  ccc::DD8x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x5y103abcEv");}
ccc::DD8x5y10 ::~DD8x5y10(){ note_dtor("_ZN3ccc8DD8x5y10E", this);} // tgen
ccc::DD8x5y10 ::DD8x5y10(){ note_ctor("_ZN3ccc8DD8x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x5y10E, buf);
    ::ccc::DD8x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x5y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD8x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x5y10E);
    dp->::ccc::DD8x5y10::~DD8x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x5y10E(Test__ZN3ccc8DD8x5y10E, "_ZN3ccc8DD8x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x5y10C1Ev();
extern void _ZN3ccc8DD8x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x5y10E[] = {
  NSPAIR(_ZN3ccc8DD8x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD8x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x5y103abcEv();
extern void _ZN3ccc8DD8x5y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x5y103pqrEv,_ZTv0_n12_N3ccc8DD8x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y103pqrEv,_ZThn4_N3ccc8DD8x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x5y103abcEv,_ZTv0_n20_N3ccc8DD8x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y103abcEv,_ZThn4_N3ccc8DD8x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x5y103pqrEv,_ZTv0_n12_N3ccc8DD8x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x5y103abcEv,_ZTv0_n20_N3ccc8DD8x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x5y10E[] = {
  {&(_ZTVN3ccc8DD8x5y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x5y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x5y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x5y10E[];
static VTBL_ENTRY alt_thunk_names1339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x5y103abcEv,_ZTv0_n20_N3ccc8DD8x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y103abcEv,_ZThn4_N3ccc8DD8x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x5y103pqrEv,_ZTv0_n12_N3ccc8DD8x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y103pqrEv,_ZThn4_N3ccc8DD8x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x5y10E = {  "_ZN3ccc8DD8x5y10E", // class name
  bases__ZN3ccc8DD8x5y10E, 2,
  &(vtc__ZN3ccc8DD8x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x5y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x5y10E),3, //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  CC8x5y11  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC8x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x5y113efgEv
  ~CC8x5y11(); // tgen
  CC8x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y11E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x5y113pqrEv");}
void  ccc::CC8x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x5y113efgEv");}
ccc::CC8x5y11 ::~CC8x5y11(){ note_dtor("_ZN3ccc8CC8x5y11E", this);} // tgen
ccc::CC8x5y11 ::CC8x5y11(){ note_ctor("_ZN3ccc8CC8x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x5y11E, buf);
    ::ccc::CC8x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x5y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC8x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x5y11E);
    dp->::ccc::CC8x5y11::~CC8x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x5y11E(Test__ZN3ccc8CC8x5y11E, "_ZN3ccc8CC8x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x5y11C1Ev();
extern void _ZN3ccc8CC8x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x5y11E[] = {
  NSPAIR(_ZN3ccc8CC8x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC8x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x5y11E[];
extern void _ZN3ccc8CC8x5y113pqrEv();
extern void _ZN3ccc8CC8x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x5y113efgEv,_ZTv0_n12_N3ccc8CC8x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y113efgEv,_ZThn4_N3ccc8CC8x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x5y113efgEv,_ZTv0_n12_N3ccc8CC8x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x5y11E[] = {
  {&(_ZTVN3ccc8CC8x5y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x5y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x5y11E[];
static VTBL_ENTRY alt_thunk_names1340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x5y113efgEv,_ZTv0_n12_N3ccc8CC8x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x5y113efgEv,_ZThn4_N3ccc8CC8x5y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x5y11E = {  "_ZN3ccc8CC8x5y11E", // class name
  bases__ZN3ccc8CC8x5y11E, 2,
  &(vtc__ZN3ccc8CC8x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x5y11E),2, //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  DD8x5y11  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD8x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x5y113efgEv
  ~DD8x5y11(); // tgen
  DD8x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x5y11E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x5y113pqrEv");}
void  ccc::DD8x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x5y113efgEv");}
ccc::DD8x5y11 ::~DD8x5y11(){ note_dtor("_ZN3ccc8DD8x5y11E", this);} // tgen
ccc::DD8x5y11 ::DD8x5y11(){ note_ctor("_ZN3ccc8DD8x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x5y11E, buf);
    ::ccc::DD8x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x5y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD8x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x5y11E);
    dp->::ccc::DD8x5y11::~DD8x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x5y11E(Test__ZN3ccc8DD8x5y11E, "_ZN3ccc8DD8x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x5y11C1Ev();
extern void _ZN3ccc8DD8x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x5y11E[] = {
  NSPAIR(_ZN3ccc8DD8x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD8x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y11E[];
extern void _ZN3ccc8DD8x5y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x5y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x5y113pqrEv,_ZTv0_n12_N3ccc8DD8x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y113pqrEv,_ZThn4_N3ccc8DD8x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x5y113efgEv,_ZTv0_n16_N3ccc8DD8x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y113efgEv,_ZThn4_N3ccc8DD8x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x5y113pqrEv,_ZTv0_n12_N3ccc8DD8x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x5y113efgEv,_ZTv0_n16_N3ccc8DD8x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x5y11E[] = {
  {&(_ZTVN3ccc8DD8x5y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x5y11E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x5y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x5y11E[];
static VTBL_ENTRY alt_thunk_names1341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x5y113efgEv,_ZTv0_n16_N3ccc8DD8x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y113efgEv,_ZThn4_N3ccc8DD8x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x5y113pqrEv,_ZTv0_n12_N3ccc8DD8x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y113pqrEv,_ZThn4_N3ccc8DD8x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x5y11E = {  "_ZN3ccc8DD8x5y11E", // class name
  bases__ZN3ccc8DD8x5y11E, 2,
  &(vtc__ZN3ccc8DD8x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x5y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x5y11E),3, //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  CC8x5y12  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC8x5y123abcEv
  ~CC8x5y12(); // tgen
  CC8x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y12E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC8x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x5y123abcEv");}
ccc::CC8x5y12 ::~CC8x5y12(){ note_dtor("_ZN3ccc8CC8x5y12E", this);} // tgen
ccc::CC8x5y12 ::CC8x5y12(){ note_ctor("_ZN3ccc8CC8x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x5y12E, buf);
    ::ccc::CC8x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x5y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC8x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x5y12E);
    dp->::ccc::CC8x5y12::~CC8x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x5y12E(Test__ZN3ccc8CC8x5y12E, "_ZN3ccc8CC8x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x5y12C1Ev();
extern void _ZN3ccc8CC8x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x5y12E[] = {
  NSPAIR(_ZN3ccc8CC8x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC8x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC8x5y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x5y123abcEv,_ZTv0_n16_N3ccc8CC8x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y123abcEv,_ZThn4_N3ccc8CC8x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x5y123abcEv,_ZTv0_n16_N3ccc8CC8x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x5y12E[] = {
  {&(_ZTVN3ccc8CC8x5y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x5y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x5y12E[];
static VTBL_ENTRY alt_thunk_names1342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x5y123abcEv,_ZTv0_n16_N3ccc8CC8x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x5y123abcEv,_ZThn4_N3ccc8CC8x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x5y12E = {  "_ZN3ccc8CC8x5y12E", // class name
  bases__ZN3ccc8CC8x5y12E, 2,
  &(vtc__ZN3ccc8CC8x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x5y12E),2, //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  DD8x5y12  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD8x5y123abcEv
  ~DD8x5y12(); // tgen
  DD8x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x5y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD8x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x5y123abcEv");}
ccc::DD8x5y12 ::~DD8x5y12(){ note_dtor("_ZN3ccc8DD8x5y12E", this);} // tgen
ccc::DD8x5y12 ::DD8x5y12(){ note_ctor("_ZN3ccc8DD8x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x5y12E, buf);
    ::ccc::DD8x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x5y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD8x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x5y12E);
    dp->::ccc::DD8x5y12::~DD8x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x5y12E(Test__ZN3ccc8DD8x5y12E, "_ZN3ccc8DD8x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x5y12C1Ev();
extern void _ZN3ccc8DD8x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x5y12E[] = {
  NSPAIR(_ZN3ccc8DD8x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD8x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD8x5y123abcEv,_ZTv0_n20_N3ccc8DD8x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y123abcEv,_ZThn4_N3ccc8DD8x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD8x5y123abcEv,_ZTv0_n20_N3ccc8DD8x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x5y12E[] = {
  {&(_ZTVN3ccc8DD8x5y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x5y12E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x5y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x5y12E[];
static VTBL_ENTRY alt_thunk_names1343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD8x5y123abcEv,_ZTv0_n20_N3ccc8DD8x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y123abcEv,_ZThn4_N3ccc8DD8x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x5y12E = {  "_ZN3ccc8DD8x5y12E", // class name
  bases__ZN3ccc8DD8x5y12E, 2,
  &(vtc__ZN3ccc8DD8x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x5y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x5y12E),3, //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  CC8x5y13  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC8x5y133efgEv
  ~CC8x5y13(); // tgen
  CC8x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC8x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x5y133efgEv");}
ccc::CC8x5y13 ::~CC8x5y13(){ note_dtor("_ZN3ccc8CC8x5y13E", this);} // tgen
ccc::CC8x5y13 ::CC8x5y13(){ note_ctor("_ZN3ccc8CC8x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x5y13E, buf);
    ::ccc::CC8x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x5y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC8x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x5y13E);
    dp->::ccc::CC8x5y13::~CC8x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x5y13E(Test__ZN3ccc8CC8x5y13E, "_ZN3ccc8CC8x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x5y13C1Ev();
extern void _ZN3ccc8CC8x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x5y13E[] = {
  NSPAIR(_ZN3ccc8CC8x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC8x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC8x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x5y133efgEv,_ZTv0_n12_N3ccc8CC8x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x5y133efgEv,_ZThn4_N3ccc8CC8x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x5y133efgEv,_ZTv0_n12_N3ccc8CC8x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x5y13E[] = {
  {&(_ZTVN3ccc8CC8x5y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x5y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x5y13E[];
static VTBL_ENTRY alt_thunk_names1344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x5y133efgEv,_ZTv0_n12_N3ccc8CC8x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x5y133efgEv,_ZThn4_N3ccc8CC8x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x5y13E = {  "_ZN3ccc8CC8x5y13E", // class name
  bases__ZN3ccc8CC8x5y13E, 2,
  &(vtc__ZN3ccc8CC8x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x5y13E),2, //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  DD8x5y13  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD8x5y133efgEv
  ~DD8x5y13(); // tgen
  DD8x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x5y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD8x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x5y133efgEv");}
ccc::DD8x5y13 ::~DD8x5y13(){ note_dtor("_ZN3ccc8DD8x5y13E", this);} // tgen
ccc::DD8x5y13 ::DD8x5y13(){ note_ctor("_ZN3ccc8DD8x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x5y13E, buf);
    ::ccc::DD8x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x5y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD8x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x5y13E);
    dp->::ccc::DD8x5y13::~DD8x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x5y13E(Test__ZN3ccc8DD8x5y13E, "_ZN3ccc8DD8x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x5y13C1Ev();
extern void _ZN3ccc8DD8x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x5y13E[] = {
  NSPAIR(_ZN3ccc8DD8x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD8x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y13E[];
extern void _ZN3ccc8DD8x5y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x5y133efgEv,_ZTv0_n16_N3ccc8DD8x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y133efgEv,_ZThn4_N3ccc8DD8x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x5y133efgEv,_ZTv0_n16_N3ccc8DD8x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x5y13E[] = {
  {&(_ZTVN3ccc8DD8x5y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x5y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x5y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x5y13E[];
static VTBL_ENTRY alt_thunk_names1345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x5y133efgEv,_ZTv0_n16_N3ccc8DD8x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y133efgEv,_ZThn4_N3ccc8DD8x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x5y13E = {  "_ZN3ccc8DD8x5y13E", // class name
  bases__ZN3ccc8DD8x5y13E, 2,
  &(vtc__ZN3ccc8DD8x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x5y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x5y13E),3, //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  CC8x5y14  : virtual ::ccc::AA8 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC8x5y143pqrEv
  ~CC8x5y14(); // tgen
  CC8x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC8x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x5y143pqrEv");}
ccc::CC8x5y14 ::~CC8x5y14(){ note_dtor("_ZN3ccc8CC8x5y14E", this);} // tgen
ccc::CC8x5y14 ::CC8x5y14(){ note_ctor("_ZN3ccc8CC8x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x5y14E, buf);
    ::ccc::CC8x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x5y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC8x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x5y14E);
    dp->::ccc::CC8x5y14::~CC8x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x5y14E(Test__ZN3ccc8CC8x5y14E, "_ZN3ccc8CC8x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x5y14C1Ev();
extern void _ZN3ccc8CC8x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x5y14E[] = {
  NSPAIR(_ZN3ccc8CC8x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC8x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x5y14E[];
extern void _ZN3ccc8CC8x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x5y14E[] = {
  {&(_ZTVN3ccc8CC8x5y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x5y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x5y14E[];
Class_Descriptor cd__ZN3ccc8CC8x5y14E = {  "_ZN3ccc8CC8x5y14E", // class name
  bases__ZN3ccc8CC8x5y14E, 2,
  &(vtc__ZN3ccc8CC8x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x5y14E),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  DD8x5y14  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD8x5y143pqrEv
  ~DD8x5y14(); // tgen
  DD8x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x5y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD8x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x5y143pqrEv");}
ccc::DD8x5y14 ::~DD8x5y14(){ note_dtor("_ZN3ccc8DD8x5y14E", this);} // tgen
ccc::DD8x5y14 ::DD8x5y14(){ note_ctor("_ZN3ccc8DD8x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x5y14E, buf);
    ::ccc::DD8x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x5y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD8x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x5y14E);
    dp->::ccc::DD8x5y14::~DD8x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x5y14E(Test__ZN3ccc8DD8x5y14E, "_ZN3ccc8DD8x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x5y14C1Ev();
extern void _ZN3ccc8DD8x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x5y14E[] = {
  NSPAIR(_ZN3ccc8DD8x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD8x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x5y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x5y143pqrEv,_ZTv0_n12_N3ccc8DD8x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x5y143pqrEv,_ZThn4_N3ccc8DD8x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x5y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x5y143pqrEv,_ZTv0_n12_N3ccc8DD8x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x5y14E[] = {
  {&(_ZTVN3ccc8DD8x5y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x5y14E[6]),  6,17},
  {&(_ZTVN3ccc8DD8x5y14E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x5y14E[];
static VTBL_ENTRY alt_thunk_names1346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x5y143pqrEv,_ZTv0_n12_N3ccc8DD8x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x5y143pqrEv,_ZThn4_N3ccc8DD8x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x5y14E = {  "_ZN3ccc8DD8x5y14E", // class name
  bases__ZN3ccc8DD8x5y14E, 2,
  &(vtc__ZN3ccc8DD8x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x5y14E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x5y14E),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  CC8x5y15  : virtual ::ccc::AA8 , ::ccc::BB5 {
  ~CC8x5y15(); // tgen
  CC8x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x5y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC8x5y15 ::~CC8x5y15(){ note_dtor("_ZN3ccc8CC8x5y15E", this);} // tgen
ccc::CC8x5y15 ::CC8x5y15(){ note_ctor("_ZN3ccc8CC8x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x5y15E, buf);
    ::ccc::CC8x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x5y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC8x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x5y15E);
    dp->::ccc::CC8x5y15::~CC8x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x5y15E(Test__ZN3ccc8CC8x5y15E, "_ZN3ccc8CC8x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x5y15C1Ev();
extern void _ZN3ccc8CC8x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x5y15E[] = {
  NSPAIR(_ZN3ccc8CC8x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC8x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x5y15E[] = {
  {&(_ZTVN3ccc8CC8x5y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x5y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x5y15E[];
Class_Descriptor cd__ZN3ccc8CC8x5y15E = {  "_ZN3ccc8CC8x5y15E", // class name
  bases__ZN3ccc8CC8x5y15E, 2,
  &(vtc__ZN3ccc8CC8x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x5y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x5y15E),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  DD8x5y15  : virtual ::ccc::AA8 , virtual ::ccc::BB5 {
  ~DD8x5y15(); // tgen
  DD8x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x5y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD8x5y15 ::~DD8x5y15(){ note_dtor("_ZN3ccc8DD8x5y15E", this);} // tgen
ccc::DD8x5y15 ::DD8x5y15(){ note_ctor("_ZN3ccc8DD8x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x5y15E, buf);
    ::ccc::DD8x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x5y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD8x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x5y15E);
    dp->::ccc::DD8x5y15::~DD8x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x5y15E(Test__ZN3ccc8DD8x5y15E, "_ZN3ccc8DD8x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x5y15C1Ev();
extern void _ZN3ccc8DD8x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x5y15E[] = {
  NSPAIR(_ZN3ccc8DD8x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD8x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x5y15E[] = {
  {&(_ZTVN3ccc8DD8x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD8x5y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x5y15E[];
Class_Descriptor cd__ZN3ccc8DD8x5y15E = {  "_ZN3ccc8DD8x5y15E", // class name
  bases__ZN3ccc8DD8x5y15E, 2,
  &(vtc__ZN3ccc8DD8x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x5y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x5y15E),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  CC8x6y0  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y03pqrEv
  ~CC8x6y0(); // tgen
  CC8x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y0E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y03abcEv");}
void  ccc::CC8x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y03efgEv");}
void  ccc::CC8x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y03pqrEv");}
ccc::CC8x6y0 ::~CC8x6y0(){ note_dtor("_ZN3ccc7CC8x6y0E", this);} // tgen
ccc::CC8x6y0 ::CC8x6y0(){ note_ctor("_ZN3ccc7CC8x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y0E, buf);
    ::ccc::CC8x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y0E);
    dp->::ccc::CC8x6y0::~CC8x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y0E(Test__ZN3ccc7CC8x6y0E, "_ZN3ccc7CC8x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y0C1Ev();
extern void _ZN3ccc7CC8x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y0E[] = {
  NSPAIR(_ZN3ccc7CC8x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y0E[];
extern void _ZN3ccc7CC8x6y03abcEv();
extern void _ZN3ccc7CC8x6y03efgEv();
extern void _ZN3ccc7CC8x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y03efgEv,_ZTv0_n12_N3ccc7CC8x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y03efgEv,_ZThn4_N3ccc7CC8x6y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y03abcEv,_ZTv0_n16_N3ccc7CC8x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y03abcEv,_ZThn4_N3ccc7CC8x6y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y03efgEv,_ZTv0_n12_N3ccc7CC8x6y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y03abcEv,_ZTv0_n16_N3ccc7CC8x6y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y0E[] = {
  {&(_ZTVN3ccc7CC8x6y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y0E[];
static VTBL_ENTRY alt_thunk_names1347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y03abcEv,_ZTv0_n16_N3ccc7CC8x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y03abcEv,_ZThn4_N3ccc7CC8x6y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y03efgEv,_ZTv0_n12_N3ccc7CC8x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y03efgEv,_ZThn4_N3ccc7CC8x6y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y0E = {  "_ZN3ccc7CC8x6y0E", // class name
  bases__ZN3ccc7CC8x6y0E, 2,
  &(vtc__ZN3ccc7CC8x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y0E),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  DD8x6y0  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD8x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x6y03pqrEv
  ~DD8x6y0(); // tgen
  DD8x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y0E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y03abcEv");}
void  ccc::DD8x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y03efgEv");}
void  ccc::DD8x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y03pqrEv");}
ccc::DD8x6y0 ::~DD8x6y0(){ note_dtor("_ZN3ccc7DD8x6y0E", this);} // tgen
ccc::DD8x6y0 ::DD8x6y0(){ note_ctor("_ZN3ccc7DD8x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y0E, buf);
    ::ccc::DD8x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y0E);
    dp->::ccc::DD8x6y0::~DD8x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y0E(Test__ZN3ccc7DD8x6y0E, "_ZN3ccc7DD8x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y0C1Ev();
extern void _ZN3ccc7DD8x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y0E[] = {
  NSPAIR(_ZN3ccc7DD8x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y0E[];
extern void _ZN3ccc7DD8x6y03efgEv();
extern void _ZN3ccc7DD8x6y03abcEv();
extern void _ZN3ccc7DD8x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y03abcEv,_ZTv0_n12_N3ccc7DD8x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y03abcEv,_ZThn4_N3ccc7DD8x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y03efgEv,_ZTv0_n16_N3ccc7DD8x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y03efgEv,_ZThn4_N3ccc7DD8x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y03abcEv,_ZTv0_n12_N3ccc7DD8x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y03efgEv,_ZTv0_n16_N3ccc7DD8x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y0E[] = {
  {&(_ZTVN3ccc7DD8x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y0E[];
static VTBL_ENTRY alt_thunk_names1348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y03efgEv,_ZTv0_n16_N3ccc7DD8x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y03efgEv,_ZThn4_N3ccc7DD8x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y03abcEv,_ZTv0_n12_N3ccc7DD8x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y03abcEv,_ZThn4_N3ccc7DD8x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y0E = {  "_ZN3ccc7DD8x6y0E", // class name
  bases__ZN3ccc7DD8x6y0E, 2,
  &(vtc__ZN3ccc7DD8x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y0E),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  CC8x6y1  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x6y13efgEv
  ~CC8x6y1(); // tgen
  CC8x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y1E) C1{ VBC2{ v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y13abcEv");}
void  ccc::CC8x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y13pqrEv");}
void  ccc::CC8x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y13efgEv");}
ccc::CC8x6y1 ::~CC8x6y1(){ note_dtor("_ZN3ccc7CC8x6y1E", this);} // tgen
ccc::CC8x6y1 ::CC8x6y1(){ note_ctor("_ZN3ccc7CC8x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y1E, buf);
    ::ccc::CC8x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y1E);
    dp->::ccc::CC8x6y1::~CC8x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y1E(Test__ZN3ccc7CC8x6y1E, "_ZN3ccc7CC8x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y1C1Ev();
extern void _ZN3ccc7CC8x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y1E[] = {
  NSPAIR(_ZN3ccc7CC8x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y1E[];
extern void _ZN3ccc7CC8x6y13abcEv();
extern void _ZN3ccc7CC8x6y13efgEv();
extern void _ZN3ccc7CC8x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y13efgEv,_ZTv0_n12_N3ccc7CC8x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y13efgEv,_ZThn4_N3ccc7CC8x6y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y13abcEv,_ZTv0_n16_N3ccc7CC8x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y13abcEv,_ZThn4_N3ccc7CC8x6y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y13efgEv,_ZTv0_n12_N3ccc7CC8x6y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y13abcEv,_ZTv0_n16_N3ccc7CC8x6y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y1E[] = {
  {&(_ZTVN3ccc7CC8x6y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y1E[];
static VTBL_ENTRY alt_thunk_names1349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y13abcEv,_ZTv0_n16_N3ccc7CC8x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y13abcEv,_ZThn4_N3ccc7CC8x6y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y13efgEv,_ZTv0_n12_N3ccc7CC8x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y13efgEv,_ZThn4_N3ccc7CC8x6y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y1E = {  "_ZN3ccc7CC8x6y1E", // class name
  bases__ZN3ccc7CC8x6y1E, 2,
  &(vtc__ZN3ccc7CC8x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y1E),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  DD8x6y1  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD8x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x6y13efgEv
  ~DD8x6y1(); // tgen
  DD8x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y1E) C1{ VBC2{ v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y13abcEv");}
void  ccc::DD8x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y13pqrEv");}
void  ccc::DD8x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y13efgEv");}
ccc::DD8x6y1 ::~DD8x6y1(){ note_dtor("_ZN3ccc7DD8x6y1E", this);} // tgen
ccc::DD8x6y1 ::DD8x6y1(){ note_ctor("_ZN3ccc7DD8x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y1E, buf);
    ::ccc::DD8x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y1E);
    dp->::ccc::DD8x6y1::~DD8x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y1E(Test__ZN3ccc7DD8x6y1E, "_ZN3ccc7DD8x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y1C1Ev();
extern void _ZN3ccc7DD8x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y1E[] = {
  NSPAIR(_ZN3ccc7DD8x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y1E[];
extern void _ZN3ccc7DD8x6y13efgEv();
extern void _ZN3ccc7DD8x6y13abcEv();
extern void _ZN3ccc7DD8x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y13abcEv,_ZTv0_n12_N3ccc7DD8x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y13abcEv,_ZThn4_N3ccc7DD8x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y13efgEv,_ZTv0_n16_N3ccc7DD8x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y13efgEv,_ZThn4_N3ccc7DD8x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y13abcEv,_ZTv0_n12_N3ccc7DD8x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y13efgEv,_ZTv0_n16_N3ccc7DD8x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y1E[] = {
  {&(_ZTVN3ccc7DD8x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y1E[];
static VTBL_ENTRY alt_thunk_names1350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y13efgEv,_ZTv0_n16_N3ccc7DD8x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y13efgEv,_ZThn4_N3ccc7DD8x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y13abcEv,_ZTv0_n12_N3ccc7DD8x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y13abcEv,_ZThn4_N3ccc7DD8x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y1E = {  "_ZN3ccc7DD8x6y1E", // class name
  bases__ZN3ccc7DD8x6y1E, 2,
  &(vtc__ZN3ccc7DD8x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y1E),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  CC8x6y2  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y23pqrEv
  ~CC8x6y2(); // tgen
  CC8x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y2E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y23efgEv");}
void  ccc::CC8x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y23abcEv");}
void  ccc::CC8x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y23pqrEv");}
ccc::CC8x6y2 ::~CC8x6y2(){ note_dtor("_ZN3ccc7CC8x6y2E", this);} // tgen
ccc::CC8x6y2 ::CC8x6y2(){ note_ctor("_ZN3ccc7CC8x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y2E, buf);
    ::ccc::CC8x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y2E);
    dp->::ccc::CC8x6y2::~CC8x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y2E(Test__ZN3ccc7CC8x6y2E, "_ZN3ccc7CC8x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y2C1Ev();
extern void _ZN3ccc7CC8x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y2E[] = {
  NSPAIR(_ZN3ccc7CC8x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y2E[];
extern void _ZN3ccc7CC8x6y23abcEv();
extern void _ZN3ccc7CC8x6y23efgEv();
extern void _ZN3ccc7CC8x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y23efgEv,_ZTv0_n12_N3ccc7CC8x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y23efgEv,_ZThn4_N3ccc7CC8x6y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y23abcEv,_ZTv0_n16_N3ccc7CC8x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y23abcEv,_ZThn4_N3ccc7CC8x6y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y23efgEv,_ZTv0_n12_N3ccc7CC8x6y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y23abcEv,_ZTv0_n16_N3ccc7CC8x6y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y2E[] = {
  {&(_ZTVN3ccc7CC8x6y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y2E[];
static VTBL_ENTRY alt_thunk_names1351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y23abcEv,_ZTv0_n16_N3ccc7CC8x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y23abcEv,_ZThn4_N3ccc7CC8x6y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y23efgEv,_ZTv0_n12_N3ccc7CC8x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y23efgEv,_ZThn4_N3ccc7CC8x6y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y2E = {  "_ZN3ccc7CC8x6y2E", // class name
  bases__ZN3ccc7CC8x6y2E, 2,
  &(vtc__ZN3ccc7CC8x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y2E),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  DD8x6y2  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD8x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x6y23pqrEv
  ~DD8x6y2(); // tgen
  DD8x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y2E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y23efgEv");}
void  ccc::DD8x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y23abcEv");}
void  ccc::DD8x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y23pqrEv");}
ccc::DD8x6y2 ::~DD8x6y2(){ note_dtor("_ZN3ccc7DD8x6y2E", this);} // tgen
ccc::DD8x6y2 ::DD8x6y2(){ note_ctor("_ZN3ccc7DD8x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y2E, buf);
    ::ccc::DD8x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y2E);
    dp->::ccc::DD8x6y2::~DD8x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y2E(Test__ZN3ccc7DD8x6y2E, "_ZN3ccc7DD8x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y2C1Ev();
extern void _ZN3ccc7DD8x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y2E[] = {
  NSPAIR(_ZN3ccc7DD8x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y2E[];
extern void _ZN3ccc7DD8x6y23efgEv();
extern void _ZN3ccc7DD8x6y23abcEv();
extern void _ZN3ccc7DD8x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y23abcEv,_ZTv0_n12_N3ccc7DD8x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y23abcEv,_ZThn4_N3ccc7DD8x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y23efgEv,_ZTv0_n16_N3ccc7DD8x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y23efgEv,_ZThn4_N3ccc7DD8x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y23abcEv,_ZTv0_n12_N3ccc7DD8x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y23efgEv,_ZTv0_n16_N3ccc7DD8x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y2E[] = {
  {&(_ZTVN3ccc7DD8x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y2E[];
static VTBL_ENTRY alt_thunk_names1352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y23efgEv,_ZTv0_n16_N3ccc7DD8x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y23efgEv,_ZThn4_N3ccc7DD8x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y23abcEv,_ZTv0_n12_N3ccc7DD8x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y23abcEv,_ZThn4_N3ccc7DD8x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y2E = {  "_ZN3ccc7DD8x6y2E", // class name
  bases__ZN3ccc7DD8x6y2E, 2,
  &(vtc__ZN3ccc7DD8x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y2E),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  CC8x6y3  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x6y33abcEv
  ~CC8x6y3(); // tgen
  CC8x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y3E) C1{ VBC2{ v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y33efgEv");}
void  ccc::CC8x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y33pqrEv");}
void  ccc::CC8x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y33abcEv");}
ccc::CC8x6y3 ::~CC8x6y3(){ note_dtor("_ZN3ccc7CC8x6y3E", this);} // tgen
ccc::CC8x6y3 ::CC8x6y3(){ note_ctor("_ZN3ccc7CC8x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y3E, buf);
    ::ccc::CC8x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y3E);
    dp->::ccc::CC8x6y3::~CC8x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y3E(Test__ZN3ccc7CC8x6y3E, "_ZN3ccc7CC8x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y3C1Ev();
extern void _ZN3ccc7CC8x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y3E[] = {
  NSPAIR(_ZN3ccc7CC8x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y3E[];
extern void _ZN3ccc7CC8x6y33abcEv();
extern void _ZN3ccc7CC8x6y33efgEv();
extern void _ZN3ccc7CC8x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y33efgEv,_ZTv0_n12_N3ccc7CC8x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y33efgEv,_ZThn4_N3ccc7CC8x6y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y33abcEv,_ZTv0_n16_N3ccc7CC8x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y33abcEv,_ZThn4_N3ccc7CC8x6y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y33efgEv,_ZTv0_n12_N3ccc7CC8x6y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y33abcEv,_ZTv0_n16_N3ccc7CC8x6y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y3E[] = {
  {&(_ZTVN3ccc7CC8x6y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y3E[];
static VTBL_ENTRY alt_thunk_names1353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y33abcEv,_ZTv0_n16_N3ccc7CC8x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y33abcEv,_ZThn4_N3ccc7CC8x6y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y33efgEv,_ZTv0_n12_N3ccc7CC8x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y33efgEv,_ZThn4_N3ccc7CC8x6y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y3E = {  "_ZN3ccc7CC8x6y3E", // class name
  bases__ZN3ccc7CC8x6y3E, 2,
  &(vtc__ZN3ccc7CC8x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y3E),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  DD8x6y3  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD8x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x6y33abcEv
  ~DD8x6y3(); // tgen
  DD8x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y3E) C1{ VBC2{ v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y33efgEv");}
void  ccc::DD8x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y33pqrEv");}
void  ccc::DD8x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y33abcEv");}
ccc::DD8x6y3 ::~DD8x6y3(){ note_dtor("_ZN3ccc7DD8x6y3E", this);} // tgen
ccc::DD8x6y3 ::DD8x6y3(){ note_ctor("_ZN3ccc7DD8x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y3E, buf);
    ::ccc::DD8x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y3E);
    dp->::ccc::DD8x6y3::~DD8x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y3E(Test__ZN3ccc7DD8x6y3E, "_ZN3ccc7DD8x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y3C1Ev();
extern void _ZN3ccc7DD8x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y3E[] = {
  NSPAIR(_ZN3ccc7DD8x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y3E[];
extern void _ZN3ccc7DD8x6y33efgEv();
extern void _ZN3ccc7DD8x6y33abcEv();
extern void _ZN3ccc7DD8x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y33abcEv,_ZTv0_n12_N3ccc7DD8x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y33abcEv,_ZThn4_N3ccc7DD8x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y33efgEv,_ZTv0_n16_N3ccc7DD8x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y33efgEv,_ZThn4_N3ccc7DD8x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y33abcEv,_ZTv0_n12_N3ccc7DD8x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y33efgEv,_ZTv0_n16_N3ccc7DD8x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y3E[] = {
  {&(_ZTVN3ccc7DD8x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y3E[];
static VTBL_ENTRY alt_thunk_names1354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y33efgEv,_ZTv0_n16_N3ccc7DD8x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y33efgEv,_ZThn4_N3ccc7DD8x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y33abcEv,_ZTv0_n12_N3ccc7DD8x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y33abcEv,_ZThn4_N3ccc7DD8x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y3E = {  "_ZN3ccc7DD8x6y3E", // class name
  bases__ZN3ccc7DD8x6y3E, 2,
  &(vtc__ZN3ccc7DD8x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y3E),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  CC8x6y4  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC8x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x6y43efgEv
  ~CC8x6y4(); // tgen
  CC8x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y4E) C1{ VBC2{ v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y43pqrEv");}
void  ccc::CC8x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y43abcEv");}
void  ccc::CC8x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y43efgEv");}
ccc::CC8x6y4 ::~CC8x6y4(){ note_dtor("_ZN3ccc7CC8x6y4E", this);} // tgen
ccc::CC8x6y4 ::CC8x6y4(){ note_ctor("_ZN3ccc7CC8x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y4E, buf);
    ::ccc::CC8x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y4E);
    dp->::ccc::CC8x6y4::~CC8x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y4E(Test__ZN3ccc7CC8x6y4E, "_ZN3ccc7CC8x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y4C1Ev();
extern void _ZN3ccc7CC8x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y4E[] = {
  NSPAIR(_ZN3ccc7CC8x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y4E[];
extern void _ZN3ccc7CC8x6y43abcEv();
extern void _ZN3ccc7CC8x6y43efgEv();
extern void _ZN3ccc7CC8x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y43efgEv,_ZTv0_n12_N3ccc7CC8x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y43efgEv,_ZThn4_N3ccc7CC8x6y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y43abcEv,_ZTv0_n16_N3ccc7CC8x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y43abcEv,_ZThn4_N3ccc7CC8x6y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y43efgEv,_ZTv0_n12_N3ccc7CC8x6y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y43abcEv,_ZTv0_n16_N3ccc7CC8x6y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y4E[] = {
  {&(_ZTVN3ccc7CC8x6y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y4E[];
static VTBL_ENTRY alt_thunk_names1355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y43abcEv,_ZTv0_n16_N3ccc7CC8x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y43abcEv,_ZThn4_N3ccc7CC8x6y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y43efgEv,_ZTv0_n12_N3ccc7CC8x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y43efgEv,_ZThn4_N3ccc7CC8x6y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y4E = {  "_ZN3ccc7CC8x6y4E", // class name
  bases__ZN3ccc7CC8x6y4E, 2,
  &(vtc__ZN3ccc7CC8x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y4E),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  DD8x6y4  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD8x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x6y43efgEv
  ~DD8x6y4(); // tgen
  DD8x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y4E) C1{ VBC2{ v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y43pqrEv");}
void  ccc::DD8x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y43abcEv");}
void  ccc::DD8x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y43efgEv");}
ccc::DD8x6y4 ::~DD8x6y4(){ note_dtor("_ZN3ccc7DD8x6y4E", this);} // tgen
ccc::DD8x6y4 ::DD8x6y4(){ note_ctor("_ZN3ccc7DD8x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y4E, buf);
    ::ccc::DD8x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y4E);
    dp->::ccc::DD8x6y4::~DD8x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y4E(Test__ZN3ccc7DD8x6y4E, "_ZN3ccc7DD8x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y4C1Ev();
extern void _ZN3ccc7DD8x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y4E[] = {
  NSPAIR(_ZN3ccc7DD8x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y4E[];
extern void _ZN3ccc7DD8x6y43efgEv();
extern void _ZN3ccc7DD8x6y43abcEv();
extern void _ZN3ccc7DD8x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y43abcEv,_ZTv0_n12_N3ccc7DD8x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y43abcEv,_ZThn4_N3ccc7DD8x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y43efgEv,_ZTv0_n16_N3ccc7DD8x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y43efgEv,_ZThn4_N3ccc7DD8x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y43abcEv,_ZTv0_n12_N3ccc7DD8x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y43efgEv,_ZTv0_n16_N3ccc7DD8x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y4E[] = {
  {&(_ZTVN3ccc7DD8x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y4E[];
static VTBL_ENTRY alt_thunk_names1356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y43efgEv,_ZTv0_n16_N3ccc7DD8x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y43efgEv,_ZThn4_N3ccc7DD8x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y43abcEv,_ZTv0_n12_N3ccc7DD8x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y43abcEv,_ZThn4_N3ccc7DD8x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y4E = {  "_ZN3ccc7DD8x6y4E", // class name
  bases__ZN3ccc7DD8x6y4E, 2,
  &(vtc__ZN3ccc7DD8x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y4E),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  CC8x6y5  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC8x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x6y53abcEv
  ~CC8x6y5(); // tgen
  CC8x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y5E) C1{ VBC2{ v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y53pqrEv");}
void  ccc::CC8x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y53efgEv");}
void  ccc::CC8x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y53abcEv");}
ccc::CC8x6y5 ::~CC8x6y5(){ note_dtor("_ZN3ccc7CC8x6y5E", this);} // tgen
ccc::CC8x6y5 ::CC8x6y5(){ note_ctor("_ZN3ccc7CC8x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y5E, buf);
    ::ccc::CC8x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y5E);
    dp->::ccc::CC8x6y5::~CC8x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y5E(Test__ZN3ccc7CC8x6y5E, "_ZN3ccc7CC8x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y5C1Ev();
extern void _ZN3ccc7CC8x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y5E[] = {
  NSPAIR(_ZN3ccc7CC8x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y5E[];
extern void _ZN3ccc7CC8x6y53abcEv();
extern void _ZN3ccc7CC8x6y53efgEv();
extern void _ZN3ccc7CC8x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y53efgEv,_ZTv0_n12_N3ccc7CC8x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y53efgEv,_ZThn4_N3ccc7CC8x6y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y53abcEv,_ZTv0_n16_N3ccc7CC8x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y53abcEv,_ZThn4_N3ccc7CC8x6y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y53efgEv,_ZTv0_n12_N3ccc7CC8x6y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y53abcEv,_ZTv0_n16_N3ccc7CC8x6y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y5E[] = {
  {&(_ZTVN3ccc7CC8x6y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y5E[];
static VTBL_ENTRY alt_thunk_names1357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y53abcEv,_ZTv0_n16_N3ccc7CC8x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y53abcEv,_ZThn4_N3ccc7CC8x6y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y53efgEv,_ZTv0_n12_N3ccc7CC8x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y53efgEv,_ZThn4_N3ccc7CC8x6y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y5E = {  "_ZN3ccc7CC8x6y5E", // class name
  bases__ZN3ccc7CC8x6y5E, 2,
  &(vtc__ZN3ccc7CC8x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y5E),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  DD8x6y5  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD8x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x6y53abcEv
  ~DD8x6y5(); // tgen
  DD8x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y5E) C1{ VBC2{ v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y53pqrEv");}
void  ccc::DD8x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y53efgEv");}
void  ccc::DD8x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y53abcEv");}
ccc::DD8x6y5 ::~DD8x6y5(){ note_dtor("_ZN3ccc7DD8x6y5E", this);} // tgen
ccc::DD8x6y5 ::DD8x6y5(){ note_ctor("_ZN3ccc7DD8x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y5E, buf);
    ::ccc::DD8x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y5E);
    dp->::ccc::DD8x6y5::~DD8x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y5E(Test__ZN3ccc7DD8x6y5E, "_ZN3ccc7DD8x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y5C1Ev();
extern void _ZN3ccc7DD8x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y5E[] = {
  NSPAIR(_ZN3ccc7DD8x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y5E[];
extern void _ZN3ccc7DD8x6y53efgEv();
extern void _ZN3ccc7DD8x6y53abcEv();
extern void _ZN3ccc7DD8x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y53abcEv,_ZTv0_n12_N3ccc7DD8x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y53abcEv,_ZThn4_N3ccc7DD8x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y53efgEv,_ZTv0_n16_N3ccc7DD8x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y53efgEv,_ZThn4_N3ccc7DD8x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y53abcEv,_ZTv0_n12_N3ccc7DD8x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y53efgEv,_ZTv0_n16_N3ccc7DD8x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y5E[] = {
  {&(_ZTVN3ccc7DD8x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y5E[];
static VTBL_ENTRY alt_thunk_names1358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y53efgEv,_ZTv0_n16_N3ccc7DD8x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y53efgEv,_ZThn4_N3ccc7DD8x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y53abcEv,_ZTv0_n12_N3ccc7DD8x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y53abcEv,_ZThn4_N3ccc7DD8x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y5E = {  "_ZN3ccc7DD8x6y5E", // class name
  bases__ZN3ccc7DD8x6y5E, 2,
  &(vtc__ZN3ccc7DD8x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y5E),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  CC8x6y6  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x6y63efgEv
  ~CC8x6y6(); // tgen
  CC8x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y6E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y63abcEv");}
void  ccc::CC8x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y63efgEv");}
ccc::CC8x6y6 ::~CC8x6y6(){ note_dtor("_ZN3ccc7CC8x6y6E", this);} // tgen
ccc::CC8x6y6 ::CC8x6y6(){ note_ctor("_ZN3ccc7CC8x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y6E, buf);
    ::ccc::CC8x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y6E);
    dp->::ccc::CC8x6y6::~CC8x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y6E(Test__ZN3ccc7CC8x6y6E, "_ZN3ccc7CC8x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y6C1Ev();
extern void _ZN3ccc7CC8x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y6E[] = {
  NSPAIR(_ZN3ccc7CC8x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y6E[];
extern void _ZN3ccc7CC8x6y63abcEv();
extern void _ZN3ccc7CC8x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y63efgEv,_ZTv0_n12_N3ccc7CC8x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y63efgEv,_ZThn4_N3ccc7CC8x6y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y63abcEv,_ZTv0_n16_N3ccc7CC8x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y63abcEv,_ZThn4_N3ccc7CC8x6y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y63efgEv,_ZTv0_n12_N3ccc7CC8x6y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y63abcEv,_ZTv0_n16_N3ccc7CC8x6y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y6E[] = {
  {&(_ZTVN3ccc7CC8x6y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC8x6y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y6E[];
static VTBL_ENTRY alt_thunk_names1359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y63abcEv,_ZTv0_n16_N3ccc7CC8x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y63abcEv,_ZThn4_N3ccc7CC8x6y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y63efgEv,_ZTv0_n12_N3ccc7CC8x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y63efgEv,_ZThn4_N3ccc7CC8x6y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y6E = {  "_ZN3ccc7CC8x6y6E", // class name
  bases__ZN3ccc7CC8x6y6E, 2,
  &(vtc__ZN3ccc7CC8x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y6E),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  DD8x6y6  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD8x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x6y63efgEv
  ~DD8x6y6(); // tgen
  DD8x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y6E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y63abcEv");}
void  ccc::DD8x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y63efgEv");}
ccc::DD8x6y6 ::~DD8x6y6(){ note_dtor("_ZN3ccc7DD8x6y6E", this);} // tgen
ccc::DD8x6y6 ::DD8x6y6(){ note_ctor("_ZN3ccc7DD8x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y6E, buf);
    ::ccc::DD8x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y6E);
    dp->::ccc::DD8x6y6::~DD8x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y6E(Test__ZN3ccc7DD8x6y6E, "_ZN3ccc7DD8x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y6C1Ev();
extern void _ZN3ccc7DD8x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y6E[] = {
  NSPAIR(_ZN3ccc7DD8x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y6E[];
extern void _ZN3ccc7DD8x6y63efgEv();
extern void _ZN3ccc7DD8x6y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y63abcEv,_ZTv0_n12_N3ccc7DD8x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y63abcEv,_ZThn4_N3ccc7DD8x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y63efgEv,_ZTv0_n16_N3ccc7DD8x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y63efgEv,_ZThn4_N3ccc7DD8x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y63abcEv,_ZTv0_n12_N3ccc7DD8x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y63efgEv,_ZTv0_n16_N3ccc7DD8x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y6E[] = {
  {&(_ZTVN3ccc7DD8x6y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x6y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x6y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y6E[];
static VTBL_ENTRY alt_thunk_names1360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y63efgEv,_ZTv0_n16_N3ccc7DD8x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y63efgEv,_ZThn4_N3ccc7DD8x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y63abcEv,_ZTv0_n12_N3ccc7DD8x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y63abcEv,_ZThn4_N3ccc7DD8x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y6E = {  "_ZN3ccc7DD8x6y6E", // class name
  bases__ZN3ccc7DD8x6y6E, 2,
  &(vtc__ZN3ccc7DD8x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y6E),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  CC8x6y7  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC8x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y73pqrEv
  ~CC8x6y7(); // tgen
  CC8x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y7E) C1{ VBC2{ v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y73abcEv");}
void  ccc::CC8x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y73pqrEv");}
ccc::CC8x6y7 ::~CC8x6y7(){ note_dtor("_ZN3ccc7CC8x6y7E", this);} // tgen
ccc::CC8x6y7 ::CC8x6y7(){ note_ctor("_ZN3ccc7CC8x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y7E, buf);
    ::ccc::CC8x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y7E);
    dp->::ccc::CC8x6y7::~CC8x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y7E(Test__ZN3ccc7CC8x6y7E, "_ZN3ccc7CC8x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y7C1Ev();
extern void _ZN3ccc7CC8x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y7E[] = {
  NSPAIR(_ZN3ccc7CC8x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y7E[];
extern void _ZN3ccc7CC8x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC8x6y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y73abcEv,_ZTv0_n16_N3ccc7CC8x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y73abcEv,_ZThn4_N3ccc7CC8x6y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y73abcEv,_ZTv0_n16_N3ccc7CC8x6y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y7E[] = {
  {&(_ZTVN3ccc7CC8x6y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y7E[];
static VTBL_ENTRY alt_thunk_names1361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y73abcEv,_ZTv0_n16_N3ccc7CC8x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y73abcEv,_ZThn4_N3ccc7CC8x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y7E = {  "_ZN3ccc7CC8x6y7E", // class name
  bases__ZN3ccc7CC8x6y7E, 2,
  &(vtc__ZN3ccc7CC8x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y7E),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  DD8x6y7  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD8x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x6y73pqrEv
  ~DD8x6y7(); // tgen
  DD8x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y7E) C1{ VBC2{ v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y73abcEv");}
void  ccc::DD8x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y73pqrEv");}
ccc::DD8x6y7 ::~DD8x6y7(){ note_dtor("_ZN3ccc7DD8x6y7E", this);} // tgen
ccc::DD8x6y7 ::DD8x6y7(){ note_ctor("_ZN3ccc7DD8x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y7E, buf);
    ::ccc::DD8x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y7E);
    dp->::ccc::DD8x6y7::~DD8x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y7E(Test__ZN3ccc7DD8x6y7E, "_ZN3ccc7DD8x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y7C1Ev();
extern void _ZN3ccc7DD8x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y7E[] = {
  NSPAIR(_ZN3ccc7DD8x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x6y73abcEv();
extern void _ZN3ccc7DD8x6y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y73abcEv,_ZTv0_n12_N3ccc7DD8x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y73abcEv,_ZThn4_N3ccc7DD8x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y73abcEv,_ZTv0_n12_N3ccc7DD8x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y7E[] = {
  {&(_ZTVN3ccc7DD8x6y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y7E[];
static VTBL_ENTRY alt_thunk_names1362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y73abcEv,_ZTv0_n12_N3ccc7DD8x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y73abcEv,_ZThn4_N3ccc7DD8x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y7E = {  "_ZN3ccc7DD8x6y7E", // class name
  bases__ZN3ccc7DD8x6y7E, 2,
  &(vtc__ZN3ccc7DD8x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y7E),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  CC8x6y8  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x6y83abcEv
  ~CC8x6y8(); // tgen
  CC8x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y8E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y83efgEv");}
void  ccc::CC8x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x6y83abcEv");}
ccc::CC8x6y8 ::~CC8x6y8(){ note_dtor("_ZN3ccc7CC8x6y8E", this);} // tgen
ccc::CC8x6y8 ::CC8x6y8(){ note_ctor("_ZN3ccc7CC8x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y8E, buf);
    ::ccc::CC8x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y8E);
    dp->::ccc::CC8x6y8::~CC8x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y8E(Test__ZN3ccc7CC8x6y8E, "_ZN3ccc7CC8x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y8C1Ev();
extern void _ZN3ccc7CC8x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y8E[] = {
  NSPAIR(_ZN3ccc7CC8x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y8E[];
extern void _ZN3ccc7CC8x6y83abcEv();
extern void _ZN3ccc7CC8x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y83efgEv,_ZTv0_n12_N3ccc7CC8x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y83efgEv,_ZThn4_N3ccc7CC8x6y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x6y83abcEv,_ZTv0_n16_N3ccc7CC8x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y83abcEv,_ZThn4_N3ccc7CC8x6y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y83efgEv,_ZTv0_n12_N3ccc7CC8x6y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x6y83abcEv,_ZTv0_n16_N3ccc7CC8x6y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y8E[] = {
  {&(_ZTVN3ccc7CC8x6y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC8x6y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y8E[];
static VTBL_ENTRY alt_thunk_names1363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x6y83abcEv,_ZTv0_n16_N3ccc7CC8x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y83abcEv,_ZThn4_N3ccc7CC8x6y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y83efgEv,_ZTv0_n12_N3ccc7CC8x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y83efgEv,_ZThn4_N3ccc7CC8x6y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y8E = {  "_ZN3ccc7CC8x6y8E", // class name
  bases__ZN3ccc7CC8x6y8E, 2,
  &(vtc__ZN3ccc7CC8x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y8E),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  DD8x6y8  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD8x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x6y83abcEv
  ~DD8x6y8(); // tgen
  DD8x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y8E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y83efgEv");}
void  ccc::DD8x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x6y83abcEv");}
ccc::DD8x6y8 ::~DD8x6y8(){ note_dtor("_ZN3ccc7DD8x6y8E", this);} // tgen
ccc::DD8x6y8 ::DD8x6y8(){ note_ctor("_ZN3ccc7DD8x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y8E, buf);
    ::ccc::DD8x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y8E);
    dp->::ccc::DD8x6y8::~DD8x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y8E(Test__ZN3ccc7DD8x6y8E, "_ZN3ccc7DD8x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y8C1Ev();
extern void _ZN3ccc7DD8x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y8E[] = {
  NSPAIR(_ZN3ccc7DD8x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y8E[];
extern void _ZN3ccc7DD8x6y83efgEv();
extern void _ZN3ccc7DD8x6y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x6y83abcEv,_ZTv0_n12_N3ccc7DD8x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y83abcEv,_ZThn4_N3ccc7DD8x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y83efgEv,_ZTv0_n16_N3ccc7DD8x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y83efgEv,_ZThn4_N3ccc7DD8x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x6y83abcEv,_ZTv0_n12_N3ccc7DD8x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y83efgEv,_ZTv0_n16_N3ccc7DD8x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y8E[] = {
  {&(_ZTVN3ccc7DD8x6y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x6y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x6y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y8E[];
static VTBL_ENTRY alt_thunk_names1364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y83efgEv,_ZTv0_n16_N3ccc7DD8x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y83efgEv,_ZThn4_N3ccc7DD8x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x6y83abcEv,_ZTv0_n12_N3ccc7DD8x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y83abcEv,_ZThn4_N3ccc7DD8x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y8E = {  "_ZN3ccc7DD8x6y8E", // class name
  bases__ZN3ccc7DD8x6y8E, 2,
  &(vtc__ZN3ccc7DD8x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y8E),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  CC8x6y9  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC8x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x6y93pqrEv
  ~CC8x6y9(); // tgen
  CC8x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x6y9E) C1{ VBC2{ v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x6y93efgEv");}
void  ccc::CC8x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x6y93pqrEv");}
ccc::CC8x6y9 ::~CC8x6y9(){ note_dtor("_ZN3ccc7CC8x6y9E", this);} // tgen
ccc::CC8x6y9 ::CC8x6y9(){ note_ctor("_ZN3ccc7CC8x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x6y9E, buf);
    ::ccc::CC8x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x6y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC8x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x6y9E);
    dp->::ccc::CC8x6y9::~CC8x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x6y9E(Test__ZN3ccc7CC8x6y9E, "_ZN3ccc7CC8x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x6y9C1Ev();
extern void _ZN3ccc7CC8x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x6y9E[] = {
  NSPAIR(_ZN3ccc7CC8x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC8x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC8x6y93efgEv();
extern void _ZN3ccc7CC8x6y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x6y93efgEv,_ZTv0_n12_N3ccc7CC8x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x6y93efgEv,_ZThn4_N3ccc7CC8x6y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x6y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x6y93efgEv,_ZTv0_n12_N3ccc7CC8x6y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x6y9E[] = {
  {&(_ZTVN3ccc7CC8x6y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x6y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x6y9E[];
static VTBL_ENTRY alt_thunk_names1365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x6y93efgEv,_ZTv0_n12_N3ccc7CC8x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x6y93efgEv,_ZThn4_N3ccc7CC8x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x6y9E = {  "_ZN3ccc7CC8x6y9E", // class name
  bases__ZN3ccc7CC8x6y9E, 2,
  &(vtc__ZN3ccc7CC8x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x6y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x6y9E),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  DD8x6y9  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD8x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x6y93pqrEv
  ~DD8x6y9(); // tgen
  DD8x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x6y9E) C1{ VBC2{ v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x6y93efgEv");}
void  ccc::DD8x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x6y93pqrEv");}
ccc::DD8x6y9 ::~DD8x6y9(){ note_dtor("_ZN3ccc7DD8x6y9E", this);} // tgen
ccc::DD8x6y9 ::DD8x6y9(){ note_ctor("_ZN3ccc7DD8x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x6y9E, buf);
    ::ccc::DD8x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x6y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD8x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x6y9E);
    dp->::ccc::DD8x6y9::~DD8x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x6y9E(Test__ZN3ccc7DD8x6y9E, "_ZN3ccc7DD8x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x6y9C1Ev();
extern void _ZN3ccc7DD8x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x6y9E[] = {
  NSPAIR(_ZN3ccc7DD8x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD8x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y9E[];
extern void _ZN3ccc7DD8x6y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x6y93efgEv,_ZTv0_n16_N3ccc7DD8x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x6y93efgEv,_ZThn4_N3ccc7DD8x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x6y93efgEv,_ZTv0_n16_N3ccc7DD8x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x6y9E[] = {
  {&(_ZTVN3ccc7DD8x6y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x6y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x6y9E[];
static VTBL_ENTRY alt_thunk_names1366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x6y93efgEv,_ZTv0_n16_N3ccc7DD8x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x6y93efgEv,_ZThn4_N3ccc7DD8x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x6y9E = {  "_ZN3ccc7DD8x6y9E", // class name
  bases__ZN3ccc7DD8x6y9E, 2,
  &(vtc__ZN3ccc7DD8x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x6y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x6y9E),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  CC8x6y10  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC8x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x6y103abcEv
  ~CC8x6y10(); // tgen
  CC8x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y10E) C1{ VBC2{ v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x6y103pqrEv");}
void  ccc::CC8x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x6y103abcEv");}
ccc::CC8x6y10 ::~CC8x6y10(){ note_dtor("_ZN3ccc8CC8x6y10E", this);} // tgen
ccc::CC8x6y10 ::CC8x6y10(){ note_ctor("_ZN3ccc8CC8x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x6y10E, buf);
    ::ccc::CC8x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x6y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC8x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x6y10E);
    dp->::ccc::CC8x6y10::~CC8x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x6y10E(Test__ZN3ccc8CC8x6y10E, "_ZN3ccc8CC8x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x6y10C1Ev();
extern void _ZN3ccc8CC8x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x6y10E[] = {
  NSPAIR(_ZN3ccc8CC8x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC8x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x6y10E[];
extern void _ZN3ccc8CC8x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC8x6y103pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x6y103abcEv,_ZTv0_n16_N3ccc8CC8x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y103abcEv,_ZThn4_N3ccc8CC8x6y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x6y103abcEv,_ZTv0_n16_N3ccc8CC8x6y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x6y10E[] = {
  {&(_ZTVN3ccc8CC8x6y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x6y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x6y10E[];
static VTBL_ENTRY alt_thunk_names1367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x6y103abcEv,_ZTv0_n16_N3ccc8CC8x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x6y103abcEv,_ZThn4_N3ccc8CC8x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x6y10E = {  "_ZN3ccc8CC8x6y10E", // class name
  bases__ZN3ccc8CC8x6y10E, 2,
  &(vtc__ZN3ccc8CC8x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x6y10E),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  DD8x6y10  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD8x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x6y103abcEv
  ~DD8x6y10(); // tgen
  DD8x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x6y10E) C1{ VBC2{ v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x6y103pqrEv");}
void  ccc::DD8x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x6y103abcEv");}
ccc::DD8x6y10 ::~DD8x6y10(){ note_dtor("_ZN3ccc8DD8x6y10E", this);} // tgen
ccc::DD8x6y10 ::DD8x6y10(){ note_ctor("_ZN3ccc8DD8x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x6y10E, buf);
    ::ccc::DD8x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x6y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD8x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x6y10E);
    dp->::ccc::DD8x6y10::~DD8x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x6y10E(Test__ZN3ccc8DD8x6y10E, "_ZN3ccc8DD8x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x6y10C1Ev();
extern void _ZN3ccc8DD8x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x6y10E[] = {
  NSPAIR(_ZN3ccc8DD8x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD8x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x6y103abcEv();
extern void _ZN3ccc8DD8x6y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x6y103abcEv,_ZTv0_n12_N3ccc8DD8x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x6y103abcEv,_ZThn4_N3ccc8DD8x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x6y103abcEv,_ZTv0_n12_N3ccc8DD8x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x6y10E[] = {
  {&(_ZTVN3ccc8DD8x6y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x6y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x6y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x6y10E[];
static VTBL_ENTRY alt_thunk_names1368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x6y103abcEv,_ZTv0_n12_N3ccc8DD8x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x6y103abcEv,_ZThn4_N3ccc8DD8x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x6y10E = {  "_ZN3ccc8DD8x6y10E", // class name
  bases__ZN3ccc8DD8x6y10E, 2,
  &(vtc__ZN3ccc8DD8x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x6y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x6y10E),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  CC8x6y11  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC8x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x6y113efgEv
  ~CC8x6y11(); // tgen
  CC8x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y11E) C1{ VBC2{ v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x6y113pqrEv");}
void  ccc::CC8x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x6y113efgEv");}
ccc::CC8x6y11 ::~CC8x6y11(){ note_dtor("_ZN3ccc8CC8x6y11E", this);} // tgen
ccc::CC8x6y11 ::CC8x6y11(){ note_ctor("_ZN3ccc8CC8x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x6y11E, buf);
    ::ccc::CC8x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x6y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC8x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x6y11E);
    dp->::ccc::CC8x6y11::~CC8x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x6y11E(Test__ZN3ccc8CC8x6y11E, "_ZN3ccc8CC8x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x6y11C1Ev();
extern void _ZN3ccc8CC8x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x6y11E[] = {
  NSPAIR(_ZN3ccc8CC8x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC8x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC8x6y113efgEv();
extern void _ZN3ccc8CC8x6y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x6y113efgEv,_ZTv0_n12_N3ccc8CC8x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y113efgEv,_ZThn4_N3ccc8CC8x6y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x6y113efgEv,_ZTv0_n12_N3ccc8CC8x6y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x6y11E[] = {
  {&(_ZTVN3ccc8CC8x6y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x6y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x6y11E[];
static VTBL_ENTRY alt_thunk_names1369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x6y113efgEv,_ZTv0_n12_N3ccc8CC8x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x6y113efgEv,_ZThn4_N3ccc8CC8x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x6y11E = {  "_ZN3ccc8CC8x6y11E", // class name
  bases__ZN3ccc8CC8x6y11E, 2,
  &(vtc__ZN3ccc8CC8x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x6y11E),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  DD8x6y11  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD8x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x6y113efgEv
  ~DD8x6y11(); // tgen
  DD8x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x6y11E) C1{ VBC2{ v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x6y113pqrEv");}
void  ccc::DD8x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x6y113efgEv");}
ccc::DD8x6y11 ::~DD8x6y11(){ note_dtor("_ZN3ccc8DD8x6y11E", this);} // tgen
ccc::DD8x6y11 ::DD8x6y11(){ note_ctor("_ZN3ccc8DD8x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x6y11E, buf);
    ::ccc::DD8x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x6y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD8x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x6y11E);
    dp->::ccc::DD8x6y11::~DD8x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x6y11E(Test__ZN3ccc8DD8x6y11E, "_ZN3ccc8DD8x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x6y11C1Ev();
extern void _ZN3ccc8DD8x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x6y11E[] = {
  NSPAIR(_ZN3ccc8DD8x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD8x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y11E[];
extern void _ZN3ccc8DD8x6y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x6y113efgEv,_ZTv0_n16_N3ccc8DD8x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x6y113efgEv,_ZThn4_N3ccc8DD8x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x6y113efgEv,_ZTv0_n16_N3ccc8DD8x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x6y11E[] = {
  {&(_ZTVN3ccc8DD8x6y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x6y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x6y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x6y11E[];
static VTBL_ENTRY alt_thunk_names1370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x6y113efgEv,_ZTv0_n16_N3ccc8DD8x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x6y113efgEv,_ZThn4_N3ccc8DD8x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x6y11E = {  "_ZN3ccc8DD8x6y11E", // class name
  bases__ZN3ccc8DD8x6y11E, 2,
  &(vtc__ZN3ccc8DD8x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x6y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x6y11E),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  CC8x6y12  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC8x6y123abcEv
  ~CC8x6y12(); // tgen
  CC8x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y12E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC8x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x6y123abcEv");}
ccc::CC8x6y12 ::~CC8x6y12(){ note_dtor("_ZN3ccc8CC8x6y12E", this);} // tgen
ccc::CC8x6y12 ::CC8x6y12(){ note_ctor("_ZN3ccc8CC8x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x6y12E, buf);
    ::ccc::CC8x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x6y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC8x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x6y12E);
    dp->::ccc::CC8x6y12::~CC8x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x6y12E(Test__ZN3ccc8CC8x6y12E, "_ZN3ccc8CC8x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x6y12C1Ev();
extern void _ZN3ccc8CC8x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x6y12E[] = {
  NSPAIR(_ZN3ccc8CC8x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC8x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x6y12E[];
extern void _ZN3ccc8CC8x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x6y123abcEv,_ZTv0_n16_N3ccc8CC8x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y123abcEv,_ZThn4_N3ccc8CC8x6y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x6y123abcEv,_ZTv0_n16_N3ccc8CC8x6y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x6y12E[] = {
  {&(_ZTVN3ccc8CC8x6y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x6y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x6y12E[];
static VTBL_ENTRY alt_thunk_names1371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x6y123abcEv,_ZTv0_n16_N3ccc8CC8x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x6y123abcEv,_ZThn4_N3ccc8CC8x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x6y12E = {  "_ZN3ccc8CC8x6y12E", // class name
  bases__ZN3ccc8CC8x6y12E, 2,
  &(vtc__ZN3ccc8CC8x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x6y12E),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  DD8x6y12  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD8x6y123abcEv
  ~DD8x6y12(); // tgen
  DD8x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x6y12E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD8x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x6y123abcEv");}
ccc::DD8x6y12 ::~DD8x6y12(){ note_dtor("_ZN3ccc8DD8x6y12E", this);} // tgen
ccc::DD8x6y12 ::DD8x6y12(){ note_ctor("_ZN3ccc8DD8x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x6y12E, buf);
    ::ccc::DD8x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x6y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD8x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x6y12E);
    dp->::ccc::DD8x6y12::~DD8x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x6y12E(Test__ZN3ccc8DD8x6y12E, "_ZN3ccc8DD8x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x6y12C1Ev();
extern void _ZN3ccc8DD8x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x6y12E[] = {
  NSPAIR(_ZN3ccc8DD8x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD8x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x6y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x6y123abcEv,_ZTv0_n12_N3ccc8DD8x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x6y123abcEv,_ZThn4_N3ccc8DD8x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x6y123abcEv,_ZTv0_n12_N3ccc8DD8x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x6y12E[] = {
  {&(_ZTVN3ccc8DD8x6y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x6y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x6y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x6y12E[];
static VTBL_ENTRY alt_thunk_names1372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x6y123abcEv,_ZTv0_n12_N3ccc8DD8x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x6y123abcEv,_ZThn4_N3ccc8DD8x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x6y12E = {  "_ZN3ccc8DD8x6y12E", // class name
  bases__ZN3ccc8DD8x6y12E, 2,
  &(vtc__ZN3ccc8DD8x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x6y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x6y12E),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  CC8x6y13  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC8x6y133efgEv
  ~CC8x6y13(); // tgen
  CC8x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC8x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x6y133efgEv");}
ccc::CC8x6y13 ::~CC8x6y13(){ note_dtor("_ZN3ccc8CC8x6y13E", this);} // tgen
ccc::CC8x6y13 ::CC8x6y13(){ note_ctor("_ZN3ccc8CC8x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x6y13E, buf);
    ::ccc::CC8x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x6y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC8x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x6y13E);
    dp->::ccc::CC8x6y13::~CC8x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x6y13E(Test__ZN3ccc8CC8x6y13E, "_ZN3ccc8CC8x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x6y13C1Ev();
extern void _ZN3ccc8CC8x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x6y13E[] = {
  NSPAIR(_ZN3ccc8CC8x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC8x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC8x6y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x6y133efgEv,_ZTv0_n12_N3ccc8CC8x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x6y133efgEv,_ZThn4_N3ccc8CC8x6y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x6y133efgEv,_ZTv0_n12_N3ccc8CC8x6y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x6y13E[] = {
  {&(_ZTVN3ccc8CC8x6y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x6y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x6y13E[];
static VTBL_ENTRY alt_thunk_names1373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x6y133efgEv,_ZTv0_n12_N3ccc8CC8x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x6y133efgEv,_ZThn4_N3ccc8CC8x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x6y13E = {  "_ZN3ccc8CC8x6y13E", // class name
  bases__ZN3ccc8CC8x6y13E, 2,
  &(vtc__ZN3ccc8CC8x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x6y13E),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  DD8x6y13  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD8x6y133efgEv
  ~DD8x6y13(); // tgen
  DD8x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x6y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD8x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x6y133efgEv");}
ccc::DD8x6y13 ::~DD8x6y13(){ note_dtor("_ZN3ccc8DD8x6y13E", this);} // tgen
ccc::DD8x6y13 ::DD8x6y13(){ note_ctor("_ZN3ccc8DD8x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x6y13E, buf);
    ::ccc::DD8x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x6y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD8x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x6y13E);
    dp->::ccc::DD8x6y13::~DD8x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x6y13E(Test__ZN3ccc8DD8x6y13E, "_ZN3ccc8DD8x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x6y13C1Ev();
extern void _ZN3ccc8DD8x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x6y13E[] = {
  NSPAIR(_ZN3ccc8DD8x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD8x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y13E[];
extern void _ZN3ccc8DD8x6y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x6y133efgEv,_ZTv0_n16_N3ccc8DD8x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x6y133efgEv,_ZThn4_N3ccc8DD8x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x6y133efgEv,_ZTv0_n16_N3ccc8DD8x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x6y13E[] = {
  {&(_ZTVN3ccc8DD8x6y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x6y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x6y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x6y13E[];
static VTBL_ENTRY alt_thunk_names1374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x6y133efgEv,_ZTv0_n16_N3ccc8DD8x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x6y133efgEv,_ZThn4_N3ccc8DD8x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x6y13E = {  "_ZN3ccc8DD8x6y13E", // class name
  bases__ZN3ccc8DD8x6y13E, 2,
  &(vtc__ZN3ccc8DD8x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x6y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x6y13E),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  CC8x6y14  : virtual ::ccc::AA8 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC8x6y143pqrEv
  ~CC8x6y14(); // tgen
  CC8x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC8x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x6y143pqrEv");}
ccc::CC8x6y14 ::~CC8x6y14(){ note_dtor("_ZN3ccc8CC8x6y14E", this);} // tgen
ccc::CC8x6y14 ::CC8x6y14(){ note_ctor("_ZN3ccc8CC8x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x6y14E, buf);
    ::ccc::CC8x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x6y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC8x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x6y14E);
    dp->::ccc::CC8x6y14::~CC8x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x6y14E(Test__ZN3ccc8CC8x6y14E, "_ZN3ccc8CC8x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x6y14C1Ev();
extern void _ZN3ccc8CC8x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x6y14E[] = {
  NSPAIR(_ZN3ccc8CC8x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC8x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC8x6y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x6y14E[] = {
  {&(_ZTVN3ccc8CC8x6y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x6y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x6y14E[];
Class_Descriptor cd__ZN3ccc8CC8x6y14E = {  "_ZN3ccc8CC8x6y14E", // class name
  bases__ZN3ccc8CC8x6y14E, 2,
  &(vtc__ZN3ccc8CC8x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x6y14E),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  DD8x6y14  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD8x6y143pqrEv
  ~DD8x6y14(); // tgen
  DD8x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x6y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD8x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x6y143pqrEv");}
ccc::DD8x6y14 ::~DD8x6y14(){ note_dtor("_ZN3ccc8DD8x6y14E", this);} // tgen
ccc::DD8x6y14 ::DD8x6y14(){ note_ctor("_ZN3ccc8DD8x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x6y14E, buf);
    ::ccc::DD8x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x6y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD8x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x6y14E);
    dp->::ccc::DD8x6y14::~DD8x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x6y14E(Test__ZN3ccc8DD8x6y14E, "_ZN3ccc8DD8x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x6y14C1Ev();
extern void _ZN3ccc8DD8x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x6y14E[] = {
  NSPAIR(_ZN3ccc8DD8x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD8x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x6y14E[] = {
  {&(_ZTVN3ccc8DD8x6y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x6y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x6y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x6y14E[];
Class_Descriptor cd__ZN3ccc8DD8x6y14E = {  "_ZN3ccc8DD8x6y14E", // class name
  bases__ZN3ccc8DD8x6y14E, 2,
  &(vtc__ZN3ccc8DD8x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x6y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x6y14E),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  CC8x6y15  : virtual ::ccc::AA8 , ::ccc::BB6 {
  ~CC8x6y15(); // tgen
  CC8x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x6y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC8x6y15 ::~CC8x6y15(){ note_dtor("_ZN3ccc8CC8x6y15E", this);} // tgen
ccc::CC8x6y15 ::CC8x6y15(){ note_ctor("_ZN3ccc8CC8x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x6y15E, buf);
    ::ccc::CC8x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x6y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC8x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x6y15E);
    dp->::ccc::CC8x6y15::~CC8x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x6y15E(Test__ZN3ccc8CC8x6y15E, "_ZN3ccc8CC8x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x6y15C1Ev();
extern void _ZN3ccc8CC8x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x6y15E[] = {
  NSPAIR(_ZN3ccc8CC8x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC8x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x6y15E[] = {
  {&(_ZTVN3ccc8CC8x6y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x6y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x6y15E[];
Class_Descriptor cd__ZN3ccc8CC8x6y15E = {  "_ZN3ccc8CC8x6y15E", // class name
  bases__ZN3ccc8CC8x6y15E, 2,
  &(vtc__ZN3ccc8CC8x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x6y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x6y15E),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  DD8x6y15  : virtual ::ccc::AA8 , virtual ::ccc::BB6 {
  ~DD8x6y15(); // tgen
  DD8x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x6y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD8x6y15 ::~DD8x6y15(){ note_dtor("_ZN3ccc8DD8x6y15E", this);} // tgen
ccc::DD8x6y15 ::DD8x6y15(){ note_ctor("_ZN3ccc8DD8x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x6y15E, buf);
    ::ccc::DD8x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x6y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD8x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x6y15E);
    dp->::ccc::DD8x6y15::~DD8x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x6y15E(Test__ZN3ccc8DD8x6y15E, "_ZN3ccc8DD8x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x6y15C1Ev();
extern void _ZN3ccc8DD8x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x6y15E[] = {
  NSPAIR(_ZN3ccc8DD8x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD8x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x6y15E[] = {
  {&(_ZTVN3ccc8DD8x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x6y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x6y15E[];
Class_Descriptor cd__ZN3ccc8DD8x6y15E = {  "_ZN3ccc8DD8x6y15E", // class name
  bases__ZN3ccc8DD8x6y15E, 2,
  &(vtc__ZN3ccc8DD8x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x6y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x6y15E),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  CC8x7y0  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y03pqrEv
  ~CC8x7y0(); // tgen
  CC8x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y0E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y03abcEv");}
void  ccc::CC8x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y03efgEv");}
void  ccc::CC8x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y03pqrEv");}
ccc::CC8x7y0 ::~CC8x7y0(){ note_dtor("_ZN3ccc7CC8x7y0E", this);} // tgen
ccc::CC8x7y0 ::CC8x7y0(){ note_ctor("_ZN3ccc7CC8x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y0E, buf);
    ::ccc::CC8x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y0E);
    dp->::ccc::CC8x7y0::~CC8x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y0E(Test__ZN3ccc7CC8x7y0E, "_ZN3ccc7CC8x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y0C1Ev();
extern void _ZN3ccc7CC8x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y0E[] = {
  NSPAIR(_ZN3ccc7CC8x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y0E[];
extern void _ZN3ccc7CC8x7y03abcEv();
extern void _ZN3ccc7CC8x7y03pqrEv();
extern void _ZN3ccc7CC8x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y03efgEv,_ZTv0_n12_N3ccc7CC8x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y03efgEv,_ZThn4_N3ccc7CC8x7y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y03abcEv,_ZTv0_n16_N3ccc7CC8x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y03abcEv,_ZThn4_N3ccc7CC8x7y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y03efgEv,_ZTv0_n12_N3ccc7CC8x7y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y03abcEv,_ZTv0_n16_N3ccc7CC8x7y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y0E[] = {
  {&(_ZTVN3ccc7CC8x7y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y0E[];
static VTBL_ENTRY alt_thunk_names1375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y03abcEv,_ZTv0_n16_N3ccc7CC8x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y03abcEv,_ZThn4_N3ccc7CC8x7y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y03efgEv,_ZTv0_n12_N3ccc7CC8x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y03efgEv,_ZThn4_N3ccc7CC8x7y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y0E = {  "_ZN3ccc7CC8x7y0E", // class name
  bases__ZN3ccc7CC8x7y0E, 2,
  &(vtc__ZN3ccc7CC8x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y0E),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  DD8x7y0  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD8x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x7y03pqrEv
  ~DD8x7y0(); // tgen
  DD8x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y0E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y03abcEv");}
void  ccc::DD8x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y03efgEv");}
void  ccc::DD8x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y03pqrEv");}
ccc::DD8x7y0 ::~DD8x7y0(){ note_dtor("_ZN3ccc7DD8x7y0E", this);} // tgen
ccc::DD8x7y0 ::DD8x7y0(){ note_ctor("_ZN3ccc7DD8x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y0E, buf);
    ::ccc::DD8x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y0E);
    dp->::ccc::DD8x7y0::~DD8x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y0E(Test__ZN3ccc7DD8x7y0E, "_ZN3ccc7DD8x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y0C1Ev();
extern void _ZN3ccc7DD8x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y0E[] = {
  NSPAIR(_ZN3ccc7DD8x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y0E[];
extern void _ZN3ccc7DD8x7y03efgEv();
extern void _ZN3ccc7DD8x7y03abcEv();
extern void _ZN3ccc7DD8x7y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y03abcEv,_ZTv0_n12_N3ccc7DD8x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y03abcEv,_ZThn4_N3ccc7DD8x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y03pqrEv,_ZTv0_n16_N3ccc7DD8x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y03pqrEv,_ZThn4_N3ccc7DD8x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y03abcEv,_ZTv0_n12_N3ccc7DD8x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y03pqrEv,_ZTv0_n16_N3ccc7DD8x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y0E[] = {
  {&(_ZTVN3ccc7DD8x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y0E[];
static VTBL_ENTRY alt_thunk_names1376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y03pqrEv,_ZTv0_n16_N3ccc7DD8x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y03pqrEv,_ZThn4_N3ccc7DD8x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y03abcEv,_ZTv0_n12_N3ccc7DD8x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y03abcEv,_ZThn4_N3ccc7DD8x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y0E = {  "_ZN3ccc7DD8x7y0E", // class name
  bases__ZN3ccc7DD8x7y0E, 2,
  &(vtc__ZN3ccc7DD8x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y0E),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  CC8x7y1  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x7y13efgEv
  ~CC8x7y1(); // tgen
  CC8x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y1E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y13abcEv");}
void  ccc::CC8x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y13pqrEv");}
void  ccc::CC8x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y13efgEv");}
ccc::CC8x7y1 ::~CC8x7y1(){ note_dtor("_ZN3ccc7CC8x7y1E", this);} // tgen
ccc::CC8x7y1 ::CC8x7y1(){ note_ctor("_ZN3ccc7CC8x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y1E, buf);
    ::ccc::CC8x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y1E);
    dp->::ccc::CC8x7y1::~CC8x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y1E(Test__ZN3ccc7CC8x7y1E, "_ZN3ccc7CC8x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y1C1Ev();
extern void _ZN3ccc7CC8x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y1E[] = {
  NSPAIR(_ZN3ccc7CC8x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y1E[];
extern void _ZN3ccc7CC8x7y13abcEv();
extern void _ZN3ccc7CC8x7y13pqrEv();
extern void _ZN3ccc7CC8x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y13efgEv,_ZTv0_n12_N3ccc7CC8x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y13efgEv,_ZThn4_N3ccc7CC8x7y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y13abcEv,_ZTv0_n16_N3ccc7CC8x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y13abcEv,_ZThn4_N3ccc7CC8x7y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y13efgEv,_ZTv0_n12_N3ccc7CC8x7y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y13abcEv,_ZTv0_n16_N3ccc7CC8x7y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y1E[] = {
  {&(_ZTVN3ccc7CC8x7y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y1E[];
static VTBL_ENTRY alt_thunk_names1377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y13abcEv,_ZTv0_n16_N3ccc7CC8x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y13abcEv,_ZThn4_N3ccc7CC8x7y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y13efgEv,_ZTv0_n12_N3ccc7CC8x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y13efgEv,_ZThn4_N3ccc7CC8x7y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y1E = {  "_ZN3ccc7CC8x7y1E", // class name
  bases__ZN3ccc7CC8x7y1E, 2,
  &(vtc__ZN3ccc7CC8x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y1E),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  DD8x7y1  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD8x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x7y13efgEv
  ~DD8x7y1(); // tgen
  DD8x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y1E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y13abcEv");}
void  ccc::DD8x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y13pqrEv");}
void  ccc::DD8x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y13efgEv");}
ccc::DD8x7y1 ::~DD8x7y1(){ note_dtor("_ZN3ccc7DD8x7y1E", this);} // tgen
ccc::DD8x7y1 ::DD8x7y1(){ note_ctor("_ZN3ccc7DD8x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y1E, buf);
    ::ccc::DD8x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y1E);
    dp->::ccc::DD8x7y1::~DD8x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y1E(Test__ZN3ccc7DD8x7y1E, "_ZN3ccc7DD8x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y1C1Ev();
extern void _ZN3ccc7DD8x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y1E[] = {
  NSPAIR(_ZN3ccc7DD8x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y1E[];
extern void _ZN3ccc7DD8x7y13efgEv();
extern void _ZN3ccc7DD8x7y13abcEv();
extern void _ZN3ccc7DD8x7y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y13abcEv,_ZTv0_n12_N3ccc7DD8x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y13abcEv,_ZThn4_N3ccc7DD8x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y13pqrEv,_ZTv0_n16_N3ccc7DD8x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y13pqrEv,_ZThn4_N3ccc7DD8x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y13abcEv,_ZTv0_n12_N3ccc7DD8x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y13pqrEv,_ZTv0_n16_N3ccc7DD8x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y1E[] = {
  {&(_ZTVN3ccc7DD8x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y1E[];
static VTBL_ENTRY alt_thunk_names1378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y13pqrEv,_ZTv0_n16_N3ccc7DD8x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y13pqrEv,_ZThn4_N3ccc7DD8x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y13abcEv,_ZTv0_n12_N3ccc7DD8x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y13abcEv,_ZThn4_N3ccc7DD8x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y1E = {  "_ZN3ccc7DD8x7y1E", // class name
  bases__ZN3ccc7DD8x7y1E, 2,
  &(vtc__ZN3ccc7DD8x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y1E),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  CC8x7y2  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y23pqrEv
  ~CC8x7y2(); // tgen
  CC8x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y2E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y23efgEv");}
void  ccc::CC8x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y23abcEv");}
void  ccc::CC8x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y23pqrEv");}
ccc::CC8x7y2 ::~CC8x7y2(){ note_dtor("_ZN3ccc7CC8x7y2E", this);} // tgen
ccc::CC8x7y2 ::CC8x7y2(){ note_ctor("_ZN3ccc7CC8x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y2E, buf);
    ::ccc::CC8x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y2E);
    dp->::ccc::CC8x7y2::~CC8x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y2E(Test__ZN3ccc7CC8x7y2E, "_ZN3ccc7CC8x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y2C1Ev();
extern void _ZN3ccc7CC8x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y2E[] = {
  NSPAIR(_ZN3ccc7CC8x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y2E[];
extern void _ZN3ccc7CC8x7y23abcEv();
extern void _ZN3ccc7CC8x7y23pqrEv();
extern void _ZN3ccc7CC8x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y23efgEv,_ZTv0_n12_N3ccc7CC8x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y23efgEv,_ZThn4_N3ccc7CC8x7y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y23abcEv,_ZTv0_n16_N3ccc7CC8x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y23abcEv,_ZThn4_N3ccc7CC8x7y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y23efgEv,_ZTv0_n12_N3ccc7CC8x7y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y23abcEv,_ZTv0_n16_N3ccc7CC8x7y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y2E[] = {
  {&(_ZTVN3ccc7CC8x7y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y2E[];
static VTBL_ENTRY alt_thunk_names1379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y23abcEv,_ZTv0_n16_N3ccc7CC8x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y23abcEv,_ZThn4_N3ccc7CC8x7y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y23efgEv,_ZTv0_n12_N3ccc7CC8x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y23efgEv,_ZThn4_N3ccc7CC8x7y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y2E = {  "_ZN3ccc7CC8x7y2E", // class name
  bases__ZN3ccc7CC8x7y2E, 2,
  &(vtc__ZN3ccc7CC8x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y2E),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  DD8x7y2  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD8x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x7y23pqrEv
  ~DD8x7y2(); // tgen
  DD8x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y2E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y23efgEv");}
void  ccc::DD8x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y23abcEv");}
void  ccc::DD8x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y23pqrEv");}
ccc::DD8x7y2 ::~DD8x7y2(){ note_dtor("_ZN3ccc7DD8x7y2E", this);} // tgen
ccc::DD8x7y2 ::DD8x7y2(){ note_ctor("_ZN3ccc7DD8x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y2E, buf);
    ::ccc::DD8x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y2E);
    dp->::ccc::DD8x7y2::~DD8x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y2E(Test__ZN3ccc7DD8x7y2E, "_ZN3ccc7DD8x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y2C1Ev();
extern void _ZN3ccc7DD8x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y2E[] = {
  NSPAIR(_ZN3ccc7DD8x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y2E[];
extern void _ZN3ccc7DD8x7y23efgEv();
extern void _ZN3ccc7DD8x7y23abcEv();
extern void _ZN3ccc7DD8x7y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y23abcEv,_ZTv0_n12_N3ccc7DD8x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y23abcEv,_ZThn4_N3ccc7DD8x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y23pqrEv,_ZTv0_n16_N3ccc7DD8x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y23pqrEv,_ZThn4_N3ccc7DD8x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y23abcEv,_ZTv0_n12_N3ccc7DD8x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y23pqrEv,_ZTv0_n16_N3ccc7DD8x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y2E[] = {
  {&(_ZTVN3ccc7DD8x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y2E[];
static VTBL_ENTRY alt_thunk_names1380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y23pqrEv,_ZTv0_n16_N3ccc7DD8x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y23pqrEv,_ZThn4_N3ccc7DD8x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y23abcEv,_ZTv0_n12_N3ccc7DD8x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y23abcEv,_ZThn4_N3ccc7DD8x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y2E = {  "_ZN3ccc7DD8x7y2E", // class name
  bases__ZN3ccc7DD8x7y2E, 2,
  &(vtc__ZN3ccc7DD8x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y2E),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  CC8x7y3  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x7y33abcEv
  ~CC8x7y3(); // tgen
  CC8x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y3E) C1{ VBC2{ v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y33efgEv");}
void  ccc::CC8x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y33pqrEv");}
void  ccc::CC8x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y33abcEv");}
ccc::CC8x7y3 ::~CC8x7y3(){ note_dtor("_ZN3ccc7CC8x7y3E", this);} // tgen
ccc::CC8x7y3 ::CC8x7y3(){ note_ctor("_ZN3ccc7CC8x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y3E, buf);
    ::ccc::CC8x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y3E);
    dp->::ccc::CC8x7y3::~CC8x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y3E(Test__ZN3ccc7CC8x7y3E, "_ZN3ccc7CC8x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y3C1Ev();
extern void _ZN3ccc7CC8x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y3E[] = {
  NSPAIR(_ZN3ccc7CC8x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y3E[];
extern void _ZN3ccc7CC8x7y33abcEv();
extern void _ZN3ccc7CC8x7y33pqrEv();
extern void _ZN3ccc7CC8x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y33efgEv,_ZTv0_n12_N3ccc7CC8x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y33efgEv,_ZThn4_N3ccc7CC8x7y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y33abcEv,_ZTv0_n16_N3ccc7CC8x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y33abcEv,_ZThn4_N3ccc7CC8x7y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y33efgEv,_ZTv0_n12_N3ccc7CC8x7y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y33abcEv,_ZTv0_n16_N3ccc7CC8x7y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y3E[] = {
  {&(_ZTVN3ccc7CC8x7y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y3E[];
static VTBL_ENTRY alt_thunk_names1381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y33abcEv,_ZTv0_n16_N3ccc7CC8x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y33abcEv,_ZThn4_N3ccc7CC8x7y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y33efgEv,_ZTv0_n12_N3ccc7CC8x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y33efgEv,_ZThn4_N3ccc7CC8x7y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y3E = {  "_ZN3ccc7CC8x7y3E", // class name
  bases__ZN3ccc7CC8x7y3E, 2,
  &(vtc__ZN3ccc7CC8x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y3E),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  DD8x7y3  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD8x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x7y33abcEv
  ~DD8x7y3(); // tgen
  DD8x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y3E) C1{ VBC2{ v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y33efgEv");}
void  ccc::DD8x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y33pqrEv");}
void  ccc::DD8x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y33abcEv");}
ccc::DD8x7y3 ::~DD8x7y3(){ note_dtor("_ZN3ccc7DD8x7y3E", this);} // tgen
ccc::DD8x7y3 ::DD8x7y3(){ note_ctor("_ZN3ccc7DD8x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y3E, buf);
    ::ccc::DD8x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y3E);
    dp->::ccc::DD8x7y3::~DD8x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y3E(Test__ZN3ccc7DD8x7y3E, "_ZN3ccc7DD8x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y3C1Ev();
extern void _ZN3ccc7DD8x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y3E[] = {
  NSPAIR(_ZN3ccc7DD8x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y3E[];
extern void _ZN3ccc7DD8x7y33efgEv();
extern void _ZN3ccc7DD8x7y33abcEv();
extern void _ZN3ccc7DD8x7y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y33abcEv,_ZTv0_n12_N3ccc7DD8x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y33abcEv,_ZThn4_N3ccc7DD8x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y33pqrEv,_ZTv0_n16_N3ccc7DD8x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y33pqrEv,_ZThn4_N3ccc7DD8x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y33abcEv,_ZTv0_n12_N3ccc7DD8x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y33pqrEv,_ZTv0_n16_N3ccc7DD8x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y3E[] = {
  {&(_ZTVN3ccc7DD8x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y3E[];
static VTBL_ENTRY alt_thunk_names1382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y33pqrEv,_ZTv0_n16_N3ccc7DD8x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y33pqrEv,_ZThn4_N3ccc7DD8x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y33abcEv,_ZTv0_n12_N3ccc7DD8x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y33abcEv,_ZThn4_N3ccc7DD8x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y3E = {  "_ZN3ccc7DD8x7y3E", // class name
  bases__ZN3ccc7DD8x7y3E, 2,
  &(vtc__ZN3ccc7DD8x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y3E),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  CC8x7y4  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC8x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x7y43efgEv
  ~CC8x7y4(); // tgen
  CC8x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y4E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y43pqrEv");}
void  ccc::CC8x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y43abcEv");}
void  ccc::CC8x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y43efgEv");}
ccc::CC8x7y4 ::~CC8x7y4(){ note_dtor("_ZN3ccc7CC8x7y4E", this);} // tgen
ccc::CC8x7y4 ::CC8x7y4(){ note_ctor("_ZN3ccc7CC8x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y4E, buf);
    ::ccc::CC8x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y4E);
    dp->::ccc::CC8x7y4::~CC8x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y4E(Test__ZN3ccc7CC8x7y4E, "_ZN3ccc7CC8x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y4C1Ev();
extern void _ZN3ccc7CC8x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y4E[] = {
  NSPAIR(_ZN3ccc7CC8x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y4E[];
extern void _ZN3ccc7CC8x7y43abcEv();
extern void _ZN3ccc7CC8x7y43pqrEv();
extern void _ZN3ccc7CC8x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y43efgEv,_ZTv0_n12_N3ccc7CC8x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y43efgEv,_ZThn4_N3ccc7CC8x7y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y43abcEv,_ZTv0_n16_N3ccc7CC8x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y43abcEv,_ZThn4_N3ccc7CC8x7y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y43efgEv,_ZTv0_n12_N3ccc7CC8x7y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y43abcEv,_ZTv0_n16_N3ccc7CC8x7y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y4E[] = {
  {&(_ZTVN3ccc7CC8x7y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y4E[];
static VTBL_ENTRY alt_thunk_names1383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y43abcEv,_ZTv0_n16_N3ccc7CC8x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y43abcEv,_ZThn4_N3ccc7CC8x7y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y43efgEv,_ZTv0_n12_N3ccc7CC8x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y43efgEv,_ZThn4_N3ccc7CC8x7y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y4E = {  "_ZN3ccc7CC8x7y4E", // class name
  bases__ZN3ccc7CC8x7y4E, 2,
  &(vtc__ZN3ccc7CC8x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y4E),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  DD8x7y4  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD8x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x7y43efgEv
  ~DD8x7y4(); // tgen
  DD8x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y4E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y43pqrEv");}
void  ccc::DD8x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y43abcEv");}
void  ccc::DD8x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y43efgEv");}
ccc::DD8x7y4 ::~DD8x7y4(){ note_dtor("_ZN3ccc7DD8x7y4E", this);} // tgen
ccc::DD8x7y4 ::DD8x7y4(){ note_ctor("_ZN3ccc7DD8x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y4E, buf);
    ::ccc::DD8x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y4E);
    dp->::ccc::DD8x7y4::~DD8x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y4E(Test__ZN3ccc7DD8x7y4E, "_ZN3ccc7DD8x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y4C1Ev();
extern void _ZN3ccc7DD8x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y4E[] = {
  NSPAIR(_ZN3ccc7DD8x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y4E[];
extern void _ZN3ccc7DD8x7y43efgEv();
extern void _ZN3ccc7DD8x7y43abcEv();
extern void _ZN3ccc7DD8x7y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y43abcEv,_ZTv0_n12_N3ccc7DD8x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y43abcEv,_ZThn4_N3ccc7DD8x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y43pqrEv,_ZTv0_n16_N3ccc7DD8x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y43pqrEv,_ZThn4_N3ccc7DD8x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y43abcEv,_ZTv0_n12_N3ccc7DD8x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y43pqrEv,_ZTv0_n16_N3ccc7DD8x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y4E[] = {
  {&(_ZTVN3ccc7DD8x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y4E[];
static VTBL_ENTRY alt_thunk_names1384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y43pqrEv,_ZTv0_n16_N3ccc7DD8x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y43pqrEv,_ZThn4_N3ccc7DD8x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y43abcEv,_ZTv0_n12_N3ccc7DD8x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y43abcEv,_ZThn4_N3ccc7DD8x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y4E = {  "_ZN3ccc7DD8x7y4E", // class name
  bases__ZN3ccc7DD8x7y4E, 2,
  &(vtc__ZN3ccc7DD8x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y4E),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  CC8x7y5  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC8x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x7y53abcEv
  ~CC8x7y5(); // tgen
  CC8x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y5E) C1{ VBC2{ v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y53pqrEv");}
void  ccc::CC8x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y53efgEv");}
void  ccc::CC8x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y53abcEv");}
ccc::CC8x7y5 ::~CC8x7y5(){ note_dtor("_ZN3ccc7CC8x7y5E", this);} // tgen
ccc::CC8x7y5 ::CC8x7y5(){ note_ctor("_ZN3ccc7CC8x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y5E, buf);
    ::ccc::CC8x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y5E);
    dp->::ccc::CC8x7y5::~CC8x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y5E(Test__ZN3ccc7CC8x7y5E, "_ZN3ccc7CC8x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y5C1Ev();
extern void _ZN3ccc7CC8x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y5E[] = {
  NSPAIR(_ZN3ccc7CC8x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y5E[];
extern void _ZN3ccc7CC8x7y53abcEv();
extern void _ZN3ccc7CC8x7y53pqrEv();
extern void _ZN3ccc7CC8x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y53efgEv,_ZTv0_n12_N3ccc7CC8x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y53efgEv,_ZThn4_N3ccc7CC8x7y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y53abcEv,_ZTv0_n16_N3ccc7CC8x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y53abcEv,_ZThn4_N3ccc7CC8x7y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y53efgEv,_ZTv0_n12_N3ccc7CC8x7y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y53abcEv,_ZTv0_n16_N3ccc7CC8x7y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y5E[] = {
  {&(_ZTVN3ccc7CC8x7y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y5E[];
static VTBL_ENTRY alt_thunk_names1385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y53abcEv,_ZTv0_n16_N3ccc7CC8x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y53abcEv,_ZThn4_N3ccc7CC8x7y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y53efgEv,_ZTv0_n12_N3ccc7CC8x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y53efgEv,_ZThn4_N3ccc7CC8x7y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y5E = {  "_ZN3ccc7CC8x7y5E", // class name
  bases__ZN3ccc7CC8x7y5E, 2,
  &(vtc__ZN3ccc7CC8x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y5E),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  DD8x7y5  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD8x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x7y53abcEv
  ~DD8x7y5(); // tgen
  DD8x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y5E) C1{ VBC2{ v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y53pqrEv");}
void  ccc::DD8x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y53efgEv");}
void  ccc::DD8x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y53abcEv");}
ccc::DD8x7y5 ::~DD8x7y5(){ note_dtor("_ZN3ccc7DD8x7y5E", this);} // tgen
ccc::DD8x7y5 ::DD8x7y5(){ note_ctor("_ZN3ccc7DD8x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y5E, buf);
    ::ccc::DD8x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y5E);
    dp->::ccc::DD8x7y5::~DD8x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y5E(Test__ZN3ccc7DD8x7y5E, "_ZN3ccc7DD8x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y5C1Ev();
extern void _ZN3ccc7DD8x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y5E[] = {
  NSPAIR(_ZN3ccc7DD8x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y5E[];
extern void _ZN3ccc7DD8x7y53efgEv();
extern void _ZN3ccc7DD8x7y53abcEv();
extern void _ZN3ccc7DD8x7y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y53abcEv,_ZTv0_n12_N3ccc7DD8x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y53abcEv,_ZThn4_N3ccc7DD8x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y53pqrEv,_ZTv0_n16_N3ccc7DD8x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y53pqrEv,_ZThn4_N3ccc7DD8x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y53abcEv,_ZTv0_n12_N3ccc7DD8x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y53pqrEv,_ZTv0_n16_N3ccc7DD8x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y5E[] = {
  {&(_ZTVN3ccc7DD8x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y5E[];
static VTBL_ENTRY alt_thunk_names1386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y53pqrEv,_ZTv0_n16_N3ccc7DD8x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y53pqrEv,_ZThn4_N3ccc7DD8x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y53abcEv,_ZTv0_n12_N3ccc7DD8x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y53abcEv,_ZThn4_N3ccc7DD8x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y5E = {  "_ZN3ccc7DD8x7y5E", // class name
  bases__ZN3ccc7DD8x7y5E, 2,
  &(vtc__ZN3ccc7DD8x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y5E),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  CC8x7y6  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x7y63efgEv
  ~CC8x7y6(); // tgen
  CC8x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y6E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y63abcEv");}
void  ccc::CC8x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y63efgEv");}
ccc::CC8x7y6 ::~CC8x7y6(){ note_dtor("_ZN3ccc7CC8x7y6E", this);} // tgen
ccc::CC8x7y6 ::CC8x7y6(){ note_ctor("_ZN3ccc7CC8x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y6E, buf);
    ::ccc::CC8x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y6E);
    dp->::ccc::CC8x7y6::~CC8x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y6E(Test__ZN3ccc7CC8x7y6E, "_ZN3ccc7CC8x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y6C1Ev();
extern void _ZN3ccc7CC8x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y6E[] = {
  NSPAIR(_ZN3ccc7CC8x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y6E[];
extern void _ZN3ccc7CC8x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC8x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y63efgEv,_ZTv0_n12_N3ccc7CC8x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y63efgEv,_ZThn4_N3ccc7CC8x7y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y63abcEv,_ZTv0_n16_N3ccc7CC8x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y63abcEv,_ZThn4_N3ccc7CC8x7y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y63efgEv,_ZTv0_n12_N3ccc7CC8x7y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y63abcEv,_ZTv0_n16_N3ccc7CC8x7y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y6E[] = {
  {&(_ZTVN3ccc7CC8x7y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y6E[];
static VTBL_ENTRY alt_thunk_names1387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y63abcEv,_ZTv0_n16_N3ccc7CC8x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y63abcEv,_ZThn4_N3ccc7CC8x7y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y63efgEv,_ZTv0_n12_N3ccc7CC8x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y63efgEv,_ZThn4_N3ccc7CC8x7y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y6E = {  "_ZN3ccc7CC8x7y6E", // class name
  bases__ZN3ccc7CC8x7y6E, 2,
  &(vtc__ZN3ccc7CC8x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y6E),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  DD8x7y6  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD8x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x7y63efgEv
  ~DD8x7y6(); // tgen
  DD8x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y6E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y63abcEv");}
void  ccc::DD8x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y63efgEv");}
ccc::DD8x7y6 ::~DD8x7y6(){ note_dtor("_ZN3ccc7DD8x7y6E", this);} // tgen
ccc::DD8x7y6 ::DD8x7y6(){ note_ctor("_ZN3ccc7DD8x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y6E, buf);
    ::ccc::DD8x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y6E);
    dp->::ccc::DD8x7y6::~DD8x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y6E(Test__ZN3ccc7DD8x7y6E, "_ZN3ccc7DD8x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y6C1Ev();
extern void _ZN3ccc7DD8x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y6E[] = {
  NSPAIR(_ZN3ccc7DD8x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y6E[];
extern void _ZN3ccc7DD8x7y63efgEv();
extern void _ZN3ccc7DD8x7y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y63abcEv,_ZTv0_n12_N3ccc7DD8x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y63abcEv,_ZThn4_N3ccc7DD8x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y63abcEv,_ZTv0_n12_N3ccc7DD8x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y6E[] = {
  {&(_ZTVN3ccc7DD8x7y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x7y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x7y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y6E[];
static VTBL_ENTRY alt_thunk_names1388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y63abcEv,_ZTv0_n12_N3ccc7DD8x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y63abcEv,_ZThn4_N3ccc7DD8x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y6E = {  "_ZN3ccc7DD8x7y6E", // class name
  bases__ZN3ccc7DD8x7y6E, 2,
  &(vtc__ZN3ccc7DD8x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y6E),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  CC8x7y7  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC8x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y73pqrEv
  ~CC8x7y7(); // tgen
  CC8x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y7E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y73abcEv");}
void  ccc::CC8x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y73pqrEv");}
ccc::CC8x7y7 ::~CC8x7y7(){ note_dtor("_ZN3ccc7CC8x7y7E", this);} // tgen
ccc::CC8x7y7 ::CC8x7y7(){ note_ctor("_ZN3ccc7CC8x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y7E, buf);
    ::ccc::CC8x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y7E);
    dp->::ccc::CC8x7y7::~CC8x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y7E(Test__ZN3ccc7CC8x7y7E, "_ZN3ccc7CC8x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y7C1Ev();
extern void _ZN3ccc7CC8x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y7E[] = {
  NSPAIR(_ZN3ccc7CC8x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y7E[];
extern void _ZN3ccc7CC8x7y73abcEv();
extern void _ZN3ccc7CC8x7y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y73abcEv,_ZTv0_n16_N3ccc7CC8x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y73abcEv,_ZThn4_N3ccc7CC8x7y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y73abcEv,_ZTv0_n16_N3ccc7CC8x7y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y7E[] = {
  {&(_ZTVN3ccc7CC8x7y7E[3]),  3,11},
  {&(_ZTVN3ccc7CC8x7y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y7E[];
static VTBL_ENTRY alt_thunk_names1389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y73abcEv,_ZTv0_n16_N3ccc7CC8x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y73abcEv,_ZThn4_N3ccc7CC8x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y7E = {  "_ZN3ccc7CC8x7y7E", // class name
  bases__ZN3ccc7CC8x7y7E, 2,
  &(vtc__ZN3ccc7CC8x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y7E),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  DD8x7y7  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD8x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x7y73pqrEv
  ~DD8x7y7(); // tgen
  DD8x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y7E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y73abcEv");}
void  ccc::DD8x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y73pqrEv");}
ccc::DD8x7y7 ::~DD8x7y7(){ note_dtor("_ZN3ccc7DD8x7y7E", this);} // tgen
ccc::DD8x7y7 ::DD8x7y7(){ note_ctor("_ZN3ccc7DD8x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y7E, buf);
    ::ccc::DD8x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y7E);
    dp->::ccc::DD8x7y7::~DD8x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y7E(Test__ZN3ccc7DD8x7y7E, "_ZN3ccc7DD8x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y7C1Ev();
extern void _ZN3ccc7DD8x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y7E[] = {
  NSPAIR(_ZN3ccc7DD8x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x7y73abcEv();
extern void _ZN3ccc7DD8x7y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y73abcEv,_ZTv0_n12_N3ccc7DD8x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y73abcEv,_ZThn4_N3ccc7DD8x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y73pqrEv,_ZTv0_n16_N3ccc7DD8x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y73pqrEv,_ZThn4_N3ccc7DD8x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y73abcEv,_ZTv0_n12_N3ccc7DD8x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y73pqrEv,_ZTv0_n16_N3ccc7DD8x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y7E[] = {
  {&(_ZTVN3ccc7DD8x7y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y7E[];
static VTBL_ENTRY alt_thunk_names1390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y73pqrEv,_ZTv0_n16_N3ccc7DD8x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y73pqrEv,_ZThn4_N3ccc7DD8x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y73abcEv,_ZTv0_n12_N3ccc7DD8x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y73abcEv,_ZThn4_N3ccc7DD8x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y7E = {  "_ZN3ccc7DD8x7y7E", // class name
  bases__ZN3ccc7DD8x7y7E, 2,
  &(vtc__ZN3ccc7DD8x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y7E),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  CC8x7y8  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x7y83abcEv
  ~CC8x7y8(); // tgen
  CC8x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y8E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y83efgEv");}
void  ccc::CC8x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x7y83abcEv");}
ccc::CC8x7y8 ::~CC8x7y8(){ note_dtor("_ZN3ccc7CC8x7y8E", this);} // tgen
ccc::CC8x7y8 ::CC8x7y8(){ note_ctor("_ZN3ccc7CC8x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y8E, buf);
    ::ccc::CC8x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y8E);
    dp->::ccc::CC8x7y8::~CC8x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y8E(Test__ZN3ccc7CC8x7y8E, "_ZN3ccc7CC8x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y8C1Ev();
extern void _ZN3ccc7CC8x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y8E[] = {
  NSPAIR(_ZN3ccc7CC8x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y8E[];
extern void _ZN3ccc7CC8x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC8x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y83efgEv,_ZTv0_n12_N3ccc7CC8x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y83efgEv,_ZThn4_N3ccc7CC8x7y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x7y83abcEv,_ZTv0_n16_N3ccc7CC8x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y83abcEv,_ZThn4_N3ccc7CC8x7y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y83efgEv,_ZTv0_n12_N3ccc7CC8x7y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x7y83abcEv,_ZTv0_n16_N3ccc7CC8x7y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y8E[] = {
  {&(_ZTVN3ccc7CC8x7y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y8E[];
static VTBL_ENTRY alt_thunk_names1391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x7y83abcEv,_ZTv0_n16_N3ccc7CC8x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y83abcEv,_ZThn4_N3ccc7CC8x7y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y83efgEv,_ZTv0_n12_N3ccc7CC8x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y83efgEv,_ZThn4_N3ccc7CC8x7y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y8E = {  "_ZN3ccc7CC8x7y8E", // class name
  bases__ZN3ccc7CC8x7y8E, 2,
  &(vtc__ZN3ccc7CC8x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y8E),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  DD8x7y8  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD8x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x7y83abcEv
  ~DD8x7y8(); // tgen
  DD8x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y8E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y83efgEv");}
void  ccc::DD8x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x7y83abcEv");}
ccc::DD8x7y8 ::~DD8x7y8(){ note_dtor("_ZN3ccc7DD8x7y8E", this);} // tgen
ccc::DD8x7y8 ::DD8x7y8(){ note_ctor("_ZN3ccc7DD8x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y8E, buf);
    ::ccc::DD8x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y8E);
    dp->::ccc::DD8x7y8::~DD8x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y8E(Test__ZN3ccc7DD8x7y8E, "_ZN3ccc7DD8x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y8C1Ev();
extern void _ZN3ccc7DD8x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y8E[] = {
  NSPAIR(_ZN3ccc7DD8x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y8E[];
extern void _ZN3ccc7DD8x7y83efgEv();
extern void _ZN3ccc7DD8x7y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x7y83abcEv,_ZTv0_n12_N3ccc7DD8x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y83abcEv,_ZThn4_N3ccc7DD8x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x7y83abcEv,_ZTv0_n12_N3ccc7DD8x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y8E[] = {
  {&(_ZTVN3ccc7DD8x7y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x7y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x7y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y8E[];
static VTBL_ENTRY alt_thunk_names1392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x7y83abcEv,_ZTv0_n12_N3ccc7DD8x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y83abcEv,_ZThn4_N3ccc7DD8x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y8E = {  "_ZN3ccc7DD8x7y8E", // class name
  bases__ZN3ccc7DD8x7y8E, 2,
  &(vtc__ZN3ccc7DD8x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y8E),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  CC8x7y9  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC8x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x7y93pqrEv
  ~CC8x7y9(); // tgen
  CC8x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x7y9E) C1{ VBC2{ v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x7y93efgEv");}
void  ccc::CC8x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x7y93pqrEv");}
ccc::CC8x7y9 ::~CC8x7y9(){ note_dtor("_ZN3ccc7CC8x7y9E", this);} // tgen
ccc::CC8x7y9 ::CC8x7y9(){ note_ctor("_ZN3ccc7CC8x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x7y9E, buf);
    ::ccc::CC8x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x7y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC8x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x7y9E);
    dp->::ccc::CC8x7y9::~CC8x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x7y9E(Test__ZN3ccc7CC8x7y9E, "_ZN3ccc7CC8x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x7y9C1Ev();
extern void _ZN3ccc7CC8x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x7y9E[] = {
  NSPAIR(_ZN3ccc7CC8x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC8x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC8x7y93pqrEv();
extern void _ZN3ccc7CC8x7y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x7y93efgEv,_ZTv0_n12_N3ccc7CC8x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x7y93efgEv,_ZThn4_N3ccc7CC8x7y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x7y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x7y93efgEv,_ZTv0_n12_N3ccc7CC8x7y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x7y9E[] = {
  {&(_ZTVN3ccc7CC8x7y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x7y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x7y9E[];
static VTBL_ENTRY alt_thunk_names1393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x7y93efgEv,_ZTv0_n12_N3ccc7CC8x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x7y93efgEv,_ZThn4_N3ccc7CC8x7y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x7y9E = {  "_ZN3ccc7CC8x7y9E", // class name
  bases__ZN3ccc7CC8x7y9E, 2,
  &(vtc__ZN3ccc7CC8x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x7y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x7y9E),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  DD8x7y9  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD8x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x7y93pqrEv
  ~DD8x7y9(); // tgen
  DD8x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x7y9E) C1{ VBC2{ v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x7y93efgEv");}
void  ccc::DD8x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x7y93pqrEv");}
ccc::DD8x7y9 ::~DD8x7y9(){ note_dtor("_ZN3ccc7DD8x7y9E", this);} // tgen
ccc::DD8x7y9 ::DD8x7y9(){ note_ctor("_ZN3ccc7DD8x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x7y9E, buf);
    ::ccc::DD8x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x7y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD8x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x7y9E);
    dp->::ccc::DD8x7y9::~DD8x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x7y9E(Test__ZN3ccc7DD8x7y9E, "_ZN3ccc7DD8x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x7y9C1Ev();
extern void _ZN3ccc7DD8x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x7y9E[] = {
  NSPAIR(_ZN3ccc7DD8x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD8x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y9E[];
extern void _ZN3ccc7DD8x7y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x7y93pqrEv,_ZTv0_n16_N3ccc7DD8x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x7y93pqrEv,_ZThn4_N3ccc7DD8x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x7y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x7y93pqrEv,_ZTv0_n16_N3ccc7DD8x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x7y9E[] = {
  {&(_ZTVN3ccc7DD8x7y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x7y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x7y9E[];
static VTBL_ENTRY alt_thunk_names1394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x7y93pqrEv,_ZTv0_n16_N3ccc7DD8x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x7y93pqrEv,_ZThn4_N3ccc7DD8x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x7y9E = {  "_ZN3ccc7DD8x7y9E", // class name
  bases__ZN3ccc7DD8x7y9E, 2,
  &(vtc__ZN3ccc7DD8x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x7y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x7y9E),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  CC8x7y10  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC8x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x7y103abcEv
  ~CC8x7y10(); // tgen
  CC8x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y10E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x7y103pqrEv");}
void  ccc::CC8x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x7y103abcEv");}
ccc::CC8x7y10 ::~CC8x7y10(){ note_dtor("_ZN3ccc8CC8x7y10E", this);} // tgen
ccc::CC8x7y10 ::CC8x7y10(){ note_ctor("_ZN3ccc8CC8x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x7y10E, buf);
    ::ccc::CC8x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x7y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC8x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x7y10E);
    dp->::ccc::CC8x7y10::~CC8x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x7y10E(Test__ZN3ccc8CC8x7y10E, "_ZN3ccc8CC8x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x7y10C1Ev();
extern void _ZN3ccc8CC8x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x7y10E[] = {
  NSPAIR(_ZN3ccc8CC8x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC8x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x7y10E[];
extern void _ZN3ccc8CC8x7y103abcEv();
extern void _ZN3ccc8CC8x7y103pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x7y103abcEv,_ZTv0_n16_N3ccc8CC8x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y103abcEv,_ZThn4_N3ccc8CC8x7y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x7y103abcEv,_ZTv0_n16_N3ccc8CC8x7y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x7y10E[] = {
  {&(_ZTVN3ccc8CC8x7y10E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x7y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x7y10E[];
static VTBL_ENTRY alt_thunk_names1395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x7y103abcEv,_ZTv0_n16_N3ccc8CC8x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x7y103abcEv,_ZThn4_N3ccc8CC8x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x7y10E = {  "_ZN3ccc8CC8x7y10E", // class name
  bases__ZN3ccc8CC8x7y10E, 2,
  &(vtc__ZN3ccc8CC8x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x7y10E),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  DD8x7y10  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD8x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x7y103abcEv
  ~DD8x7y10(); // tgen
  DD8x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x7y10E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x7y103pqrEv");}
void  ccc::DD8x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x7y103abcEv");}
ccc::DD8x7y10 ::~DD8x7y10(){ note_dtor("_ZN3ccc8DD8x7y10E", this);} // tgen
ccc::DD8x7y10 ::DD8x7y10(){ note_ctor("_ZN3ccc8DD8x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x7y10E, buf);
    ::ccc::DD8x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x7y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD8x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x7y10E);
    dp->::ccc::DD8x7y10::~DD8x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x7y10E(Test__ZN3ccc8DD8x7y10E, "_ZN3ccc8DD8x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x7y10C1Ev();
extern void _ZN3ccc8DD8x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x7y10E[] = {
  NSPAIR(_ZN3ccc8DD8x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD8x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x7y103abcEv();
extern void _ZN3ccc8DD8x7y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x7y103abcEv,_ZTv0_n12_N3ccc8DD8x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x7y103abcEv,_ZThn4_N3ccc8DD8x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x7y103pqrEv,_ZTv0_n16_N3ccc8DD8x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x7y103pqrEv,_ZThn4_N3ccc8DD8x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x7y103abcEv,_ZTv0_n12_N3ccc8DD8x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x7y103pqrEv,_ZTv0_n16_N3ccc8DD8x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x7y10E[] = {
  {&(_ZTVN3ccc8DD8x7y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x7y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x7y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x7y10E[];
static VTBL_ENTRY alt_thunk_names1396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x7y103pqrEv,_ZTv0_n16_N3ccc8DD8x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x7y103pqrEv,_ZThn4_N3ccc8DD8x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x7y103abcEv,_ZTv0_n12_N3ccc8DD8x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x7y103abcEv,_ZThn4_N3ccc8DD8x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x7y10E = {  "_ZN3ccc8DD8x7y10E", // class name
  bases__ZN3ccc8DD8x7y10E, 2,
  &(vtc__ZN3ccc8DD8x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x7y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x7y10E),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  CC8x7y11  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC8x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x7y113efgEv
  ~CC8x7y11(); // tgen
  CC8x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y11E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x7y113pqrEv");}
void  ccc::CC8x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x7y113efgEv");}
ccc::CC8x7y11 ::~CC8x7y11(){ note_dtor("_ZN3ccc8CC8x7y11E", this);} // tgen
ccc::CC8x7y11 ::CC8x7y11(){ note_ctor("_ZN3ccc8CC8x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x7y11E, buf);
    ::ccc::CC8x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x7y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC8x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x7y11E);
    dp->::ccc::CC8x7y11::~CC8x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x7y11E(Test__ZN3ccc8CC8x7y11E, "_ZN3ccc8CC8x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x7y11C1Ev();
extern void _ZN3ccc8CC8x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x7y11E[] = {
  NSPAIR(_ZN3ccc8CC8x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC8x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC8x7y113pqrEv();
extern void _ZN3ccc8CC8x7y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x7y113efgEv,_ZTv0_n12_N3ccc8CC8x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y113efgEv,_ZThn4_N3ccc8CC8x7y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x7y113efgEv,_ZTv0_n12_N3ccc8CC8x7y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x7y11E[] = {
  {&(_ZTVN3ccc8CC8x7y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x7y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x7y11E[];
static VTBL_ENTRY alt_thunk_names1397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x7y113efgEv,_ZTv0_n12_N3ccc8CC8x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x7y113efgEv,_ZThn4_N3ccc8CC8x7y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x7y11E = {  "_ZN3ccc8CC8x7y11E", // class name
  bases__ZN3ccc8CC8x7y11E, 2,
  &(vtc__ZN3ccc8CC8x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x7y11E),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  DD8x7y11  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD8x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x7y113efgEv
  ~DD8x7y11(); // tgen
  DD8x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x7y11E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x7y113pqrEv");}
void  ccc::DD8x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x7y113efgEv");}
ccc::DD8x7y11 ::~DD8x7y11(){ note_dtor("_ZN3ccc8DD8x7y11E", this);} // tgen
ccc::DD8x7y11 ::DD8x7y11(){ note_ctor("_ZN3ccc8DD8x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x7y11E, buf);
    ::ccc::DD8x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x7y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD8x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x7y11E);
    dp->::ccc::DD8x7y11::~DD8x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x7y11E(Test__ZN3ccc8DD8x7y11E, "_ZN3ccc8DD8x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x7y11C1Ev();
extern void _ZN3ccc8DD8x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x7y11E[] = {
  NSPAIR(_ZN3ccc8DD8x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD8x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y11E[];
extern void _ZN3ccc8DD8x7y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x7y113pqrEv,_ZTv0_n16_N3ccc8DD8x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x7y113pqrEv,_ZThn4_N3ccc8DD8x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x7y113pqrEv,_ZTv0_n16_N3ccc8DD8x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x7y11E[] = {
  {&(_ZTVN3ccc8DD8x7y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x7y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x7y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x7y11E[];
static VTBL_ENTRY alt_thunk_names1398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x7y113pqrEv,_ZTv0_n16_N3ccc8DD8x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x7y113pqrEv,_ZThn4_N3ccc8DD8x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x7y11E = {  "_ZN3ccc8DD8x7y11E", // class name
  bases__ZN3ccc8DD8x7y11E, 2,
  &(vtc__ZN3ccc8DD8x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x7y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x7y11E),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  CC8x7y12  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC8x7y123abcEv
  ~CC8x7y12(); // tgen
  CC8x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y12E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC8x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x7y123abcEv");}
ccc::CC8x7y12 ::~CC8x7y12(){ note_dtor("_ZN3ccc8CC8x7y12E", this);} // tgen
ccc::CC8x7y12 ::CC8x7y12(){ note_ctor("_ZN3ccc8CC8x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x7y12E, buf);
    ::ccc::CC8x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x7y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC8x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x7y12E);
    dp->::ccc::CC8x7y12::~CC8x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x7y12E(Test__ZN3ccc8CC8x7y12E, "_ZN3ccc8CC8x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x7y12C1Ev();
extern void _ZN3ccc8CC8x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x7y12E[] = {
  NSPAIR(_ZN3ccc8CC8x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC8x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x7y12E[];
extern void _ZN3ccc8CC8x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x7y123abcEv,_ZTv0_n16_N3ccc8CC8x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y123abcEv,_ZThn4_N3ccc8CC8x7y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x7y123abcEv,_ZTv0_n16_N3ccc8CC8x7y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x7y12E[] = {
  {&(_ZTVN3ccc8CC8x7y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x7y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x7y12E[];
static VTBL_ENTRY alt_thunk_names1399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x7y123abcEv,_ZTv0_n16_N3ccc8CC8x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x7y123abcEv,_ZThn4_N3ccc8CC8x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x7y12E = {  "_ZN3ccc8CC8x7y12E", // class name
  bases__ZN3ccc8CC8x7y12E, 2,
  &(vtc__ZN3ccc8CC8x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x7y12E),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  DD8x7y12  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD8x7y123abcEv
  ~DD8x7y12(); // tgen
  DD8x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x7y12E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD8x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x7y123abcEv");}
ccc::DD8x7y12 ::~DD8x7y12(){ note_dtor("_ZN3ccc8DD8x7y12E", this);} // tgen
ccc::DD8x7y12 ::DD8x7y12(){ note_ctor("_ZN3ccc8DD8x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x7y12E, buf);
    ::ccc::DD8x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x7y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD8x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x7y12E);
    dp->::ccc::DD8x7y12::~DD8x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x7y12E(Test__ZN3ccc8DD8x7y12E, "_ZN3ccc8DD8x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x7y12C1Ev();
extern void _ZN3ccc8DD8x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x7y12E[] = {
  NSPAIR(_ZN3ccc8DD8x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD8x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x7y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x7y123abcEv,_ZTv0_n12_N3ccc8DD8x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x7y123abcEv,_ZThn4_N3ccc8DD8x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x7y123abcEv,_ZTv0_n12_N3ccc8DD8x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x7y12E[] = {
  {&(_ZTVN3ccc8DD8x7y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x7y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x7y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x7y12E[];
static VTBL_ENTRY alt_thunk_names1400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x7y123abcEv,_ZTv0_n12_N3ccc8DD8x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x7y123abcEv,_ZThn4_N3ccc8DD8x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x7y12E = {  "_ZN3ccc8DD8x7y12E", // class name
  bases__ZN3ccc8DD8x7y12E, 2,
  &(vtc__ZN3ccc8DD8x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x7y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x7y12E),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  CC8x7y13  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC8x7y133efgEv
  ~CC8x7y13(); // tgen
  CC8x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x7y133efgEv");}
ccc::CC8x7y13 ::~CC8x7y13(){ note_dtor("_ZN3ccc8CC8x7y13E", this);} // tgen
ccc::CC8x7y13 ::CC8x7y13(){ note_ctor("_ZN3ccc8CC8x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x7y13E, buf);
    ::ccc::CC8x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x7y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC8x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x7y13E);
    dp->::ccc::CC8x7y13::~CC8x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x7y13E(Test__ZN3ccc8CC8x7y13E, "_ZN3ccc8CC8x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x7y13C1Ev();
extern void _ZN3ccc8CC8x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x7y13E[] = {
  NSPAIR(_ZN3ccc8CC8x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC8x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC8x7y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x7y133efgEv,_ZTv0_n12_N3ccc8CC8x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x7y133efgEv,_ZThn4_N3ccc8CC8x7y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x7y133efgEv,_ZTv0_n12_N3ccc8CC8x7y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x7y13E[] = {
  {&(_ZTVN3ccc8CC8x7y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x7y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x7y13E[];
static VTBL_ENTRY alt_thunk_names1401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x7y133efgEv,_ZTv0_n12_N3ccc8CC8x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x7y133efgEv,_ZThn4_N3ccc8CC8x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x7y13E = {  "_ZN3ccc8CC8x7y13E", // class name
  bases__ZN3ccc8CC8x7y13E, 2,
  &(vtc__ZN3ccc8CC8x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x7y13E),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  DD8x7y13  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD8x7y133efgEv
  ~DD8x7y13(); // tgen
  DD8x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x7y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x7y133efgEv");}
ccc::DD8x7y13 ::~DD8x7y13(){ note_dtor("_ZN3ccc8DD8x7y13E", this);} // tgen
ccc::DD8x7y13 ::DD8x7y13(){ note_ctor("_ZN3ccc8DD8x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x7y13E, buf);
    ::ccc::DD8x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x7y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD8x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x7y13E);
    dp->::ccc::DD8x7y13::~DD8x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x7y13E(Test__ZN3ccc8DD8x7y13E, "_ZN3ccc8DD8x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x7y13C1Ev();
extern void _ZN3ccc8DD8x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x7y13E[] = {
  NSPAIR(_ZN3ccc8DD8x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD8x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y13E[];
extern void _ZN3ccc8DD8x7y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x7y13E[] = {
  {&(_ZTVN3ccc8DD8x7y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x7y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x7y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x7y13E[];
Class_Descriptor cd__ZN3ccc8DD8x7y13E = {  "_ZN3ccc8DD8x7y13E", // class name
  bases__ZN3ccc8DD8x7y13E, 2,
  &(vtc__ZN3ccc8DD8x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x7y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x7y13E),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  CC8x7y14  : virtual ::ccc::AA8 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC8x7y143pqrEv
  ~CC8x7y14(); // tgen
  CC8x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC8x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x7y143pqrEv");}
ccc::CC8x7y14 ::~CC8x7y14(){ note_dtor("_ZN3ccc8CC8x7y14E", this);} // tgen
ccc::CC8x7y14 ::CC8x7y14(){ note_ctor("_ZN3ccc8CC8x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x7y14E, buf);
    ::ccc::CC8x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x7y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC8x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x7y14E);
    dp->::ccc::CC8x7y14::~CC8x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x7y14E(Test__ZN3ccc8CC8x7y14E, "_ZN3ccc8CC8x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x7y14C1Ev();
extern void _ZN3ccc8CC8x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x7y14E[] = {
  NSPAIR(_ZN3ccc8CC8x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC8x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC8x7y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x7y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x7y14E[] = {
  {&(_ZTVN3ccc8CC8x7y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x7y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x7y14E[];
Class_Descriptor cd__ZN3ccc8CC8x7y14E = {  "_ZN3ccc8CC8x7y14E", // class name
  bases__ZN3ccc8CC8x7y14E, 2,
  &(vtc__ZN3ccc8CC8x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x7y14E),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  DD8x7y14  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD8x7y143pqrEv
  ~DD8x7y14(); // tgen
  DD8x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x7y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD8x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x7y143pqrEv");}
ccc::DD8x7y14 ::~DD8x7y14(){ note_dtor("_ZN3ccc8DD8x7y14E", this);} // tgen
ccc::DD8x7y14 ::DD8x7y14(){ note_ctor("_ZN3ccc8DD8x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x7y14E, buf);
    ::ccc::DD8x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x7y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD8x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x7y14E);
    dp->::ccc::DD8x7y14::~DD8x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x7y14E(Test__ZN3ccc8DD8x7y14E, "_ZN3ccc8DD8x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x7y14C1Ev();
extern void _ZN3ccc8DD8x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x7y14E[] = {
  NSPAIR(_ZN3ccc8DD8x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD8x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x7y143pqrEv,_ZTv0_n16_N3ccc8DD8x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x7y143pqrEv,_ZThn4_N3ccc8DD8x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x7y143pqrEv,_ZTv0_n16_N3ccc8DD8x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x7y14E[] = {
  {&(_ZTVN3ccc8DD8x7y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x7y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x7y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x7y14E[];
static VTBL_ENTRY alt_thunk_names1402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x7y143pqrEv,_ZTv0_n16_N3ccc8DD8x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x7y143pqrEv,_ZThn4_N3ccc8DD8x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x7y14E = {  "_ZN3ccc8DD8x7y14E", // class name
  bases__ZN3ccc8DD8x7y14E, 2,
  &(vtc__ZN3ccc8DD8x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x7y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x7y14E),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  CC8x7y15  : virtual ::ccc::AA8 , ::ccc::BB7 {
  ~CC8x7y15(); // tgen
  CC8x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x7y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC8x7y15 ::~CC8x7y15(){ note_dtor("_ZN3ccc8CC8x7y15E", this);} // tgen
ccc::CC8x7y15 ::CC8x7y15(){ note_ctor("_ZN3ccc8CC8x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x7y15E, buf);
    ::ccc::CC8x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x7y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC8x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x7y15E);
    dp->::ccc::CC8x7y15::~CC8x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x7y15E(Test__ZN3ccc8CC8x7y15E, "_ZN3ccc8CC8x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x7y15C1Ev();
extern void _ZN3ccc8CC8x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x7y15E[] = {
  NSPAIR(_ZN3ccc8CC8x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC8x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x7y15E[] = {
  {&(_ZTVN3ccc8CC8x7y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x7y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x7y15E[];
Class_Descriptor cd__ZN3ccc8CC8x7y15E = {  "_ZN3ccc8CC8x7y15E", // class name
  bases__ZN3ccc8CC8x7y15E, 2,
  &(vtc__ZN3ccc8CC8x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x7y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x7y15E),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  DD8x7y15  : virtual ::ccc::AA8 , virtual ::ccc::BB7 {
  ~DD8x7y15(); // tgen
  DD8x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x7y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD8x7y15 ::~DD8x7y15(){ note_dtor("_ZN3ccc8DD8x7y15E", this);} // tgen
ccc::DD8x7y15 ::DD8x7y15(){ note_ctor("_ZN3ccc8DD8x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x7y15E, buf);
    ::ccc::DD8x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x7y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD8x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x7y15E);
    dp->::ccc::DD8x7y15::~DD8x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x7y15E(Test__ZN3ccc8DD8x7y15E, "_ZN3ccc8DD8x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x7y15C1Ev();
extern void _ZN3ccc8DD8x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x7y15E[] = {
  NSPAIR(_ZN3ccc8DD8x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD8x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x7y15E[] = {
  {&(_ZTVN3ccc8DD8x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x7y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x7y15E[];
Class_Descriptor cd__ZN3ccc8DD8x7y15E = {  "_ZN3ccc8DD8x7y15E", // class name
  bases__ZN3ccc8DD8x7y15E, 2,
  &(vtc__ZN3ccc8DD8x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x7y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x7y15E),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  CC8x8y0  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y03pqrEv
  ~CC8x8y0(); // tgen
  CC8x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y0E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y03abcEv");}
void  ccc::CC8x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y03efgEv");}
void  ccc::CC8x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y03pqrEv");}
ccc::CC8x8y0 ::~CC8x8y0(){ note_dtor("_ZN3ccc7CC8x8y0E", this);} // tgen
ccc::CC8x8y0 ::CC8x8y0(){ note_ctor("_ZN3ccc7CC8x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y0E, buf);
    ::ccc::CC8x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y0E);
    dp->::ccc::CC8x8y0::~CC8x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y0E(Test__ZN3ccc7CC8x8y0E, "_ZN3ccc7CC8x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y0C1Ev();
extern void _ZN3ccc7CC8x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y0E[] = {
  NSPAIR(_ZN3ccc7CC8x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y0E[];
extern void _ZN3ccc7CC8x8y03efgEv();
extern void _ZN3ccc7CC8x8y03abcEv();
extern void _ZN3ccc7CC8x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y03efgEv,_ZTv0_n12_N3ccc7CC8x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y03efgEv,_ZThn4_N3ccc7CC8x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y03abcEv,_ZTv0_n16_N3ccc7CC8x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y03abcEv,_ZThn4_N3ccc7CC8x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y03efgEv,_ZTv0_n12_N3ccc7CC8x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y03abcEv,_ZTv0_n16_N3ccc7CC8x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y0E[] = {
  {&(_ZTVN3ccc7CC8x8y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y0E[];
static VTBL_ENTRY alt_thunk_names1403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y03abcEv,_ZTv0_n16_N3ccc7CC8x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y03abcEv,_ZThn4_N3ccc7CC8x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y03efgEv,_ZTv0_n12_N3ccc7CC8x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y03efgEv,_ZThn4_N3ccc7CC8x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y0E = {  "_ZN3ccc7CC8x8y0E", // class name
  bases__ZN3ccc7CC8x8y0E, 2,
  &(vtc__ZN3ccc7CC8x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y0E),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  DD8x8y0  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD8x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x8y03pqrEv
  ~DD8x8y0(); // tgen
  DD8x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y0E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y03abcEv");}
void  ccc::DD8x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y03efgEv");}
void  ccc::DD8x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y03pqrEv");}
ccc::DD8x8y0 ::~DD8x8y0(){ note_dtor("_ZN3ccc7DD8x8y0E", this);} // tgen
ccc::DD8x8y0 ::DD8x8y0(){ note_ctor("_ZN3ccc7DD8x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y0E, buf);
    ::ccc::DD8x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y0E);
    dp->::ccc::DD8x8y0::~DD8x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y0E(Test__ZN3ccc7DD8x8y0E, "_ZN3ccc7DD8x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y0C1Ev();
extern void _ZN3ccc7DD8x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y0E[] = {
  NSPAIR(_ZN3ccc7DD8x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y0E[];
extern void _ZN3ccc7DD8x8y03efgEv();
extern void _ZN3ccc7DD8x8y03abcEv();
extern void _ZN3ccc7DD8x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y03efgEv,_ZTv0_n12_N3ccc7DD8x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y03efgEv,_ZThn4_N3ccc7DD8x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y03abcEv,_ZTv0_n16_N3ccc7DD8x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y03abcEv,_ZThn4_N3ccc7DD8x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y03efgEv,_ZTv0_n12_N3ccc7DD8x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y03abcEv,_ZTv0_n16_N3ccc7DD8x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y0E[] = {
  {&(_ZTVN3ccc7DD8x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y0E[];
static VTBL_ENTRY alt_thunk_names1404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y03abcEv,_ZTv0_n16_N3ccc7DD8x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y03abcEv,_ZThn4_N3ccc7DD8x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y03efgEv,_ZTv0_n12_N3ccc7DD8x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y03efgEv,_ZThn4_N3ccc7DD8x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y0E = {  "_ZN3ccc7DD8x8y0E", // class name
  bases__ZN3ccc7DD8x8y0E, 2,
  &(vtc__ZN3ccc7DD8x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y0E),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  CC8x8y1  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x8y13efgEv
  ~CC8x8y1(); // tgen
  CC8x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y1E) C1{ VBC2{ v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y13abcEv");}
void  ccc::CC8x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y13pqrEv");}
void  ccc::CC8x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y13efgEv");}
ccc::CC8x8y1 ::~CC8x8y1(){ note_dtor("_ZN3ccc7CC8x8y1E", this);} // tgen
ccc::CC8x8y1 ::CC8x8y1(){ note_ctor("_ZN3ccc7CC8x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y1E, buf);
    ::ccc::CC8x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y1E);
    dp->::ccc::CC8x8y1::~CC8x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y1E(Test__ZN3ccc7CC8x8y1E, "_ZN3ccc7CC8x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y1C1Ev();
extern void _ZN3ccc7CC8x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y1E[] = {
  NSPAIR(_ZN3ccc7CC8x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y1E[];
extern void _ZN3ccc7CC8x8y13efgEv();
extern void _ZN3ccc7CC8x8y13abcEv();
extern void _ZN3ccc7CC8x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y13efgEv,_ZTv0_n12_N3ccc7CC8x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y13efgEv,_ZThn4_N3ccc7CC8x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y13abcEv,_ZTv0_n16_N3ccc7CC8x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y13abcEv,_ZThn4_N3ccc7CC8x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y13efgEv,_ZTv0_n12_N3ccc7CC8x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y13abcEv,_ZTv0_n16_N3ccc7CC8x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y1E[] = {
  {&(_ZTVN3ccc7CC8x8y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y1E[];
static VTBL_ENTRY alt_thunk_names1405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y13abcEv,_ZTv0_n16_N3ccc7CC8x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y13abcEv,_ZThn4_N3ccc7CC8x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y13efgEv,_ZTv0_n12_N3ccc7CC8x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y13efgEv,_ZThn4_N3ccc7CC8x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y1E = {  "_ZN3ccc7CC8x8y1E", // class name
  bases__ZN3ccc7CC8x8y1E, 2,
  &(vtc__ZN3ccc7CC8x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y1E),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  DD8x8y1  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD8x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x8y13efgEv
  ~DD8x8y1(); // tgen
  DD8x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y1E) C1{ VBC2{ v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y13abcEv");}
void  ccc::DD8x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y13pqrEv");}
void  ccc::DD8x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y13efgEv");}
ccc::DD8x8y1 ::~DD8x8y1(){ note_dtor("_ZN3ccc7DD8x8y1E", this);} // tgen
ccc::DD8x8y1 ::DD8x8y1(){ note_ctor("_ZN3ccc7DD8x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y1E, buf);
    ::ccc::DD8x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y1E);
    dp->::ccc::DD8x8y1::~DD8x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y1E(Test__ZN3ccc7DD8x8y1E, "_ZN3ccc7DD8x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y1C1Ev();
extern void _ZN3ccc7DD8x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y1E[] = {
  NSPAIR(_ZN3ccc7DD8x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y1E[];
extern void _ZN3ccc7DD8x8y13efgEv();
extern void _ZN3ccc7DD8x8y13abcEv();
extern void _ZN3ccc7DD8x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y13efgEv,_ZTv0_n12_N3ccc7DD8x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y13efgEv,_ZThn4_N3ccc7DD8x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y13abcEv,_ZTv0_n16_N3ccc7DD8x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y13abcEv,_ZThn4_N3ccc7DD8x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y13efgEv,_ZTv0_n12_N3ccc7DD8x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y13abcEv,_ZTv0_n16_N3ccc7DD8x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y1E[] = {
  {&(_ZTVN3ccc7DD8x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y1E[];
static VTBL_ENTRY alt_thunk_names1406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y13abcEv,_ZTv0_n16_N3ccc7DD8x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y13abcEv,_ZThn4_N3ccc7DD8x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y13efgEv,_ZTv0_n12_N3ccc7DD8x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y13efgEv,_ZThn4_N3ccc7DD8x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y1E = {  "_ZN3ccc7DD8x8y1E", // class name
  bases__ZN3ccc7DD8x8y1E, 2,
  &(vtc__ZN3ccc7DD8x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y1E),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  CC8x8y2  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y23pqrEv
  ~CC8x8y2(); // tgen
  CC8x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y2E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y23efgEv");}
void  ccc::CC8x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y23abcEv");}
void  ccc::CC8x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y23pqrEv");}
ccc::CC8x8y2 ::~CC8x8y2(){ note_dtor("_ZN3ccc7CC8x8y2E", this);} // tgen
ccc::CC8x8y2 ::CC8x8y2(){ note_ctor("_ZN3ccc7CC8x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y2E, buf);
    ::ccc::CC8x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y2E);
    dp->::ccc::CC8x8y2::~CC8x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y2E(Test__ZN3ccc7CC8x8y2E, "_ZN3ccc7CC8x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y2C1Ev();
extern void _ZN3ccc7CC8x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y2E[] = {
  NSPAIR(_ZN3ccc7CC8x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y2E[];
extern void _ZN3ccc7CC8x8y23efgEv();
extern void _ZN3ccc7CC8x8y23abcEv();
extern void _ZN3ccc7CC8x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y23efgEv,_ZTv0_n12_N3ccc7CC8x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y23efgEv,_ZThn4_N3ccc7CC8x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y23abcEv,_ZTv0_n16_N3ccc7CC8x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y23abcEv,_ZThn4_N3ccc7CC8x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y23efgEv,_ZTv0_n12_N3ccc7CC8x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y23abcEv,_ZTv0_n16_N3ccc7CC8x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y2E[] = {
  {&(_ZTVN3ccc7CC8x8y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y2E[];
static VTBL_ENTRY alt_thunk_names1407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y23abcEv,_ZTv0_n16_N3ccc7CC8x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y23abcEv,_ZThn4_N3ccc7CC8x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y23efgEv,_ZTv0_n12_N3ccc7CC8x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y23efgEv,_ZThn4_N3ccc7CC8x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y2E = {  "_ZN3ccc7CC8x8y2E", // class name
  bases__ZN3ccc7CC8x8y2E, 2,
  &(vtc__ZN3ccc7CC8x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y2E),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  DD8x8y2  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD8x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x8y23pqrEv
  ~DD8x8y2(); // tgen
  DD8x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y2E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y23efgEv");}
void  ccc::DD8x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y23abcEv");}
void  ccc::DD8x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y23pqrEv");}
ccc::DD8x8y2 ::~DD8x8y2(){ note_dtor("_ZN3ccc7DD8x8y2E", this);} // tgen
ccc::DD8x8y2 ::DD8x8y2(){ note_ctor("_ZN3ccc7DD8x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y2E, buf);
    ::ccc::DD8x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y2E);
    dp->::ccc::DD8x8y2::~DD8x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y2E(Test__ZN3ccc7DD8x8y2E, "_ZN3ccc7DD8x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y2C1Ev();
extern void _ZN3ccc7DD8x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y2E[] = {
  NSPAIR(_ZN3ccc7DD8x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y2E[];
extern void _ZN3ccc7DD8x8y23efgEv();
extern void _ZN3ccc7DD8x8y23abcEv();
extern void _ZN3ccc7DD8x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y23efgEv,_ZTv0_n12_N3ccc7DD8x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y23efgEv,_ZThn4_N3ccc7DD8x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y23abcEv,_ZTv0_n16_N3ccc7DD8x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y23abcEv,_ZThn4_N3ccc7DD8x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y23efgEv,_ZTv0_n12_N3ccc7DD8x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y23abcEv,_ZTv0_n16_N3ccc7DD8x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y2E[] = {
  {&(_ZTVN3ccc7DD8x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y2E[];
static VTBL_ENTRY alt_thunk_names1408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y23abcEv,_ZTv0_n16_N3ccc7DD8x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y23abcEv,_ZThn4_N3ccc7DD8x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y23efgEv,_ZTv0_n12_N3ccc7DD8x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y23efgEv,_ZThn4_N3ccc7DD8x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y2E = {  "_ZN3ccc7DD8x8y2E", // class name
  bases__ZN3ccc7DD8x8y2E, 2,
  &(vtc__ZN3ccc7DD8x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y2E),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  CC8x8y3  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x8y33abcEv
  ~CC8x8y3(); // tgen
  CC8x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y3E) C1{ VBC2{ v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y33efgEv");}
void  ccc::CC8x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y33pqrEv");}
void  ccc::CC8x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y33abcEv");}
ccc::CC8x8y3 ::~CC8x8y3(){ note_dtor("_ZN3ccc7CC8x8y3E", this);} // tgen
ccc::CC8x8y3 ::CC8x8y3(){ note_ctor("_ZN3ccc7CC8x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y3E, buf);
    ::ccc::CC8x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y3E);
    dp->::ccc::CC8x8y3::~CC8x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y3E(Test__ZN3ccc7CC8x8y3E, "_ZN3ccc7CC8x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y3C1Ev();
extern void _ZN3ccc7CC8x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y3E[] = {
  NSPAIR(_ZN3ccc7CC8x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y3E[];
extern void _ZN3ccc7CC8x8y33efgEv();
extern void _ZN3ccc7CC8x8y33abcEv();
extern void _ZN3ccc7CC8x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y33efgEv,_ZTv0_n12_N3ccc7CC8x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y33efgEv,_ZThn4_N3ccc7CC8x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y33abcEv,_ZTv0_n16_N3ccc7CC8x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y33abcEv,_ZThn4_N3ccc7CC8x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y33efgEv,_ZTv0_n12_N3ccc7CC8x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y33abcEv,_ZTv0_n16_N3ccc7CC8x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y3E[] = {
  {&(_ZTVN3ccc7CC8x8y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y3E[];
static VTBL_ENTRY alt_thunk_names1409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y33abcEv,_ZTv0_n16_N3ccc7CC8x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y33abcEv,_ZThn4_N3ccc7CC8x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y33efgEv,_ZTv0_n12_N3ccc7CC8x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y33efgEv,_ZThn4_N3ccc7CC8x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y3E = {  "_ZN3ccc7CC8x8y3E", // class name
  bases__ZN3ccc7CC8x8y3E, 2,
  &(vtc__ZN3ccc7CC8x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y3E),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  DD8x8y3  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD8x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x8y33abcEv
  ~DD8x8y3(); // tgen
  DD8x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y3E) C1{ VBC2{ v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y33efgEv");}
void  ccc::DD8x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y33pqrEv");}
void  ccc::DD8x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y33abcEv");}
ccc::DD8x8y3 ::~DD8x8y3(){ note_dtor("_ZN3ccc7DD8x8y3E", this);} // tgen
ccc::DD8x8y3 ::DD8x8y3(){ note_ctor("_ZN3ccc7DD8x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y3E, buf);
    ::ccc::DD8x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y3E);
    dp->::ccc::DD8x8y3::~DD8x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y3E(Test__ZN3ccc7DD8x8y3E, "_ZN3ccc7DD8x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y3C1Ev();
extern void _ZN3ccc7DD8x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y3E[] = {
  NSPAIR(_ZN3ccc7DD8x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y3E[];
extern void _ZN3ccc7DD8x8y33efgEv();
extern void _ZN3ccc7DD8x8y33abcEv();
extern void _ZN3ccc7DD8x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y33efgEv,_ZTv0_n12_N3ccc7DD8x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y33efgEv,_ZThn4_N3ccc7DD8x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y33abcEv,_ZTv0_n16_N3ccc7DD8x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y33abcEv,_ZThn4_N3ccc7DD8x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y33efgEv,_ZTv0_n12_N3ccc7DD8x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y33abcEv,_ZTv0_n16_N3ccc7DD8x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y3E[] = {
  {&(_ZTVN3ccc7DD8x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y3E[];
static VTBL_ENTRY alt_thunk_names1410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y33abcEv,_ZTv0_n16_N3ccc7DD8x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y33abcEv,_ZThn4_N3ccc7DD8x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y33efgEv,_ZTv0_n12_N3ccc7DD8x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y33efgEv,_ZThn4_N3ccc7DD8x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y3E = {  "_ZN3ccc7DD8x8y3E", // class name
  bases__ZN3ccc7DD8x8y3E, 2,
  &(vtc__ZN3ccc7DD8x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y3E),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  CC8x8y4  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC8x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x8y43efgEv
  ~CC8x8y4(); // tgen
  CC8x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y4E) C1{ VBC2{ v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y43pqrEv");}
void  ccc::CC8x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y43abcEv");}
void  ccc::CC8x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y43efgEv");}
ccc::CC8x8y4 ::~CC8x8y4(){ note_dtor("_ZN3ccc7CC8x8y4E", this);} // tgen
ccc::CC8x8y4 ::CC8x8y4(){ note_ctor("_ZN3ccc7CC8x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y4E, buf);
    ::ccc::CC8x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y4E);
    dp->::ccc::CC8x8y4::~CC8x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y4E(Test__ZN3ccc7CC8x8y4E, "_ZN3ccc7CC8x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y4C1Ev();
extern void _ZN3ccc7CC8x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y4E[] = {
  NSPAIR(_ZN3ccc7CC8x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y4E[];
extern void _ZN3ccc7CC8x8y43efgEv();
extern void _ZN3ccc7CC8x8y43abcEv();
extern void _ZN3ccc7CC8x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y43efgEv,_ZTv0_n12_N3ccc7CC8x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y43efgEv,_ZThn4_N3ccc7CC8x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y43abcEv,_ZTv0_n16_N3ccc7CC8x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y43abcEv,_ZThn4_N3ccc7CC8x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y43efgEv,_ZTv0_n12_N3ccc7CC8x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y43abcEv,_ZTv0_n16_N3ccc7CC8x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y4E[] = {
  {&(_ZTVN3ccc7CC8x8y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y4E[];
static VTBL_ENTRY alt_thunk_names1411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y43abcEv,_ZTv0_n16_N3ccc7CC8x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y43abcEv,_ZThn4_N3ccc7CC8x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y43efgEv,_ZTv0_n12_N3ccc7CC8x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y43efgEv,_ZThn4_N3ccc7CC8x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y4E = {  "_ZN3ccc7CC8x8y4E", // class name
  bases__ZN3ccc7CC8x8y4E, 2,
  &(vtc__ZN3ccc7CC8x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y4E),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  DD8x8y4  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD8x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x8y43efgEv
  ~DD8x8y4(); // tgen
  DD8x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y4E) C1{ VBC2{ v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y43pqrEv");}
void  ccc::DD8x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y43abcEv");}
void  ccc::DD8x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y43efgEv");}
ccc::DD8x8y4 ::~DD8x8y4(){ note_dtor("_ZN3ccc7DD8x8y4E", this);} // tgen
ccc::DD8x8y4 ::DD8x8y4(){ note_ctor("_ZN3ccc7DD8x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y4E, buf);
    ::ccc::DD8x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y4E);
    dp->::ccc::DD8x8y4::~DD8x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y4E(Test__ZN3ccc7DD8x8y4E, "_ZN3ccc7DD8x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y4C1Ev();
extern void _ZN3ccc7DD8x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y4E[] = {
  NSPAIR(_ZN3ccc7DD8x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y4E[];
extern void _ZN3ccc7DD8x8y43efgEv();
extern void _ZN3ccc7DD8x8y43abcEv();
extern void _ZN3ccc7DD8x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y43efgEv,_ZTv0_n12_N3ccc7DD8x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y43efgEv,_ZThn4_N3ccc7DD8x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y43abcEv,_ZTv0_n16_N3ccc7DD8x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y43abcEv,_ZThn4_N3ccc7DD8x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y43efgEv,_ZTv0_n12_N3ccc7DD8x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y43abcEv,_ZTv0_n16_N3ccc7DD8x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y4E[] = {
  {&(_ZTVN3ccc7DD8x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y4E[];
static VTBL_ENTRY alt_thunk_names1412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y43abcEv,_ZTv0_n16_N3ccc7DD8x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y43abcEv,_ZThn4_N3ccc7DD8x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y43efgEv,_ZTv0_n12_N3ccc7DD8x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y43efgEv,_ZThn4_N3ccc7DD8x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y4E = {  "_ZN3ccc7DD8x8y4E", // class name
  bases__ZN3ccc7DD8x8y4E, 2,
  &(vtc__ZN3ccc7DD8x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y4E),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  CC8x8y5  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC8x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x8y53abcEv
  ~CC8x8y5(); // tgen
  CC8x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y5E) C1{ VBC2{ v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y53pqrEv");}
void  ccc::CC8x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y53efgEv");}
void  ccc::CC8x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y53abcEv");}
ccc::CC8x8y5 ::~CC8x8y5(){ note_dtor("_ZN3ccc7CC8x8y5E", this);} // tgen
ccc::CC8x8y5 ::CC8x8y5(){ note_ctor("_ZN3ccc7CC8x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y5E, buf);
    ::ccc::CC8x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y5E);
    dp->::ccc::CC8x8y5::~CC8x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y5E(Test__ZN3ccc7CC8x8y5E, "_ZN3ccc7CC8x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y5C1Ev();
extern void _ZN3ccc7CC8x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y5E[] = {
  NSPAIR(_ZN3ccc7CC8x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y5E[];
extern void _ZN3ccc7CC8x8y53efgEv();
extern void _ZN3ccc7CC8x8y53abcEv();
extern void _ZN3ccc7CC8x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y53efgEv,_ZTv0_n12_N3ccc7CC8x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y53efgEv,_ZThn4_N3ccc7CC8x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y53abcEv,_ZTv0_n16_N3ccc7CC8x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y53abcEv,_ZThn4_N3ccc7CC8x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y53efgEv,_ZTv0_n12_N3ccc7CC8x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y53abcEv,_ZTv0_n16_N3ccc7CC8x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y5E[] = {
  {&(_ZTVN3ccc7CC8x8y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y5E[];
static VTBL_ENTRY alt_thunk_names1413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y53abcEv,_ZTv0_n16_N3ccc7CC8x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y53abcEv,_ZThn4_N3ccc7CC8x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y53efgEv,_ZTv0_n12_N3ccc7CC8x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y53efgEv,_ZThn4_N3ccc7CC8x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y5E = {  "_ZN3ccc7CC8x8y5E", // class name
  bases__ZN3ccc7CC8x8y5E, 2,
  &(vtc__ZN3ccc7CC8x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y5E),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  DD8x8y5  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD8x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x8y53abcEv
  ~DD8x8y5(); // tgen
  DD8x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y5E) C1{ VBC2{ v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y53pqrEv");}
void  ccc::DD8x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y53efgEv");}
void  ccc::DD8x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y53abcEv");}
ccc::DD8x8y5 ::~DD8x8y5(){ note_dtor("_ZN3ccc7DD8x8y5E", this);} // tgen
ccc::DD8x8y5 ::DD8x8y5(){ note_ctor("_ZN3ccc7DD8x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y5E, buf);
    ::ccc::DD8x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y5E);
    dp->::ccc::DD8x8y5::~DD8x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y5E(Test__ZN3ccc7DD8x8y5E, "_ZN3ccc7DD8x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y5C1Ev();
extern void _ZN3ccc7DD8x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y5E[] = {
  NSPAIR(_ZN3ccc7DD8x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y5E[];
extern void _ZN3ccc7DD8x8y53efgEv();
extern void _ZN3ccc7DD8x8y53abcEv();
extern void _ZN3ccc7DD8x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y53efgEv,_ZTv0_n12_N3ccc7DD8x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y53efgEv,_ZThn4_N3ccc7DD8x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y53abcEv,_ZTv0_n16_N3ccc7DD8x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y53abcEv,_ZThn4_N3ccc7DD8x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y53efgEv,_ZTv0_n12_N3ccc7DD8x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y53abcEv,_ZTv0_n16_N3ccc7DD8x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y5E[] = {
  {&(_ZTVN3ccc7DD8x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y5E[];
static VTBL_ENTRY alt_thunk_names1414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y53abcEv,_ZTv0_n16_N3ccc7DD8x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y53abcEv,_ZThn4_N3ccc7DD8x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y53efgEv,_ZTv0_n12_N3ccc7DD8x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y53efgEv,_ZThn4_N3ccc7DD8x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y5E = {  "_ZN3ccc7DD8x8y5E", // class name
  bases__ZN3ccc7DD8x8y5E, 2,
  &(vtc__ZN3ccc7DD8x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y5E),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  CC8x8y6  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x8y63efgEv
  ~CC8x8y6(); // tgen
  CC8x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y6E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y63abcEv");}
void  ccc::CC8x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y63efgEv");}
ccc::CC8x8y6 ::~CC8x8y6(){ note_dtor("_ZN3ccc7CC8x8y6E", this);} // tgen
ccc::CC8x8y6 ::CC8x8y6(){ note_ctor("_ZN3ccc7CC8x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y6E, buf);
    ::ccc::CC8x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y6E);
    dp->::ccc::CC8x8y6::~CC8x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y6E(Test__ZN3ccc7CC8x8y6E, "_ZN3ccc7CC8x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y6C1Ev();
extern void _ZN3ccc7CC8x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y6E[] = {
  NSPAIR(_ZN3ccc7CC8x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y6E[];
extern void _ZN3ccc7CC8x8y63efgEv();
extern void _ZN3ccc7CC8x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y63efgEv,_ZTv0_n12_N3ccc7CC8x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y63efgEv,_ZThn4_N3ccc7CC8x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y63abcEv,_ZTv0_n16_N3ccc7CC8x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y63abcEv,_ZThn4_N3ccc7CC8x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y63efgEv,_ZTv0_n12_N3ccc7CC8x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y63abcEv,_ZTv0_n16_N3ccc7CC8x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y6E[] = {
  {&(_ZTVN3ccc7CC8x8y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC8x8y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y6E[];
static VTBL_ENTRY alt_thunk_names1415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y63abcEv,_ZTv0_n16_N3ccc7CC8x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y63abcEv,_ZThn4_N3ccc7CC8x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y63efgEv,_ZTv0_n12_N3ccc7CC8x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y63efgEv,_ZThn4_N3ccc7CC8x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y6E = {  "_ZN3ccc7CC8x8y6E", // class name
  bases__ZN3ccc7CC8x8y6E, 2,
  &(vtc__ZN3ccc7CC8x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y6E),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  DD8x8y6  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD8x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x8y63efgEv
  ~DD8x8y6(); // tgen
  DD8x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y6E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y63abcEv");}
void  ccc::DD8x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y63efgEv");}
ccc::DD8x8y6 ::~DD8x8y6(){ note_dtor("_ZN3ccc7DD8x8y6E", this);} // tgen
ccc::DD8x8y6 ::DD8x8y6(){ note_ctor("_ZN3ccc7DD8x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y6E, buf);
    ::ccc::DD8x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y6E);
    dp->::ccc::DD8x8y6::~DD8x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y6E(Test__ZN3ccc7DD8x8y6E, "_ZN3ccc7DD8x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y6C1Ev();
extern void _ZN3ccc7DD8x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y6E[] = {
  NSPAIR(_ZN3ccc7DD8x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y6E[];
extern void _ZN3ccc7DD8x8y63efgEv();
extern void _ZN3ccc7DD8x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y63efgEv,_ZTv0_n12_N3ccc7DD8x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y63efgEv,_ZThn4_N3ccc7DD8x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y63abcEv,_ZTv0_n16_N3ccc7DD8x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y63abcEv,_ZThn4_N3ccc7DD8x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y63efgEv,_ZTv0_n12_N3ccc7DD8x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y63abcEv,_ZTv0_n16_N3ccc7DD8x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y6E[] = {
  {&(_ZTVN3ccc7DD8x8y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x8y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x8y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y6E[];
static VTBL_ENTRY alt_thunk_names1416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y63abcEv,_ZTv0_n16_N3ccc7DD8x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y63abcEv,_ZThn4_N3ccc7DD8x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y63efgEv,_ZTv0_n12_N3ccc7DD8x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y63efgEv,_ZThn4_N3ccc7DD8x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y6E = {  "_ZN3ccc7DD8x8y6E", // class name
  bases__ZN3ccc7DD8x8y6E, 2,
  &(vtc__ZN3ccc7DD8x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y6E),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  CC8x8y7  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC8x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y73pqrEv
  ~CC8x8y7(); // tgen
  CC8x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y7E) C1{ VBC2{ v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y73abcEv");}
void  ccc::CC8x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y73pqrEv");}
ccc::CC8x8y7 ::~CC8x8y7(){ note_dtor("_ZN3ccc7CC8x8y7E", this);} // tgen
ccc::CC8x8y7 ::CC8x8y7(){ note_ctor("_ZN3ccc7CC8x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y7E, buf);
    ::ccc::CC8x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y7E);
    dp->::ccc::CC8x8y7::~CC8x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y7E(Test__ZN3ccc7CC8x8y7E, "_ZN3ccc7CC8x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y7C1Ev();
extern void _ZN3ccc7CC8x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y7E[] = {
  NSPAIR(_ZN3ccc7CC8x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC8x8y73abcEv();
extern void _ZN3ccc7CC8x8y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y73abcEv,_ZTv0_n16_N3ccc7CC8x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y73abcEv,_ZThn4_N3ccc7CC8x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y73abcEv,_ZTv0_n16_N3ccc7CC8x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y7E[] = {
  {&(_ZTVN3ccc7CC8x8y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y7E[];
static VTBL_ENTRY alt_thunk_names1417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y73abcEv,_ZTv0_n16_N3ccc7CC8x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y73abcEv,_ZThn4_N3ccc7CC8x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y7E = {  "_ZN3ccc7CC8x8y7E", // class name
  bases__ZN3ccc7CC8x8y7E, 2,
  &(vtc__ZN3ccc7CC8x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y7E),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  DD8x8y7  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD8x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x8y73pqrEv
  ~DD8x8y7(); // tgen
  DD8x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y7E) C1{ VBC2{ v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y73abcEv");}
void  ccc::DD8x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y73pqrEv");}
ccc::DD8x8y7 ::~DD8x8y7(){ note_dtor("_ZN3ccc7DD8x8y7E", this);} // tgen
ccc::DD8x8y7 ::DD8x8y7(){ note_ctor("_ZN3ccc7DD8x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y7E, buf);
    ::ccc::DD8x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y7E);
    dp->::ccc::DD8x8y7::~DD8x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y7E(Test__ZN3ccc7DD8x8y7E, "_ZN3ccc7DD8x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y7C1Ev();
extern void _ZN3ccc7DD8x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y7E[] = {
  NSPAIR(_ZN3ccc7DD8x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x8y73abcEv();
extern void _ZN3ccc7DD8x8y73pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y73abcEv,_ZTv0_n16_N3ccc7DD8x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y73abcEv,_ZThn4_N3ccc7DD8x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y73abcEv,_ZTv0_n16_N3ccc7DD8x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y7E[] = {
  {&(_ZTVN3ccc7DD8x8y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y7E[];
static VTBL_ENTRY alt_thunk_names1418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y73abcEv,_ZTv0_n16_N3ccc7DD8x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y73abcEv,_ZThn4_N3ccc7DD8x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y7E = {  "_ZN3ccc7DD8x8y7E", // class name
  bases__ZN3ccc7DD8x8y7E, 2,
  &(vtc__ZN3ccc7DD8x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y7E),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  CC8x8y8  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x8y83abcEv
  ~CC8x8y8(); // tgen
  CC8x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y8E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y83efgEv");}
void  ccc::CC8x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x8y83abcEv");}
ccc::CC8x8y8 ::~CC8x8y8(){ note_dtor("_ZN3ccc7CC8x8y8E", this);} // tgen
ccc::CC8x8y8 ::CC8x8y8(){ note_ctor("_ZN3ccc7CC8x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y8E, buf);
    ::ccc::CC8x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y8E);
    dp->::ccc::CC8x8y8::~CC8x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y8E(Test__ZN3ccc7CC8x8y8E, "_ZN3ccc7CC8x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y8C1Ev();
extern void _ZN3ccc7CC8x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y8E[] = {
  NSPAIR(_ZN3ccc7CC8x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y8E[];
extern void _ZN3ccc7CC8x8y83efgEv();
extern void _ZN3ccc7CC8x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y83efgEv,_ZTv0_n12_N3ccc7CC8x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y83efgEv,_ZThn4_N3ccc7CC8x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x8y83abcEv,_ZTv0_n16_N3ccc7CC8x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y83abcEv,_ZThn4_N3ccc7CC8x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y83efgEv,_ZTv0_n12_N3ccc7CC8x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x8y83abcEv,_ZTv0_n16_N3ccc7CC8x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y8E[] = {
  {&(_ZTVN3ccc7CC8x8y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC8x8y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y8E[];
static VTBL_ENTRY alt_thunk_names1419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x8y83abcEv,_ZTv0_n16_N3ccc7CC8x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y83abcEv,_ZThn4_N3ccc7CC8x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y83efgEv,_ZTv0_n12_N3ccc7CC8x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y83efgEv,_ZThn4_N3ccc7CC8x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y8E = {  "_ZN3ccc7CC8x8y8E", // class name
  bases__ZN3ccc7CC8x8y8E, 2,
  &(vtc__ZN3ccc7CC8x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y8E),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  DD8x8y8  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD8x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x8y83abcEv
  ~DD8x8y8(); // tgen
  DD8x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y8E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y83efgEv");}
void  ccc::DD8x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x8y83abcEv");}
ccc::DD8x8y8 ::~DD8x8y8(){ note_dtor("_ZN3ccc7DD8x8y8E", this);} // tgen
ccc::DD8x8y8 ::DD8x8y8(){ note_ctor("_ZN3ccc7DD8x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y8E, buf);
    ::ccc::DD8x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y8E);
    dp->::ccc::DD8x8y8::~DD8x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y8E(Test__ZN3ccc7DD8x8y8E, "_ZN3ccc7DD8x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y8C1Ev();
extern void _ZN3ccc7DD8x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y8E[] = {
  NSPAIR(_ZN3ccc7DD8x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y8E[];
extern void _ZN3ccc7DD8x8y83efgEv();
extern void _ZN3ccc7DD8x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y83efgEv,_ZTv0_n12_N3ccc7DD8x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y83efgEv,_ZThn4_N3ccc7DD8x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x8y83abcEv,_ZTv0_n16_N3ccc7DD8x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y83abcEv,_ZThn4_N3ccc7DD8x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y83efgEv,_ZTv0_n12_N3ccc7DD8x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x8y83abcEv,_ZTv0_n16_N3ccc7DD8x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y8E[] = {
  {&(_ZTVN3ccc7DD8x8y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x8y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x8y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y8E[];
static VTBL_ENTRY alt_thunk_names1420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x8y83abcEv,_ZTv0_n16_N3ccc7DD8x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y83abcEv,_ZThn4_N3ccc7DD8x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y83efgEv,_ZTv0_n12_N3ccc7DD8x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y83efgEv,_ZThn4_N3ccc7DD8x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y8E = {  "_ZN3ccc7DD8x8y8E", // class name
  bases__ZN3ccc7DD8x8y8E, 2,
  &(vtc__ZN3ccc7DD8x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y8E),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  CC8x8y9  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC8x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x8y93pqrEv
  ~CC8x8y9(); // tgen
  CC8x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x8y9E) C1{ VBC2{ v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x8y93efgEv");}
void  ccc::CC8x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x8y93pqrEv");}
ccc::CC8x8y9 ::~CC8x8y9(){ note_dtor("_ZN3ccc7CC8x8y9E", this);} // tgen
ccc::CC8x8y9 ::CC8x8y9(){ note_ctor("_ZN3ccc7CC8x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x8y9E, buf);
    ::ccc::CC8x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x8y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC8x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x8y9E);
    dp->::ccc::CC8x8y9::~CC8x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x8y9E(Test__ZN3ccc7CC8x8y9E, "_ZN3ccc7CC8x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x8y9C1Ev();
extern void _ZN3ccc7CC8x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x8y9E[] = {
  NSPAIR(_ZN3ccc7CC8x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC8x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x8y9E[];
extern void _ZN3ccc7CC8x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC8x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x8y93efgEv,_ZTv0_n12_N3ccc7CC8x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x8y93efgEv,_ZThn4_N3ccc7CC8x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x8y93efgEv,_ZTv0_n12_N3ccc7CC8x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x8y9E[] = {
  {&(_ZTVN3ccc7CC8x8y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x8y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x8y9E[];
static VTBL_ENTRY alt_thunk_names1421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x8y93efgEv,_ZTv0_n12_N3ccc7CC8x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x8y93efgEv,_ZThn4_N3ccc7CC8x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x8y9E = {  "_ZN3ccc7CC8x8y9E", // class name
  bases__ZN3ccc7CC8x8y9E, 2,
  &(vtc__ZN3ccc7CC8x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x8y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x8y9E),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  DD8x8y9  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD8x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x8y93pqrEv
  ~DD8x8y9(); // tgen
  DD8x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x8y9E) C1{ VBC2{ v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x8y93efgEv");}
void  ccc::DD8x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x8y93pqrEv");}
ccc::DD8x8y9 ::~DD8x8y9(){ note_dtor("_ZN3ccc7DD8x8y9E", this);} // tgen
ccc::DD8x8y9 ::DD8x8y9(){ note_ctor("_ZN3ccc7DD8x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x8y9E, buf);
    ::ccc::DD8x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x8y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD8x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x8y9E);
    dp->::ccc::DD8x8y9::~DD8x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x8y9E(Test__ZN3ccc7DD8x8y9E, "_ZN3ccc7DD8x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x8y9C1Ev();
extern void _ZN3ccc7DD8x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x8y9E[] = {
  NSPAIR(_ZN3ccc7DD8x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD8x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y9E[];
extern void _ZN3ccc7DD8x8y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x8y93efgEv,_ZTv0_n12_N3ccc7DD8x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x8y93efgEv,_ZThn4_N3ccc7DD8x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x8y93efgEv,_ZTv0_n12_N3ccc7DD8x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x8y9E[] = {
  {&(_ZTVN3ccc7DD8x8y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x8y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x8y9E[];
static VTBL_ENTRY alt_thunk_names1422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x8y93efgEv,_ZTv0_n12_N3ccc7DD8x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x8y93efgEv,_ZThn4_N3ccc7DD8x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x8y9E = {  "_ZN3ccc7DD8x8y9E", // class name
  bases__ZN3ccc7DD8x8y9E, 2,
  &(vtc__ZN3ccc7DD8x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x8y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x8y9E),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  CC8x8y10  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC8x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x8y103abcEv
  ~CC8x8y10(); // tgen
  CC8x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y10E) C1{ VBC2{ v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x8y103pqrEv");}
void  ccc::CC8x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x8y103abcEv");}
ccc::CC8x8y10 ::~CC8x8y10(){ note_dtor("_ZN3ccc8CC8x8y10E", this);} // tgen
ccc::CC8x8y10 ::CC8x8y10(){ note_ctor("_ZN3ccc8CC8x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x8y10E, buf);
    ::ccc::CC8x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x8y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC8x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x8y10E);
    dp->::ccc::CC8x8y10::~CC8x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x8y10E(Test__ZN3ccc8CC8x8y10E, "_ZN3ccc8CC8x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x8y10C1Ev();
extern void _ZN3ccc8CC8x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x8y10E[] = {
  NSPAIR(_ZN3ccc8CC8x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC8x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC8x8y103abcEv();
extern void _ZN3ccc8CC8x8y103pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x8y103abcEv,_ZTv0_n16_N3ccc8CC8x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y103abcEv,_ZThn4_N3ccc8CC8x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x8y103abcEv,_ZTv0_n16_N3ccc8CC8x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x8y10E[] = {
  {&(_ZTVN3ccc8CC8x8y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x8y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x8y10E[];
static VTBL_ENTRY alt_thunk_names1423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x8y103abcEv,_ZTv0_n16_N3ccc8CC8x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x8y103abcEv,_ZThn4_N3ccc8CC8x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x8y10E = {  "_ZN3ccc8CC8x8y10E", // class name
  bases__ZN3ccc8CC8x8y10E, 2,
  &(vtc__ZN3ccc8CC8x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x8y10E),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  DD8x8y10  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD8x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x8y103abcEv
  ~DD8x8y10(); // tgen
  DD8x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x8y10E) C1{ VBC2{ v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x8y103pqrEv");}
void  ccc::DD8x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x8y103abcEv");}
ccc::DD8x8y10 ::~DD8x8y10(){ note_dtor("_ZN3ccc8DD8x8y10E", this);} // tgen
ccc::DD8x8y10 ::DD8x8y10(){ note_ctor("_ZN3ccc8DD8x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x8y10E, buf);
    ::ccc::DD8x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x8y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD8x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x8y10E);
    dp->::ccc::DD8x8y10::~DD8x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x8y10E(Test__ZN3ccc8DD8x8y10E, "_ZN3ccc8DD8x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x8y10C1Ev();
extern void _ZN3ccc8DD8x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x8y10E[] = {
  NSPAIR(_ZN3ccc8DD8x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD8x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x8y103abcEv();
extern void _ZN3ccc8DD8x8y103pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x8y103abcEv,_ZTv0_n16_N3ccc8DD8x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x8y103abcEv,_ZThn4_N3ccc8DD8x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x8y103abcEv,_ZTv0_n16_N3ccc8DD8x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x8y10E[] = {
  {&(_ZTVN3ccc8DD8x8y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x8y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x8y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x8y10E[];
static VTBL_ENTRY alt_thunk_names1424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x8y103abcEv,_ZTv0_n16_N3ccc8DD8x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x8y103abcEv,_ZThn4_N3ccc8DD8x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x8y10E = {  "_ZN3ccc8DD8x8y10E", // class name
  bases__ZN3ccc8DD8x8y10E, 2,
  &(vtc__ZN3ccc8DD8x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x8y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x8y10E),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  CC8x8y11  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC8x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x8y113efgEv
  ~CC8x8y11(); // tgen
  CC8x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y11E) C1{ VBC2{ v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x8y113pqrEv");}
void  ccc::CC8x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x8y113efgEv");}
ccc::CC8x8y11 ::~CC8x8y11(){ note_dtor("_ZN3ccc8CC8x8y11E", this);} // tgen
ccc::CC8x8y11 ::CC8x8y11(){ note_ctor("_ZN3ccc8CC8x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x8y11E, buf);
    ::ccc::CC8x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x8y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC8x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x8y11E);
    dp->::ccc::CC8x8y11::~CC8x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x8y11E(Test__ZN3ccc8CC8x8y11E, "_ZN3ccc8CC8x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x8y11C1Ev();
extern void _ZN3ccc8CC8x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x8y11E[] = {
  NSPAIR(_ZN3ccc8CC8x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC8x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x8y11E[];
extern void _ZN3ccc8CC8x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC8x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x8y113efgEv,_ZTv0_n12_N3ccc8CC8x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y113efgEv,_ZThn4_N3ccc8CC8x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x8y113efgEv,_ZTv0_n12_N3ccc8CC8x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x8y11E[] = {
  {&(_ZTVN3ccc8CC8x8y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x8y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x8y11E[];
static VTBL_ENTRY alt_thunk_names1425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x8y113efgEv,_ZTv0_n12_N3ccc8CC8x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x8y113efgEv,_ZThn4_N3ccc8CC8x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x8y11E = {  "_ZN3ccc8CC8x8y11E", // class name
  bases__ZN3ccc8CC8x8y11E, 2,
  &(vtc__ZN3ccc8CC8x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x8y11E),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  DD8x8y11  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD8x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x8y113efgEv
  ~DD8x8y11(); // tgen
  DD8x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x8y11E) C1{ VBC2{ v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x8y113pqrEv");}
void  ccc::DD8x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x8y113efgEv");}
ccc::DD8x8y11 ::~DD8x8y11(){ note_dtor("_ZN3ccc8DD8x8y11E", this);} // tgen
ccc::DD8x8y11 ::DD8x8y11(){ note_ctor("_ZN3ccc8DD8x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x8y11E, buf);
    ::ccc::DD8x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x8y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD8x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x8y11E);
    dp->::ccc::DD8x8y11::~DD8x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x8y11E(Test__ZN3ccc8DD8x8y11E, "_ZN3ccc8DD8x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x8y11C1Ev();
extern void _ZN3ccc8DD8x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x8y11E[] = {
  NSPAIR(_ZN3ccc8DD8x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD8x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y11E[];
extern void _ZN3ccc8DD8x8y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x8y113efgEv,_ZTv0_n12_N3ccc8DD8x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x8y113efgEv,_ZThn4_N3ccc8DD8x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x8y113efgEv,_ZTv0_n12_N3ccc8DD8x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x8y11E[] = {
  {&(_ZTVN3ccc8DD8x8y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x8y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x8y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x8y11E[];
static VTBL_ENTRY alt_thunk_names1426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x8y113efgEv,_ZTv0_n12_N3ccc8DD8x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x8y113efgEv,_ZThn4_N3ccc8DD8x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x8y11E = {  "_ZN3ccc8DD8x8y11E", // class name
  bases__ZN3ccc8DD8x8y11E, 2,
  &(vtc__ZN3ccc8DD8x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x8y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x8y11E),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  CC8x8y12  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC8x8y123abcEv
  ~CC8x8y12(); // tgen
  CC8x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y12E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC8x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x8y123abcEv");}
ccc::CC8x8y12 ::~CC8x8y12(){ note_dtor("_ZN3ccc8CC8x8y12E", this);} // tgen
ccc::CC8x8y12 ::CC8x8y12(){ note_ctor("_ZN3ccc8CC8x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x8y12E, buf);
    ::ccc::CC8x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x8y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC8x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x8y12E);
    dp->::ccc::CC8x8y12::~CC8x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x8y12E(Test__ZN3ccc8CC8x8y12E, "_ZN3ccc8CC8x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x8y12C1Ev();
extern void _ZN3ccc8CC8x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x8y12E[] = {
  NSPAIR(_ZN3ccc8CC8x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC8x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC8x8y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x8y123abcEv,_ZTv0_n16_N3ccc8CC8x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y123abcEv,_ZThn4_N3ccc8CC8x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x8y123abcEv,_ZTv0_n16_N3ccc8CC8x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x8y12E[] = {
  {&(_ZTVN3ccc8CC8x8y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x8y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x8y12E[];
static VTBL_ENTRY alt_thunk_names1427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x8y123abcEv,_ZTv0_n16_N3ccc8CC8x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x8y123abcEv,_ZThn4_N3ccc8CC8x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x8y12E = {  "_ZN3ccc8CC8x8y12E", // class name
  bases__ZN3ccc8CC8x8y12E, 2,
  &(vtc__ZN3ccc8CC8x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x8y12E),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  DD8x8y12  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD8x8y123abcEv
  ~DD8x8y12(); // tgen
  DD8x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x8y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD8x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x8y123abcEv");}
ccc::DD8x8y12 ::~DD8x8y12(){ note_dtor("_ZN3ccc8DD8x8y12E", this);} // tgen
ccc::DD8x8y12 ::DD8x8y12(){ note_ctor("_ZN3ccc8DD8x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x8y12E, buf);
    ::ccc::DD8x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x8y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD8x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x8y12E);
    dp->::ccc::DD8x8y12::~DD8x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x8y12E(Test__ZN3ccc8DD8x8y12E, "_ZN3ccc8DD8x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x8y12C1Ev();
extern void _ZN3ccc8DD8x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x8y12E[] = {
  NSPAIR(_ZN3ccc8DD8x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD8x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x8y123abcEv,_ZTv0_n16_N3ccc8DD8x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x8y123abcEv,_ZThn4_N3ccc8DD8x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x8y123abcEv,_ZTv0_n16_N3ccc8DD8x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x8y12E[] = {
  {&(_ZTVN3ccc8DD8x8y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x8y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x8y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x8y12E[];
static VTBL_ENTRY alt_thunk_names1428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x8y123abcEv,_ZTv0_n16_N3ccc8DD8x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x8y123abcEv,_ZThn4_N3ccc8DD8x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x8y12E = {  "_ZN3ccc8DD8x8y12E", // class name
  bases__ZN3ccc8DD8x8y12E, 2,
  &(vtc__ZN3ccc8DD8x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x8y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x8y12E),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  CC8x8y13  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC8x8y133efgEv
  ~CC8x8y13(); // tgen
  CC8x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC8x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x8y133efgEv");}
ccc::CC8x8y13 ::~CC8x8y13(){ note_dtor("_ZN3ccc8CC8x8y13E", this);} // tgen
ccc::CC8x8y13 ::CC8x8y13(){ note_ctor("_ZN3ccc8CC8x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x8y13E, buf);
    ::ccc::CC8x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x8y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC8x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x8y13E);
    dp->::ccc::CC8x8y13::~CC8x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x8y13E(Test__ZN3ccc8CC8x8y13E, "_ZN3ccc8CC8x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x8y13C1Ev();
extern void _ZN3ccc8CC8x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x8y13E[] = {
  NSPAIR(_ZN3ccc8CC8x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC8x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x8y13E[];
extern void _ZN3ccc8CC8x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x8y133efgEv,_ZTv0_n12_N3ccc8CC8x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x8y133efgEv,_ZThn4_N3ccc8CC8x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x8y133efgEv,_ZTv0_n12_N3ccc8CC8x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x8y13E[] = {
  {&(_ZTVN3ccc8CC8x8y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x8y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x8y13E[];
static VTBL_ENTRY alt_thunk_names1429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x8y133efgEv,_ZTv0_n12_N3ccc8CC8x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x8y133efgEv,_ZThn4_N3ccc8CC8x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x8y13E = {  "_ZN3ccc8CC8x8y13E", // class name
  bases__ZN3ccc8CC8x8y13E, 2,
  &(vtc__ZN3ccc8CC8x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x8y13E),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  DD8x8y13  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD8x8y133efgEv
  ~DD8x8y13(); // tgen
  DD8x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x8y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD8x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x8y133efgEv");}
ccc::DD8x8y13 ::~DD8x8y13(){ note_dtor("_ZN3ccc8DD8x8y13E", this);} // tgen
ccc::DD8x8y13 ::DD8x8y13(){ note_ctor("_ZN3ccc8DD8x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x8y13E, buf);
    ::ccc::DD8x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x8y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD8x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x8y13E);
    dp->::ccc::DD8x8y13::~DD8x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x8y13E(Test__ZN3ccc8DD8x8y13E, "_ZN3ccc8DD8x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x8y13C1Ev();
extern void _ZN3ccc8DD8x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x8y13E[] = {
  NSPAIR(_ZN3ccc8DD8x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD8x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y13E[];
extern void _ZN3ccc8DD8x8y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x8y133efgEv,_ZTv0_n12_N3ccc8DD8x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x8y133efgEv,_ZThn4_N3ccc8DD8x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x8y133efgEv,_ZTv0_n12_N3ccc8DD8x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x8y13E[] = {
  {&(_ZTVN3ccc8DD8x8y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x8y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x8y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x8y13E[];
static VTBL_ENTRY alt_thunk_names1430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x8y133efgEv,_ZTv0_n12_N3ccc8DD8x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x8y133efgEv,_ZThn4_N3ccc8DD8x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x8y13E = {  "_ZN3ccc8DD8x8y13E", // class name
  bases__ZN3ccc8DD8x8y13E, 2,
  &(vtc__ZN3ccc8DD8x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x8y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x8y13E),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  CC8x8y14  : virtual ::ccc::AA8 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC8x8y143pqrEv
  ~CC8x8y14(); // tgen
  CC8x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y14E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC8x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x8y143pqrEv");}
ccc::CC8x8y14 ::~CC8x8y14(){ note_dtor("_ZN3ccc8CC8x8y14E", this);} // tgen
ccc::CC8x8y14 ::CC8x8y14(){ note_ctor("_ZN3ccc8CC8x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x8y14E, buf);
    ::ccc::CC8x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x8y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC8x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x8y14E);
    dp->::ccc::CC8x8y14::~CC8x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x8y14E(Test__ZN3ccc8CC8x8y14E, "_ZN3ccc8CC8x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x8y14C1Ev();
extern void _ZN3ccc8CC8x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x8y14E[] = {
  NSPAIR(_ZN3ccc8CC8x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC8x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC8x8y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x8y14E[] = {
  {&(_ZTVN3ccc8CC8x8y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x8y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x8y14E[];
Class_Descriptor cd__ZN3ccc8CC8x8y14E = {  "_ZN3ccc8CC8x8y14E", // class name
  bases__ZN3ccc8CC8x8y14E, 2,
  &(vtc__ZN3ccc8CC8x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x8y14E),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  DD8x8y14  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD8x8y143pqrEv
  ~DD8x8y14(); // tgen
  DD8x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x8y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD8x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x8y143pqrEv");}
ccc::DD8x8y14 ::~DD8x8y14(){ note_dtor("_ZN3ccc8DD8x8y14E", this);} // tgen
ccc::DD8x8y14 ::DD8x8y14(){ note_ctor("_ZN3ccc8DD8x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x8y14E, buf);
    ::ccc::DD8x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x8y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD8x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x8y14E);
    dp->::ccc::DD8x8y14::~DD8x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x8y14E(Test__ZN3ccc8DD8x8y14E, "_ZN3ccc8DD8x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x8y14C1Ev();
extern void _ZN3ccc8DD8x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x8y14E[] = {
  NSPAIR(_ZN3ccc8DD8x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD8x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x8y14E[] = {
  {&(_ZTVN3ccc8DD8x8y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x8y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x8y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x8y14E[];
Class_Descriptor cd__ZN3ccc8DD8x8y14E = {  "_ZN3ccc8DD8x8y14E", // class name
  bases__ZN3ccc8DD8x8y14E, 2,
  &(vtc__ZN3ccc8DD8x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x8y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x8y14E),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  CC8x8y15  : virtual ::ccc::AA8 , ::ccc::BB8 {
  ~CC8x8y15(); // tgen
  CC8x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x8y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC8x8y15 ::~CC8x8y15(){ note_dtor("_ZN3ccc8CC8x8y15E", this);} // tgen
ccc::CC8x8y15 ::CC8x8y15(){ note_ctor("_ZN3ccc8CC8x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x8y15E, buf);
    ::ccc::CC8x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x8y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC8x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x8y15E);
    dp->::ccc::CC8x8y15::~CC8x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x8y15E(Test__ZN3ccc8CC8x8y15E, "_ZN3ccc8CC8x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x8y15C1Ev();
extern void _ZN3ccc8CC8x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x8y15E[] = {
  NSPAIR(_ZN3ccc8CC8x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC8x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x8y15E[] = {
  {&(_ZTVN3ccc8CC8x8y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x8y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x8y15E[];
Class_Descriptor cd__ZN3ccc8CC8x8y15E = {  "_ZN3ccc8CC8x8y15E", // class name
  bases__ZN3ccc8CC8x8y15E, 2,
  &(vtc__ZN3ccc8CC8x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x8y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x8y15E),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  DD8x8y15  : virtual ::ccc::AA8 , virtual ::ccc::BB8 {
  ~DD8x8y15(); // tgen
  DD8x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x8y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD8x8y15 ::~DD8x8y15(){ note_dtor("_ZN3ccc8DD8x8y15E", this);} // tgen
ccc::DD8x8y15 ::DD8x8y15(){ note_ctor("_ZN3ccc8DD8x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x8y15E, buf);
    ::ccc::DD8x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x8y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD8x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x8y15E);
    dp->::ccc::DD8x8y15::~DD8x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x8y15E(Test__ZN3ccc8DD8x8y15E, "_ZN3ccc8DD8x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x8y15C1Ev();
extern void _ZN3ccc8DD8x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x8y15E[] = {
  NSPAIR(_ZN3ccc8DD8x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD8x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x8y15E[] = {
  {&(_ZTVN3ccc8DD8x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x8y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x8y15E[];
Class_Descriptor cd__ZN3ccc8DD8x8y15E = {  "_ZN3ccc8DD8x8y15E", // class name
  bases__ZN3ccc8DD8x8y15E, 2,
  &(vtc__ZN3ccc8DD8x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x8y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x8y15E),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  CC8x9y0  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC8x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y03pqrEv
  ~CC8x9y0(); // tgen
  CC8x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y0E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y03abcEv");}
void  ccc::CC8x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y03efgEv");}
void  ccc::CC8x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y03pqrEv");}
ccc::CC8x9y0 ::~CC8x9y0(){ note_dtor("_ZN3ccc7CC8x9y0E", this);} // tgen
ccc::CC8x9y0 ::CC8x9y0(){ note_ctor("_ZN3ccc7CC8x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y0E, buf);
    ::ccc::CC8x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y0E);
    dp->::ccc::CC8x9y0::~CC8x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y0E(Test__ZN3ccc7CC8x9y0E, "_ZN3ccc7CC8x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y0C1Ev();
extern void _ZN3ccc7CC8x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y0E[] = {
  NSPAIR(_ZN3ccc7CC8x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y0E[];
extern void _ZN3ccc7CC8x9y03efgEv();
extern void _ZN3ccc7CC8x9y03pqrEv();
extern void _ZN3ccc7CC8x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y03efgEv,_ZTv0_n12_N3ccc7CC8x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y03efgEv,_ZThn4_N3ccc7CC8x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y03abcEv,_ZTv0_n16_N3ccc7CC8x9y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y03abcEv,_ZThn4_N3ccc7CC8x9y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y03efgEv,_ZTv0_n12_N3ccc7CC8x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y03abcEv,_ZTv0_n16_N3ccc7CC8x9y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y0E[] = {
  {&(_ZTVN3ccc7CC8x9y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y0E[];
static VTBL_ENTRY alt_thunk_names1431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y03abcEv,_ZTv0_n16_N3ccc7CC8x9y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y03abcEv,_ZThn4_N3ccc7CC8x9y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y03efgEv,_ZTv0_n12_N3ccc7CC8x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y03efgEv,_ZThn4_N3ccc7CC8x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y0E = {  "_ZN3ccc7CC8x9y0E", // class name
  bases__ZN3ccc7CC8x9y0E, 2,
  &(vtc__ZN3ccc7CC8x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y0E),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  DD8x9y0  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD8x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD8x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x9y03pqrEv
  ~DD8x9y0(); // tgen
  DD8x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y0E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y03abcEv");}
void  ccc::DD8x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y03efgEv");}
void  ccc::DD8x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y03pqrEv");}
ccc::DD8x9y0 ::~DD8x9y0(){ note_dtor("_ZN3ccc7DD8x9y0E", this);} // tgen
ccc::DD8x9y0 ::DD8x9y0(){ note_ctor("_ZN3ccc7DD8x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y0E, buf);
    ::ccc::DD8x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y0E);
    dp->::ccc::DD8x9y0::~DD8x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y0E(Test__ZN3ccc7DD8x9y0E, "_ZN3ccc7DD8x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y0C1Ev();
extern void _ZN3ccc7DD8x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y0E[] = {
  NSPAIR(_ZN3ccc7DD8x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y0E[];
extern void _ZN3ccc7DD8x9y03efgEv();
extern void _ZN3ccc7DD8x9y03abcEv();
extern void _ZN3ccc7DD8x9y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y03efgEv,_ZTv0_n12_N3ccc7DD8x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y03efgEv,_ZThn4_N3ccc7DD8x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y03pqrEv,_ZTv0_n16_N3ccc7DD8x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y03pqrEv,_ZThn4_N3ccc7DD8x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y03efgEv,_ZTv0_n12_N3ccc7DD8x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y03pqrEv,_ZTv0_n16_N3ccc7DD8x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y0E[] = {
  {&(_ZTVN3ccc7DD8x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y0E[];
static VTBL_ENTRY alt_thunk_names1432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y03pqrEv,_ZTv0_n16_N3ccc7DD8x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y03pqrEv,_ZThn4_N3ccc7DD8x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y03efgEv,_ZTv0_n12_N3ccc7DD8x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y03efgEv,_ZThn4_N3ccc7DD8x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y0E = {  "_ZN3ccc7DD8x9y0E", // class name
  bases__ZN3ccc7DD8x9y0E, 2,
  &(vtc__ZN3ccc7DD8x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y0E),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  CC8x9y1  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x9y13efgEv
  ~CC8x9y1(); // tgen
  CC8x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y1E) C1{ VBC2{ v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y13abcEv");}
void  ccc::CC8x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y13pqrEv");}
void  ccc::CC8x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y13efgEv");}
ccc::CC8x9y1 ::~CC8x9y1(){ note_dtor("_ZN3ccc7CC8x9y1E", this);} // tgen
ccc::CC8x9y1 ::CC8x9y1(){ note_ctor("_ZN3ccc7CC8x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y1E, buf);
    ::ccc::CC8x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y1E);
    dp->::ccc::CC8x9y1::~CC8x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y1E(Test__ZN3ccc7CC8x9y1E, "_ZN3ccc7CC8x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y1C1Ev();
extern void _ZN3ccc7CC8x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y1E[] = {
  NSPAIR(_ZN3ccc7CC8x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y1E[];
extern void _ZN3ccc7CC8x9y13efgEv();
extern void _ZN3ccc7CC8x9y13pqrEv();
extern void _ZN3ccc7CC8x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y13efgEv,_ZTv0_n12_N3ccc7CC8x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y13efgEv,_ZThn4_N3ccc7CC8x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y13abcEv,_ZTv0_n16_N3ccc7CC8x9y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y13abcEv,_ZThn4_N3ccc7CC8x9y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y13efgEv,_ZTv0_n12_N3ccc7CC8x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y13abcEv,_ZTv0_n16_N3ccc7CC8x9y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y1E[] = {
  {&(_ZTVN3ccc7CC8x9y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y1E[];
static VTBL_ENTRY alt_thunk_names1433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y13abcEv,_ZTv0_n16_N3ccc7CC8x9y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y13abcEv,_ZThn4_N3ccc7CC8x9y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y13efgEv,_ZTv0_n12_N3ccc7CC8x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y13efgEv,_ZThn4_N3ccc7CC8x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y1E = {  "_ZN3ccc7CC8x9y1E", // class name
  bases__ZN3ccc7CC8x9y1E, 2,
  &(vtc__ZN3ccc7CC8x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y1E),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  DD8x9y1  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD8x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x9y13efgEv
  ~DD8x9y1(); // tgen
  DD8x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y1E) C1{ VBC2{ v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y13abcEv");}
void  ccc::DD8x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y13pqrEv");}
void  ccc::DD8x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y13efgEv");}
ccc::DD8x9y1 ::~DD8x9y1(){ note_dtor("_ZN3ccc7DD8x9y1E", this);} // tgen
ccc::DD8x9y1 ::DD8x9y1(){ note_ctor("_ZN3ccc7DD8x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y1E, buf);
    ::ccc::DD8x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y1E);
    dp->::ccc::DD8x9y1::~DD8x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y1E(Test__ZN3ccc7DD8x9y1E, "_ZN3ccc7DD8x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y1C1Ev();
extern void _ZN3ccc7DD8x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y1E[] = {
  NSPAIR(_ZN3ccc7DD8x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y1E[];
extern void _ZN3ccc7DD8x9y13efgEv();
extern void _ZN3ccc7DD8x9y13abcEv();
extern void _ZN3ccc7DD8x9y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y13efgEv,_ZTv0_n12_N3ccc7DD8x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y13efgEv,_ZThn4_N3ccc7DD8x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y13pqrEv,_ZTv0_n16_N3ccc7DD8x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y13pqrEv,_ZThn4_N3ccc7DD8x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y13efgEv,_ZTv0_n12_N3ccc7DD8x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y13pqrEv,_ZTv0_n16_N3ccc7DD8x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y1E[] = {
  {&(_ZTVN3ccc7DD8x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y1E[];
static VTBL_ENTRY alt_thunk_names1434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y13pqrEv,_ZTv0_n16_N3ccc7DD8x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y13pqrEv,_ZThn4_N3ccc7DD8x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y13efgEv,_ZTv0_n12_N3ccc7DD8x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y13efgEv,_ZThn4_N3ccc7DD8x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y1E = {  "_ZN3ccc7DD8x9y1E", // class name
  bases__ZN3ccc7DD8x9y1E, 2,
  &(vtc__ZN3ccc7DD8x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y1E),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  CC8x9y2  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC8x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y23pqrEv
  ~CC8x9y2(); // tgen
  CC8x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y2E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y23efgEv");}
void  ccc::CC8x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y23abcEv");}
void  ccc::CC8x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y23pqrEv");}
ccc::CC8x9y2 ::~CC8x9y2(){ note_dtor("_ZN3ccc7CC8x9y2E", this);} // tgen
ccc::CC8x9y2 ::CC8x9y2(){ note_ctor("_ZN3ccc7CC8x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y2E, buf);
    ::ccc::CC8x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y2E);
    dp->::ccc::CC8x9y2::~CC8x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y2E(Test__ZN3ccc7CC8x9y2E, "_ZN3ccc7CC8x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y2C1Ev();
extern void _ZN3ccc7CC8x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y2E[] = {
  NSPAIR(_ZN3ccc7CC8x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y2E[];
extern void _ZN3ccc7CC8x9y23efgEv();
extern void _ZN3ccc7CC8x9y23pqrEv();
extern void _ZN3ccc7CC8x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y23efgEv,_ZTv0_n12_N3ccc7CC8x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y23efgEv,_ZThn4_N3ccc7CC8x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y23abcEv,_ZTv0_n16_N3ccc7CC8x9y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y23abcEv,_ZThn4_N3ccc7CC8x9y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y23efgEv,_ZTv0_n12_N3ccc7CC8x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y23abcEv,_ZTv0_n16_N3ccc7CC8x9y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y2E[] = {
  {&(_ZTVN3ccc7CC8x9y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y2E[];
static VTBL_ENTRY alt_thunk_names1435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y23abcEv,_ZTv0_n16_N3ccc7CC8x9y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y23abcEv,_ZThn4_N3ccc7CC8x9y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y23efgEv,_ZTv0_n12_N3ccc7CC8x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y23efgEv,_ZThn4_N3ccc7CC8x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y2E = {  "_ZN3ccc7CC8x9y2E", // class name
  bases__ZN3ccc7CC8x9y2E, 2,
  &(vtc__ZN3ccc7CC8x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y2E),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  DD8x9y2  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD8x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD8x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x9y23pqrEv
  ~DD8x9y2(); // tgen
  DD8x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y2E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y23efgEv");}
void  ccc::DD8x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y23abcEv");}
void  ccc::DD8x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y23pqrEv");}
ccc::DD8x9y2 ::~DD8x9y2(){ note_dtor("_ZN3ccc7DD8x9y2E", this);} // tgen
ccc::DD8x9y2 ::DD8x9y2(){ note_ctor("_ZN3ccc7DD8x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y2E, buf);
    ::ccc::DD8x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y2E);
    dp->::ccc::DD8x9y2::~DD8x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y2E(Test__ZN3ccc7DD8x9y2E, "_ZN3ccc7DD8x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y2C1Ev();
extern void _ZN3ccc7DD8x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y2E[] = {
  NSPAIR(_ZN3ccc7DD8x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y2E[];
extern void _ZN3ccc7DD8x9y23efgEv();
extern void _ZN3ccc7DD8x9y23abcEv();
extern void _ZN3ccc7DD8x9y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y23efgEv,_ZTv0_n12_N3ccc7DD8x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y23efgEv,_ZThn4_N3ccc7DD8x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y23pqrEv,_ZTv0_n16_N3ccc7DD8x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y23pqrEv,_ZThn4_N3ccc7DD8x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y23efgEv,_ZTv0_n12_N3ccc7DD8x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y23pqrEv,_ZTv0_n16_N3ccc7DD8x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y2E[] = {
  {&(_ZTVN3ccc7DD8x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y2E[];
static VTBL_ENTRY alt_thunk_names1436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y23pqrEv,_ZTv0_n16_N3ccc7DD8x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y23pqrEv,_ZThn4_N3ccc7DD8x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y23efgEv,_ZTv0_n12_N3ccc7DD8x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y23efgEv,_ZThn4_N3ccc7DD8x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y2E = {  "_ZN3ccc7DD8x9y2E", // class name
  bases__ZN3ccc7DD8x9y2E, 2,
  &(vtc__ZN3ccc7DD8x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y2E),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  CC8x9y3  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x9y33abcEv
  ~CC8x9y3(); // tgen
  CC8x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y3E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y33efgEv");}
void  ccc::CC8x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y33pqrEv");}
void  ccc::CC8x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y33abcEv");}
ccc::CC8x9y3 ::~CC8x9y3(){ note_dtor("_ZN3ccc7CC8x9y3E", this);} // tgen
ccc::CC8x9y3 ::CC8x9y3(){ note_ctor("_ZN3ccc7CC8x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y3E, buf);
    ::ccc::CC8x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y3E);
    dp->::ccc::CC8x9y3::~CC8x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y3E(Test__ZN3ccc7CC8x9y3E, "_ZN3ccc7CC8x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y3C1Ev();
extern void _ZN3ccc7CC8x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y3E[] = {
  NSPAIR(_ZN3ccc7CC8x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y3E[];
extern void _ZN3ccc7CC8x9y33efgEv();
extern void _ZN3ccc7CC8x9y33pqrEv();
extern void _ZN3ccc7CC8x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y33efgEv,_ZTv0_n12_N3ccc7CC8x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y33efgEv,_ZThn4_N3ccc7CC8x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y33abcEv,_ZTv0_n16_N3ccc7CC8x9y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y33abcEv,_ZThn4_N3ccc7CC8x9y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y33efgEv,_ZTv0_n12_N3ccc7CC8x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y33abcEv,_ZTv0_n16_N3ccc7CC8x9y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y3E[] = {
  {&(_ZTVN3ccc7CC8x9y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y3E[];
static VTBL_ENTRY alt_thunk_names1437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y33abcEv,_ZTv0_n16_N3ccc7CC8x9y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y33abcEv,_ZThn4_N3ccc7CC8x9y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y33efgEv,_ZTv0_n12_N3ccc7CC8x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y33efgEv,_ZThn4_N3ccc7CC8x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y3E = {  "_ZN3ccc7CC8x9y3E", // class name
  bases__ZN3ccc7CC8x9y3E, 2,
  &(vtc__ZN3ccc7CC8x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y3E),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  DD8x9y3  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD8x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x9y33abcEv
  ~DD8x9y3(); // tgen
  DD8x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y3E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y33efgEv");}
void  ccc::DD8x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y33pqrEv");}
void  ccc::DD8x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y33abcEv");}
ccc::DD8x9y3 ::~DD8x9y3(){ note_dtor("_ZN3ccc7DD8x9y3E", this);} // tgen
ccc::DD8x9y3 ::DD8x9y3(){ note_ctor("_ZN3ccc7DD8x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y3E, buf);
    ::ccc::DD8x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y3E);
    dp->::ccc::DD8x9y3::~DD8x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y3E(Test__ZN3ccc7DD8x9y3E, "_ZN3ccc7DD8x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y3C1Ev();
extern void _ZN3ccc7DD8x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y3E[] = {
  NSPAIR(_ZN3ccc7DD8x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y3E[];
extern void _ZN3ccc7DD8x9y33efgEv();
extern void _ZN3ccc7DD8x9y33abcEv();
extern void _ZN3ccc7DD8x9y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y33efgEv,_ZTv0_n12_N3ccc7DD8x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y33efgEv,_ZThn4_N3ccc7DD8x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y33pqrEv,_ZTv0_n16_N3ccc7DD8x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y33pqrEv,_ZThn4_N3ccc7DD8x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y33efgEv,_ZTv0_n12_N3ccc7DD8x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y33pqrEv,_ZTv0_n16_N3ccc7DD8x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y3E[] = {
  {&(_ZTVN3ccc7DD8x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y3E[];
static VTBL_ENTRY alt_thunk_names1438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y33pqrEv,_ZTv0_n16_N3ccc7DD8x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y33pqrEv,_ZThn4_N3ccc7DD8x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y33efgEv,_ZTv0_n12_N3ccc7DD8x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y33efgEv,_ZThn4_N3ccc7DD8x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y3E = {  "_ZN3ccc7DD8x9y3E", // class name
  bases__ZN3ccc7DD8x9y3E, 2,
  &(vtc__ZN3ccc7DD8x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y3E),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  CC8x9y4  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC8x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC8x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC8x9y43efgEv
  ~CC8x9y4(); // tgen
  CC8x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y4E) C1{ VBC2{ v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y43pqrEv");}
void  ccc::CC8x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y43abcEv");}
void  ccc::CC8x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y43efgEv");}
ccc::CC8x9y4 ::~CC8x9y4(){ note_dtor("_ZN3ccc7CC8x9y4E", this);} // tgen
ccc::CC8x9y4 ::CC8x9y4(){ note_ctor("_ZN3ccc7CC8x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y4E, buf);
    ::ccc::CC8x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y4E);
    dp->::ccc::CC8x9y4::~CC8x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y4E(Test__ZN3ccc7CC8x9y4E, "_ZN3ccc7CC8x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y4C1Ev();
extern void _ZN3ccc7CC8x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y4E[] = {
  NSPAIR(_ZN3ccc7CC8x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y4E[];
extern void _ZN3ccc7CC8x9y43efgEv();
extern void _ZN3ccc7CC8x9y43pqrEv();
extern void _ZN3ccc7CC8x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y43efgEv,_ZTv0_n12_N3ccc7CC8x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y43efgEv,_ZThn4_N3ccc7CC8x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y43abcEv,_ZTv0_n16_N3ccc7CC8x9y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y43abcEv,_ZThn4_N3ccc7CC8x9y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y43efgEv,_ZTv0_n12_N3ccc7CC8x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y43abcEv,_ZTv0_n16_N3ccc7CC8x9y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y4E[] = {
  {&(_ZTVN3ccc7CC8x9y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y4E[];
static VTBL_ENTRY alt_thunk_names1439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y43abcEv,_ZTv0_n16_N3ccc7CC8x9y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y43abcEv,_ZThn4_N3ccc7CC8x9y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y43efgEv,_ZTv0_n12_N3ccc7CC8x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y43efgEv,_ZThn4_N3ccc7CC8x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y4E = {  "_ZN3ccc7CC8x9y4E", // class name
  bases__ZN3ccc7CC8x9y4E, 2,
  &(vtc__ZN3ccc7CC8x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y4E),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  DD8x9y4  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD8x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD8x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD8x9y43efgEv
  ~DD8x9y4(); // tgen
  DD8x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y4E) C1{ VBC2{ v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y43pqrEv");}
void  ccc::DD8x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y43abcEv");}
void  ccc::DD8x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y43efgEv");}
ccc::DD8x9y4 ::~DD8x9y4(){ note_dtor("_ZN3ccc7DD8x9y4E", this);} // tgen
ccc::DD8x9y4 ::DD8x9y4(){ note_ctor("_ZN3ccc7DD8x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y4E, buf);
    ::ccc::DD8x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y4E);
    dp->::ccc::DD8x9y4::~DD8x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y4E(Test__ZN3ccc7DD8x9y4E, "_ZN3ccc7DD8x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y4C1Ev();
extern void _ZN3ccc7DD8x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y4E[] = {
  NSPAIR(_ZN3ccc7DD8x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y4E[];
extern void _ZN3ccc7DD8x9y43efgEv();
extern void _ZN3ccc7DD8x9y43abcEv();
extern void _ZN3ccc7DD8x9y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y43efgEv,_ZTv0_n12_N3ccc7DD8x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y43efgEv,_ZThn4_N3ccc7DD8x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y43pqrEv,_ZTv0_n16_N3ccc7DD8x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y43pqrEv,_ZThn4_N3ccc7DD8x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y43efgEv,_ZTv0_n12_N3ccc7DD8x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y43pqrEv,_ZTv0_n16_N3ccc7DD8x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y4E[] = {
  {&(_ZTVN3ccc7DD8x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y4E[];
static VTBL_ENTRY alt_thunk_names1440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y43pqrEv,_ZTv0_n16_N3ccc7DD8x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y43pqrEv,_ZThn4_N3ccc7DD8x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y43efgEv,_ZTv0_n12_N3ccc7DD8x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y43efgEv,_ZThn4_N3ccc7DD8x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y4E = {  "_ZN3ccc7DD8x9y4E", // class name
  bases__ZN3ccc7DD8x9y4E, 2,
  &(vtc__ZN3ccc7DD8x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y4E),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  CC8x9y5  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC8x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC8x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC8x9y53abcEv
  ~CC8x9y5(); // tgen
  CC8x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y5E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y53pqrEv");}
void  ccc::CC8x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y53efgEv");}
void  ccc::CC8x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y53abcEv");}
ccc::CC8x9y5 ::~CC8x9y5(){ note_dtor("_ZN3ccc7CC8x9y5E", this);} // tgen
ccc::CC8x9y5 ::CC8x9y5(){ note_ctor("_ZN3ccc7CC8x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y5E, buf);
    ::ccc::CC8x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y5E);
    dp->::ccc::CC8x9y5::~CC8x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y5E(Test__ZN3ccc7CC8x9y5E, "_ZN3ccc7CC8x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y5C1Ev();
extern void _ZN3ccc7CC8x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y5E[] = {
  NSPAIR(_ZN3ccc7CC8x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y5E[];
extern void _ZN3ccc7CC8x9y53efgEv();
extern void _ZN3ccc7CC8x9y53pqrEv();
extern void _ZN3ccc7CC8x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y53efgEv,_ZTv0_n12_N3ccc7CC8x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y53efgEv,_ZThn4_N3ccc7CC8x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y53abcEv,_ZTv0_n16_N3ccc7CC8x9y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y53abcEv,_ZThn4_N3ccc7CC8x9y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y53efgEv,_ZTv0_n12_N3ccc7CC8x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y53abcEv,_ZTv0_n16_N3ccc7CC8x9y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y5E[] = {
  {&(_ZTVN3ccc7CC8x9y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y5E[];
static VTBL_ENTRY alt_thunk_names1441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y53abcEv,_ZTv0_n16_N3ccc7CC8x9y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y53abcEv,_ZThn4_N3ccc7CC8x9y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y53efgEv,_ZTv0_n12_N3ccc7CC8x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y53efgEv,_ZThn4_N3ccc7CC8x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y5E = {  "_ZN3ccc7CC8x9y5E", // class name
  bases__ZN3ccc7CC8x9y5E, 2,
  &(vtc__ZN3ccc7CC8x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y5E),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  DD8x9y5  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD8x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD8x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD8x9y53abcEv
  ~DD8x9y5(); // tgen
  DD8x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y5E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y53pqrEv");}
void  ccc::DD8x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y53efgEv");}
void  ccc::DD8x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y53abcEv");}
ccc::DD8x9y5 ::~DD8x9y5(){ note_dtor("_ZN3ccc7DD8x9y5E", this);} // tgen
ccc::DD8x9y5 ::DD8x9y5(){ note_ctor("_ZN3ccc7DD8x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y5E, buf);
    ::ccc::DD8x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y5E);
    dp->::ccc::DD8x9y5::~DD8x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y5E(Test__ZN3ccc7DD8x9y5E, "_ZN3ccc7DD8x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y5C1Ev();
extern void _ZN3ccc7DD8x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y5E[] = {
  NSPAIR(_ZN3ccc7DD8x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y5E[];
extern void _ZN3ccc7DD8x9y53efgEv();
extern void _ZN3ccc7DD8x9y53abcEv();
extern void _ZN3ccc7DD8x9y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y53efgEv,_ZTv0_n12_N3ccc7DD8x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y53efgEv,_ZThn4_N3ccc7DD8x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y53pqrEv,_ZTv0_n16_N3ccc7DD8x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y53pqrEv,_ZThn4_N3ccc7DD8x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y53efgEv,_ZTv0_n12_N3ccc7DD8x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y53pqrEv,_ZTv0_n16_N3ccc7DD8x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y5E[] = {
  {&(_ZTVN3ccc7DD8x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y5E[];
static VTBL_ENTRY alt_thunk_names1442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y53pqrEv,_ZTv0_n16_N3ccc7DD8x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y53pqrEv,_ZThn4_N3ccc7DD8x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y53efgEv,_ZTv0_n12_N3ccc7DD8x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y53efgEv,_ZThn4_N3ccc7DD8x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y5E = {  "_ZN3ccc7DD8x9y5E", // class name
  bases__ZN3ccc7DD8x9y5E, 2,
  &(vtc__ZN3ccc7DD8x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y5E),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  CC8x9y6  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC8x9y63efgEv
  ~CC8x9y6(); // tgen
  CC8x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y6E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y63abcEv");}
void  ccc::CC8x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y63efgEv");}
ccc::CC8x9y6 ::~CC8x9y6(){ note_dtor("_ZN3ccc7CC8x9y6E", this);} // tgen
ccc::CC8x9y6 ::CC8x9y6(){ note_ctor("_ZN3ccc7CC8x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y6E, buf);
    ::ccc::CC8x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y6E);
    dp->::ccc::CC8x9y6::~CC8x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y6E(Test__ZN3ccc7CC8x9y6E, "_ZN3ccc7CC8x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y6C1Ev();
extern void _ZN3ccc7CC8x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y6E[] = {
  NSPAIR(_ZN3ccc7CC8x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y6E[];
extern void _ZN3ccc7CC8x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC8x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y63efgEv,_ZTv0_n12_N3ccc7CC8x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y63efgEv,_ZThn4_N3ccc7CC8x9y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y63abcEv,_ZTv0_n16_N3ccc7CC8x9y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y63abcEv,_ZThn4_N3ccc7CC8x9y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y63efgEv,_ZTv0_n12_N3ccc7CC8x9y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y63abcEv,_ZTv0_n16_N3ccc7CC8x9y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y6E[] = {
  {&(_ZTVN3ccc7CC8x9y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y6E[];
static VTBL_ENTRY alt_thunk_names1443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y63abcEv,_ZTv0_n16_N3ccc7CC8x9y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y63abcEv,_ZThn4_N3ccc7CC8x9y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y63efgEv,_ZTv0_n12_N3ccc7CC8x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y63efgEv,_ZThn4_N3ccc7CC8x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y6E = {  "_ZN3ccc7CC8x9y6E", // class name
  bases__ZN3ccc7CC8x9y6E, 2,
  &(vtc__ZN3ccc7CC8x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y6E),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  DD8x9y6  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD8x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD8x9y63efgEv
  ~DD8x9y6(); // tgen
  DD8x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y6E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y63abcEv");}
void  ccc::DD8x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y63efgEv");}
ccc::DD8x9y6 ::~DD8x9y6(){ note_dtor("_ZN3ccc7DD8x9y6E", this);} // tgen
ccc::DD8x9y6 ::DD8x9y6(){ note_ctor("_ZN3ccc7DD8x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y6E, buf);
    ::ccc::DD8x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y6E);
    dp->::ccc::DD8x9y6::~DD8x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y6E(Test__ZN3ccc7DD8x9y6E, "_ZN3ccc7DD8x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y6C1Ev();
extern void _ZN3ccc7DD8x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y6E[] = {
  NSPAIR(_ZN3ccc7DD8x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y6E[];
extern void _ZN3ccc7DD8x9y63efgEv();
extern void _ZN3ccc7DD8x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y63efgEv,_ZTv0_n12_N3ccc7DD8x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y63efgEv,_ZThn4_N3ccc7DD8x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y63efgEv,_ZTv0_n12_N3ccc7DD8x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y6E[] = {
  {&(_ZTVN3ccc7DD8x9y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x9y6E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x9y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y6E[];
static VTBL_ENTRY alt_thunk_names1444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y63efgEv,_ZTv0_n12_N3ccc7DD8x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y63efgEv,_ZThn4_N3ccc7DD8x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y6E = {  "_ZN3ccc7DD8x9y6E", // class name
  bases__ZN3ccc7DD8x9y6E, 2,
  &(vtc__ZN3ccc7DD8x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y6E),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  CC8x9y7  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC8x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y73pqrEv
  ~CC8x9y7(); // tgen
  CC8x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y7E) C1{ VBC2{ v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y73abcEv");}
void  ccc::CC8x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y73pqrEv");}
ccc::CC8x9y7 ::~CC8x9y7(){ note_dtor("_ZN3ccc7CC8x9y7E", this);} // tgen
ccc::CC8x9y7 ::CC8x9y7(){ note_ctor("_ZN3ccc7CC8x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y7E, buf);
    ::ccc::CC8x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y7E);
    dp->::ccc::CC8x9y7::~CC8x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y7E(Test__ZN3ccc7CC8x9y7E, "_ZN3ccc7CC8x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y7C1Ev();
extern void _ZN3ccc7CC8x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y7E[] = {
  NSPAIR(_ZN3ccc7CC8x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC8x9y73pqrEv();
extern void _ZN3ccc7CC8x9y73abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y73abcEv,_ZTv0_n16_N3ccc7CC8x9y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y73abcEv,_ZThn4_N3ccc7CC8x9y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y73abcEv,_ZTv0_n16_N3ccc7CC8x9y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y7E[] = {
  {&(_ZTVN3ccc7CC8x9y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y7E[];
static VTBL_ENTRY alt_thunk_names1445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y73abcEv,_ZTv0_n16_N3ccc7CC8x9y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y73abcEv,_ZThn4_N3ccc7CC8x9y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y7E = {  "_ZN3ccc7CC8x9y7E", // class name
  bases__ZN3ccc7CC8x9y7E, 2,
  &(vtc__ZN3ccc7CC8x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y7E),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  DD8x9y7  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD8x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD8x9y73pqrEv
  ~DD8x9y7(); // tgen
  DD8x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y7E) C1{ VBC2{ v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y73abcEv");}
void  ccc::DD8x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y73pqrEv");}
ccc::DD8x9y7 ::~DD8x9y7(){ note_dtor("_ZN3ccc7DD8x9y7E", this);} // tgen
ccc::DD8x9y7 ::DD8x9y7(){ note_ctor("_ZN3ccc7DD8x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y7E, buf);
    ::ccc::DD8x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y7E);
    dp->::ccc::DD8x9y7::~DD8x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y7E(Test__ZN3ccc7DD8x9y7E, "_ZN3ccc7DD8x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y7C1Ev();
extern void _ZN3ccc7DD8x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y7E[] = {
  NSPAIR(_ZN3ccc7DD8x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc7DD8x9y73abcEv();
extern void _ZN3ccc7DD8x9y73pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y73pqrEv,_ZTv0_n16_N3ccc7DD8x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y73pqrEv,_ZThn4_N3ccc7DD8x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y73pqrEv,_ZTv0_n16_N3ccc7DD8x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y7E[] = {
  {&(_ZTVN3ccc7DD8x9y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y7E[];
static VTBL_ENTRY alt_thunk_names1446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y73pqrEv,_ZTv0_n16_N3ccc7DD8x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y73pqrEv,_ZThn4_N3ccc7DD8x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y7E = {  "_ZN3ccc7DD8x9y7E", // class name
  bases__ZN3ccc7DD8x9y7E, 2,
  &(vtc__ZN3ccc7DD8x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y7E),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  CC8x9y8  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC8x9y83abcEv
  ~CC8x9y8(); // tgen
  CC8x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y8E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y83efgEv");}
void  ccc::CC8x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC8x9y83abcEv");}
ccc::CC8x9y8 ::~CC8x9y8(){ note_dtor("_ZN3ccc7CC8x9y8E", this);} // tgen
ccc::CC8x9y8 ::CC8x9y8(){ note_ctor("_ZN3ccc7CC8x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y8E, buf);
    ::ccc::CC8x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y8E);
    dp->::ccc::CC8x9y8::~CC8x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y8E(Test__ZN3ccc7CC8x9y8E, "_ZN3ccc7CC8x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y8C1Ev();
extern void _ZN3ccc7CC8x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y8E[] = {
  NSPAIR(_ZN3ccc7CC8x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y8E[];
extern void _ZN3ccc7CC8x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC8x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y83efgEv,_ZTv0_n12_N3ccc7CC8x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y83efgEv,_ZThn4_N3ccc7CC8x9y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC8x9y83abcEv,_ZTv0_n16_N3ccc7CC8x9y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y83abcEv,_ZThn4_N3ccc7CC8x9y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y83efgEv,_ZTv0_n12_N3ccc7CC8x9y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC8x9y83abcEv,_ZTv0_n16_N3ccc7CC8x9y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y8E[] = {
  {&(_ZTVN3ccc7CC8x9y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC8x9y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y8E[];
static VTBL_ENTRY alt_thunk_names1447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC8x9y83abcEv,_ZTv0_n16_N3ccc7CC8x9y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y83abcEv,_ZThn4_N3ccc7CC8x9y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y83efgEv,_ZTv0_n12_N3ccc7CC8x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y83efgEv,_ZThn4_N3ccc7CC8x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y8E = {  "_ZN3ccc7CC8x9y8E", // class name
  bases__ZN3ccc7CC8x9y8E, 2,
  &(vtc__ZN3ccc7CC8x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y8E),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  DD8x9y8  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD8x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD8x9y83abcEv
  ~DD8x9y8(); // tgen
  DD8x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y8E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y83efgEv");}
void  ccc::DD8x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD8x9y83abcEv");}
ccc::DD8x9y8 ::~DD8x9y8(){ note_dtor("_ZN3ccc7DD8x9y8E", this);} // tgen
ccc::DD8x9y8 ::DD8x9y8(){ note_ctor("_ZN3ccc7DD8x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y8E, buf);
    ::ccc::DD8x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y8E);
    dp->::ccc::DD8x9y8::~DD8x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y8E(Test__ZN3ccc7DD8x9y8E, "_ZN3ccc7DD8x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y8C1Ev();
extern void _ZN3ccc7DD8x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y8E[] = {
  NSPAIR(_ZN3ccc7DD8x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y8E[];
extern void _ZN3ccc7DD8x9y83efgEv();
extern void _ZN3ccc7DD8x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y83efgEv,_ZTv0_n12_N3ccc7DD8x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y83efgEv,_ZThn4_N3ccc7DD8x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y83efgEv,_ZTv0_n12_N3ccc7DD8x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y8E[] = {
  {&(_ZTVN3ccc7DD8x9y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x9y8E[6]),  6,14},
  {&(_ZTVN3ccc7DD8x9y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y8E[];
static VTBL_ENTRY alt_thunk_names1448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y83efgEv,_ZTv0_n12_N3ccc7DD8x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y83efgEv,_ZThn4_N3ccc7DD8x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y8E = {  "_ZN3ccc7DD8x9y8E", // class name
  bases__ZN3ccc7DD8x9y8E, 2,
  &(vtc__ZN3ccc7DD8x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y8E),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  CC8x9y9  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC8x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC8x9y93pqrEv
  ~CC8x9y9(); // tgen
  CC8x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC8x9y9E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC8x9y93efgEv");}
void  ccc::CC8x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC8x9y93pqrEv");}
ccc::CC8x9y9 ::~CC8x9y9(){ note_dtor("_ZN3ccc7CC8x9y9E", this);} // tgen
ccc::CC8x9y9 ::CC8x9y9(){ note_ctor("_ZN3ccc7CC8x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC8x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC8x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC8x9y9E, buf);
    ::ccc::CC8x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC8x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC8x9y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc7CC8x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC8x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC8x9y9E);
    dp->::ccc::CC8x9y9::~CC8x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC8x9y9E(Test__ZN3ccc7CC8x9y9E, "_ZN3ccc7CC8x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC8x9y9C1Ev();
extern void _ZN3ccc7CC8x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC8x9y9E[] = {
  NSPAIR(_ZN3ccc7CC8x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC8x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC8x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC8x9y9E[];
extern void _ZN3ccc7CC8x9y93efgEv();
extern void _ZN3ccc7CC8x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC8x9y93efgEv,_ZTv0_n12_N3ccc7CC8x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC8x9y93efgEv,_ZThn4_N3ccc7CC8x9y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC8x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC8x9y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC8x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC8x9y93efgEv,_ZTv0_n12_N3ccc7CC8x9y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC8x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC8x9y9E[] = {
  {&(_ZTVN3ccc7CC8x9y9E[3]),  3,11},
  {&(_ZTVN3ccc7CC8x9y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC8x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC8x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC8x9y9E[];
static VTBL_ENTRY alt_thunk_names1449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC8x9y93efgEv,_ZTv0_n12_N3ccc7CC8x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC8x9y93efgEv,_ZThn4_N3ccc7CC8x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC8x9y9E = {  "_ZN3ccc7CC8x9y9E", // class name
  bases__ZN3ccc7CC8x9y9E, 2,
  &(vtc__ZN3ccc7CC8x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC8x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC8x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC8x9y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC8x9y9E),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  DD8x9y9  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD8x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD8x9y93pqrEv
  ~DD8x9y9(); // tgen
  DD8x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD8x9y9E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD8x9y93efgEv");}
void  ccc::DD8x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD8x9y93pqrEv");}
ccc::DD8x9y9 ::~DD8x9y9(){ note_dtor("_ZN3ccc7DD8x9y9E", this);} // tgen
ccc::DD8x9y9 ::DD8x9y9(){ note_ctor("_ZN3ccc7DD8x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD8x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD8x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD8x9y9E, buf);
    ::ccc::DD8x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD8x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD8x9y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc7DD8x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD8x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD8x9y9E);
    dp->::ccc::DD8x9y9::~DD8x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD8x9y9E(Test__ZN3ccc7DD8x9y9E, "_ZN3ccc7DD8x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD8x9y9C1Ev();
extern void _ZN3ccc7DD8x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD8x9y9E[] = {
  NSPAIR(_ZN3ccc7DD8x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD8x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD8x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y9E[];
extern void _ZN3ccc7DD8x9y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc7DD8x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD8x9y93efgEv,_ZTv0_n12_N3ccc7DD8x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y93efgEv,_ZThn4_N3ccc7DD8x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD8x9y93pqrEv,_ZTv0_n16_N3ccc7DD8x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD8x9y93pqrEv,_ZThn4_N3ccc7DD8x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD8x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7DD8x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD8x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD8x9y93efgEv,_ZTv0_n12_N3ccc7DD8x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD8x9y93pqrEv,_ZTv0_n16_N3ccc7DD8x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD8x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD8x9y9E[] = {
  {&(_ZTVN3ccc7DD8x9y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y9E[6]),  6,15},
  {&(_ZTVN3ccc7DD8x9y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD8x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD8x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD8x9y9E[];
static VTBL_ENTRY alt_thunk_names1450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD8x9y93pqrEv,_ZTv0_n16_N3ccc7DD8x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y93pqrEv,_ZThn4_N3ccc7DD8x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD8x9y93efgEv,_ZTv0_n12_N3ccc7DD8x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD8x9y93efgEv,_ZThn4_N3ccc7DD8x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD8x9y9E = {  "_ZN3ccc7DD8x9y9E", // class name
  bases__ZN3ccc7DD8x9y9E, 2,
  &(vtc__ZN3ccc7DD8x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD8x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD8x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD8x9y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD8x9y9E),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  CC8x9y10  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC8x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x9y103abcEv
  ~CC8x9y10(); // tgen
  CC8x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y10E) C1{ VBC2{ v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x9y103pqrEv");}
void  ccc::CC8x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x9y103abcEv");}
ccc::CC8x9y10 ::~CC8x9y10(){ note_dtor("_ZN3ccc8CC8x9y10E", this);} // tgen
ccc::CC8x9y10 ::CC8x9y10(){ note_ctor("_ZN3ccc8CC8x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC8x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x9y10E, buf);
    ::ccc::CC8x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x9y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC8x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x9y10E);
    dp->::ccc::CC8x9y10::~CC8x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x9y10E(Test__ZN3ccc8CC8x9y10E, "_ZN3ccc8CC8x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x9y10C1Ev();
extern void _ZN3ccc8CC8x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC8x9y10E[] = {
  NSPAIR(_ZN3ccc8CC8x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC8x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC8x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC8x9y103pqrEv();
extern void _ZN3ccc8CC8x9y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x9y103abcEv,_ZTv0_n16_N3ccc8CC8x9y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y103abcEv,_ZThn4_N3ccc8CC8x9y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x9y103abcEv,_ZTv0_n16_N3ccc8CC8x9y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x9y10E[] = {
  {&(_ZTVN3ccc8CC8x9y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x9y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x9y10E[];
static VTBL_ENTRY alt_thunk_names1451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x9y103abcEv,_ZTv0_n16_N3ccc8CC8x9y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x9y103abcEv,_ZThn4_N3ccc8CC8x9y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x9y10E = {  "_ZN3ccc8CC8x9y10E", // class name
  bases__ZN3ccc8CC8x9y10E, 2,
  &(vtc__ZN3ccc8CC8x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x9y10E),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  DD8x9y10  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD8x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x9y103abcEv
  ~DD8x9y10(); // tgen
  DD8x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD8x9y10E) C1{ VBC2{ v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x9y103pqrEv");}
void  ccc::DD8x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x9y103abcEv");}
ccc::DD8x9y10 ::~DD8x9y10(){ note_dtor("_ZN3ccc8DD8x9y10E", this);} // tgen
ccc::DD8x9y10 ::DD8x9y10(){ note_ctor("_ZN3ccc8DD8x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD8x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x9y10E, buf);
    ::ccc::DD8x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x9y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD8x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x9y10E);
    dp->::ccc::DD8x9y10::~DD8x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x9y10E(Test__ZN3ccc8DD8x9y10E, "_ZN3ccc8DD8x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x9y10C1Ev();
extern void _ZN3ccc8DD8x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD8x9y10E[] = {
  NSPAIR(_ZN3ccc8DD8x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD8x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD8x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x9y103abcEv();
extern void _ZN3ccc8DD8x9y103pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x9y103pqrEv,_ZTv0_n16_N3ccc8DD8x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x9y103pqrEv,_ZThn4_N3ccc8DD8x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x9y103pqrEv,_ZTv0_n16_N3ccc8DD8x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x9y10E[] = {
  {&(_ZTVN3ccc8DD8x9y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x9y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x9y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x9y10E[];
static VTBL_ENTRY alt_thunk_names1452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x9y103pqrEv,_ZTv0_n16_N3ccc8DD8x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x9y103pqrEv,_ZThn4_N3ccc8DD8x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x9y10E = {  "_ZN3ccc8DD8x9y10E", // class name
  bases__ZN3ccc8DD8x9y10E, 2,
  &(vtc__ZN3ccc8DD8x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x9y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x9y10E),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  CC8x9y11  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC8x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x9y113efgEv
  ~CC8x9y11(); // tgen
  CC8x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y11E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x9y113pqrEv");}
void  ccc::CC8x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x9y113efgEv");}
ccc::CC8x9y11 ::~CC8x9y11(){ note_dtor("_ZN3ccc8CC8x9y11E", this);} // tgen
ccc::CC8x9y11 ::CC8x9y11(){ note_ctor("_ZN3ccc8CC8x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC8x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x9y11E, buf);
    ::ccc::CC8x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x9y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC8x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x9y11E);
    dp->::ccc::CC8x9y11::~CC8x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x9y11E(Test__ZN3ccc8CC8x9y11E, "_ZN3ccc8CC8x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x9y11C1Ev();
extern void _ZN3ccc8CC8x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC8x9y11E[] = {
  NSPAIR(_ZN3ccc8CC8x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC8x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC8x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x9y11E[];
extern void _ZN3ccc8CC8x9y113efgEv();
extern void _ZN3ccc8CC8x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x9y113efgEv,_ZTv0_n12_N3ccc8CC8x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y113efgEv,_ZThn4_N3ccc8CC8x9y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x9y113efgEv,_ZTv0_n12_N3ccc8CC8x9y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x9y11E[] = {
  {&(_ZTVN3ccc8CC8x9y11E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x9y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x9y11E[];
static VTBL_ENTRY alt_thunk_names1453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x9y113efgEv,_ZTv0_n12_N3ccc8CC8x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x9y113efgEv,_ZThn4_N3ccc8CC8x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x9y11E = {  "_ZN3ccc8CC8x9y11E", // class name
  bases__ZN3ccc8CC8x9y11E, 2,
  &(vtc__ZN3ccc8CC8x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x9y11E),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  DD8x9y11  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD8x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x9y113efgEv
  ~DD8x9y11(); // tgen
  DD8x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD8x9y11E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x9y113pqrEv");}
void  ccc::DD8x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x9y113efgEv");}
ccc::DD8x9y11 ::~DD8x9y11(){ note_dtor("_ZN3ccc8DD8x9y11E", this);} // tgen
ccc::DD8x9y11 ::DD8x9y11(){ note_ctor("_ZN3ccc8DD8x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD8x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x9y11E, buf);
    ::ccc::DD8x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x9y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD8x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x9y11E);
    dp->::ccc::DD8x9y11::~DD8x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x9y11E(Test__ZN3ccc8DD8x9y11E, "_ZN3ccc8DD8x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x9y11C1Ev();
extern void _ZN3ccc8DD8x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD8x9y11E[] = {
  NSPAIR(_ZN3ccc8DD8x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD8x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD8x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y11E[];
extern void _ZN3ccc8DD8x9y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x9y113efgEv,_ZTv0_n12_N3ccc8DD8x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x9y113efgEv,_ZThn4_N3ccc8DD8x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x9y113pqrEv,_ZTv0_n16_N3ccc8DD8x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x9y113pqrEv,_ZThn4_N3ccc8DD8x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x9y113efgEv,_ZTv0_n12_N3ccc8DD8x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x9y113pqrEv,_ZTv0_n16_N3ccc8DD8x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x9y11E[] = {
  {&(_ZTVN3ccc8DD8x9y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x9y11E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x9y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x9y11E[];
static VTBL_ENTRY alt_thunk_names1454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x9y113pqrEv,_ZTv0_n16_N3ccc8DD8x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x9y113pqrEv,_ZThn4_N3ccc8DD8x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x9y113efgEv,_ZTv0_n12_N3ccc8DD8x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x9y113efgEv,_ZThn4_N3ccc8DD8x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x9y11E = {  "_ZN3ccc8DD8x9y11E", // class name
  bases__ZN3ccc8DD8x9y11E, 2,
  &(vtc__ZN3ccc8DD8x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x9y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x9y11E),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  CC8x9y12  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC8x9y123abcEv
  ~CC8x9y12(); // tgen
  CC8x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y12E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x9y123abcEv");}
ccc::CC8x9y12 ::~CC8x9y12(){ note_dtor("_ZN3ccc8CC8x9y12E", this);} // tgen
ccc::CC8x9y12 ::CC8x9y12(){ note_ctor("_ZN3ccc8CC8x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC8x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x9y12E, buf);
    ::ccc::CC8x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x9y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC8x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x9y12E);
    dp->::ccc::CC8x9y12::~CC8x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x9y12E(Test__ZN3ccc8CC8x9y12E, "_ZN3ccc8CC8x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x9y12C1Ev();
extern void _ZN3ccc8CC8x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC8x9y12E[] = {
  NSPAIR(_ZN3ccc8CC8x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC8x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC8x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC8x9y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x9y123abcEv,_ZTv0_n16_N3ccc8CC8x9y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y123abcEv,_ZThn4_N3ccc8CC8x9y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x9y123abcEv,_ZTv0_n16_N3ccc8CC8x9y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x9y12E[] = {
  {&(_ZTVN3ccc8CC8x9y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x9y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x9y12E[];
static VTBL_ENTRY alt_thunk_names1455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x9y123abcEv,_ZTv0_n16_N3ccc8CC8x9y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x9y123abcEv,_ZThn4_N3ccc8CC8x9y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x9y12E = {  "_ZN3ccc8CC8x9y12E", // class name
  bases__ZN3ccc8CC8x9y12E, 2,
  &(vtc__ZN3ccc8CC8x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x9y12E),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  DD8x9y12  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD8x9y123abcEv
  ~DD8x9y12(); // tgen
  DD8x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD8x9y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x9y123abcEv");}
ccc::DD8x9y12 ::~DD8x9y12(){ note_dtor("_ZN3ccc8DD8x9y12E", this);} // tgen
ccc::DD8x9y12 ::DD8x9y12(){ note_ctor("_ZN3ccc8DD8x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD8x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x9y12E, buf);
    ::ccc::DD8x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x9y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD8x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x9y12E);
    dp->::ccc::DD8x9y12::~DD8x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x9y12E(Test__ZN3ccc8DD8x9y12E, "_ZN3ccc8DD8x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x9y12C1Ev();
extern void _ZN3ccc8DD8x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD8x9y12E[] = {
  NSPAIR(_ZN3ccc8DD8x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD8x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD8x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x9y12E[] = {
  {&(_ZTVN3ccc8DD8x9y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x9y12E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x9y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x9y12E[];
Class_Descriptor cd__ZN3ccc8DD8x9y12E = {  "_ZN3ccc8DD8x9y12E", // class name
  bases__ZN3ccc8DD8x9y12E, 2,
  &(vtc__ZN3ccc8DD8x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x9y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x9y12E),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  CC8x9y13  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC8x9y133efgEv
  ~CC8x9y13(); // tgen
  CC8x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC8x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x9y133efgEv");}
ccc::CC8x9y13 ::~CC8x9y13(){ note_dtor("_ZN3ccc8CC8x9y13E", this);} // tgen
ccc::CC8x9y13 ::CC8x9y13(){ note_ctor("_ZN3ccc8CC8x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC8x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x9y13E, buf);
    ::ccc::CC8x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x9y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC8x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x9y13E);
    dp->::ccc::CC8x9y13::~CC8x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x9y13E(Test__ZN3ccc8CC8x9y13E, "_ZN3ccc8CC8x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x9y13C1Ev();
extern void _ZN3ccc8CC8x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC8x9y13E[] = {
  NSPAIR(_ZN3ccc8CC8x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC8x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC8x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x9y13E[];
extern void _ZN3ccc8CC8x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x9y133efgEv,_ZTv0_n12_N3ccc8CC8x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x9y133efgEv,_ZThn4_N3ccc8CC8x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x9y133efgEv,_ZTv0_n12_N3ccc8CC8x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x9y13E[] = {
  {&(_ZTVN3ccc8CC8x9y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x9y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x9y13E[];
static VTBL_ENTRY alt_thunk_names1456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x9y133efgEv,_ZTv0_n12_N3ccc8CC8x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x9y133efgEv,_ZThn4_N3ccc8CC8x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x9y13E = {  "_ZN3ccc8CC8x9y13E", // class name
  bases__ZN3ccc8CC8x9y13E, 2,
  &(vtc__ZN3ccc8CC8x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x9y13E),2, //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  DD8x9y13  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD8x9y133efgEv
  ~DD8x9y13(); // tgen
  DD8x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD8x9y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD8x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x9y133efgEv");}
ccc::DD8x9y13 ::~DD8x9y13(){ note_dtor("_ZN3ccc8DD8x9y13E", this);} // tgen
ccc::DD8x9y13 ::DD8x9y13(){ note_ctor("_ZN3ccc8DD8x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD8x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x9y13E, buf);
    ::ccc::DD8x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x9y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD8x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x9y13E);
    dp->::ccc::DD8x9y13::~DD8x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x9y13E(Test__ZN3ccc8DD8x9y13E, "_ZN3ccc8DD8x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x9y13C1Ev();
extern void _ZN3ccc8DD8x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD8x9y13E[] = {
  NSPAIR(_ZN3ccc8DD8x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD8x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD8x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y13E[];
extern void _ZN3ccc8DD8x9y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x9y133efgEv,_ZTv0_n12_N3ccc8DD8x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x9y133efgEv,_ZThn4_N3ccc8DD8x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x9y133efgEv,_ZTv0_n12_N3ccc8DD8x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x9y13E[] = {
  {&(_ZTVN3ccc8DD8x9y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x9y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x9y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x9y13E[];
static VTBL_ENTRY alt_thunk_names1457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x9y133efgEv,_ZTv0_n12_N3ccc8DD8x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x9y133efgEv,_ZThn4_N3ccc8DD8x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x9y13E = {  "_ZN3ccc8DD8x9y13E", // class name
  bases__ZN3ccc8DD8x9y13E, 2,
  &(vtc__ZN3ccc8DD8x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x9y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x9y13E),3, //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  CC8x9y14  : virtual ::ccc::AA8 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC8x9y143pqrEv
  ~CC8x9y14(); // tgen
  CC8x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y14E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC8x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x9y143pqrEv");}
ccc::CC8x9y14 ::~CC8x9y14(){ note_dtor("_ZN3ccc8CC8x9y14E", this);} // tgen
ccc::CC8x9y14 ::CC8x9y14(){ note_ctor("_ZN3ccc8CC8x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC8x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x9y14E, buf);
    ::ccc::CC8x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x9y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC8x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x9y14E);
    dp->::ccc::CC8x9y14::~CC8x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x9y14E(Test__ZN3ccc8CC8x9y14E, "_ZN3ccc8CC8x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x9y14C1Ev();
extern void _ZN3ccc8CC8x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC8x9y14E[] = {
  NSPAIR(_ZN3ccc8CC8x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC8x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC8x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC8x9y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x9y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x9y14E[] = {
  {&(_ZTVN3ccc8CC8x9y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x9y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x9y14E[];
Class_Descriptor cd__ZN3ccc8CC8x9y14E = {  "_ZN3ccc8CC8x9y14E", // class name
  bases__ZN3ccc8CC8x9y14E, 2,
  &(vtc__ZN3ccc8CC8x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x9y14E),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  DD8x9y14  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD8x9y143pqrEv
  ~DD8x9y14(); // tgen
  DD8x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD8x9y14E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD8x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x9y143pqrEv");}
ccc::DD8x9y14 ::~DD8x9y14(){ note_dtor("_ZN3ccc8DD8x9y14E", this);} // tgen
ccc::DD8x9y14 ::DD8x9y14(){ note_ctor("_ZN3ccc8DD8x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD8x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x9y14E, buf);
    ::ccc::DD8x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x9y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD8x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x9y14E);
    dp->::ccc::DD8x9y14::~DD8x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x9y14E(Test__ZN3ccc8DD8x9y14E, "_ZN3ccc8DD8x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x9y14C1Ev();
extern void _ZN3ccc8DD8x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD8x9y14E[] = {
  NSPAIR(_ZN3ccc8DD8x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD8x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD8x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x9y143pqrEv,_ZTv0_n16_N3ccc8DD8x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x9y143pqrEv,_ZThn4_N3ccc8DD8x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x9y143pqrEv,_ZTv0_n16_N3ccc8DD8x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x9y14E[] = {
  {&(_ZTVN3ccc8DD8x9y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x9y14E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x9y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x9y14E[];
static VTBL_ENTRY alt_thunk_names1458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x9y143pqrEv,_ZTv0_n16_N3ccc8DD8x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x9y143pqrEv,_ZThn4_N3ccc8DD8x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x9y14E = {  "_ZN3ccc8DD8x9y14E", // class name
  bases__ZN3ccc8DD8x9y14E, 2,
  &(vtc__ZN3ccc8DD8x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x9y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x9y14E),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  CC8x9y15  : virtual ::ccc::AA8 , ::ccc::BB9 {
  ~CC8x9y15(); // tgen
  CC8x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC8x9y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC8x9y15 ::~CC8x9y15(){ note_dtor("_ZN3ccc8CC8x9y15E", this);} // tgen
ccc::CC8x9y15 ::CC8x9y15(){ note_ctor("_ZN3ccc8CC8x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC8x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x9y15E, buf);
    ::ccc::CC8x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x9y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC8x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x9y15E);
    dp->::ccc::CC8x9y15::~CC8x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x9y15E(Test__ZN3ccc8CC8x9y15E, "_ZN3ccc8CC8x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x9y15C1Ev();
extern void _ZN3ccc8CC8x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC8x9y15E[] = {
  NSPAIR(_ZN3ccc8CC8x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC8x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC8x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x9y15E[] = {
  {&(_ZTVN3ccc8CC8x9y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x9y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x9y15E[];
Class_Descriptor cd__ZN3ccc8CC8x9y15E = {  "_ZN3ccc8CC8x9y15E", // class name
  bases__ZN3ccc8CC8x9y15E, 2,
  &(vtc__ZN3ccc8CC8x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x9y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x9y15E),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  DD8x9y15  : virtual ::ccc::AA8 , virtual ::ccc::BB9 {
  ~DD8x9y15(); // tgen
  DD8x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD8x9y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD8x9y15 ::~DD8x9y15(){ note_dtor("_ZN3ccc8DD8x9y15E", this);} // tgen
ccc::DD8x9y15 ::DD8x9y15(){ note_ctor("_ZN3ccc8DD8x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD8x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x9y15E, buf);
    ::ccc::DD8x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x9y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD8x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x9y15E);
    dp->::ccc::DD8x9y15::~DD8x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x9y15E(Test__ZN3ccc8DD8x9y15E, "_ZN3ccc8DD8x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x9y15C1Ev();
extern void _ZN3ccc8DD8x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD8x9y15E[] = {
  NSPAIR(_ZN3ccc8DD8x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD8x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD8x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x9y15E[] = {
  {&(_ZTVN3ccc8DD8x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x9y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x9y15E[];
Class_Descriptor cd__ZN3ccc8DD8x9y15E = {  "_ZN3ccc8DD8x9y15E", // class name
  bases__ZN3ccc8DD8x9y15E, 2,
  &(vtc__ZN3ccc8DD8x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x9y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x9y15E),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  CC8x10y0  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y03pqrEv
  ~CC8x10y0(); // tgen
  CC8x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y0E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y03abcEv");}
void  ccc::CC8x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y03efgEv");}
void  ccc::CC8x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y03pqrEv");}
ccc::CC8x10y0 ::~CC8x10y0(){ note_dtor("_ZN3ccc8CC8x10y0E", this);} // tgen
ccc::CC8x10y0 ::CC8x10y0(){ note_ctor("_ZN3ccc8CC8x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y0E, buf);
    ::ccc::CC8x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y0E);
    dp->::ccc::CC8x10y0::~CC8x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y0E(Test__ZN3ccc8CC8x10y0E, "_ZN3ccc8CC8x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y0C1Ev();
extern void _ZN3ccc8CC8x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y0E[] = {
  NSPAIR(_ZN3ccc8CC8x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y0E[];
extern void _ZN3ccc8CC8x10y03pqrEv();
extern void _ZN3ccc8CC8x10y03abcEv();
extern void _ZN3ccc8CC8x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y03efgEv,_ZTv0_n12_N3ccc8CC8x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y03efgEv,_ZThn4_N3ccc8CC8x10y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y03abcEv,_ZTv0_n16_N3ccc8CC8x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y03abcEv,_ZThn4_N3ccc8CC8x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y03efgEv,_ZTv0_n12_N3ccc8CC8x10y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y03abcEv,_ZTv0_n16_N3ccc8CC8x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y0E[] = {
  {&(_ZTVN3ccc8CC8x10y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y0E[];
static VTBL_ENTRY alt_thunk_names1459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y03abcEv,_ZTv0_n16_N3ccc8CC8x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y03abcEv,_ZThn4_N3ccc8CC8x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y03efgEv,_ZTv0_n12_N3ccc8CC8x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y03efgEv,_ZThn4_N3ccc8CC8x10y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y0E = {  "_ZN3ccc8CC8x10y0E", // class name
  bases__ZN3ccc8CC8x10y0E, 2,
  &(vtc__ZN3ccc8CC8x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y0E),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  DD8x10y0  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD8x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD8x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x10y03pqrEv
  ~DD8x10y0(); // tgen
  DD8x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y0E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y03abcEv");}
void  ccc::DD8x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y03efgEv");}
void  ccc::DD8x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y03pqrEv");}
ccc::DD8x10y0 ::~DD8x10y0(){ note_dtor("_ZN3ccc8DD8x10y0E", this);} // tgen
ccc::DD8x10y0 ::DD8x10y0(){ note_ctor("_ZN3ccc8DD8x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y0E, buf);
    ::ccc::DD8x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y0E);
    dp->::ccc::DD8x10y0::~DD8x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y0E(Test__ZN3ccc8DD8x10y0E, "_ZN3ccc8DD8x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y0C1Ev();
extern void _ZN3ccc8DD8x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y0E[] = {
  NSPAIR(_ZN3ccc8DD8x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y0E[];
extern void _ZN3ccc8DD8x10y03efgEv();
extern void _ZN3ccc8DD8x10y03abcEv();
extern void _ZN3ccc8DD8x10y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y03pqrEv,_ZTv0_n12_N3ccc8DD8x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y03pqrEv,_ZThn4_N3ccc8DD8x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y03abcEv,_ZTv0_n16_N3ccc8DD8x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y03abcEv,_ZThn4_N3ccc8DD8x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y03pqrEv,_ZTv0_n12_N3ccc8DD8x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y03abcEv,_ZTv0_n16_N3ccc8DD8x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y0E[] = {
  {&(_ZTVN3ccc8DD8x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y0E[];
static VTBL_ENTRY alt_thunk_names1460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y03abcEv,_ZTv0_n16_N3ccc8DD8x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y03abcEv,_ZThn4_N3ccc8DD8x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y03pqrEv,_ZTv0_n12_N3ccc8DD8x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y03pqrEv,_ZThn4_N3ccc8DD8x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y0E = {  "_ZN3ccc8DD8x10y0E", // class name
  bases__ZN3ccc8DD8x10y0E, 2,
  &(vtc__ZN3ccc8DD8x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y0E),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  CC8x10y1  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x10y13efgEv
  ~CC8x10y1(); // tgen
  CC8x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y1E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y13abcEv");}
void  ccc::CC8x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y13pqrEv");}
void  ccc::CC8x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y13efgEv");}
ccc::CC8x10y1 ::~CC8x10y1(){ note_dtor("_ZN3ccc8CC8x10y1E", this);} // tgen
ccc::CC8x10y1 ::CC8x10y1(){ note_ctor("_ZN3ccc8CC8x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y1E, buf);
    ::ccc::CC8x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y1E);
    dp->::ccc::CC8x10y1::~CC8x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y1E(Test__ZN3ccc8CC8x10y1E, "_ZN3ccc8CC8x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y1C1Ev();
extern void _ZN3ccc8CC8x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y1E[] = {
  NSPAIR(_ZN3ccc8CC8x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y1E[];
extern void _ZN3ccc8CC8x10y13pqrEv();
extern void _ZN3ccc8CC8x10y13abcEv();
extern void _ZN3ccc8CC8x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y13efgEv,_ZTv0_n12_N3ccc8CC8x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y13efgEv,_ZThn4_N3ccc8CC8x10y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y13abcEv,_ZTv0_n16_N3ccc8CC8x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y13abcEv,_ZThn4_N3ccc8CC8x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y13efgEv,_ZTv0_n12_N3ccc8CC8x10y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y13abcEv,_ZTv0_n16_N3ccc8CC8x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y1E[] = {
  {&(_ZTVN3ccc8CC8x10y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y1E[];
static VTBL_ENTRY alt_thunk_names1461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y13abcEv,_ZTv0_n16_N3ccc8CC8x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y13abcEv,_ZThn4_N3ccc8CC8x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y13efgEv,_ZTv0_n12_N3ccc8CC8x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y13efgEv,_ZThn4_N3ccc8CC8x10y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y1E = {  "_ZN3ccc8CC8x10y1E", // class name
  bases__ZN3ccc8CC8x10y1E, 2,
  &(vtc__ZN3ccc8CC8x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y1E),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  DD8x10y1  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD8x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x10y13efgEv
  ~DD8x10y1(); // tgen
  DD8x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y1E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y13abcEv");}
void  ccc::DD8x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y13pqrEv");}
void  ccc::DD8x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y13efgEv");}
ccc::DD8x10y1 ::~DD8x10y1(){ note_dtor("_ZN3ccc8DD8x10y1E", this);} // tgen
ccc::DD8x10y1 ::DD8x10y1(){ note_ctor("_ZN3ccc8DD8x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y1E, buf);
    ::ccc::DD8x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y1E);
    dp->::ccc::DD8x10y1::~DD8x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y1E(Test__ZN3ccc8DD8x10y1E, "_ZN3ccc8DD8x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y1C1Ev();
extern void _ZN3ccc8DD8x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y1E[] = {
  NSPAIR(_ZN3ccc8DD8x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y1E[];
extern void _ZN3ccc8DD8x10y13efgEv();
extern void _ZN3ccc8DD8x10y13abcEv();
extern void _ZN3ccc8DD8x10y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y13pqrEv,_ZTv0_n12_N3ccc8DD8x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y13pqrEv,_ZThn4_N3ccc8DD8x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y13abcEv,_ZTv0_n16_N3ccc8DD8x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y13abcEv,_ZThn4_N3ccc8DD8x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y13pqrEv,_ZTv0_n12_N3ccc8DD8x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y13abcEv,_ZTv0_n16_N3ccc8DD8x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y1E[] = {
  {&(_ZTVN3ccc8DD8x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y1E[];
static VTBL_ENTRY alt_thunk_names1462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y13abcEv,_ZTv0_n16_N3ccc8DD8x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y13abcEv,_ZThn4_N3ccc8DD8x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y13pqrEv,_ZTv0_n12_N3ccc8DD8x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y13pqrEv,_ZThn4_N3ccc8DD8x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y1E = {  "_ZN3ccc8DD8x10y1E", // class name
  bases__ZN3ccc8DD8x10y1E, 2,
  &(vtc__ZN3ccc8DD8x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y1E),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  CC8x10y2  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y23pqrEv
  ~CC8x10y2(); // tgen
  CC8x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y2E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y23efgEv");}
void  ccc::CC8x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y23abcEv");}
void  ccc::CC8x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y23pqrEv");}
ccc::CC8x10y2 ::~CC8x10y2(){ note_dtor("_ZN3ccc8CC8x10y2E", this);} // tgen
ccc::CC8x10y2 ::CC8x10y2(){ note_ctor("_ZN3ccc8CC8x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y2E, buf);
    ::ccc::CC8x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y2E);
    dp->::ccc::CC8x10y2::~CC8x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y2E(Test__ZN3ccc8CC8x10y2E, "_ZN3ccc8CC8x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y2C1Ev();
extern void _ZN3ccc8CC8x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y2E[] = {
  NSPAIR(_ZN3ccc8CC8x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y2E[];
extern void _ZN3ccc8CC8x10y23pqrEv();
extern void _ZN3ccc8CC8x10y23abcEv();
extern void _ZN3ccc8CC8x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y23efgEv,_ZTv0_n12_N3ccc8CC8x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y23efgEv,_ZThn4_N3ccc8CC8x10y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y23abcEv,_ZTv0_n16_N3ccc8CC8x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y23abcEv,_ZThn4_N3ccc8CC8x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y23efgEv,_ZTv0_n12_N3ccc8CC8x10y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y23abcEv,_ZTv0_n16_N3ccc8CC8x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y2E[] = {
  {&(_ZTVN3ccc8CC8x10y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y2E[];
static VTBL_ENTRY alt_thunk_names1463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y23abcEv,_ZTv0_n16_N3ccc8CC8x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y23abcEv,_ZThn4_N3ccc8CC8x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y23efgEv,_ZTv0_n12_N3ccc8CC8x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y23efgEv,_ZThn4_N3ccc8CC8x10y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y2E = {  "_ZN3ccc8CC8x10y2E", // class name
  bases__ZN3ccc8CC8x10y2E, 2,
  &(vtc__ZN3ccc8CC8x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y2E),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  DD8x10y2  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD8x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD8x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x10y23pqrEv
  ~DD8x10y2(); // tgen
  DD8x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y2E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y23efgEv");}
void  ccc::DD8x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y23abcEv");}
void  ccc::DD8x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y23pqrEv");}
ccc::DD8x10y2 ::~DD8x10y2(){ note_dtor("_ZN3ccc8DD8x10y2E", this);} // tgen
ccc::DD8x10y2 ::DD8x10y2(){ note_ctor("_ZN3ccc8DD8x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y2E, buf);
    ::ccc::DD8x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y2E);
    dp->::ccc::DD8x10y2::~DD8x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y2E(Test__ZN3ccc8DD8x10y2E, "_ZN3ccc8DD8x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y2C1Ev();
extern void _ZN3ccc8DD8x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y2E[] = {
  NSPAIR(_ZN3ccc8DD8x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y2E[];
extern void _ZN3ccc8DD8x10y23efgEv();
extern void _ZN3ccc8DD8x10y23abcEv();
extern void _ZN3ccc8DD8x10y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y23pqrEv,_ZTv0_n12_N3ccc8DD8x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y23pqrEv,_ZThn4_N3ccc8DD8x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y23abcEv,_ZTv0_n16_N3ccc8DD8x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y23abcEv,_ZThn4_N3ccc8DD8x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y23pqrEv,_ZTv0_n12_N3ccc8DD8x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y23abcEv,_ZTv0_n16_N3ccc8DD8x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y2E[] = {
  {&(_ZTVN3ccc8DD8x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y2E[];
static VTBL_ENTRY alt_thunk_names1464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y23abcEv,_ZTv0_n16_N3ccc8DD8x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y23abcEv,_ZThn4_N3ccc8DD8x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y23pqrEv,_ZTv0_n12_N3ccc8DD8x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y23pqrEv,_ZThn4_N3ccc8DD8x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y2E = {  "_ZN3ccc8DD8x10y2E", // class name
  bases__ZN3ccc8DD8x10y2E, 2,
  &(vtc__ZN3ccc8DD8x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y2E),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  CC8x10y3  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x10y33abcEv
  ~CC8x10y3(); // tgen
  CC8x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y3E) C1{ VBC2{ v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y33efgEv");}
void  ccc::CC8x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y33pqrEv");}
void  ccc::CC8x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y33abcEv");}
ccc::CC8x10y3 ::~CC8x10y3(){ note_dtor("_ZN3ccc8CC8x10y3E", this);} // tgen
ccc::CC8x10y3 ::CC8x10y3(){ note_ctor("_ZN3ccc8CC8x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y3E, buf);
    ::ccc::CC8x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y3E);
    dp->::ccc::CC8x10y3::~CC8x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y3E(Test__ZN3ccc8CC8x10y3E, "_ZN3ccc8CC8x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y3C1Ev();
extern void _ZN3ccc8CC8x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y3E[] = {
  NSPAIR(_ZN3ccc8CC8x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y3E[];
extern void _ZN3ccc8CC8x10y33pqrEv();
extern void _ZN3ccc8CC8x10y33abcEv();
extern void _ZN3ccc8CC8x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y33efgEv,_ZTv0_n12_N3ccc8CC8x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y33efgEv,_ZThn4_N3ccc8CC8x10y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y33abcEv,_ZTv0_n16_N3ccc8CC8x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y33abcEv,_ZThn4_N3ccc8CC8x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y33efgEv,_ZTv0_n12_N3ccc8CC8x10y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y33abcEv,_ZTv0_n16_N3ccc8CC8x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y3E[] = {
  {&(_ZTVN3ccc8CC8x10y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y3E[];
static VTBL_ENTRY alt_thunk_names1465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y33abcEv,_ZTv0_n16_N3ccc8CC8x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y33abcEv,_ZThn4_N3ccc8CC8x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y33efgEv,_ZTv0_n12_N3ccc8CC8x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y33efgEv,_ZThn4_N3ccc8CC8x10y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y3E = {  "_ZN3ccc8CC8x10y3E", // class name
  bases__ZN3ccc8CC8x10y3E, 2,
  &(vtc__ZN3ccc8CC8x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y3E),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  DD8x10y3  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD8x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x10y33abcEv
  ~DD8x10y3(); // tgen
  DD8x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y3E) C1{ VBC2{ v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y33efgEv");}
void  ccc::DD8x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y33pqrEv");}
void  ccc::DD8x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y33abcEv");}
ccc::DD8x10y3 ::~DD8x10y3(){ note_dtor("_ZN3ccc8DD8x10y3E", this);} // tgen
ccc::DD8x10y3 ::DD8x10y3(){ note_ctor("_ZN3ccc8DD8x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y3E, buf);
    ::ccc::DD8x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y3E);
    dp->::ccc::DD8x10y3::~DD8x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y3E(Test__ZN3ccc8DD8x10y3E, "_ZN3ccc8DD8x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y3C1Ev();
extern void _ZN3ccc8DD8x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y3E[] = {
  NSPAIR(_ZN3ccc8DD8x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y3E[];
extern void _ZN3ccc8DD8x10y33efgEv();
extern void _ZN3ccc8DD8x10y33abcEv();
extern void _ZN3ccc8DD8x10y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y33pqrEv,_ZTv0_n12_N3ccc8DD8x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y33pqrEv,_ZThn4_N3ccc8DD8x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y33abcEv,_ZTv0_n16_N3ccc8DD8x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y33abcEv,_ZThn4_N3ccc8DD8x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y33pqrEv,_ZTv0_n12_N3ccc8DD8x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y33abcEv,_ZTv0_n16_N3ccc8DD8x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y3E[] = {
  {&(_ZTVN3ccc8DD8x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y3E[];
static VTBL_ENTRY alt_thunk_names1466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y33abcEv,_ZTv0_n16_N3ccc8DD8x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y33abcEv,_ZThn4_N3ccc8DD8x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y33pqrEv,_ZTv0_n12_N3ccc8DD8x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y33pqrEv,_ZThn4_N3ccc8DD8x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y3E = {  "_ZN3ccc8DD8x10y3E", // class name
  bases__ZN3ccc8DD8x10y3E, 2,
  &(vtc__ZN3ccc8DD8x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y3E),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  CC8x10y4  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC8x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x10y43efgEv
  ~CC8x10y4(); // tgen
  CC8x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y4E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y43pqrEv");}
void  ccc::CC8x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y43abcEv");}
void  ccc::CC8x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y43efgEv");}
ccc::CC8x10y4 ::~CC8x10y4(){ note_dtor("_ZN3ccc8CC8x10y4E", this);} // tgen
ccc::CC8x10y4 ::CC8x10y4(){ note_ctor("_ZN3ccc8CC8x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y4E, buf);
    ::ccc::CC8x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y4E);
    dp->::ccc::CC8x10y4::~CC8x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y4E(Test__ZN3ccc8CC8x10y4E, "_ZN3ccc8CC8x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y4C1Ev();
extern void _ZN3ccc8CC8x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y4E[] = {
  NSPAIR(_ZN3ccc8CC8x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y4E[];
extern void _ZN3ccc8CC8x10y43pqrEv();
extern void _ZN3ccc8CC8x10y43abcEv();
extern void _ZN3ccc8CC8x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y43efgEv,_ZTv0_n12_N3ccc8CC8x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y43efgEv,_ZThn4_N3ccc8CC8x10y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y43abcEv,_ZTv0_n16_N3ccc8CC8x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y43abcEv,_ZThn4_N3ccc8CC8x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y43efgEv,_ZTv0_n12_N3ccc8CC8x10y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y43abcEv,_ZTv0_n16_N3ccc8CC8x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y4E[] = {
  {&(_ZTVN3ccc8CC8x10y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y4E[];
static VTBL_ENTRY alt_thunk_names1467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y43abcEv,_ZTv0_n16_N3ccc8CC8x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y43abcEv,_ZThn4_N3ccc8CC8x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y43efgEv,_ZTv0_n12_N3ccc8CC8x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y43efgEv,_ZThn4_N3ccc8CC8x10y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y4E = {  "_ZN3ccc8CC8x10y4E", // class name
  bases__ZN3ccc8CC8x10y4E, 2,
  &(vtc__ZN3ccc8CC8x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y4E),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  DD8x10y4  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD8x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD8x10y43efgEv
  ~DD8x10y4(); // tgen
  DD8x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y4E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y43pqrEv");}
void  ccc::DD8x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y43abcEv");}
void  ccc::DD8x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y43efgEv");}
ccc::DD8x10y4 ::~DD8x10y4(){ note_dtor("_ZN3ccc8DD8x10y4E", this);} // tgen
ccc::DD8x10y4 ::DD8x10y4(){ note_ctor("_ZN3ccc8DD8x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y4E, buf);
    ::ccc::DD8x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y4E);
    dp->::ccc::DD8x10y4::~DD8x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y4E(Test__ZN3ccc8DD8x10y4E, "_ZN3ccc8DD8x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y4C1Ev();
extern void _ZN3ccc8DD8x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y4E[] = {
  NSPAIR(_ZN3ccc8DD8x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y4E[];
extern void _ZN3ccc8DD8x10y43efgEv();
extern void _ZN3ccc8DD8x10y43abcEv();
extern void _ZN3ccc8DD8x10y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y43pqrEv,_ZTv0_n12_N3ccc8DD8x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y43pqrEv,_ZThn4_N3ccc8DD8x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y43abcEv,_ZTv0_n16_N3ccc8DD8x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y43abcEv,_ZThn4_N3ccc8DD8x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y43pqrEv,_ZTv0_n12_N3ccc8DD8x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y43abcEv,_ZTv0_n16_N3ccc8DD8x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y4E[] = {
  {&(_ZTVN3ccc8DD8x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y4E[];
static VTBL_ENTRY alt_thunk_names1468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y43abcEv,_ZTv0_n16_N3ccc8DD8x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y43abcEv,_ZThn4_N3ccc8DD8x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y43pqrEv,_ZTv0_n12_N3ccc8DD8x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y43pqrEv,_ZThn4_N3ccc8DD8x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y4E = {  "_ZN3ccc8DD8x10y4E", // class name
  bases__ZN3ccc8DD8x10y4E, 2,
  &(vtc__ZN3ccc8DD8x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y4E),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  CC8x10y5  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC8x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x10y53abcEv
  ~CC8x10y5(); // tgen
  CC8x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y5E) C1{ VBC2{ v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y53pqrEv");}
void  ccc::CC8x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y53efgEv");}
void  ccc::CC8x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y53abcEv");}
ccc::CC8x10y5 ::~CC8x10y5(){ note_dtor("_ZN3ccc8CC8x10y5E", this);} // tgen
ccc::CC8x10y5 ::CC8x10y5(){ note_ctor("_ZN3ccc8CC8x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y5E, buf);
    ::ccc::CC8x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y5E);
    dp->::ccc::CC8x10y5::~CC8x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y5E(Test__ZN3ccc8CC8x10y5E, "_ZN3ccc8CC8x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y5C1Ev();
extern void _ZN3ccc8CC8x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y5E[] = {
  NSPAIR(_ZN3ccc8CC8x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y5E[];
extern void _ZN3ccc8CC8x10y53pqrEv();
extern void _ZN3ccc8CC8x10y53abcEv();
extern void _ZN3ccc8CC8x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y53efgEv,_ZTv0_n12_N3ccc8CC8x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y53efgEv,_ZThn4_N3ccc8CC8x10y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y53abcEv,_ZTv0_n16_N3ccc8CC8x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y53abcEv,_ZThn4_N3ccc8CC8x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y53efgEv,_ZTv0_n12_N3ccc8CC8x10y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y53abcEv,_ZTv0_n16_N3ccc8CC8x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y5E[] = {
  {&(_ZTVN3ccc8CC8x10y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y5E[];
static VTBL_ENTRY alt_thunk_names1469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y53abcEv,_ZTv0_n16_N3ccc8CC8x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y53abcEv,_ZThn4_N3ccc8CC8x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y53efgEv,_ZTv0_n12_N3ccc8CC8x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y53efgEv,_ZThn4_N3ccc8CC8x10y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y5E = {  "_ZN3ccc8CC8x10y5E", // class name
  bases__ZN3ccc8CC8x10y5E, 2,
  &(vtc__ZN3ccc8CC8x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y5E),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  DD8x10y5  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD8x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD8x10y53abcEv
  ~DD8x10y5(); // tgen
  DD8x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y5E) C1{ VBC2{ v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y53pqrEv");}
void  ccc::DD8x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y53efgEv");}
void  ccc::DD8x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y53abcEv");}
ccc::DD8x10y5 ::~DD8x10y5(){ note_dtor("_ZN3ccc8DD8x10y5E", this);} // tgen
ccc::DD8x10y5 ::DD8x10y5(){ note_ctor("_ZN3ccc8DD8x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y5E, buf);
    ::ccc::DD8x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y5E);
    dp->::ccc::DD8x10y5::~DD8x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y5E(Test__ZN3ccc8DD8x10y5E, "_ZN3ccc8DD8x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y5C1Ev();
extern void _ZN3ccc8DD8x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y5E[] = {
  NSPAIR(_ZN3ccc8DD8x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y5E[];
extern void _ZN3ccc8DD8x10y53efgEv();
extern void _ZN3ccc8DD8x10y53abcEv();
extern void _ZN3ccc8DD8x10y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y53pqrEv,_ZTv0_n12_N3ccc8DD8x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y53pqrEv,_ZThn4_N3ccc8DD8x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y53abcEv,_ZTv0_n16_N3ccc8DD8x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y53abcEv,_ZThn4_N3ccc8DD8x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y53pqrEv,_ZTv0_n12_N3ccc8DD8x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y53abcEv,_ZTv0_n16_N3ccc8DD8x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y5E[] = {
  {&(_ZTVN3ccc8DD8x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y5E[];
static VTBL_ENTRY alt_thunk_names1470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y53abcEv,_ZTv0_n16_N3ccc8DD8x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y53abcEv,_ZThn4_N3ccc8DD8x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y53pqrEv,_ZTv0_n12_N3ccc8DD8x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y53pqrEv,_ZThn4_N3ccc8DD8x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y5E = {  "_ZN3ccc8DD8x10y5E", // class name
  bases__ZN3ccc8DD8x10y5E, 2,
  &(vtc__ZN3ccc8DD8x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y5E),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  CC8x10y6  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x10y63efgEv
  ~CC8x10y6(); // tgen
  CC8x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y6E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y63abcEv");}
void  ccc::CC8x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y63efgEv");}
ccc::CC8x10y6 ::~CC8x10y6(){ note_dtor("_ZN3ccc8CC8x10y6E", this);} // tgen
ccc::CC8x10y6 ::CC8x10y6(){ note_ctor("_ZN3ccc8CC8x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y6E, buf);
    ::ccc::CC8x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y6E);
    dp->::ccc::CC8x10y6::~CC8x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y6E(Test__ZN3ccc8CC8x10y6E, "_ZN3ccc8CC8x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y6C1Ev();
extern void _ZN3ccc8CC8x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y6E[] = {
  NSPAIR(_ZN3ccc8CC8x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC8x10y63abcEv();
extern void _ZN3ccc8CC8x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y63efgEv,_ZTv0_n12_N3ccc8CC8x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y63efgEv,_ZThn4_N3ccc8CC8x10y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y63abcEv,_ZTv0_n16_N3ccc8CC8x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y63abcEv,_ZThn4_N3ccc8CC8x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y63efgEv,_ZTv0_n12_N3ccc8CC8x10y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y63abcEv,_ZTv0_n16_N3ccc8CC8x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y6E[] = {
  {&(_ZTVN3ccc8CC8x10y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y6E[];
static VTBL_ENTRY alt_thunk_names1471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y63abcEv,_ZTv0_n16_N3ccc8CC8x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y63abcEv,_ZThn4_N3ccc8CC8x10y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y63efgEv,_ZTv0_n12_N3ccc8CC8x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y63efgEv,_ZThn4_N3ccc8CC8x10y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y6E = {  "_ZN3ccc8CC8x10y6E", // class name
  bases__ZN3ccc8CC8x10y6E, 2,
  &(vtc__ZN3ccc8CC8x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y6E),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  DD8x10y6  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD8x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD8x10y63efgEv
  ~DD8x10y6(); // tgen
  DD8x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y6E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y63abcEv");}
void  ccc::DD8x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y63efgEv");}
ccc::DD8x10y6 ::~DD8x10y6(){ note_dtor("_ZN3ccc8DD8x10y6E", this);} // tgen
ccc::DD8x10y6 ::DD8x10y6(){ note_ctor("_ZN3ccc8DD8x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y6E, buf);
    ::ccc::DD8x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y6E);
    dp->::ccc::DD8x10y6::~DD8x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y6E(Test__ZN3ccc8DD8x10y6E, "_ZN3ccc8DD8x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y6C1Ev();
extern void _ZN3ccc8DD8x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y6E[] = {
  NSPAIR(_ZN3ccc8DD8x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y6E[];
extern void _ZN3ccc8DD8x10y63efgEv();
extern void _ZN3ccc8DD8x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y63abcEv,_ZTv0_n16_N3ccc8DD8x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y63abcEv,_ZThn4_N3ccc8DD8x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y63abcEv,_ZTv0_n16_N3ccc8DD8x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y6E[] = {
  {&(_ZTVN3ccc8DD8x10y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x10y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x10y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y6E[];
static VTBL_ENTRY alt_thunk_names1472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y63abcEv,_ZTv0_n16_N3ccc8DD8x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y63abcEv,_ZThn4_N3ccc8DD8x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y6E = {  "_ZN3ccc8DD8x10y6E", // class name
  bases__ZN3ccc8DD8x10y6E, 2,
  &(vtc__ZN3ccc8DD8x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y6E),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  CC8x10y7  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC8x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y73pqrEv
  ~CC8x10y7(); // tgen
  CC8x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y7E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y73abcEv");}
void  ccc::CC8x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y73pqrEv");}
ccc::CC8x10y7 ::~CC8x10y7(){ note_dtor("_ZN3ccc8CC8x10y7E", this);} // tgen
ccc::CC8x10y7 ::CC8x10y7(){ note_ctor("_ZN3ccc8CC8x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y7E, buf);
    ::ccc::CC8x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y7E);
    dp->::ccc::CC8x10y7::~CC8x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y7E(Test__ZN3ccc8CC8x10y7E, "_ZN3ccc8CC8x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y7C1Ev();
extern void _ZN3ccc8CC8x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y7E[] = {
  NSPAIR(_ZN3ccc8CC8x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y7E[];
extern void _ZN3ccc8CC8x10y73pqrEv();
extern void _ZN3ccc8CC8x10y73abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y73abcEv,_ZTv0_n16_N3ccc8CC8x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y73abcEv,_ZThn4_N3ccc8CC8x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y73abcEv,_ZTv0_n16_N3ccc8CC8x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y7E[] = {
  {&(_ZTVN3ccc8CC8x10y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x10y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y7E[];
static VTBL_ENTRY alt_thunk_names1473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y73abcEv,_ZTv0_n16_N3ccc8CC8x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y73abcEv,_ZThn4_N3ccc8CC8x10y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y7E = {  "_ZN3ccc8CC8x10y7E", // class name
  bases__ZN3ccc8CC8x10y7E, 2,
  &(vtc__ZN3ccc8CC8x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y7E),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  DD8x10y7  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD8x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x10y73pqrEv
  ~DD8x10y7(); // tgen
  DD8x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y7E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y73abcEv");}
void  ccc::DD8x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y73pqrEv");}
ccc::DD8x10y7 ::~DD8x10y7(){ note_dtor("_ZN3ccc8DD8x10y7E", this);} // tgen
ccc::DD8x10y7 ::DD8x10y7(){ note_ctor("_ZN3ccc8DD8x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y7E, buf);
    ::ccc::DD8x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y7E);
    dp->::ccc::DD8x10y7::~DD8x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y7E(Test__ZN3ccc8DD8x10y7E, "_ZN3ccc8DD8x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y7C1Ev();
extern void _ZN3ccc8DD8x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y7E[] = {
  NSPAIR(_ZN3ccc8DD8x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x10y73abcEv();
extern void _ZN3ccc8DD8x10y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y73pqrEv,_ZTv0_n12_N3ccc8DD8x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y73pqrEv,_ZThn4_N3ccc8DD8x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y73abcEv,_ZTv0_n16_N3ccc8DD8x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y73abcEv,_ZThn4_N3ccc8DD8x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y73pqrEv,_ZTv0_n12_N3ccc8DD8x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y73abcEv,_ZTv0_n16_N3ccc8DD8x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y7E[] = {
  {&(_ZTVN3ccc8DD8x10y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y7E[];
static VTBL_ENTRY alt_thunk_names1474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y73abcEv,_ZTv0_n16_N3ccc8DD8x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y73abcEv,_ZThn4_N3ccc8DD8x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y73pqrEv,_ZTv0_n12_N3ccc8DD8x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y73pqrEv,_ZThn4_N3ccc8DD8x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y7E = {  "_ZN3ccc8DD8x10y7E", // class name
  bases__ZN3ccc8DD8x10y7E, 2,
  &(vtc__ZN3ccc8DD8x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y7E),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  CC8x10y8  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x10y83abcEv
  ~CC8x10y8(); // tgen
  CC8x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y8E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y83efgEv");}
void  ccc::CC8x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x10y83abcEv");}
ccc::CC8x10y8 ::~CC8x10y8(){ note_dtor("_ZN3ccc8CC8x10y8E", this);} // tgen
ccc::CC8x10y8 ::CC8x10y8(){ note_ctor("_ZN3ccc8CC8x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y8E, buf);
    ::ccc::CC8x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y8E);
    dp->::ccc::CC8x10y8::~CC8x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y8E(Test__ZN3ccc8CC8x10y8E, "_ZN3ccc8CC8x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y8C1Ev();
extern void _ZN3ccc8CC8x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y8E[] = {
  NSPAIR(_ZN3ccc8CC8x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC8x10y83abcEv();
extern void _ZN3ccc8CC8x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y83efgEv,_ZTv0_n12_N3ccc8CC8x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y83efgEv,_ZThn4_N3ccc8CC8x10y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x10y83abcEv,_ZTv0_n16_N3ccc8CC8x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y83abcEv,_ZThn4_N3ccc8CC8x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y83efgEv,_ZTv0_n12_N3ccc8CC8x10y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x10y83abcEv,_ZTv0_n16_N3ccc8CC8x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y8E[] = {
  {&(_ZTVN3ccc8CC8x10y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y8E[];
static VTBL_ENTRY alt_thunk_names1475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x10y83abcEv,_ZTv0_n16_N3ccc8CC8x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y83abcEv,_ZThn4_N3ccc8CC8x10y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y83efgEv,_ZTv0_n12_N3ccc8CC8x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y83efgEv,_ZThn4_N3ccc8CC8x10y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y8E = {  "_ZN3ccc8CC8x10y8E", // class name
  bases__ZN3ccc8CC8x10y8E, 2,
  &(vtc__ZN3ccc8CC8x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y8E),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  DD8x10y8  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD8x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD8x10y83abcEv
  ~DD8x10y8(); // tgen
  DD8x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y8E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y83efgEv");}
void  ccc::DD8x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x10y83abcEv");}
ccc::DD8x10y8 ::~DD8x10y8(){ note_dtor("_ZN3ccc8DD8x10y8E", this);} // tgen
ccc::DD8x10y8 ::DD8x10y8(){ note_ctor("_ZN3ccc8DD8x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y8E, buf);
    ::ccc::DD8x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y8E);
    dp->::ccc::DD8x10y8::~DD8x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y8E(Test__ZN3ccc8DD8x10y8E, "_ZN3ccc8DD8x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y8C1Ev();
extern void _ZN3ccc8DD8x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y8E[] = {
  NSPAIR(_ZN3ccc8DD8x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y8E[];
extern void _ZN3ccc8DD8x10y83efgEv();
extern void _ZN3ccc8DD8x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x10y83abcEv,_ZTv0_n16_N3ccc8DD8x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y83abcEv,_ZThn4_N3ccc8DD8x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x10y83abcEv,_ZTv0_n16_N3ccc8DD8x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y8E[] = {
  {&(_ZTVN3ccc8DD8x10y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x10y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x10y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y8E[];
static VTBL_ENTRY alt_thunk_names1476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x10y83abcEv,_ZTv0_n16_N3ccc8DD8x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y83abcEv,_ZThn4_N3ccc8DD8x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y8E = {  "_ZN3ccc8DD8x10y8E", // class name
  bases__ZN3ccc8DD8x10y8E, 2,
  &(vtc__ZN3ccc8DD8x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y8E),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  CC8x10y9  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC8x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x10y93pqrEv
  ~CC8x10y9(); // tgen
  CC8x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x10y9E) C1{ VBC2{ v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x10y93efgEv");}
void  ccc::CC8x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x10y93pqrEv");}
ccc::CC8x10y9 ::~CC8x10y9(){ note_dtor("_ZN3ccc8CC8x10y9E", this);} // tgen
ccc::CC8x10y9 ::CC8x10y9(){ note_ctor("_ZN3ccc8CC8x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC8x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x10y9E, buf);
    ::ccc::CC8x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x10y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC8x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x10y9E);
    dp->::ccc::CC8x10y9::~CC8x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x10y9E(Test__ZN3ccc8CC8x10y9E, "_ZN3ccc8CC8x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x10y9C1Ev();
extern void _ZN3ccc8CC8x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC8x10y9E[] = {
  NSPAIR(_ZN3ccc8CC8x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC8x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC8x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x10y9E[];
extern void _ZN3ccc8CC8x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC8x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x10y93efgEv,_ZTv0_n12_N3ccc8CC8x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x10y93efgEv,_ZThn4_N3ccc8CC8x10y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x10y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x10y93efgEv,_ZTv0_n12_N3ccc8CC8x10y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x10y9E[] = {
  {&(_ZTVN3ccc8CC8x10y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x10y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x10y9E[];
static VTBL_ENTRY alt_thunk_names1477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x10y93efgEv,_ZTv0_n12_N3ccc8CC8x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x10y93efgEv,_ZThn4_N3ccc8CC8x10y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x10y9E = {  "_ZN3ccc8CC8x10y9E", // class name
  bases__ZN3ccc8CC8x10y9E, 2,
  &(vtc__ZN3ccc8CC8x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x10y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x10y9E),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  DD8x10y9  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD8x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x10y93pqrEv
  ~DD8x10y9(); // tgen
  DD8x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD8x10y9E) C1{ VBC2{ v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x10y93efgEv");}
void  ccc::DD8x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x10y93pqrEv");}
ccc::DD8x10y9 ::~DD8x10y9(){ note_dtor("_ZN3ccc8DD8x10y9E", this);} // tgen
ccc::DD8x10y9 ::DD8x10y9(){ note_ctor("_ZN3ccc8DD8x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD8x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x10y9E, buf);
    ::ccc::DD8x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x10y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD8x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x10y9E);
    dp->::ccc::DD8x10y9::~DD8x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x10y9E(Test__ZN3ccc8DD8x10y9E, "_ZN3ccc8DD8x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x10y9C1Ev();
extern void _ZN3ccc8DD8x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD8x10y9E[] = {
  NSPAIR(_ZN3ccc8DD8x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD8x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD8x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y9E[];
extern void _ZN3ccc8DD8x10y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x10y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x10y93pqrEv,_ZTv0_n12_N3ccc8DD8x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x10y93pqrEv,_ZThn4_N3ccc8DD8x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x10y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x10y93pqrEv,_ZTv0_n12_N3ccc8DD8x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x10y9E[] = {
  {&(_ZTVN3ccc8DD8x10y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x10y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x10y9E[];
static VTBL_ENTRY alt_thunk_names1478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x10y93pqrEv,_ZTv0_n12_N3ccc8DD8x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x10y93pqrEv,_ZThn4_N3ccc8DD8x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x10y9E = {  "_ZN3ccc8DD8x10y9E", // class name
  bases__ZN3ccc8DD8x10y9E, 2,
  &(vtc__ZN3ccc8DD8x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x10y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x10y9E),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  CC8x10y10  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC8x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x10y103abcEv
  ~CC8x10y10(); // tgen
  CC8x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y10E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x10y103pqrEv");}
void  ccc::CC8x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x10y103abcEv");}
ccc::CC8x10y10 ::~CC8x10y10(){ note_dtor("_ZN3ccc9CC8x10y10E", this);} // tgen
ccc::CC8x10y10 ::CC8x10y10(){ note_ctor("_ZN3ccc9CC8x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC8x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x10y10E, buf);
    ::ccc::CC8x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x10y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC8x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x10y10E);
    dp->::ccc::CC8x10y10::~CC8x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x10y10E(Test__ZN3ccc9CC8x10y10E, "_ZN3ccc9CC8x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x10y10C1Ev();
extern void _ZN3ccc9CC8x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC8x10y10E[] = {
  NSPAIR(_ZN3ccc9CC8x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC8x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC8x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x10y10E[];
extern void _ZN3ccc9CC8x10y103pqrEv();
extern void _ZN3ccc9CC8x10y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x10y103abcEv,_ZTv0_n16_N3ccc9CC8x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y103abcEv,_ZThn4_N3ccc9CC8x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x10y103abcEv,_ZTv0_n16_N3ccc9CC8x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x10y10E[] = {
  {&(_ZTVN3ccc9CC8x10y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x10y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x10y10E[];
static VTBL_ENTRY alt_thunk_names1479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x10y103abcEv,_ZTv0_n16_N3ccc9CC8x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x10y103abcEv,_ZThn4_N3ccc9CC8x10y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x10y10E = {  "_ZN3ccc9CC8x10y10E", // class name
  bases__ZN3ccc9CC8x10y10E, 2,
  &(vtc__ZN3ccc9CC8x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x10y10E),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  DD8x10y10  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD8x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD8x10y103abcEv
  ~DD8x10y10(); // tgen
  DD8x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD8x10y10E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x10y103pqrEv");}
void  ccc::DD8x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x10y103abcEv");}
ccc::DD8x10y10 ::~DD8x10y10(){ note_dtor("_ZN3ccc9DD8x10y10E", this);} // tgen
ccc::DD8x10y10 ::DD8x10y10(){ note_ctor("_ZN3ccc9DD8x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD8x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x10y10E, buf);
    ::ccc::DD8x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x10y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD8x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x10y10E);
    dp->::ccc::DD8x10y10::~DD8x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x10y10E(Test__ZN3ccc9DD8x10y10E, "_ZN3ccc9DD8x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x10y10C1Ev();
extern void _ZN3ccc9DD8x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD8x10y10E[] = {
  NSPAIR(_ZN3ccc9DD8x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD8x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD8x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x10y103abcEv();
extern void _ZN3ccc9DD8x10y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x10y103pqrEv,_ZTv0_n12_N3ccc9DD8x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x10y103pqrEv,_ZThn4_N3ccc9DD8x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD8x10y103abcEv,_ZTv0_n16_N3ccc9DD8x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x10y103abcEv,_ZThn4_N3ccc9DD8x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x10y103pqrEv,_ZTv0_n12_N3ccc9DD8x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD8x10y103abcEv,_ZTv0_n16_N3ccc9DD8x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x10y10E[] = {
  {&(_ZTVN3ccc9DD8x10y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x10y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x10y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x10y10E[];
static VTBL_ENTRY alt_thunk_names1480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD8x10y103abcEv,_ZTv0_n16_N3ccc9DD8x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x10y103abcEv,_ZThn4_N3ccc9DD8x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x10y103pqrEv,_ZTv0_n12_N3ccc9DD8x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x10y103pqrEv,_ZThn4_N3ccc9DD8x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x10y10E = {  "_ZN3ccc9DD8x10y10E", // class name
  bases__ZN3ccc9DD8x10y10E, 2,
  &(vtc__ZN3ccc9DD8x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x10y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x10y10E),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  CC8x10y11  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC8x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x10y113efgEv
  ~CC8x10y11(); // tgen
  CC8x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y11E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x10y113pqrEv");}
void  ccc::CC8x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x10y113efgEv");}
ccc::CC8x10y11 ::~CC8x10y11(){ note_dtor("_ZN3ccc9CC8x10y11E", this);} // tgen
ccc::CC8x10y11 ::CC8x10y11(){ note_ctor("_ZN3ccc9CC8x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC8x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x10y11E, buf);
    ::ccc::CC8x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x10y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC8x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x10y11E);
    dp->::ccc::CC8x10y11::~CC8x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x10y11E(Test__ZN3ccc9CC8x10y11E, "_ZN3ccc9CC8x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x10y11C1Ev();
extern void _ZN3ccc9CC8x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC8x10y11E[] = {
  NSPAIR(_ZN3ccc9CC8x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC8x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC8x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x10y11E[];
extern void _ZN3ccc9CC8x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC8x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x10y113efgEv,_ZTv0_n12_N3ccc9CC8x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y113efgEv,_ZThn4_N3ccc9CC8x10y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x10y113efgEv,_ZTv0_n12_N3ccc9CC8x10y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x10y11E[] = {
  {&(_ZTVN3ccc9CC8x10y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC8x10y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x10y11E[];
static VTBL_ENTRY alt_thunk_names1481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x10y113efgEv,_ZTv0_n12_N3ccc9CC8x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x10y113efgEv,_ZThn4_N3ccc9CC8x10y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x10y11E = {  "_ZN3ccc9CC8x10y11E", // class name
  bases__ZN3ccc9CC8x10y11E, 2,
  &(vtc__ZN3ccc9CC8x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x10y11E),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  DD8x10y11  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD8x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD8x10y113efgEv
  ~DD8x10y11(); // tgen
  DD8x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD8x10y11E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x10y113pqrEv");}
void  ccc::DD8x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x10y113efgEv");}
ccc::DD8x10y11 ::~DD8x10y11(){ note_dtor("_ZN3ccc9DD8x10y11E", this);} // tgen
ccc::DD8x10y11 ::DD8x10y11(){ note_ctor("_ZN3ccc9DD8x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD8x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x10y11E, buf);
    ::ccc::DD8x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x10y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD8x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x10y11E);
    dp->::ccc::DD8x10y11::~DD8x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x10y11E(Test__ZN3ccc9DD8x10y11E, "_ZN3ccc9DD8x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x10y11C1Ev();
extern void _ZN3ccc9DD8x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD8x10y11E[] = {
  NSPAIR(_ZN3ccc9DD8x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD8x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD8x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y11E[];
extern void _ZN3ccc9DD8x10y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x10y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x10y113pqrEv,_ZTv0_n12_N3ccc9DD8x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x10y113pqrEv,_ZThn4_N3ccc9DD8x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x10y113pqrEv,_ZTv0_n12_N3ccc9DD8x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x10y11E[] = {
  {&(_ZTVN3ccc9DD8x10y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x10y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x10y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x10y11E[];
static VTBL_ENTRY alt_thunk_names1482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x10y113pqrEv,_ZTv0_n12_N3ccc9DD8x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x10y113pqrEv,_ZThn4_N3ccc9DD8x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x10y11E = {  "_ZN3ccc9DD8x10y11E", // class name
  bases__ZN3ccc9DD8x10y11E, 2,
  &(vtc__ZN3ccc9DD8x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x10y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x10y11E),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  CC8x10y12  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC8x10y123abcEv
  ~CC8x10y12(); // tgen
  CC8x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y12E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC8x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x10y123abcEv");}
ccc::CC8x10y12 ::~CC8x10y12(){ note_dtor("_ZN3ccc9CC8x10y12E", this);} // tgen
ccc::CC8x10y12 ::CC8x10y12(){ note_ctor("_ZN3ccc9CC8x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC8x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x10y12E, buf);
    ::ccc::CC8x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x10y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC8x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x10y12E);
    dp->::ccc::CC8x10y12::~CC8x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x10y12E(Test__ZN3ccc9CC8x10y12E, "_ZN3ccc9CC8x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x10y12C1Ev();
extern void _ZN3ccc9CC8x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC8x10y12E[] = {
  NSPAIR(_ZN3ccc9CC8x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC8x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC8x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC8x10y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x10y123abcEv,_ZTv0_n16_N3ccc9CC8x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y123abcEv,_ZThn4_N3ccc9CC8x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x10y123abcEv,_ZTv0_n16_N3ccc9CC8x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x10y12E[] = {
  {&(_ZTVN3ccc9CC8x10y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x10y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x10y12E[];
static VTBL_ENTRY alt_thunk_names1483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x10y123abcEv,_ZTv0_n16_N3ccc9CC8x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x10y123abcEv,_ZThn4_N3ccc9CC8x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x10y12E = {  "_ZN3ccc9CC8x10y12E", // class name
  bases__ZN3ccc9CC8x10y12E, 2,
  &(vtc__ZN3ccc9CC8x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x10y12E),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  DD8x10y12  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD8x10y123abcEv
  ~DD8x10y12(); // tgen
  DD8x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD8x10y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD8x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x10y123abcEv");}
ccc::DD8x10y12 ::~DD8x10y12(){ note_dtor("_ZN3ccc9DD8x10y12E", this);} // tgen
ccc::DD8x10y12 ::DD8x10y12(){ note_ctor("_ZN3ccc9DD8x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD8x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x10y12E, buf);
    ::ccc::DD8x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x10y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD8x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x10y12E);
    dp->::ccc::DD8x10y12::~DD8x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x10y12E(Test__ZN3ccc9DD8x10y12E, "_ZN3ccc9DD8x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x10y12C1Ev();
extern void _ZN3ccc9DD8x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD8x10y12E[] = {
  NSPAIR(_ZN3ccc9DD8x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD8x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD8x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD8x10y123abcEv,_ZTv0_n16_N3ccc9DD8x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x10y123abcEv,_ZThn4_N3ccc9DD8x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD8x10y123abcEv,_ZTv0_n16_N3ccc9DD8x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x10y12E[] = {
  {&(_ZTVN3ccc9DD8x10y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x10y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x10y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x10y12E[];
static VTBL_ENTRY alt_thunk_names1484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD8x10y123abcEv,_ZTv0_n16_N3ccc9DD8x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x10y123abcEv,_ZThn4_N3ccc9DD8x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x10y12E = {  "_ZN3ccc9DD8x10y12E", // class name
  bases__ZN3ccc9DD8x10y12E, 2,
  &(vtc__ZN3ccc9DD8x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x10y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x10y12E),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  CC8x10y13  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC8x10y133efgEv
  ~CC8x10y13(); // tgen
  CC8x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x10y133efgEv");}
ccc::CC8x10y13 ::~CC8x10y13(){ note_dtor("_ZN3ccc9CC8x10y13E", this);} // tgen
ccc::CC8x10y13 ::CC8x10y13(){ note_ctor("_ZN3ccc9CC8x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC8x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x10y13E, buf);
    ::ccc::CC8x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x10y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC8x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x10y13E);
    dp->::ccc::CC8x10y13::~CC8x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x10y13E(Test__ZN3ccc9CC8x10y13E, "_ZN3ccc9CC8x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x10y13C1Ev();
extern void _ZN3ccc9CC8x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC8x10y13E[] = {
  NSPAIR(_ZN3ccc9CC8x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC8x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC8x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC8x10y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x10y133efgEv,_ZTv0_n12_N3ccc9CC8x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x10y133efgEv,_ZThn4_N3ccc9CC8x10y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x10y133efgEv,_ZTv0_n12_N3ccc9CC8x10y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x10y13E[] = {
  {&(_ZTVN3ccc9CC8x10y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC8x10y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x10y13E[];
static VTBL_ENTRY alt_thunk_names1485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x10y133efgEv,_ZTv0_n12_N3ccc9CC8x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x10y133efgEv,_ZThn4_N3ccc9CC8x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x10y13E = {  "_ZN3ccc9CC8x10y13E", // class name
  bases__ZN3ccc9CC8x10y13E, 2,
  &(vtc__ZN3ccc9CC8x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x10y13E),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  DD8x10y13  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD8x10y133efgEv
  ~DD8x10y13(); // tgen
  DD8x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD8x10y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x10y133efgEv");}
ccc::DD8x10y13 ::~DD8x10y13(){ note_dtor("_ZN3ccc9DD8x10y13E", this);} // tgen
ccc::DD8x10y13 ::DD8x10y13(){ note_ctor("_ZN3ccc9DD8x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD8x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x10y13E, buf);
    ::ccc::DD8x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x10y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD8x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x10y13E);
    dp->::ccc::DD8x10y13::~DD8x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x10y13E(Test__ZN3ccc9DD8x10y13E, "_ZN3ccc9DD8x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x10y13C1Ev();
extern void _ZN3ccc9DD8x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD8x10y13E[] = {
  NSPAIR(_ZN3ccc9DD8x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD8x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD8x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y13E[];
extern void _ZN3ccc9DD8x10y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x10y13E[] = {
  {&(_ZTVN3ccc9DD8x10y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x10y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x10y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x10y13E[];
Class_Descriptor cd__ZN3ccc9DD8x10y13E = {  "_ZN3ccc9DD8x10y13E", // class name
  bases__ZN3ccc9DD8x10y13E, 2,
  &(vtc__ZN3ccc9DD8x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x10y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x10y13E),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  CC8x10y14  : virtual ::ccc::AA8 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC8x10y143pqrEv
  ~CC8x10y14(); // tgen
  CC8x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC8x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x10y143pqrEv");}
ccc::CC8x10y14 ::~CC8x10y14(){ note_dtor("_ZN3ccc9CC8x10y14E", this);} // tgen
ccc::CC8x10y14 ::CC8x10y14(){ note_ctor("_ZN3ccc9CC8x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC8x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x10y14E, buf);
    ::ccc::CC8x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x10y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC8x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x10y14E);
    dp->::ccc::CC8x10y14::~CC8x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x10y14E(Test__ZN3ccc9CC8x10y14E, "_ZN3ccc9CC8x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x10y14C1Ev();
extern void _ZN3ccc9CC8x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC8x10y14E[] = {
  NSPAIR(_ZN3ccc9CC8x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC8x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC8x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x10y14E[];
extern void _ZN3ccc9CC8x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x10y14E[] = {
  {&(_ZTVN3ccc9CC8x10y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x10y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x10y14E[];
Class_Descriptor cd__ZN3ccc9CC8x10y14E = {  "_ZN3ccc9CC8x10y14E", // class name
  bases__ZN3ccc9CC8x10y14E, 2,
  &(vtc__ZN3ccc9CC8x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x10y14E),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  DD8x10y14  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD8x10y143pqrEv
  ~DD8x10y14(); // tgen
  DD8x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD8x10y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD8x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x10y143pqrEv");}
ccc::DD8x10y14 ::~DD8x10y14(){ note_dtor("_ZN3ccc9DD8x10y14E", this);} // tgen
ccc::DD8x10y14 ::DD8x10y14(){ note_ctor("_ZN3ccc9DD8x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD8x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x10y14E, buf);
    ::ccc::DD8x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x10y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD8x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x10y14E);
    dp->::ccc::DD8x10y14::~DD8x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x10y14E(Test__ZN3ccc9DD8x10y14E, "_ZN3ccc9DD8x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x10y14C1Ev();
extern void _ZN3ccc9DD8x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD8x10y14E[] = {
  NSPAIR(_ZN3ccc9DD8x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD8x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD8x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x10y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x10y143pqrEv,_ZTv0_n12_N3ccc9DD8x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x10y143pqrEv,_ZThn4_N3ccc9DD8x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x10y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x10y143pqrEv,_ZTv0_n12_N3ccc9DD8x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x10y14E[] = {
  {&(_ZTVN3ccc9DD8x10y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x10y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x10y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x10y14E[];
static VTBL_ENTRY alt_thunk_names1486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x10y143pqrEv,_ZTv0_n12_N3ccc9DD8x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x10y143pqrEv,_ZThn4_N3ccc9DD8x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x10y14E = {  "_ZN3ccc9DD8x10y14E", // class name
  bases__ZN3ccc9DD8x10y14E, 2,
  &(vtc__ZN3ccc9DD8x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x10y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x10y14E),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  CC8x10y15  : virtual ::ccc::AA8 , ::ccc::BB10 {
  ~CC8x10y15(); // tgen
  CC8x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x10y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC8x10y15 ::~CC8x10y15(){ note_dtor("_ZN3ccc9CC8x10y15E", this);} // tgen
ccc::CC8x10y15 ::CC8x10y15(){ note_ctor("_ZN3ccc9CC8x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC8x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x10y15E, buf);
    ::ccc::CC8x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x10y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC8x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x10y15E);
    dp->::ccc::CC8x10y15::~CC8x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x10y15E(Test__ZN3ccc9CC8x10y15E, "_ZN3ccc9CC8x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x10y15C1Ev();
extern void _ZN3ccc9CC8x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC8x10y15E[] = {
  NSPAIR(_ZN3ccc9CC8x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC8x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC8x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x10y15E[] = {
  {&(_ZTVN3ccc9CC8x10y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x10y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x10y15E[];
Class_Descriptor cd__ZN3ccc9CC8x10y15E = {  "_ZN3ccc9CC8x10y15E", // class name
  bases__ZN3ccc9CC8x10y15E, 2,
  &(vtc__ZN3ccc9CC8x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x10y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x10y15E),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  DD8x10y15  : virtual ::ccc::AA8 , virtual ::ccc::BB10 {
  ~DD8x10y15(); // tgen
  DD8x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD8x10y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD8x10y15 ::~DD8x10y15(){ note_dtor("_ZN3ccc9DD8x10y15E", this);} // tgen
ccc::DD8x10y15 ::DD8x10y15(){ note_ctor("_ZN3ccc9DD8x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD8x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x10y15E, buf);
    ::ccc::DD8x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x10y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD8x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x10y15E);
    dp->::ccc::DD8x10y15::~DD8x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x10y15E(Test__ZN3ccc9DD8x10y15E, "_ZN3ccc9DD8x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x10y15C1Ev();
extern void _ZN3ccc9DD8x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD8x10y15E[] = {
  NSPAIR(_ZN3ccc9DD8x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD8x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD8x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x10y15E[] = {
  {&(_ZTVN3ccc9DD8x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x10y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x10y15E[];
Class_Descriptor cd__ZN3ccc9DD8x10y15E = {  "_ZN3ccc9DD8x10y15E", // class name
  bases__ZN3ccc9DD8x10y15E, 2,
  &(vtc__ZN3ccc9DD8x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x10y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x10y15E),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  CC8x11y0  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y03pqrEv
  ~CC8x11y0(); // tgen
  CC8x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y0E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y03abcEv");}
void  ccc::CC8x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y03efgEv");}
void  ccc::CC8x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y03pqrEv");}
ccc::CC8x11y0 ::~CC8x11y0(){ note_dtor("_ZN3ccc8CC8x11y0E", this);} // tgen
ccc::CC8x11y0 ::CC8x11y0(){ note_ctor("_ZN3ccc8CC8x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y0E, buf);
    ::ccc::CC8x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y0E);
    dp->::ccc::CC8x11y0::~CC8x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y0E(Test__ZN3ccc8CC8x11y0E, "_ZN3ccc8CC8x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y0C1Ev();
extern void _ZN3ccc8CC8x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y0E[] = {
  NSPAIR(_ZN3ccc8CC8x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y0E[];
extern void _ZN3ccc8CC8x11y03pqrEv();
extern void _ZN3ccc8CC8x11y03efgEv();
extern void _ZN3ccc8CC8x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y03efgEv,_ZTv0_n12_N3ccc8CC8x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y03efgEv,_ZThn4_N3ccc8CC8x11y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y03abcEv,_ZTv0_n16_N3ccc8CC8x11y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y03abcEv,_ZThn4_N3ccc8CC8x11y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y03efgEv,_ZTv0_n12_N3ccc8CC8x11y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y03abcEv,_ZTv0_n16_N3ccc8CC8x11y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y0E[] = {
  {&(_ZTVN3ccc8CC8x11y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y0E[];
static VTBL_ENTRY alt_thunk_names1487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y03abcEv,_ZTv0_n16_N3ccc8CC8x11y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y03abcEv,_ZThn4_N3ccc8CC8x11y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y03efgEv,_ZTv0_n12_N3ccc8CC8x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y03efgEv,_ZThn4_N3ccc8CC8x11y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y0E = {  "_ZN3ccc8CC8x11y0E", // class name
  bases__ZN3ccc8CC8x11y0E, 2,
  &(vtc__ZN3ccc8CC8x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y0E),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  DD8x11y0  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD8x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD8x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x11y03pqrEv
  ~DD8x11y0(); // tgen
  DD8x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y0E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y03abcEv");}
void  ccc::DD8x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y03efgEv");}
void  ccc::DD8x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y03pqrEv");}
ccc::DD8x11y0 ::~DD8x11y0(){ note_dtor("_ZN3ccc8DD8x11y0E", this);} // tgen
ccc::DD8x11y0 ::DD8x11y0(){ note_ctor("_ZN3ccc8DD8x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y0E, buf);
    ::ccc::DD8x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y0E);
    dp->::ccc::DD8x11y0::~DD8x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y0E(Test__ZN3ccc8DD8x11y0E, "_ZN3ccc8DD8x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y0C1Ev();
extern void _ZN3ccc8DD8x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y0E[] = {
  NSPAIR(_ZN3ccc8DD8x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y0E[];
extern void _ZN3ccc8DD8x11y03efgEv();
extern void _ZN3ccc8DD8x11y03abcEv();
extern void _ZN3ccc8DD8x11y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y03pqrEv,_ZTv0_n12_N3ccc8DD8x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y03pqrEv,_ZThn4_N3ccc8DD8x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y03efgEv,_ZTv0_n16_N3ccc8DD8x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y03efgEv,_ZThn4_N3ccc8DD8x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y03pqrEv,_ZTv0_n12_N3ccc8DD8x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y03efgEv,_ZTv0_n16_N3ccc8DD8x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y0E[] = {
  {&(_ZTVN3ccc8DD8x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y0E[];
static VTBL_ENTRY alt_thunk_names1488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y03efgEv,_ZTv0_n16_N3ccc8DD8x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y03efgEv,_ZThn4_N3ccc8DD8x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y03pqrEv,_ZTv0_n12_N3ccc8DD8x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y03pqrEv,_ZThn4_N3ccc8DD8x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y0E = {  "_ZN3ccc8DD8x11y0E", // class name
  bases__ZN3ccc8DD8x11y0E, 2,
  &(vtc__ZN3ccc8DD8x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y0E),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  CC8x11y1  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x11y13efgEv
  ~CC8x11y1(); // tgen
  CC8x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y1E) C1{ VBC2{ v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y13abcEv");}
void  ccc::CC8x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y13pqrEv");}
void  ccc::CC8x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y13efgEv");}
ccc::CC8x11y1 ::~CC8x11y1(){ note_dtor("_ZN3ccc8CC8x11y1E", this);} // tgen
ccc::CC8x11y1 ::CC8x11y1(){ note_ctor("_ZN3ccc8CC8x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y1E, buf);
    ::ccc::CC8x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y1E);
    dp->::ccc::CC8x11y1::~CC8x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y1E(Test__ZN3ccc8CC8x11y1E, "_ZN3ccc8CC8x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y1C1Ev();
extern void _ZN3ccc8CC8x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y1E[] = {
  NSPAIR(_ZN3ccc8CC8x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y1E[];
extern void _ZN3ccc8CC8x11y13pqrEv();
extern void _ZN3ccc8CC8x11y13efgEv();
extern void _ZN3ccc8CC8x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y13efgEv,_ZTv0_n12_N3ccc8CC8x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y13efgEv,_ZThn4_N3ccc8CC8x11y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y13abcEv,_ZTv0_n16_N3ccc8CC8x11y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y13abcEv,_ZThn4_N3ccc8CC8x11y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y13efgEv,_ZTv0_n12_N3ccc8CC8x11y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y13abcEv,_ZTv0_n16_N3ccc8CC8x11y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y1E[] = {
  {&(_ZTVN3ccc8CC8x11y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y1E[];
static VTBL_ENTRY alt_thunk_names1489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y13abcEv,_ZTv0_n16_N3ccc8CC8x11y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y13abcEv,_ZThn4_N3ccc8CC8x11y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y13efgEv,_ZTv0_n12_N3ccc8CC8x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y13efgEv,_ZThn4_N3ccc8CC8x11y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y1E = {  "_ZN3ccc8CC8x11y1E", // class name
  bases__ZN3ccc8CC8x11y1E, 2,
  &(vtc__ZN3ccc8CC8x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y1E),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  DD8x11y1  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD8x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x11y13efgEv
  ~DD8x11y1(); // tgen
  DD8x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y1E) C1{ VBC2{ v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y13abcEv");}
void  ccc::DD8x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y13pqrEv");}
void  ccc::DD8x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y13efgEv");}
ccc::DD8x11y1 ::~DD8x11y1(){ note_dtor("_ZN3ccc8DD8x11y1E", this);} // tgen
ccc::DD8x11y1 ::DD8x11y1(){ note_ctor("_ZN3ccc8DD8x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y1E, buf);
    ::ccc::DD8x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y1E);
    dp->::ccc::DD8x11y1::~DD8x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y1E(Test__ZN3ccc8DD8x11y1E, "_ZN3ccc8DD8x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y1C1Ev();
extern void _ZN3ccc8DD8x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y1E[] = {
  NSPAIR(_ZN3ccc8DD8x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y1E[];
extern void _ZN3ccc8DD8x11y13efgEv();
extern void _ZN3ccc8DD8x11y13abcEv();
extern void _ZN3ccc8DD8x11y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y13pqrEv,_ZTv0_n12_N3ccc8DD8x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y13pqrEv,_ZThn4_N3ccc8DD8x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y13efgEv,_ZTv0_n16_N3ccc8DD8x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y13efgEv,_ZThn4_N3ccc8DD8x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y13pqrEv,_ZTv0_n12_N3ccc8DD8x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y13efgEv,_ZTv0_n16_N3ccc8DD8x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y1E[] = {
  {&(_ZTVN3ccc8DD8x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y1E[];
static VTBL_ENTRY alt_thunk_names1490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y13efgEv,_ZTv0_n16_N3ccc8DD8x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y13efgEv,_ZThn4_N3ccc8DD8x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y13pqrEv,_ZTv0_n12_N3ccc8DD8x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y13pqrEv,_ZThn4_N3ccc8DD8x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y1E = {  "_ZN3ccc8DD8x11y1E", // class name
  bases__ZN3ccc8DD8x11y1E, 2,
  &(vtc__ZN3ccc8DD8x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y1E),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  CC8x11y2  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y23pqrEv
  ~CC8x11y2(); // tgen
  CC8x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y2E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y23efgEv");}
void  ccc::CC8x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y23abcEv");}
void  ccc::CC8x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y23pqrEv");}
ccc::CC8x11y2 ::~CC8x11y2(){ note_dtor("_ZN3ccc8CC8x11y2E", this);} // tgen
ccc::CC8x11y2 ::CC8x11y2(){ note_ctor("_ZN3ccc8CC8x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y2E, buf);
    ::ccc::CC8x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y2E);
    dp->::ccc::CC8x11y2::~CC8x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y2E(Test__ZN3ccc8CC8x11y2E, "_ZN3ccc8CC8x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y2C1Ev();
extern void _ZN3ccc8CC8x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y2E[] = {
  NSPAIR(_ZN3ccc8CC8x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y2E[];
extern void _ZN3ccc8CC8x11y23pqrEv();
extern void _ZN3ccc8CC8x11y23efgEv();
extern void _ZN3ccc8CC8x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y23efgEv,_ZTv0_n12_N3ccc8CC8x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y23efgEv,_ZThn4_N3ccc8CC8x11y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y23abcEv,_ZTv0_n16_N3ccc8CC8x11y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y23abcEv,_ZThn4_N3ccc8CC8x11y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y23efgEv,_ZTv0_n12_N3ccc8CC8x11y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y23abcEv,_ZTv0_n16_N3ccc8CC8x11y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y2E[] = {
  {&(_ZTVN3ccc8CC8x11y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y2E[];
static VTBL_ENTRY alt_thunk_names1491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y23abcEv,_ZTv0_n16_N3ccc8CC8x11y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y23abcEv,_ZThn4_N3ccc8CC8x11y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y23efgEv,_ZTv0_n12_N3ccc8CC8x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y23efgEv,_ZThn4_N3ccc8CC8x11y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y2E = {  "_ZN3ccc8CC8x11y2E", // class name
  bases__ZN3ccc8CC8x11y2E, 2,
  &(vtc__ZN3ccc8CC8x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y2E),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  DD8x11y2  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD8x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD8x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x11y23pqrEv
  ~DD8x11y2(); // tgen
  DD8x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y2E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y23efgEv");}
void  ccc::DD8x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y23abcEv");}
void  ccc::DD8x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y23pqrEv");}
ccc::DD8x11y2 ::~DD8x11y2(){ note_dtor("_ZN3ccc8DD8x11y2E", this);} // tgen
ccc::DD8x11y2 ::DD8x11y2(){ note_ctor("_ZN3ccc8DD8x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y2E, buf);
    ::ccc::DD8x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y2E);
    dp->::ccc::DD8x11y2::~DD8x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y2E(Test__ZN3ccc8DD8x11y2E, "_ZN3ccc8DD8x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y2C1Ev();
extern void _ZN3ccc8DD8x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y2E[] = {
  NSPAIR(_ZN3ccc8DD8x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y2E[];
extern void _ZN3ccc8DD8x11y23efgEv();
extern void _ZN3ccc8DD8x11y23abcEv();
extern void _ZN3ccc8DD8x11y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y23pqrEv,_ZTv0_n12_N3ccc8DD8x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y23pqrEv,_ZThn4_N3ccc8DD8x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y23efgEv,_ZTv0_n16_N3ccc8DD8x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y23efgEv,_ZThn4_N3ccc8DD8x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y23pqrEv,_ZTv0_n12_N3ccc8DD8x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y23efgEv,_ZTv0_n16_N3ccc8DD8x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y2E[] = {
  {&(_ZTVN3ccc8DD8x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y2E[];
static VTBL_ENTRY alt_thunk_names1492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y23efgEv,_ZTv0_n16_N3ccc8DD8x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y23efgEv,_ZThn4_N3ccc8DD8x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y23pqrEv,_ZTv0_n12_N3ccc8DD8x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y23pqrEv,_ZThn4_N3ccc8DD8x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y2E = {  "_ZN3ccc8DD8x11y2E", // class name
  bases__ZN3ccc8DD8x11y2E, 2,
  &(vtc__ZN3ccc8DD8x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y2E),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  CC8x11y3  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x11y33abcEv
  ~CC8x11y3(); // tgen
  CC8x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y3E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y33efgEv");}
void  ccc::CC8x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y33pqrEv");}
void  ccc::CC8x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y33abcEv");}
ccc::CC8x11y3 ::~CC8x11y3(){ note_dtor("_ZN3ccc8CC8x11y3E", this);} // tgen
ccc::CC8x11y3 ::CC8x11y3(){ note_ctor("_ZN3ccc8CC8x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y3E, buf);
    ::ccc::CC8x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y3E);
    dp->::ccc::CC8x11y3::~CC8x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y3E(Test__ZN3ccc8CC8x11y3E, "_ZN3ccc8CC8x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y3C1Ev();
extern void _ZN3ccc8CC8x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y3E[] = {
  NSPAIR(_ZN3ccc8CC8x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y3E[];
extern void _ZN3ccc8CC8x11y33pqrEv();
extern void _ZN3ccc8CC8x11y33efgEv();
extern void _ZN3ccc8CC8x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y33efgEv,_ZTv0_n12_N3ccc8CC8x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y33efgEv,_ZThn4_N3ccc8CC8x11y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y33abcEv,_ZTv0_n16_N3ccc8CC8x11y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y33abcEv,_ZThn4_N3ccc8CC8x11y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y33efgEv,_ZTv0_n12_N3ccc8CC8x11y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y33abcEv,_ZTv0_n16_N3ccc8CC8x11y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y3E[] = {
  {&(_ZTVN3ccc8CC8x11y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y3E[];
static VTBL_ENTRY alt_thunk_names1493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y33abcEv,_ZTv0_n16_N3ccc8CC8x11y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y33abcEv,_ZThn4_N3ccc8CC8x11y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y33efgEv,_ZTv0_n12_N3ccc8CC8x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y33efgEv,_ZThn4_N3ccc8CC8x11y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y3E = {  "_ZN3ccc8CC8x11y3E", // class name
  bases__ZN3ccc8CC8x11y3E, 2,
  &(vtc__ZN3ccc8CC8x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y3E),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  DD8x11y3  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD8x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x11y33abcEv
  ~DD8x11y3(); // tgen
  DD8x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y3E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y33efgEv");}
void  ccc::DD8x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y33pqrEv");}
void  ccc::DD8x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y33abcEv");}
ccc::DD8x11y3 ::~DD8x11y3(){ note_dtor("_ZN3ccc8DD8x11y3E", this);} // tgen
ccc::DD8x11y3 ::DD8x11y3(){ note_ctor("_ZN3ccc8DD8x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y3E, buf);
    ::ccc::DD8x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y3E);
    dp->::ccc::DD8x11y3::~DD8x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y3E(Test__ZN3ccc8DD8x11y3E, "_ZN3ccc8DD8x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y3C1Ev();
extern void _ZN3ccc8DD8x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y3E[] = {
  NSPAIR(_ZN3ccc8DD8x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y3E[];
extern void _ZN3ccc8DD8x11y33efgEv();
extern void _ZN3ccc8DD8x11y33abcEv();
extern void _ZN3ccc8DD8x11y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y33pqrEv,_ZTv0_n12_N3ccc8DD8x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y33pqrEv,_ZThn4_N3ccc8DD8x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y33efgEv,_ZTv0_n16_N3ccc8DD8x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y33efgEv,_ZThn4_N3ccc8DD8x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y33pqrEv,_ZTv0_n12_N3ccc8DD8x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y33efgEv,_ZTv0_n16_N3ccc8DD8x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y3E[] = {
  {&(_ZTVN3ccc8DD8x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y3E[];
static VTBL_ENTRY alt_thunk_names1494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y33efgEv,_ZTv0_n16_N3ccc8DD8x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y33efgEv,_ZThn4_N3ccc8DD8x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y33pqrEv,_ZTv0_n12_N3ccc8DD8x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y33pqrEv,_ZThn4_N3ccc8DD8x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y3E = {  "_ZN3ccc8DD8x11y3E", // class name
  bases__ZN3ccc8DD8x11y3E, 2,
  &(vtc__ZN3ccc8DD8x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y3E),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  CC8x11y4  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC8x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x11y43efgEv
  ~CC8x11y4(); // tgen
  CC8x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y4E) C1{ VBC2{ v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y43pqrEv");}
void  ccc::CC8x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y43abcEv");}
void  ccc::CC8x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y43efgEv");}
ccc::CC8x11y4 ::~CC8x11y4(){ note_dtor("_ZN3ccc8CC8x11y4E", this);} // tgen
ccc::CC8x11y4 ::CC8x11y4(){ note_ctor("_ZN3ccc8CC8x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y4E, buf);
    ::ccc::CC8x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y4E);
    dp->::ccc::CC8x11y4::~CC8x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y4E(Test__ZN3ccc8CC8x11y4E, "_ZN3ccc8CC8x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y4C1Ev();
extern void _ZN3ccc8CC8x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y4E[] = {
  NSPAIR(_ZN3ccc8CC8x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y4E[];
extern void _ZN3ccc8CC8x11y43pqrEv();
extern void _ZN3ccc8CC8x11y43efgEv();
extern void _ZN3ccc8CC8x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y43efgEv,_ZTv0_n12_N3ccc8CC8x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y43efgEv,_ZThn4_N3ccc8CC8x11y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y43abcEv,_ZTv0_n16_N3ccc8CC8x11y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y43abcEv,_ZThn4_N3ccc8CC8x11y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y43efgEv,_ZTv0_n12_N3ccc8CC8x11y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y43abcEv,_ZTv0_n16_N3ccc8CC8x11y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y4E[] = {
  {&(_ZTVN3ccc8CC8x11y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y4E[];
static VTBL_ENTRY alt_thunk_names1495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y43abcEv,_ZTv0_n16_N3ccc8CC8x11y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y43abcEv,_ZThn4_N3ccc8CC8x11y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y43efgEv,_ZTv0_n12_N3ccc8CC8x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y43efgEv,_ZThn4_N3ccc8CC8x11y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y4E = {  "_ZN3ccc8CC8x11y4E", // class name
  bases__ZN3ccc8CC8x11y4E, 2,
  &(vtc__ZN3ccc8CC8x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y4E),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  DD8x11y4  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD8x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD8x11y43efgEv
  ~DD8x11y4(); // tgen
  DD8x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y4E) C1{ VBC2{ v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y43pqrEv");}
void  ccc::DD8x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y43abcEv");}
void  ccc::DD8x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y43efgEv");}
ccc::DD8x11y4 ::~DD8x11y4(){ note_dtor("_ZN3ccc8DD8x11y4E", this);} // tgen
ccc::DD8x11y4 ::DD8x11y4(){ note_ctor("_ZN3ccc8DD8x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y4E, buf);
    ::ccc::DD8x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y4E);
    dp->::ccc::DD8x11y4::~DD8x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y4E(Test__ZN3ccc8DD8x11y4E, "_ZN3ccc8DD8x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y4C1Ev();
extern void _ZN3ccc8DD8x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y4E[] = {
  NSPAIR(_ZN3ccc8DD8x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y4E[];
extern void _ZN3ccc8DD8x11y43efgEv();
extern void _ZN3ccc8DD8x11y43abcEv();
extern void _ZN3ccc8DD8x11y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y43pqrEv,_ZTv0_n12_N3ccc8DD8x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y43pqrEv,_ZThn4_N3ccc8DD8x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y43efgEv,_ZTv0_n16_N3ccc8DD8x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y43efgEv,_ZThn4_N3ccc8DD8x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y43pqrEv,_ZTv0_n12_N3ccc8DD8x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y43efgEv,_ZTv0_n16_N3ccc8DD8x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y4E[] = {
  {&(_ZTVN3ccc8DD8x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y4E[];
static VTBL_ENTRY alt_thunk_names1496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y43efgEv,_ZTv0_n16_N3ccc8DD8x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y43efgEv,_ZThn4_N3ccc8DD8x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y43pqrEv,_ZTv0_n12_N3ccc8DD8x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y43pqrEv,_ZThn4_N3ccc8DD8x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y4E = {  "_ZN3ccc8DD8x11y4E", // class name
  bases__ZN3ccc8DD8x11y4E, 2,
  &(vtc__ZN3ccc8DD8x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y4E),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  CC8x11y5  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC8x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x11y53abcEv
  ~CC8x11y5(); // tgen
  CC8x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y5E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y53pqrEv");}
void  ccc::CC8x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y53efgEv");}
void  ccc::CC8x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y53abcEv");}
ccc::CC8x11y5 ::~CC8x11y5(){ note_dtor("_ZN3ccc8CC8x11y5E", this);} // tgen
ccc::CC8x11y5 ::CC8x11y5(){ note_ctor("_ZN3ccc8CC8x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y5E, buf);
    ::ccc::CC8x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y5E);
    dp->::ccc::CC8x11y5::~CC8x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y5E(Test__ZN3ccc8CC8x11y5E, "_ZN3ccc8CC8x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y5C1Ev();
extern void _ZN3ccc8CC8x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y5E[] = {
  NSPAIR(_ZN3ccc8CC8x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y5E[];
extern void _ZN3ccc8CC8x11y53pqrEv();
extern void _ZN3ccc8CC8x11y53efgEv();
extern void _ZN3ccc8CC8x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y53efgEv,_ZTv0_n12_N3ccc8CC8x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y53efgEv,_ZThn4_N3ccc8CC8x11y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y53abcEv,_ZTv0_n16_N3ccc8CC8x11y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y53abcEv,_ZThn4_N3ccc8CC8x11y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y53efgEv,_ZTv0_n12_N3ccc8CC8x11y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y53abcEv,_ZTv0_n16_N3ccc8CC8x11y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y5E[] = {
  {&(_ZTVN3ccc8CC8x11y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y5E[];
static VTBL_ENTRY alt_thunk_names1497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y53abcEv,_ZTv0_n16_N3ccc8CC8x11y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y53abcEv,_ZThn4_N3ccc8CC8x11y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y53efgEv,_ZTv0_n12_N3ccc8CC8x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y53efgEv,_ZThn4_N3ccc8CC8x11y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y5E = {  "_ZN3ccc8CC8x11y5E", // class name
  bases__ZN3ccc8CC8x11y5E, 2,
  &(vtc__ZN3ccc8CC8x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y5E),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  DD8x11y5  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD8x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD8x11y53abcEv
  ~DD8x11y5(); // tgen
  DD8x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y5E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y53pqrEv");}
void  ccc::DD8x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y53efgEv");}
void  ccc::DD8x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y53abcEv");}
ccc::DD8x11y5 ::~DD8x11y5(){ note_dtor("_ZN3ccc8DD8x11y5E", this);} // tgen
ccc::DD8x11y5 ::DD8x11y5(){ note_ctor("_ZN3ccc8DD8x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y5E, buf);
    ::ccc::DD8x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y5E);
    dp->::ccc::DD8x11y5::~DD8x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y5E(Test__ZN3ccc8DD8x11y5E, "_ZN3ccc8DD8x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y5C1Ev();
extern void _ZN3ccc8DD8x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y5E[] = {
  NSPAIR(_ZN3ccc8DD8x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y5E[];
extern void _ZN3ccc8DD8x11y53efgEv();
extern void _ZN3ccc8DD8x11y53abcEv();
extern void _ZN3ccc8DD8x11y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y53pqrEv,_ZTv0_n12_N3ccc8DD8x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y53pqrEv,_ZThn4_N3ccc8DD8x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y53efgEv,_ZTv0_n16_N3ccc8DD8x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y53efgEv,_ZThn4_N3ccc8DD8x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y53pqrEv,_ZTv0_n12_N3ccc8DD8x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y53efgEv,_ZTv0_n16_N3ccc8DD8x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y5E[] = {
  {&(_ZTVN3ccc8DD8x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y5E[];
static VTBL_ENTRY alt_thunk_names1498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y53efgEv,_ZTv0_n16_N3ccc8DD8x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y53efgEv,_ZThn4_N3ccc8DD8x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y53pqrEv,_ZTv0_n12_N3ccc8DD8x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y53pqrEv,_ZThn4_N3ccc8DD8x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y5E = {  "_ZN3ccc8DD8x11y5E", // class name
  bases__ZN3ccc8DD8x11y5E, 2,
  &(vtc__ZN3ccc8DD8x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y5E),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  CC8x11y6  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x11y63efgEv
  ~CC8x11y6(); // tgen
  CC8x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y6E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y63abcEv");}
void  ccc::CC8x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y63efgEv");}
ccc::CC8x11y6 ::~CC8x11y6(){ note_dtor("_ZN3ccc8CC8x11y6E", this);} // tgen
ccc::CC8x11y6 ::CC8x11y6(){ note_ctor("_ZN3ccc8CC8x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y6E, buf);
    ::ccc::CC8x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y6E);
    dp->::ccc::CC8x11y6::~CC8x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y6E(Test__ZN3ccc8CC8x11y6E, "_ZN3ccc8CC8x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y6C1Ev();
extern void _ZN3ccc8CC8x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y6E[] = {
  NSPAIR(_ZN3ccc8CC8x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC8x11y63efgEv();
extern void _ZN3ccc8CC8x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y63efgEv,_ZTv0_n12_N3ccc8CC8x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y63efgEv,_ZThn4_N3ccc8CC8x11y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y63abcEv,_ZTv0_n16_N3ccc8CC8x11y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y63abcEv,_ZThn4_N3ccc8CC8x11y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y63efgEv,_ZTv0_n12_N3ccc8CC8x11y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y63abcEv,_ZTv0_n16_N3ccc8CC8x11y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y6E[] = {
  {&(_ZTVN3ccc8CC8x11y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y6E[];
static VTBL_ENTRY alt_thunk_names1499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y63abcEv,_ZTv0_n16_N3ccc8CC8x11y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y63abcEv,_ZThn4_N3ccc8CC8x11y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y63efgEv,_ZTv0_n12_N3ccc8CC8x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y63efgEv,_ZThn4_N3ccc8CC8x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y6E = {  "_ZN3ccc8CC8x11y6E", // class name
  bases__ZN3ccc8CC8x11y6E, 2,
  &(vtc__ZN3ccc8CC8x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y6E),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  DD8x11y6  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD8x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD8x11y63efgEv
  ~DD8x11y6(); // tgen
  DD8x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y6E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y63abcEv");}
void  ccc::DD8x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y63efgEv");}
ccc::DD8x11y6 ::~DD8x11y6(){ note_dtor("_ZN3ccc8DD8x11y6E", this);} // tgen
ccc::DD8x11y6 ::DD8x11y6(){ note_ctor("_ZN3ccc8DD8x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y6E, buf);
    ::ccc::DD8x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y6E);
    dp->::ccc::DD8x11y6::~DD8x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y6E(Test__ZN3ccc8DD8x11y6E, "_ZN3ccc8DD8x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y6C1Ev();
extern void _ZN3ccc8DD8x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y6E[] = {
  NSPAIR(_ZN3ccc8DD8x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y6E[];
extern void _ZN3ccc8DD8x11y63efgEv();
extern void _ZN3ccc8DD8x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y63efgEv,_ZTv0_n16_N3ccc8DD8x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y63efgEv,_ZThn4_N3ccc8DD8x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y63efgEv,_ZTv0_n16_N3ccc8DD8x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y6E[] = {
  {&(_ZTVN3ccc8DD8x11y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x11y6E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x11y6E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y6E[];
static VTBL_ENTRY alt_thunk_names1500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y63efgEv,_ZTv0_n16_N3ccc8DD8x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y63efgEv,_ZThn4_N3ccc8DD8x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y6E = {  "_ZN3ccc8DD8x11y6E", // class name
  bases__ZN3ccc8DD8x11y6E, 2,
  &(vtc__ZN3ccc8DD8x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y6E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y6E),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  CC8x11y7  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC8x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y73pqrEv
  ~CC8x11y7(); // tgen
  CC8x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y7E) C1{ VBC2{ v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y73abcEv");}
void  ccc::CC8x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y73pqrEv");}
ccc::CC8x11y7 ::~CC8x11y7(){ note_dtor("_ZN3ccc8CC8x11y7E", this);} // tgen
ccc::CC8x11y7 ::CC8x11y7(){ note_ctor("_ZN3ccc8CC8x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y7E, buf);
    ::ccc::CC8x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y7E);
    dp->::ccc::CC8x11y7::~CC8x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y7E(Test__ZN3ccc8CC8x11y7E, "_ZN3ccc8CC8x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y7C1Ev();
extern void _ZN3ccc8CC8x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y7E[] = {
  NSPAIR(_ZN3ccc8CC8x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y7E[];
extern void _ZN3ccc8CC8x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC8x11y73abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y73abcEv,_ZTv0_n16_N3ccc8CC8x11y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y73abcEv,_ZThn4_N3ccc8CC8x11y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y73abcEv,_ZTv0_n16_N3ccc8CC8x11y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y7E[] = {
  {&(_ZTVN3ccc8CC8x11y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y7E[];
static VTBL_ENTRY alt_thunk_names1501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y73abcEv,_ZTv0_n16_N3ccc8CC8x11y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y73abcEv,_ZThn4_N3ccc8CC8x11y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y7E = {  "_ZN3ccc8CC8x11y7E", // class name
  bases__ZN3ccc8CC8x11y7E, 2,
  &(vtc__ZN3ccc8CC8x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y7E),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  DD8x11y7  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD8x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x11y73pqrEv
  ~DD8x11y7(); // tgen
  DD8x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y7E) C1{ VBC2{ v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y73abcEv");}
void  ccc::DD8x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y73pqrEv");}
ccc::DD8x11y7 ::~DD8x11y7(){ note_dtor("_ZN3ccc8DD8x11y7E", this);} // tgen
ccc::DD8x11y7 ::DD8x11y7(){ note_ctor("_ZN3ccc8DD8x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y7E, buf);
    ::ccc::DD8x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y7E);
    dp->::ccc::DD8x11y7::~DD8x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y7E(Test__ZN3ccc8DD8x11y7E, "_ZN3ccc8DD8x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y7C1Ev();
extern void _ZN3ccc8DD8x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y7E[] = {
  NSPAIR(_ZN3ccc8DD8x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x11y73abcEv();
extern void _ZN3ccc8DD8x11y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y73pqrEv,_ZTv0_n12_N3ccc8DD8x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y73pqrEv,_ZThn4_N3ccc8DD8x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y73pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y73pqrEv,_ZTv0_n12_N3ccc8DD8x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y7E[] = {
  {&(_ZTVN3ccc8DD8x11y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y7E[];
static VTBL_ENTRY alt_thunk_names1502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y73pqrEv,_ZTv0_n12_N3ccc8DD8x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y73pqrEv,_ZThn4_N3ccc8DD8x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y7E = {  "_ZN3ccc8DD8x11y7E", // class name
  bases__ZN3ccc8DD8x11y7E, 2,
  &(vtc__ZN3ccc8DD8x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y7E),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  CC8x11y8  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x11y83abcEv
  ~CC8x11y8(); // tgen
  CC8x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y8E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y83efgEv");}
void  ccc::CC8x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x11y83abcEv");}
ccc::CC8x11y8 ::~CC8x11y8(){ note_dtor("_ZN3ccc8CC8x11y8E", this);} // tgen
ccc::CC8x11y8 ::CC8x11y8(){ note_ctor("_ZN3ccc8CC8x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y8E, buf);
    ::ccc::CC8x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y8E);
    dp->::ccc::CC8x11y8::~CC8x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y8E(Test__ZN3ccc8CC8x11y8E, "_ZN3ccc8CC8x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y8C1Ev();
extern void _ZN3ccc8CC8x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y8E[] = {
  NSPAIR(_ZN3ccc8CC8x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC8x11y83efgEv();
extern void _ZN3ccc8CC8x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y83efgEv,_ZTv0_n12_N3ccc8CC8x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y83efgEv,_ZThn4_N3ccc8CC8x11y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x11y83abcEv,_ZTv0_n16_N3ccc8CC8x11y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y83abcEv,_ZThn4_N3ccc8CC8x11y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y83efgEv,_ZTv0_n12_N3ccc8CC8x11y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x11y83abcEv,_ZTv0_n16_N3ccc8CC8x11y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y8E[] = {
  {&(_ZTVN3ccc8CC8x11y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x11y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y8E[];
static VTBL_ENTRY alt_thunk_names1503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x11y83abcEv,_ZTv0_n16_N3ccc8CC8x11y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y83abcEv,_ZThn4_N3ccc8CC8x11y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y83efgEv,_ZTv0_n12_N3ccc8CC8x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y83efgEv,_ZThn4_N3ccc8CC8x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y8E = {  "_ZN3ccc8CC8x11y8E", // class name
  bases__ZN3ccc8CC8x11y8E, 2,
  &(vtc__ZN3ccc8CC8x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y8E),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  DD8x11y8  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD8x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD8x11y83abcEv
  ~DD8x11y8(); // tgen
  DD8x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y8E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y83efgEv");}
void  ccc::DD8x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x11y83abcEv");}
ccc::DD8x11y8 ::~DD8x11y8(){ note_dtor("_ZN3ccc8DD8x11y8E", this);} // tgen
ccc::DD8x11y8 ::DD8x11y8(){ note_ctor("_ZN3ccc8DD8x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y8E, buf);
    ::ccc::DD8x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y8E);
    dp->::ccc::DD8x11y8::~DD8x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y8E(Test__ZN3ccc8DD8x11y8E, "_ZN3ccc8DD8x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y8C1Ev();
extern void _ZN3ccc8DD8x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y8E[] = {
  NSPAIR(_ZN3ccc8DD8x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y8E[];
extern void _ZN3ccc8DD8x11y83efgEv();
extern void _ZN3ccc8DD8x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y83efgEv,_ZTv0_n16_N3ccc8DD8x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y83efgEv,_ZThn4_N3ccc8DD8x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y83efgEv,_ZTv0_n16_N3ccc8DD8x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y8E[] = {
  {&(_ZTVN3ccc8DD8x11y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x11y8E[6]),  6,14},
  {&(_ZTVN3ccc8DD8x11y8E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y8E[];
static VTBL_ENTRY alt_thunk_names1504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y83efgEv,_ZTv0_n16_N3ccc8DD8x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y83efgEv,_ZThn4_N3ccc8DD8x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y8E = {  "_ZN3ccc8DD8x11y8E", // class name
  bases__ZN3ccc8DD8x11y8E, 2,
  &(vtc__ZN3ccc8DD8x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y8E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y8E),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  CC8x11y9  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC8x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x11y93pqrEv
  ~CC8x11y9(); // tgen
  CC8x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x11y9E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x11y93efgEv");}
void  ccc::CC8x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x11y93pqrEv");}
ccc::CC8x11y9 ::~CC8x11y9(){ note_dtor("_ZN3ccc8CC8x11y9E", this);} // tgen
ccc::CC8x11y9 ::CC8x11y9(){ note_ctor("_ZN3ccc8CC8x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC8x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x11y9E, buf);
    ::ccc::CC8x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x11y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC8x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x11y9E);
    dp->::ccc::CC8x11y9::~CC8x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x11y9E(Test__ZN3ccc8CC8x11y9E, "_ZN3ccc8CC8x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x11y9C1Ev();
extern void _ZN3ccc8CC8x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC8x11y9E[] = {
  NSPAIR(_ZN3ccc8CC8x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC8x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC8x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x11y9E[];
extern void _ZN3ccc8CC8x11y93pqrEv();
extern void _ZN3ccc8CC8x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x11y93efgEv,_ZTv0_n12_N3ccc8CC8x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x11y93efgEv,_ZThn4_N3ccc8CC8x11y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x11y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x11y93efgEv,_ZTv0_n12_N3ccc8CC8x11y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x11y9E[] = {
  {&(_ZTVN3ccc8CC8x11y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x11y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x11y9E[];
static VTBL_ENTRY alt_thunk_names1505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x11y93efgEv,_ZTv0_n12_N3ccc8CC8x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x11y93efgEv,_ZThn4_N3ccc8CC8x11y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x11y9E = {  "_ZN3ccc8CC8x11y9E", // class name
  bases__ZN3ccc8CC8x11y9E, 2,
  &(vtc__ZN3ccc8CC8x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x11y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x11y9E),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  DD8x11y9  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD8x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x11y93pqrEv
  ~DD8x11y9(); // tgen
  DD8x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD8x11y9E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x11y93efgEv");}
void  ccc::DD8x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x11y93pqrEv");}
ccc::DD8x11y9 ::~DD8x11y9(){ note_dtor("_ZN3ccc8DD8x11y9E", this);} // tgen
ccc::DD8x11y9 ::DD8x11y9(){ note_ctor("_ZN3ccc8DD8x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD8x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x11y9E, buf);
    ::ccc::DD8x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x11y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD8x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x11y9E);
    dp->::ccc::DD8x11y9::~DD8x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x11y9E(Test__ZN3ccc8DD8x11y9E, "_ZN3ccc8DD8x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x11y9C1Ev();
extern void _ZN3ccc8DD8x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD8x11y9E[] = {
  NSPAIR(_ZN3ccc8DD8x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD8x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD8x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y9E[];
extern void _ZN3ccc8DD8x11y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x11y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x11y93pqrEv,_ZTv0_n12_N3ccc8DD8x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y93pqrEv,_ZThn4_N3ccc8DD8x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD8x11y93efgEv,_ZTv0_n16_N3ccc8DD8x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x11y93efgEv,_ZThn4_N3ccc8DD8x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x11y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x11y93pqrEv,_ZTv0_n12_N3ccc8DD8x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD8x11y93efgEv,_ZTv0_n16_N3ccc8DD8x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x11y9E[] = {
  {&(_ZTVN3ccc8DD8x11y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y9E[6]),  6,15},
  {&(_ZTVN3ccc8DD8x11y9E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x11y9E[];
static VTBL_ENTRY alt_thunk_names1506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD8x11y93efgEv,_ZTv0_n16_N3ccc8DD8x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y93efgEv,_ZThn4_N3ccc8DD8x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x11y93pqrEv,_ZTv0_n12_N3ccc8DD8x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x11y93pqrEv,_ZThn4_N3ccc8DD8x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x11y9E = {  "_ZN3ccc8DD8x11y9E", // class name
  bases__ZN3ccc8DD8x11y9E, 2,
  &(vtc__ZN3ccc8DD8x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x11y9E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x11y9E),3, //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  CC8x11y10  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC8x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x11y103abcEv
  ~CC8x11y10(); // tgen
  CC8x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y10E) C1{ VBC2{ v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x11y103pqrEv");}
void  ccc::CC8x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x11y103abcEv");}
ccc::CC8x11y10 ::~CC8x11y10(){ note_dtor("_ZN3ccc9CC8x11y10E", this);} // tgen
ccc::CC8x11y10 ::CC8x11y10(){ note_ctor("_ZN3ccc9CC8x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC8x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x11y10E, buf);
    ::ccc::CC8x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x11y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC8x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x11y10E);
    dp->::ccc::CC8x11y10::~CC8x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x11y10E(Test__ZN3ccc9CC8x11y10E, "_ZN3ccc9CC8x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x11y10C1Ev();
extern void _ZN3ccc9CC8x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC8x11y10E[] = {
  NSPAIR(_ZN3ccc9CC8x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC8x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC8x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x11y10E[];
extern void _ZN3ccc9CC8x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC8x11y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x11y103abcEv,_ZTv0_n16_N3ccc9CC8x11y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y103abcEv,_ZThn4_N3ccc9CC8x11y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x11y103abcEv,_ZTv0_n16_N3ccc9CC8x11y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x11y10E[] = {
  {&(_ZTVN3ccc9CC8x11y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC8x11y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x11y10E[];
static VTBL_ENTRY alt_thunk_names1507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x11y103abcEv,_ZTv0_n16_N3ccc9CC8x11y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x11y103abcEv,_ZThn4_N3ccc9CC8x11y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x11y10E = {  "_ZN3ccc9CC8x11y10E", // class name
  bases__ZN3ccc9CC8x11y10E, 2,
  &(vtc__ZN3ccc9CC8x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x11y10E),2, //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  DD8x11y10  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD8x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD8x11y103abcEv
  ~DD8x11y10(); // tgen
  DD8x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD8x11y10E) C1{ VBC2{ v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x11y103pqrEv");}
void  ccc::DD8x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x11y103abcEv");}
ccc::DD8x11y10 ::~DD8x11y10(){ note_dtor("_ZN3ccc9DD8x11y10E", this);} // tgen
ccc::DD8x11y10 ::DD8x11y10(){ note_ctor("_ZN3ccc9DD8x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD8x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x11y10E, buf);
    ::ccc::DD8x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x11y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD8x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x11y10E);
    dp->::ccc::DD8x11y10::~DD8x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x11y10E(Test__ZN3ccc9DD8x11y10E, "_ZN3ccc9DD8x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x11y10C1Ev();
extern void _ZN3ccc9DD8x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD8x11y10E[] = {
  NSPAIR(_ZN3ccc9DD8x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD8x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD8x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x11y103abcEv();
extern void _ZN3ccc9DD8x11y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x11y103pqrEv,_ZTv0_n12_N3ccc9DD8x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x11y103pqrEv,_ZThn4_N3ccc9DD8x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y103pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x11y103pqrEv,_ZTv0_n12_N3ccc9DD8x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x11y10E[] = {
  {&(_ZTVN3ccc9DD8x11y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x11y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x11y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x11y10E[];
static VTBL_ENTRY alt_thunk_names1508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x11y103pqrEv,_ZTv0_n12_N3ccc9DD8x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x11y103pqrEv,_ZThn4_N3ccc9DD8x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x11y10E = {  "_ZN3ccc9DD8x11y10E", // class name
  bases__ZN3ccc9DD8x11y10E, 2,
  &(vtc__ZN3ccc9DD8x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x11y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x11y10E),3, //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  CC8x11y11  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC8x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x11y113efgEv
  ~CC8x11y11(); // tgen
  CC8x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y11E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x11y113pqrEv");}
void  ccc::CC8x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x11y113efgEv");}
ccc::CC8x11y11 ::~CC8x11y11(){ note_dtor("_ZN3ccc9CC8x11y11E", this);} // tgen
ccc::CC8x11y11 ::CC8x11y11(){ note_ctor("_ZN3ccc9CC8x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC8x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x11y11E, buf);
    ::ccc::CC8x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x11y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC8x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x11y11E);
    dp->::ccc::CC8x11y11::~CC8x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x11y11E(Test__ZN3ccc9CC8x11y11E, "_ZN3ccc9CC8x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x11y11C1Ev();
extern void _ZN3ccc9CC8x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC8x11y11E[] = {
  NSPAIR(_ZN3ccc9CC8x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC8x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC8x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x11y11E[];
extern void _ZN3ccc9CC8x11y113pqrEv();
extern void _ZN3ccc9CC8x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x11y113efgEv,_ZTv0_n12_N3ccc9CC8x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y113efgEv,_ZThn4_N3ccc9CC8x11y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x11y113efgEv,_ZTv0_n12_N3ccc9CC8x11y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x11y11E[] = {
  {&(_ZTVN3ccc9CC8x11y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x11y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x11y11E[];
static VTBL_ENTRY alt_thunk_names1509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x11y113efgEv,_ZTv0_n12_N3ccc9CC8x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x11y113efgEv,_ZThn4_N3ccc9CC8x11y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x11y11E = {  "_ZN3ccc9CC8x11y11E", // class name
  bases__ZN3ccc9CC8x11y11E, 2,
  &(vtc__ZN3ccc9CC8x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x11y11E),2, //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  DD8x11y11  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD8x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD8x11y113efgEv
  ~DD8x11y11(); // tgen
  DD8x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD8x11y11E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x11y113pqrEv");}
void  ccc::DD8x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x11y113efgEv");}
ccc::DD8x11y11 ::~DD8x11y11(){ note_dtor("_ZN3ccc9DD8x11y11E", this);} // tgen
ccc::DD8x11y11 ::DD8x11y11(){ note_ctor("_ZN3ccc9DD8x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD8x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x11y11E, buf);
    ::ccc::DD8x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x11y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD8x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x11y11E);
    dp->::ccc::DD8x11y11::~DD8x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x11y11E(Test__ZN3ccc9DD8x11y11E, "_ZN3ccc9DD8x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x11y11C1Ev();
extern void _ZN3ccc9DD8x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD8x11y11E[] = {
  NSPAIR(_ZN3ccc9DD8x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD8x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD8x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y11E[];
extern void _ZN3ccc9DD8x11y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x11y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x11y113pqrEv,_ZTv0_n12_N3ccc9DD8x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x11y113pqrEv,_ZThn4_N3ccc9DD8x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD8x11y113efgEv,_ZTv0_n16_N3ccc9DD8x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x11y113efgEv,_ZThn4_N3ccc9DD8x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x11y113pqrEv,_ZTv0_n12_N3ccc9DD8x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD8x11y113efgEv,_ZTv0_n16_N3ccc9DD8x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x11y11E[] = {
  {&(_ZTVN3ccc9DD8x11y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x11y11E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x11y11E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x11y11E[];
static VTBL_ENTRY alt_thunk_names1510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD8x11y113efgEv,_ZTv0_n16_N3ccc9DD8x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x11y113efgEv,_ZThn4_N3ccc9DD8x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x11y113pqrEv,_ZTv0_n12_N3ccc9DD8x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x11y113pqrEv,_ZThn4_N3ccc9DD8x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x11y11E = {  "_ZN3ccc9DD8x11y11E", // class name
  bases__ZN3ccc9DD8x11y11E, 2,
  &(vtc__ZN3ccc9DD8x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x11y11E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x11y11E),3, //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  CC8x11y12  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC8x11y123abcEv
  ~CC8x11y12(); // tgen
  CC8x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y12E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC8x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x11y123abcEv");}
ccc::CC8x11y12 ::~CC8x11y12(){ note_dtor("_ZN3ccc9CC8x11y12E", this);} // tgen
ccc::CC8x11y12 ::CC8x11y12(){ note_ctor("_ZN3ccc9CC8x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC8x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x11y12E, buf);
    ::ccc::CC8x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x11y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC8x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x11y12E);
    dp->::ccc::CC8x11y12::~CC8x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x11y12E(Test__ZN3ccc9CC8x11y12E, "_ZN3ccc9CC8x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x11y12C1Ev();
extern void _ZN3ccc9CC8x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC8x11y12E[] = {
  NSPAIR(_ZN3ccc9CC8x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC8x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC8x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC8x11y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x11y123abcEv,_ZTv0_n16_N3ccc9CC8x11y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y123abcEv,_ZThn4_N3ccc9CC8x11y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x11y123abcEv,_ZTv0_n16_N3ccc9CC8x11y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x11y12E[] = {
  {&(_ZTVN3ccc9CC8x11y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC8x11y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x11y12E[];
static VTBL_ENTRY alt_thunk_names1511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x11y123abcEv,_ZTv0_n16_N3ccc9CC8x11y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x11y123abcEv,_ZThn4_N3ccc9CC8x11y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x11y12E = {  "_ZN3ccc9CC8x11y12E", // class name
  bases__ZN3ccc9CC8x11y12E, 2,
  &(vtc__ZN3ccc9CC8x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x11y12E),2, //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  DD8x11y12  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD8x11y123abcEv
  ~DD8x11y12(); // tgen
  DD8x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD8x11y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD8x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x11y123abcEv");}
ccc::DD8x11y12 ::~DD8x11y12(){ note_dtor("_ZN3ccc9DD8x11y12E", this);} // tgen
ccc::DD8x11y12 ::DD8x11y12(){ note_ctor("_ZN3ccc9DD8x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD8x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x11y12E, buf);
    ::ccc::DD8x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x11y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD8x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x11y12E);
    dp->::ccc::DD8x11y12::~DD8x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x11y12E(Test__ZN3ccc9DD8x11y12E, "_ZN3ccc9DD8x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x11y12C1Ev();
extern void _ZN3ccc9DD8x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD8x11y12E[] = {
  NSPAIR(_ZN3ccc9DD8x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD8x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD8x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x11y12E[] = {
  {&(_ZTVN3ccc9DD8x11y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x11y12E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x11y12E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x11y12E[];
Class_Descriptor cd__ZN3ccc9DD8x11y12E = {  "_ZN3ccc9DD8x11y12E", // class name
  bases__ZN3ccc9DD8x11y12E, 2,
  &(vtc__ZN3ccc9DD8x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x11y12E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x11y12E),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  CC8x11y13  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC8x11y133efgEv
  ~CC8x11y13(); // tgen
  CC8x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC8x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x11y133efgEv");}
ccc::CC8x11y13 ::~CC8x11y13(){ note_dtor("_ZN3ccc9CC8x11y13E", this);} // tgen
ccc::CC8x11y13 ::CC8x11y13(){ note_ctor("_ZN3ccc9CC8x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC8x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x11y13E, buf);
    ::ccc::CC8x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x11y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC8x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x11y13E);
    dp->::ccc::CC8x11y13::~CC8x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x11y13E(Test__ZN3ccc9CC8x11y13E, "_ZN3ccc9CC8x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x11y13C1Ev();
extern void _ZN3ccc9CC8x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC8x11y13E[] = {
  NSPAIR(_ZN3ccc9CC8x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC8x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC8x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC8x11y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x11y133efgEv,_ZTv0_n12_N3ccc9CC8x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x11y133efgEv,_ZThn4_N3ccc9CC8x11y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x11y133efgEv,_ZTv0_n12_N3ccc9CC8x11y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x11y13E[] = {
  {&(_ZTVN3ccc9CC8x11y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x11y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x11y13E[];
static VTBL_ENTRY alt_thunk_names1512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x11y133efgEv,_ZTv0_n12_N3ccc9CC8x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x11y133efgEv,_ZThn4_N3ccc9CC8x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x11y13E = {  "_ZN3ccc9CC8x11y13E", // class name
  bases__ZN3ccc9CC8x11y13E, 2,
  &(vtc__ZN3ccc9CC8x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x11y13E),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  DD8x11y13  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD8x11y133efgEv
  ~DD8x11y13(); // tgen
  DD8x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD8x11y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD8x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x11y133efgEv");}
ccc::DD8x11y13 ::~DD8x11y13(){ note_dtor("_ZN3ccc9DD8x11y13E", this);} // tgen
ccc::DD8x11y13 ::DD8x11y13(){ note_ctor("_ZN3ccc9DD8x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD8x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x11y13E, buf);
    ::ccc::DD8x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x11y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD8x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x11y13E);
    dp->::ccc::DD8x11y13::~DD8x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x11y13E(Test__ZN3ccc9DD8x11y13E, "_ZN3ccc9DD8x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x11y13C1Ev();
extern void _ZN3ccc9DD8x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD8x11y13E[] = {
  NSPAIR(_ZN3ccc9DD8x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD8x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD8x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y13E[];
extern void _ZN3ccc9DD8x11y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD8x11y133efgEv,_ZTv0_n16_N3ccc9DD8x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x11y133efgEv,_ZThn4_N3ccc9DD8x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD8x11y133efgEv,_ZTv0_n16_N3ccc9DD8x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x11y13E[] = {
  {&(_ZTVN3ccc9DD8x11y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x11y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x11y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x11y13E[];
static VTBL_ENTRY alt_thunk_names1513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD8x11y133efgEv,_ZTv0_n16_N3ccc9DD8x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x11y133efgEv,_ZThn4_N3ccc9DD8x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x11y13E = {  "_ZN3ccc9DD8x11y13E", // class name
  bases__ZN3ccc9DD8x11y13E, 2,
  &(vtc__ZN3ccc9DD8x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x11y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x11y13E),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  CC8x11y14  : virtual ::ccc::AA8 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC8x11y143pqrEv
  ~CC8x11y14(); // tgen
  CC8x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y14E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC8x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x11y143pqrEv");}
ccc::CC8x11y14 ::~CC8x11y14(){ note_dtor("_ZN3ccc9CC8x11y14E", this);} // tgen
ccc::CC8x11y14 ::CC8x11y14(){ note_ctor("_ZN3ccc9CC8x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC8x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x11y14E, buf);
    ::ccc::CC8x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x11y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC8x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x11y14E);
    dp->::ccc::CC8x11y14::~CC8x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x11y14E(Test__ZN3ccc9CC8x11y14E, "_ZN3ccc9CC8x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x11y14C1Ev();
extern void _ZN3ccc9CC8x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC8x11y14E[] = {
  NSPAIR(_ZN3ccc9CC8x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC8x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC8x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x11y14E[];
extern void _ZN3ccc9CC8x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x11y14E[] = {
  {&(_ZTVN3ccc9CC8x11y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x11y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x11y14E[];
Class_Descriptor cd__ZN3ccc9CC8x11y14E = {  "_ZN3ccc9CC8x11y14E", // class name
  bases__ZN3ccc9CC8x11y14E, 2,
  &(vtc__ZN3ccc9CC8x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x11y14E),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  DD8x11y14  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD8x11y143pqrEv
  ~DD8x11y14(); // tgen
  DD8x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD8x11y14E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD8x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x11y143pqrEv");}
ccc::DD8x11y14 ::~DD8x11y14(){ note_dtor("_ZN3ccc9DD8x11y14E", this);} // tgen
ccc::DD8x11y14 ::DD8x11y14(){ note_ctor("_ZN3ccc9DD8x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD8x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x11y14E, buf);
    ::ccc::DD8x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x11y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD8x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x11y14E);
    dp->::ccc::DD8x11y14::~DD8x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x11y14E(Test__ZN3ccc9DD8x11y14E, "_ZN3ccc9DD8x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x11y14C1Ev();
extern void _ZN3ccc9DD8x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD8x11y14E[] = {
  NSPAIR(_ZN3ccc9DD8x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD8x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD8x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x11y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x11y143pqrEv,_ZTv0_n12_N3ccc9DD8x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x11y143pqrEv,_ZThn4_N3ccc9DD8x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x11y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x11y143pqrEv,_ZTv0_n12_N3ccc9DD8x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x11y14E[] = {
  {&(_ZTVN3ccc9DD8x11y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x11y14E[6]),  6,15},
  {&(_ZTVN3ccc9DD8x11y14E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x11y14E[];
static VTBL_ENTRY alt_thunk_names1514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x11y143pqrEv,_ZTv0_n12_N3ccc9DD8x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x11y143pqrEv,_ZThn4_N3ccc9DD8x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x11y14E = {  "_ZN3ccc9DD8x11y14E", // class name
  bases__ZN3ccc9DD8x11y14E, 2,
  &(vtc__ZN3ccc9DD8x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x11y14E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x11y14E),3, //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  CC8x11y15  : virtual ::ccc::AA8 , ::ccc::BB11 {
  ~CC8x11y15(); // tgen
  CC8x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x11y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC8x11y15 ::~CC8x11y15(){ note_dtor("_ZN3ccc9CC8x11y15E", this);} // tgen
ccc::CC8x11y15 ::CC8x11y15(){ note_ctor("_ZN3ccc9CC8x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC8x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x11y15E, buf);
    ::ccc::CC8x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x11y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC8x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x11y15E);
    dp->::ccc::CC8x11y15::~CC8x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x11y15E(Test__ZN3ccc9CC8x11y15E, "_ZN3ccc9CC8x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x11y15C1Ev();
extern void _ZN3ccc9CC8x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC8x11y15E[] = {
  NSPAIR(_ZN3ccc9CC8x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC8x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC8x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x11y15E[] = {
  {&(_ZTVN3ccc9CC8x11y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x11y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x11y15E[];
Class_Descriptor cd__ZN3ccc9CC8x11y15E = {  "_ZN3ccc9CC8x11y15E", // class name
  bases__ZN3ccc9CC8x11y15E, 2,
  &(vtc__ZN3ccc9CC8x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x11y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x11y15E),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  DD8x11y15  : virtual ::ccc::AA8 , virtual ::ccc::BB11 {
  ~DD8x11y15(); // tgen
  DD8x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD8x11y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD8x11y15 ::~DD8x11y15(){ note_dtor("_ZN3ccc9DD8x11y15E", this);} // tgen
ccc::DD8x11y15 ::DD8x11y15(){ note_ctor("_ZN3ccc9DD8x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD8x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x11y15E, buf);
    ::ccc::DD8x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x11y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD8x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x11y15E);
    dp->::ccc::DD8x11y15::~DD8x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x11y15E(Test__ZN3ccc9DD8x11y15E, "_ZN3ccc9DD8x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x11y15C1Ev();
extern void _ZN3ccc9DD8x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD8x11y15E[] = {
  NSPAIR(_ZN3ccc9DD8x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD8x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD8x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x11y15E[] = {
  {&(_ZTVN3ccc9DD8x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD8x11y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x11y15E[];
Class_Descriptor cd__ZN3ccc9DD8x11y15E = {  "_ZN3ccc9DD8x11y15E", // class name
  bases__ZN3ccc9DD8x11y15E, 2,
  &(vtc__ZN3ccc9DD8x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x11y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x11y15E),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  CC8x12y0  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y03pqrEv
  ~CC8x12y0(); // tgen
  CC8x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y0E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y03abcEv");}
void  ccc::CC8x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y03efgEv");}
void  ccc::CC8x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y03pqrEv");}
ccc::CC8x12y0 ::~CC8x12y0(){ note_dtor("_ZN3ccc8CC8x12y0E", this);} // tgen
ccc::CC8x12y0 ::CC8x12y0(){ note_ctor("_ZN3ccc8CC8x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y0E, buf);
    ::ccc::CC8x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y0E);
    dp->::ccc::CC8x12y0::~CC8x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y0E(Test__ZN3ccc8CC8x12y0E, "_ZN3ccc8CC8x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y0C1Ev();
extern void _ZN3ccc8CC8x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y0E[] = {
  NSPAIR(_ZN3ccc8CC8x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y0E[];
extern void _ZN3ccc8CC8x12y03abcEv();
extern void _ZN3ccc8CC8x12y03efgEv();
extern void _ZN3ccc8CC8x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y03efgEv,_ZTv0_n12_N3ccc8CC8x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y03efgEv,_ZThn4_N3ccc8CC8x12y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y03abcEv,_ZTv0_n16_N3ccc8CC8x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y03abcEv,_ZThn4_N3ccc8CC8x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y03efgEv,_ZTv0_n12_N3ccc8CC8x12y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y03abcEv,_ZTv0_n16_N3ccc8CC8x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y0E[] = {
  {&(_ZTVN3ccc8CC8x12y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y0E[];
static VTBL_ENTRY alt_thunk_names1515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y03abcEv,_ZTv0_n16_N3ccc8CC8x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y03abcEv,_ZThn4_N3ccc8CC8x12y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y03efgEv,_ZTv0_n12_N3ccc8CC8x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y03efgEv,_ZThn4_N3ccc8CC8x12y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y0E = {  "_ZN3ccc8CC8x12y0E", // class name
  bases__ZN3ccc8CC8x12y0E, 2,
  &(vtc__ZN3ccc8CC8x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y0E),2, //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  DD8x12y0  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD8x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD8x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x12y03pqrEv
  ~DD8x12y0(); // tgen
  DD8x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y0E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y03abcEv");}
void  ccc::DD8x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y03efgEv");}
void  ccc::DD8x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y03pqrEv");}
ccc::DD8x12y0 ::~DD8x12y0(){ note_dtor("_ZN3ccc8DD8x12y0E", this);} // tgen
ccc::DD8x12y0 ::DD8x12y0(){ note_ctor("_ZN3ccc8DD8x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y0E, buf);
    ::ccc::DD8x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y0E);
    dp->::ccc::DD8x12y0::~DD8x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y0E(Test__ZN3ccc8DD8x12y0E, "_ZN3ccc8DD8x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y0C1Ev();
extern void _ZN3ccc8DD8x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y0E[] = {
  NSPAIR(_ZN3ccc8DD8x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y0E[];
extern void _ZN3ccc8DD8x12y03efgEv();
extern void _ZN3ccc8DD8x12y03abcEv();
extern void _ZN3ccc8DD8x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y03abcEv,_ZTv0_n12_N3ccc8DD8x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y03abcEv,_ZThn4_N3ccc8DD8x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y03abcEv,_ZTv0_n12_N3ccc8DD8x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y0E[] = {
  {&(_ZTVN3ccc8DD8x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y0E[];
static VTBL_ENTRY alt_thunk_names1516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y03abcEv,_ZTv0_n12_N3ccc8DD8x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y03abcEv,_ZThn4_N3ccc8DD8x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y0E = {  "_ZN3ccc8DD8x12y0E", // class name
  bases__ZN3ccc8DD8x12y0E, 2,
  &(vtc__ZN3ccc8DD8x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y0E),3, //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  CC8x12y1  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x12y13efgEv
  ~CC8x12y1(); // tgen
  CC8x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y1E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y13abcEv");}
void  ccc::CC8x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y13pqrEv");}
void  ccc::CC8x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y13efgEv");}
ccc::CC8x12y1 ::~CC8x12y1(){ note_dtor("_ZN3ccc8CC8x12y1E", this);} // tgen
ccc::CC8x12y1 ::CC8x12y1(){ note_ctor("_ZN3ccc8CC8x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y1E, buf);
    ::ccc::CC8x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y1E);
    dp->::ccc::CC8x12y1::~CC8x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y1E(Test__ZN3ccc8CC8x12y1E, "_ZN3ccc8CC8x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y1C1Ev();
extern void _ZN3ccc8CC8x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y1E[] = {
  NSPAIR(_ZN3ccc8CC8x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y1E[];
extern void _ZN3ccc8CC8x12y13abcEv();
extern void _ZN3ccc8CC8x12y13pqrEv();
extern void _ZN3ccc8CC8x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y13efgEv,_ZTv0_n12_N3ccc8CC8x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y13efgEv,_ZThn4_N3ccc8CC8x12y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y13abcEv,_ZTv0_n16_N3ccc8CC8x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y13abcEv,_ZThn4_N3ccc8CC8x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y13efgEv,_ZTv0_n12_N3ccc8CC8x12y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y13abcEv,_ZTv0_n16_N3ccc8CC8x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y1E[] = {
  {&(_ZTVN3ccc8CC8x12y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y1E[];
static VTBL_ENTRY alt_thunk_names1517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y13abcEv,_ZTv0_n16_N3ccc8CC8x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y13abcEv,_ZThn4_N3ccc8CC8x12y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y13efgEv,_ZTv0_n12_N3ccc8CC8x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y13efgEv,_ZThn4_N3ccc8CC8x12y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y1E = {  "_ZN3ccc8CC8x12y1E", // class name
  bases__ZN3ccc8CC8x12y1E, 2,
  &(vtc__ZN3ccc8CC8x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y1E),2, //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  DD8x12y1  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD8x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x12y13efgEv
  ~DD8x12y1(); // tgen
  DD8x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y1E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y13abcEv");}
void  ccc::DD8x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y13pqrEv");}
void  ccc::DD8x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y13efgEv");}
ccc::DD8x12y1 ::~DD8x12y1(){ note_dtor("_ZN3ccc8DD8x12y1E", this);} // tgen
ccc::DD8x12y1 ::DD8x12y1(){ note_ctor("_ZN3ccc8DD8x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y1E, buf);
    ::ccc::DD8x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y1E);
    dp->::ccc::DD8x12y1::~DD8x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y1E(Test__ZN3ccc8DD8x12y1E, "_ZN3ccc8DD8x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y1C1Ev();
extern void _ZN3ccc8DD8x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y1E[] = {
  NSPAIR(_ZN3ccc8DD8x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y1E[];
extern void _ZN3ccc8DD8x12y13efgEv();
extern void _ZN3ccc8DD8x12y13abcEv();
extern void _ZN3ccc8DD8x12y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y13abcEv,_ZTv0_n12_N3ccc8DD8x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y13abcEv,_ZThn4_N3ccc8DD8x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y13abcEv,_ZTv0_n12_N3ccc8DD8x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y1E[] = {
  {&(_ZTVN3ccc8DD8x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y1E[];
static VTBL_ENTRY alt_thunk_names1518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y13abcEv,_ZTv0_n12_N3ccc8DD8x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y13abcEv,_ZThn4_N3ccc8DD8x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y1E = {  "_ZN3ccc8DD8x12y1E", // class name
  bases__ZN3ccc8DD8x12y1E, 2,
  &(vtc__ZN3ccc8DD8x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y1E),3, //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  CC8x12y2  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y23pqrEv
  ~CC8x12y2(); // tgen
  CC8x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y2E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y23efgEv");}
void  ccc::CC8x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y23abcEv");}
void  ccc::CC8x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y23pqrEv");}
ccc::CC8x12y2 ::~CC8x12y2(){ note_dtor("_ZN3ccc8CC8x12y2E", this);} // tgen
ccc::CC8x12y2 ::CC8x12y2(){ note_ctor("_ZN3ccc8CC8x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y2E, buf);
    ::ccc::CC8x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y2E);
    dp->::ccc::CC8x12y2::~CC8x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y2E(Test__ZN3ccc8CC8x12y2E, "_ZN3ccc8CC8x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y2C1Ev();
extern void _ZN3ccc8CC8x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y2E[] = {
  NSPAIR(_ZN3ccc8CC8x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y2E[];
extern void _ZN3ccc8CC8x12y23abcEv();
extern void _ZN3ccc8CC8x12y23efgEv();
extern void _ZN3ccc8CC8x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y23efgEv,_ZTv0_n12_N3ccc8CC8x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y23efgEv,_ZThn4_N3ccc8CC8x12y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y23abcEv,_ZTv0_n16_N3ccc8CC8x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y23abcEv,_ZThn4_N3ccc8CC8x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y23efgEv,_ZTv0_n12_N3ccc8CC8x12y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y23abcEv,_ZTv0_n16_N3ccc8CC8x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y2E[] = {
  {&(_ZTVN3ccc8CC8x12y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y2E[];
static VTBL_ENTRY alt_thunk_names1519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y23abcEv,_ZTv0_n16_N3ccc8CC8x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y23abcEv,_ZThn4_N3ccc8CC8x12y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y23efgEv,_ZTv0_n12_N3ccc8CC8x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y23efgEv,_ZThn4_N3ccc8CC8x12y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y2E = {  "_ZN3ccc8CC8x12y2E", // class name
  bases__ZN3ccc8CC8x12y2E, 2,
  &(vtc__ZN3ccc8CC8x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y2E),2, //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  DD8x12y2  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD8x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD8x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x12y23pqrEv
  ~DD8x12y2(); // tgen
  DD8x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y2E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y23efgEv");}
void  ccc::DD8x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y23abcEv");}
void  ccc::DD8x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y23pqrEv");}
ccc::DD8x12y2 ::~DD8x12y2(){ note_dtor("_ZN3ccc8DD8x12y2E", this);} // tgen
ccc::DD8x12y2 ::DD8x12y2(){ note_ctor("_ZN3ccc8DD8x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y2E, buf);
    ::ccc::DD8x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y2E);
    dp->::ccc::DD8x12y2::~DD8x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y2E(Test__ZN3ccc8DD8x12y2E, "_ZN3ccc8DD8x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y2C1Ev();
extern void _ZN3ccc8DD8x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y2E[] = {
  NSPAIR(_ZN3ccc8DD8x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y2E[];
extern void _ZN3ccc8DD8x12y23efgEv();
extern void _ZN3ccc8DD8x12y23abcEv();
extern void _ZN3ccc8DD8x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y23abcEv,_ZTv0_n12_N3ccc8DD8x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y23abcEv,_ZThn4_N3ccc8DD8x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y23abcEv,_ZTv0_n12_N3ccc8DD8x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y2E[] = {
  {&(_ZTVN3ccc8DD8x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y2E[];
static VTBL_ENTRY alt_thunk_names1520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y23abcEv,_ZTv0_n12_N3ccc8DD8x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y23abcEv,_ZThn4_N3ccc8DD8x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y2E = {  "_ZN3ccc8DD8x12y2E", // class name
  bases__ZN3ccc8DD8x12y2E, 2,
  &(vtc__ZN3ccc8DD8x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y2E),3, //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  CC8x12y3  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x12y33abcEv
  ~CC8x12y3(); // tgen
  CC8x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y3E) C1{ VBC2{ v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y33efgEv");}
void  ccc::CC8x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y33pqrEv");}
void  ccc::CC8x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y33abcEv");}
ccc::CC8x12y3 ::~CC8x12y3(){ note_dtor("_ZN3ccc8CC8x12y3E", this);} // tgen
ccc::CC8x12y3 ::CC8x12y3(){ note_ctor("_ZN3ccc8CC8x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y3E, buf);
    ::ccc::CC8x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y3E);
    dp->::ccc::CC8x12y3::~CC8x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y3E(Test__ZN3ccc8CC8x12y3E, "_ZN3ccc8CC8x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y3C1Ev();
extern void _ZN3ccc8CC8x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y3E[] = {
  NSPAIR(_ZN3ccc8CC8x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y3E[];
extern void _ZN3ccc8CC8x12y33abcEv();
extern void _ZN3ccc8CC8x12y33efgEv();
extern void _ZN3ccc8CC8x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y33efgEv,_ZTv0_n12_N3ccc8CC8x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y33efgEv,_ZThn4_N3ccc8CC8x12y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y33abcEv,_ZTv0_n16_N3ccc8CC8x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y33abcEv,_ZThn4_N3ccc8CC8x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y33efgEv,_ZTv0_n12_N3ccc8CC8x12y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y33abcEv,_ZTv0_n16_N3ccc8CC8x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y3E[] = {
  {&(_ZTVN3ccc8CC8x12y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y3E[];
static VTBL_ENTRY alt_thunk_names1521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y33abcEv,_ZTv0_n16_N3ccc8CC8x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y33abcEv,_ZThn4_N3ccc8CC8x12y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y33efgEv,_ZTv0_n12_N3ccc8CC8x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y33efgEv,_ZThn4_N3ccc8CC8x12y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y3E = {  "_ZN3ccc8CC8x12y3E", // class name
  bases__ZN3ccc8CC8x12y3E, 2,
  &(vtc__ZN3ccc8CC8x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y3E),2, //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  DD8x12y3  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD8x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x12y33abcEv
  ~DD8x12y3(); // tgen
  DD8x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y3E) C1{ VBC2{ v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y33efgEv");}
void  ccc::DD8x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y33pqrEv");}
void  ccc::DD8x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y33abcEv");}
ccc::DD8x12y3 ::~DD8x12y3(){ note_dtor("_ZN3ccc8DD8x12y3E", this);} // tgen
ccc::DD8x12y3 ::DD8x12y3(){ note_ctor("_ZN3ccc8DD8x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y3E, buf);
    ::ccc::DD8x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y3E);
    dp->::ccc::DD8x12y3::~DD8x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y3E(Test__ZN3ccc8DD8x12y3E, "_ZN3ccc8DD8x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y3C1Ev();
extern void _ZN3ccc8DD8x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y3E[] = {
  NSPAIR(_ZN3ccc8DD8x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y3E[];
extern void _ZN3ccc8DD8x12y33efgEv();
extern void _ZN3ccc8DD8x12y33abcEv();
extern void _ZN3ccc8DD8x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y33abcEv,_ZTv0_n12_N3ccc8DD8x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y33abcEv,_ZThn4_N3ccc8DD8x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y33abcEv,_ZTv0_n12_N3ccc8DD8x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y3E[] = {
  {&(_ZTVN3ccc8DD8x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y3E[];
static VTBL_ENTRY alt_thunk_names1522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y33abcEv,_ZTv0_n12_N3ccc8DD8x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y33abcEv,_ZThn4_N3ccc8DD8x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y3E = {  "_ZN3ccc8DD8x12y3E", // class name
  bases__ZN3ccc8DD8x12y3E, 2,
  &(vtc__ZN3ccc8DD8x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y3E),3, //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  CC8x12y4  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC8x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x12y43efgEv
  ~CC8x12y4(); // tgen
  CC8x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y4E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y43pqrEv");}
void  ccc::CC8x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y43abcEv");}
void  ccc::CC8x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y43efgEv");}
ccc::CC8x12y4 ::~CC8x12y4(){ note_dtor("_ZN3ccc8CC8x12y4E", this);} // tgen
ccc::CC8x12y4 ::CC8x12y4(){ note_ctor("_ZN3ccc8CC8x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y4E, buf);
    ::ccc::CC8x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y4E);
    dp->::ccc::CC8x12y4::~CC8x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y4E(Test__ZN3ccc8CC8x12y4E, "_ZN3ccc8CC8x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y4C1Ev();
extern void _ZN3ccc8CC8x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y4E[] = {
  NSPAIR(_ZN3ccc8CC8x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y4E[];
extern void _ZN3ccc8CC8x12y43abcEv();
extern void _ZN3ccc8CC8x12y43pqrEv();
extern void _ZN3ccc8CC8x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y43efgEv,_ZTv0_n12_N3ccc8CC8x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y43efgEv,_ZThn4_N3ccc8CC8x12y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y43abcEv,_ZTv0_n16_N3ccc8CC8x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y43abcEv,_ZThn4_N3ccc8CC8x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y43efgEv,_ZTv0_n12_N3ccc8CC8x12y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y43abcEv,_ZTv0_n16_N3ccc8CC8x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y4E[] = {
  {&(_ZTVN3ccc8CC8x12y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y4E[];
static VTBL_ENTRY alt_thunk_names1523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y43abcEv,_ZTv0_n16_N3ccc8CC8x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y43abcEv,_ZThn4_N3ccc8CC8x12y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y43efgEv,_ZTv0_n12_N3ccc8CC8x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y43efgEv,_ZThn4_N3ccc8CC8x12y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y4E = {  "_ZN3ccc8CC8x12y4E", // class name
  bases__ZN3ccc8CC8x12y4E, 2,
  &(vtc__ZN3ccc8CC8x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y4E),2, //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  DD8x12y4  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD8x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD8x12y43efgEv
  ~DD8x12y4(); // tgen
  DD8x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y4E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y43pqrEv");}
void  ccc::DD8x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y43abcEv");}
void  ccc::DD8x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y43efgEv");}
ccc::DD8x12y4 ::~DD8x12y4(){ note_dtor("_ZN3ccc8DD8x12y4E", this);} // tgen
ccc::DD8x12y4 ::DD8x12y4(){ note_ctor("_ZN3ccc8DD8x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y4E, buf);
    ::ccc::DD8x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y4E);
    dp->::ccc::DD8x12y4::~DD8x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y4E(Test__ZN3ccc8DD8x12y4E, "_ZN3ccc8DD8x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y4C1Ev();
extern void _ZN3ccc8DD8x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y4E[] = {
  NSPAIR(_ZN3ccc8DD8x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y4E[];
extern void _ZN3ccc8DD8x12y43efgEv();
extern void _ZN3ccc8DD8x12y43abcEv();
extern void _ZN3ccc8DD8x12y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y43abcEv,_ZTv0_n12_N3ccc8DD8x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y43abcEv,_ZThn4_N3ccc8DD8x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y43abcEv,_ZTv0_n12_N3ccc8DD8x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y4E[] = {
  {&(_ZTVN3ccc8DD8x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y4E[];
static VTBL_ENTRY alt_thunk_names1524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y43abcEv,_ZTv0_n12_N3ccc8DD8x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y43abcEv,_ZThn4_N3ccc8DD8x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y4E = {  "_ZN3ccc8DD8x12y4E", // class name
  bases__ZN3ccc8DD8x12y4E, 2,
  &(vtc__ZN3ccc8DD8x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y4E),3, //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  CC8x12y5  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC8x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x12y53abcEv
  ~CC8x12y5(); // tgen
  CC8x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y5E) C1{ VBC2{ v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y53pqrEv");}
void  ccc::CC8x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y53efgEv");}
void  ccc::CC8x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y53abcEv");}
ccc::CC8x12y5 ::~CC8x12y5(){ note_dtor("_ZN3ccc8CC8x12y5E", this);} // tgen
ccc::CC8x12y5 ::CC8x12y5(){ note_ctor("_ZN3ccc8CC8x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y5E, buf);
    ::ccc::CC8x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y5E);
    dp->::ccc::CC8x12y5::~CC8x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y5E(Test__ZN3ccc8CC8x12y5E, "_ZN3ccc8CC8x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y5C1Ev();
extern void _ZN3ccc8CC8x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y5E[] = {
  NSPAIR(_ZN3ccc8CC8x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y5E[];
extern void _ZN3ccc8CC8x12y53abcEv();
extern void _ZN3ccc8CC8x12y53pqrEv();
extern void _ZN3ccc8CC8x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y53efgEv,_ZTv0_n12_N3ccc8CC8x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y53efgEv,_ZThn4_N3ccc8CC8x12y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y53abcEv,_ZTv0_n16_N3ccc8CC8x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y53abcEv,_ZThn4_N3ccc8CC8x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y53efgEv,_ZTv0_n12_N3ccc8CC8x12y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y53abcEv,_ZTv0_n16_N3ccc8CC8x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y5E[] = {
  {&(_ZTVN3ccc8CC8x12y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y5E[];
static VTBL_ENTRY alt_thunk_names1525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y53abcEv,_ZTv0_n16_N3ccc8CC8x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y53abcEv,_ZThn4_N3ccc8CC8x12y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y53efgEv,_ZTv0_n12_N3ccc8CC8x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y53efgEv,_ZThn4_N3ccc8CC8x12y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y5E = {  "_ZN3ccc8CC8x12y5E", // class name
  bases__ZN3ccc8CC8x12y5E, 2,
  &(vtc__ZN3ccc8CC8x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y5E),2, //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  DD8x12y5  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD8x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD8x12y53abcEv
  ~DD8x12y5(); // tgen
  DD8x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y5E) C1{ VBC2{ v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y53pqrEv");}
void  ccc::DD8x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y53efgEv");}
void  ccc::DD8x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y53abcEv");}
ccc::DD8x12y5 ::~DD8x12y5(){ note_dtor("_ZN3ccc8DD8x12y5E", this);} // tgen
ccc::DD8x12y5 ::DD8x12y5(){ note_ctor("_ZN3ccc8DD8x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y5E, buf);
    ::ccc::DD8x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y5E);
    dp->::ccc::DD8x12y5::~DD8x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y5E(Test__ZN3ccc8DD8x12y5E, "_ZN3ccc8DD8x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y5C1Ev();
extern void _ZN3ccc8DD8x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y5E[] = {
  NSPAIR(_ZN3ccc8DD8x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y5E[];
extern void _ZN3ccc8DD8x12y53efgEv();
extern void _ZN3ccc8DD8x12y53abcEv();
extern void _ZN3ccc8DD8x12y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y53abcEv,_ZTv0_n12_N3ccc8DD8x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y53abcEv,_ZThn4_N3ccc8DD8x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y53abcEv,_ZTv0_n12_N3ccc8DD8x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y5E[] = {
  {&(_ZTVN3ccc8DD8x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y5E[];
static VTBL_ENTRY alt_thunk_names1526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y53abcEv,_ZTv0_n12_N3ccc8DD8x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y53abcEv,_ZThn4_N3ccc8DD8x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y5E = {  "_ZN3ccc8DD8x12y5E", // class name
  bases__ZN3ccc8DD8x12y5E, 2,
  &(vtc__ZN3ccc8DD8x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y5E),3, //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  CC8x12y6  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x12y63efgEv
  ~CC8x12y6(); // tgen
  CC8x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y6E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y63abcEv");}
void  ccc::CC8x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y63efgEv");}
ccc::CC8x12y6 ::~CC8x12y6(){ note_dtor("_ZN3ccc8CC8x12y6E", this);} // tgen
ccc::CC8x12y6 ::CC8x12y6(){ note_ctor("_ZN3ccc8CC8x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y6E, buf);
    ::ccc::CC8x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y6E);
    dp->::ccc::CC8x12y6::~CC8x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y6E(Test__ZN3ccc8CC8x12y6E, "_ZN3ccc8CC8x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y6C1Ev();
extern void _ZN3ccc8CC8x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y6E[] = {
  NSPAIR(_ZN3ccc8CC8x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y6E[];
extern void _ZN3ccc8CC8x12y63abcEv();
extern void _ZN3ccc8CC8x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y63efgEv,_ZTv0_n12_N3ccc8CC8x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y63efgEv,_ZThn4_N3ccc8CC8x12y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y63abcEv,_ZTv0_n16_N3ccc8CC8x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y63abcEv,_ZThn4_N3ccc8CC8x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y63efgEv,_ZTv0_n12_N3ccc8CC8x12y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y63abcEv,_ZTv0_n16_N3ccc8CC8x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y6E[] = {
  {&(_ZTVN3ccc8CC8x12y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x12y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y6E[];
static VTBL_ENTRY alt_thunk_names1527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y63abcEv,_ZTv0_n16_N3ccc8CC8x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y63abcEv,_ZThn4_N3ccc8CC8x12y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y63efgEv,_ZTv0_n12_N3ccc8CC8x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y63efgEv,_ZThn4_N3ccc8CC8x12y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y6E = {  "_ZN3ccc8CC8x12y6E", // class name
  bases__ZN3ccc8CC8x12y6E, 2,
  &(vtc__ZN3ccc8CC8x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y6E),2, //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  DD8x12y6  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD8x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD8x12y63efgEv
  ~DD8x12y6(); // tgen
  DD8x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y6E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y63abcEv");}
void  ccc::DD8x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y63efgEv");}
ccc::DD8x12y6 ::~DD8x12y6(){ note_dtor("_ZN3ccc8DD8x12y6E", this);} // tgen
ccc::DD8x12y6 ::DD8x12y6(){ note_ctor("_ZN3ccc8DD8x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y6E, buf);
    ::ccc::DD8x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y6E);
    dp->::ccc::DD8x12y6::~DD8x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y6E(Test__ZN3ccc8DD8x12y6E, "_ZN3ccc8DD8x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y6C1Ev();
extern void _ZN3ccc8DD8x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y6E[] = {
  NSPAIR(_ZN3ccc8DD8x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y6E[];
extern void _ZN3ccc8DD8x12y63efgEv();
extern void _ZN3ccc8DD8x12y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y63abcEv,_ZTv0_n12_N3ccc8DD8x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y63abcEv,_ZThn4_N3ccc8DD8x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y63abcEv,_ZTv0_n12_N3ccc8DD8x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y6E[] = {
  {&(_ZTVN3ccc8DD8x12y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x12y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x12y6E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y6E[];
static VTBL_ENTRY alt_thunk_names1528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y63abcEv,_ZTv0_n12_N3ccc8DD8x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y63abcEv,_ZThn4_N3ccc8DD8x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y6E = {  "_ZN3ccc8DD8x12y6E", // class name
  bases__ZN3ccc8DD8x12y6E, 2,
  &(vtc__ZN3ccc8DD8x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y6E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y6E),3, //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  CC8x12y7  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC8x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y73pqrEv
  ~CC8x12y7(); // tgen
  CC8x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y7E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y73abcEv");}
void  ccc::CC8x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y73pqrEv");}
ccc::CC8x12y7 ::~CC8x12y7(){ note_dtor("_ZN3ccc8CC8x12y7E", this);} // tgen
ccc::CC8x12y7 ::CC8x12y7(){ note_ctor("_ZN3ccc8CC8x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y7E, buf);
    ::ccc::CC8x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y7E);
    dp->::ccc::CC8x12y7::~CC8x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y7E(Test__ZN3ccc8CC8x12y7E, "_ZN3ccc8CC8x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y7C1Ev();
extern void _ZN3ccc8CC8x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y7E[] = {
  NSPAIR(_ZN3ccc8CC8x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y7E[];
extern void _ZN3ccc8CC8x12y73abcEv();
extern void _ZN3ccc8CC8x12y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y73abcEv,_ZTv0_n16_N3ccc8CC8x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y73abcEv,_ZThn4_N3ccc8CC8x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y73abcEv,_ZTv0_n16_N3ccc8CC8x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y7E[] = {
  {&(_ZTVN3ccc8CC8x12y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x12y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y7E[];
static VTBL_ENTRY alt_thunk_names1529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y73abcEv,_ZTv0_n16_N3ccc8CC8x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y73abcEv,_ZThn4_N3ccc8CC8x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y7E = {  "_ZN3ccc8CC8x12y7E", // class name
  bases__ZN3ccc8CC8x12y7E, 2,
  &(vtc__ZN3ccc8CC8x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y7E),2, //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  DD8x12y7  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD8x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x12y73pqrEv
  ~DD8x12y7(); // tgen
  DD8x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y7E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y73abcEv");}
void  ccc::DD8x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y73pqrEv");}
ccc::DD8x12y7 ::~DD8x12y7(){ note_dtor("_ZN3ccc8DD8x12y7E", this);} // tgen
ccc::DD8x12y7 ::DD8x12y7(){ note_ctor("_ZN3ccc8DD8x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y7E, buf);
    ::ccc::DD8x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y7E);
    dp->::ccc::DD8x12y7::~DD8x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y7E(Test__ZN3ccc8DD8x12y7E, "_ZN3ccc8DD8x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y7C1Ev();
extern void _ZN3ccc8DD8x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y7E[] = {
  NSPAIR(_ZN3ccc8DD8x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x12y73abcEv();
extern void _ZN3ccc8DD8x12y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y73abcEv,_ZTv0_n12_N3ccc8DD8x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y73abcEv,_ZThn4_N3ccc8DD8x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y73abcEv,_ZTv0_n12_N3ccc8DD8x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y7E[] = {
  {&(_ZTVN3ccc8DD8x12y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y7E[];
static VTBL_ENTRY alt_thunk_names1530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y73abcEv,_ZTv0_n12_N3ccc8DD8x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y73abcEv,_ZThn4_N3ccc8DD8x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y7E = {  "_ZN3ccc8DD8x12y7E", // class name
  bases__ZN3ccc8DD8x12y7E, 2,
  &(vtc__ZN3ccc8DD8x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y7E),3, //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  CC8x12y8  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x12y83abcEv
  ~CC8x12y8(); // tgen
  CC8x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y8E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y83efgEv");}
void  ccc::CC8x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x12y83abcEv");}
ccc::CC8x12y8 ::~CC8x12y8(){ note_dtor("_ZN3ccc8CC8x12y8E", this);} // tgen
ccc::CC8x12y8 ::CC8x12y8(){ note_ctor("_ZN3ccc8CC8x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y8E, buf);
    ::ccc::CC8x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y8E);
    dp->::ccc::CC8x12y8::~CC8x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y8E(Test__ZN3ccc8CC8x12y8E, "_ZN3ccc8CC8x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y8C1Ev();
extern void _ZN3ccc8CC8x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y8E[] = {
  NSPAIR(_ZN3ccc8CC8x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y8E[];
extern void _ZN3ccc8CC8x12y83abcEv();
extern void _ZN3ccc8CC8x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y83efgEv,_ZTv0_n12_N3ccc8CC8x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y83efgEv,_ZThn4_N3ccc8CC8x12y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x12y83abcEv,_ZTv0_n16_N3ccc8CC8x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y83abcEv,_ZThn4_N3ccc8CC8x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y83efgEv,_ZTv0_n12_N3ccc8CC8x12y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x12y83abcEv,_ZTv0_n16_N3ccc8CC8x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y8E[] = {
  {&(_ZTVN3ccc8CC8x12y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x12y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y8E[];
static VTBL_ENTRY alt_thunk_names1531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x12y83abcEv,_ZTv0_n16_N3ccc8CC8x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y83abcEv,_ZThn4_N3ccc8CC8x12y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y83efgEv,_ZTv0_n12_N3ccc8CC8x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y83efgEv,_ZThn4_N3ccc8CC8x12y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y8E = {  "_ZN3ccc8CC8x12y8E", // class name
  bases__ZN3ccc8CC8x12y8E, 2,
  &(vtc__ZN3ccc8CC8x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y8E),2, //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  DD8x12y8  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD8x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD8x12y83abcEv
  ~DD8x12y8(); // tgen
  DD8x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y8E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y83efgEv");}
void  ccc::DD8x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x12y83abcEv");}
ccc::DD8x12y8 ::~DD8x12y8(){ note_dtor("_ZN3ccc8DD8x12y8E", this);} // tgen
ccc::DD8x12y8 ::DD8x12y8(){ note_ctor("_ZN3ccc8DD8x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y8E, buf);
    ::ccc::DD8x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y8E);
    dp->::ccc::DD8x12y8::~DD8x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y8E(Test__ZN3ccc8DD8x12y8E, "_ZN3ccc8DD8x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y8C1Ev();
extern void _ZN3ccc8DD8x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y8E[] = {
  NSPAIR(_ZN3ccc8DD8x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y8E[];
extern void _ZN3ccc8DD8x12y83efgEv();
extern void _ZN3ccc8DD8x12y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x12y83abcEv,_ZTv0_n12_N3ccc8DD8x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x12y83abcEv,_ZThn4_N3ccc8DD8x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x12y83abcEv,_ZTv0_n12_N3ccc8DD8x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y8E[] = {
  {&(_ZTVN3ccc8DD8x12y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x12y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x12y8E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y8E[];
static VTBL_ENTRY alt_thunk_names1532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x12y83abcEv,_ZTv0_n12_N3ccc8DD8x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x12y83abcEv,_ZThn4_N3ccc8DD8x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x12y8E = {  "_ZN3ccc8DD8x12y8E", // class name
  bases__ZN3ccc8DD8x12y8E, 2,
  &(vtc__ZN3ccc8DD8x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y8E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y8E),3, //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  CC8x12y9  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC8x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x12y93pqrEv
  ~CC8x12y9(); // tgen
  CC8x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x12y9E) C1{ VBC2{ v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x12y93efgEv");}
void  ccc::CC8x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x12y93pqrEv");}
ccc::CC8x12y9 ::~CC8x12y9(){ note_dtor("_ZN3ccc8CC8x12y9E", this);} // tgen
ccc::CC8x12y9 ::CC8x12y9(){ note_ctor("_ZN3ccc8CC8x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC8x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x12y9E, buf);
    ::ccc::CC8x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x12y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC8x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x12y9E);
    dp->::ccc::CC8x12y9::~CC8x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x12y9E(Test__ZN3ccc8CC8x12y9E, "_ZN3ccc8CC8x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x12y9C1Ev();
extern void _ZN3ccc8CC8x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC8x12y9E[] = {
  NSPAIR(_ZN3ccc8CC8x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC8x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC8x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC8x12y93efgEv();
extern void _ZN3ccc8CC8x12y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x12y93efgEv,_ZTv0_n12_N3ccc8CC8x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x12y93efgEv,_ZThn4_N3ccc8CC8x12y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x12y93efgEv,_ZTv0_n12_N3ccc8CC8x12y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x12y9E[] = {
  {&(_ZTVN3ccc8CC8x12y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x12y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x12y9E[];
static VTBL_ENTRY alt_thunk_names1533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x12y93efgEv,_ZTv0_n12_N3ccc8CC8x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x12y93efgEv,_ZThn4_N3ccc8CC8x12y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x12y9E = {  "_ZN3ccc8CC8x12y9E", // class name
  bases__ZN3ccc8CC8x12y9E, 2,
  &(vtc__ZN3ccc8CC8x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x12y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x12y9E),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  DD8x12y9  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD8x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x12y93pqrEv
  ~DD8x12y9(); // tgen
  DD8x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD8x12y9E) C1{ VBC2{ v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x12y93efgEv");}
void  ccc::DD8x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x12y93pqrEv");}
ccc::DD8x12y9 ::~DD8x12y9(){ note_dtor("_ZN3ccc8DD8x12y9E", this);} // tgen
ccc::DD8x12y9 ::DD8x12y9(){ note_ctor("_ZN3ccc8DD8x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD8x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x12y9E, buf);
    ::ccc::DD8x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x12y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD8x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x12y9E);
    dp->::ccc::DD8x12y9::~DD8x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x12y9E(Test__ZN3ccc8DD8x12y9E, "_ZN3ccc8DD8x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x12y9C1Ev();
extern void _ZN3ccc8DD8x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD8x12y9E[] = {
  NSPAIR(_ZN3ccc8DD8x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD8x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD8x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y9E[];
extern void _ZN3ccc8DD8x12y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x12y9E[] = {
  {&(_ZTVN3ccc8DD8x12y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x12y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x12y9E[];
Class_Descriptor cd__ZN3ccc8DD8x12y9E = {  "_ZN3ccc8DD8x12y9E", // class name
  bases__ZN3ccc8DD8x12y9E, 2,
  &(vtc__ZN3ccc8DD8x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x12y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x12y9E),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  CC8x12y10  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC8x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x12y103abcEv
  ~CC8x12y10(); // tgen
  CC8x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y10E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x12y103pqrEv");}
void  ccc::CC8x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x12y103abcEv");}
ccc::CC8x12y10 ::~CC8x12y10(){ note_dtor("_ZN3ccc9CC8x12y10E", this);} // tgen
ccc::CC8x12y10 ::CC8x12y10(){ note_ctor("_ZN3ccc9CC8x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC8x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x12y10E, buf);
    ::ccc::CC8x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x12y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC8x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x12y10E);
    dp->::ccc::CC8x12y10::~CC8x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x12y10E(Test__ZN3ccc9CC8x12y10E, "_ZN3ccc9CC8x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x12y10C1Ev();
extern void _ZN3ccc9CC8x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC8x12y10E[] = {
  NSPAIR(_ZN3ccc9CC8x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC8x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC8x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x12y10E[];
extern void _ZN3ccc9CC8x12y103abcEv();
extern void _ZN3ccc9CC8x12y103pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x12y103abcEv,_ZTv0_n16_N3ccc9CC8x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x12y103abcEv,_ZThn4_N3ccc9CC8x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x12y103abcEv,_ZTv0_n16_N3ccc9CC8x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x12y10E[] = {
  {&(_ZTVN3ccc9CC8x12y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x12y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x12y10E[];
static VTBL_ENTRY alt_thunk_names1534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x12y103abcEv,_ZTv0_n16_N3ccc9CC8x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x12y103abcEv,_ZThn4_N3ccc9CC8x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x12y10E = {  "_ZN3ccc9CC8x12y10E", // class name
  bases__ZN3ccc9CC8x12y10E, 2,
  &(vtc__ZN3ccc9CC8x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x12y10E),2, //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  DD8x12y10  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD8x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD8x12y103abcEv
  ~DD8x12y10(); // tgen
  DD8x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD8x12y10E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x12y103pqrEv");}
void  ccc::DD8x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x12y103abcEv");}
ccc::DD8x12y10 ::~DD8x12y10(){ note_dtor("_ZN3ccc9DD8x12y10E", this);} // tgen
ccc::DD8x12y10 ::DD8x12y10(){ note_ctor("_ZN3ccc9DD8x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD8x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x12y10E, buf);
    ::ccc::DD8x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x12y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD8x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x12y10E);
    dp->::ccc::DD8x12y10::~DD8x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x12y10E(Test__ZN3ccc9DD8x12y10E, "_ZN3ccc9DD8x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x12y10C1Ev();
extern void _ZN3ccc9DD8x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD8x12y10E[] = {
  NSPAIR(_ZN3ccc9DD8x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD8x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD8x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x12y103abcEv();
extern void _ZN3ccc9DD8x12y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x12y103abcEv,_ZTv0_n12_N3ccc9DD8x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x12y103abcEv,_ZThn4_N3ccc9DD8x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x12y103abcEv,_ZTv0_n12_N3ccc9DD8x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x12y10E[] = {
  {&(_ZTVN3ccc9DD8x12y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x12y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x12y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x12y10E[];
static VTBL_ENTRY alt_thunk_names1535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x12y103abcEv,_ZTv0_n12_N3ccc9DD8x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x12y103abcEv,_ZThn4_N3ccc9DD8x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x12y10E = {  "_ZN3ccc9DD8x12y10E", // class name
  bases__ZN3ccc9DD8x12y10E, 2,
  &(vtc__ZN3ccc9DD8x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x12y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x12y10E),3, //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  CC8x12y11  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC8x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x12y113efgEv
  ~CC8x12y11(); // tgen
  CC8x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y11E) C1{ VBC2{ v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x12y113pqrEv");}
void  ccc::CC8x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x12y113efgEv");}
ccc::CC8x12y11 ::~CC8x12y11(){ note_dtor("_ZN3ccc9CC8x12y11E", this);} // tgen
ccc::CC8x12y11 ::CC8x12y11(){ note_ctor("_ZN3ccc9CC8x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC8x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x12y11E, buf);
    ::ccc::CC8x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x12y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC8x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x12y11E);
    dp->::ccc::CC8x12y11::~CC8x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x12y11E(Test__ZN3ccc9CC8x12y11E, "_ZN3ccc9CC8x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x12y11C1Ev();
extern void _ZN3ccc9CC8x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC8x12y11E[] = {
  NSPAIR(_ZN3ccc9CC8x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC8x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC8x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC8x12y113pqrEv();
extern void _ZN3ccc9CC8x12y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x12y113efgEv,_ZTv0_n12_N3ccc9CC8x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x12y113efgEv,_ZThn4_N3ccc9CC8x12y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x12y113efgEv,_ZTv0_n12_N3ccc9CC8x12y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x12y11E[] = {
  {&(_ZTVN3ccc9CC8x12y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC8x12y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x12y11E[];
static VTBL_ENTRY alt_thunk_names1536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x12y113efgEv,_ZTv0_n12_N3ccc9CC8x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x12y113efgEv,_ZThn4_N3ccc9CC8x12y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x12y11E = {  "_ZN3ccc9CC8x12y11E", // class name
  bases__ZN3ccc9CC8x12y11E, 2,
  &(vtc__ZN3ccc9CC8x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x12y11E),2, //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  DD8x12y11  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD8x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD8x12y113efgEv
  ~DD8x12y11(); // tgen
  DD8x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD8x12y11E) C1{ VBC2{ v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x12y113pqrEv");}
void  ccc::DD8x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x12y113efgEv");}
ccc::DD8x12y11 ::~DD8x12y11(){ note_dtor("_ZN3ccc9DD8x12y11E", this);} // tgen
ccc::DD8x12y11 ::DD8x12y11(){ note_ctor("_ZN3ccc9DD8x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD8x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x12y11E, buf);
    ::ccc::DD8x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x12y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD8x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x12y11E);
    dp->::ccc::DD8x12y11::~DD8x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x12y11E(Test__ZN3ccc9DD8x12y11E, "_ZN3ccc9DD8x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x12y11C1Ev();
extern void _ZN3ccc9DD8x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD8x12y11E[] = {
  NSPAIR(_ZN3ccc9DD8x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD8x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD8x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y11E[];
extern void _ZN3ccc9DD8x12y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y113pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x12y11E[] = {
  {&(_ZTVN3ccc9DD8x12y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x12y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x12y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x12y11E[];
Class_Descriptor cd__ZN3ccc9DD8x12y11E = {  "_ZN3ccc9DD8x12y11E", // class name
  bases__ZN3ccc9DD8x12y11E, 2,
  &(vtc__ZN3ccc9DD8x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x12y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x12y11E),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  CC8x12y12  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC8x12y123abcEv
  ~CC8x12y12(); // tgen
  CC8x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y12E) C1{ VBC2{ v2 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC8x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x12y123abcEv");}
ccc::CC8x12y12 ::~CC8x12y12(){ note_dtor("_ZN3ccc9CC8x12y12E", this);} // tgen
ccc::CC8x12y12 ::CC8x12y12(){ note_ctor("_ZN3ccc9CC8x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC8x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x12y12E, buf);
    ::ccc::CC8x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x12y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC8x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x12y12E);
    dp->::ccc::CC8x12y12::~CC8x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x12y12E(Test__ZN3ccc9CC8x12y12E, "_ZN3ccc9CC8x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x12y12C1Ev();
extern void _ZN3ccc9CC8x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC8x12y12E[] = {
  NSPAIR(_ZN3ccc9CC8x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC8x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC8x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x12y12E[];
extern void _ZN3ccc9CC8x12y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x12y123abcEv,_ZTv0_n16_N3ccc9CC8x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x12y123abcEv,_ZThn4_N3ccc9CC8x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x12y123abcEv,_ZTv0_n16_N3ccc9CC8x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x12y12E[] = {
  {&(_ZTVN3ccc9CC8x12y12E[3]),  3,10},
  {&(_ZTVN3ccc9CC8x12y12E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x12y12E[];
static VTBL_ENTRY alt_thunk_names1537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x12y123abcEv,_ZTv0_n16_N3ccc9CC8x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x12y123abcEv,_ZThn4_N3ccc9CC8x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x12y12E = {  "_ZN3ccc9CC8x12y12E", // class name
  bases__ZN3ccc9CC8x12y12E, 2,
  &(vtc__ZN3ccc9CC8x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y12E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x12y12E),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  DD8x12y12  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD8x12y123abcEv
  ~DD8x12y12(); // tgen
  DD8x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD8x12y12E) C1{ VBC2{ v2 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD8x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x12y123abcEv");}
ccc::DD8x12y12 ::~DD8x12y12(){ note_dtor("_ZN3ccc9DD8x12y12E", this);} // tgen
ccc::DD8x12y12 ::DD8x12y12(){ note_ctor("_ZN3ccc9DD8x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD8x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x12y12E, buf);
    ::ccc::DD8x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x12y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD8x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x12y12E);
    dp->::ccc::DD8x12y12::~DD8x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x12y12E(Test__ZN3ccc9DD8x12y12E, "_ZN3ccc9DD8x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x12y12C1Ev();
extern void _ZN3ccc9DD8x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD8x12y12E[] = {
  NSPAIR(_ZN3ccc9DD8x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD8x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD8x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x12y123abcEv,_ZTv0_n12_N3ccc9DD8x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x12y123abcEv,_ZThn4_N3ccc9DD8x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y123abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x12y123abcEv,_ZTv0_n12_N3ccc9DD8x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x12y12E[] = {
  {&(_ZTVN3ccc9DD8x12y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x12y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x12y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x12y12E[];
static VTBL_ENTRY alt_thunk_names1538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x12y123abcEv,_ZTv0_n12_N3ccc9DD8x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x12y123abcEv,_ZThn4_N3ccc9DD8x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x12y12E = {  "_ZN3ccc9DD8x12y12E", // class name
  bases__ZN3ccc9DD8x12y12E, 2,
  &(vtc__ZN3ccc9DD8x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x12y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x12y12E),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  CC8x12y13  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC8x12y133efgEv
  ~CC8x12y13(); // tgen
  CC8x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y13E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC8x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x12y133efgEv");}
ccc::CC8x12y13 ::~CC8x12y13(){ note_dtor("_ZN3ccc9CC8x12y13E", this);} // tgen
ccc::CC8x12y13 ::CC8x12y13(){ note_ctor("_ZN3ccc9CC8x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC8x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x12y13E, buf);
    ::ccc::CC8x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x12y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC8x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x12y13E);
    dp->::ccc::CC8x12y13::~CC8x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x12y13E(Test__ZN3ccc9CC8x12y13E, "_ZN3ccc9CC8x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x12y13C1Ev();
extern void _ZN3ccc9CC8x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC8x12y13E[] = {
  NSPAIR(_ZN3ccc9CC8x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC8x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC8x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC8x12y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x12y133efgEv,_ZTv0_n12_N3ccc9CC8x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x12y133efgEv,_ZThn4_N3ccc9CC8x12y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x12y133efgEv,_ZTv0_n12_N3ccc9CC8x12y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x12y13E[] = {
  {&(_ZTVN3ccc9CC8x12y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x12y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x12y13E[];
static VTBL_ENTRY alt_thunk_names1539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x12y133efgEv,_ZTv0_n12_N3ccc9CC8x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x12y133efgEv,_ZThn4_N3ccc9CC8x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x12y13E = {  "_ZN3ccc9CC8x12y13E", // class name
  bases__ZN3ccc9CC8x12y13E, 2,
  &(vtc__ZN3ccc9CC8x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x12y13E),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  DD8x12y13  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD8x12y133efgEv
  ~DD8x12y13(); // tgen
  DD8x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD8x12y13E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD8x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x12y133efgEv");}
ccc::DD8x12y13 ::~DD8x12y13(){ note_dtor("_ZN3ccc9DD8x12y13E", this);} // tgen
ccc::DD8x12y13 ::DD8x12y13(){ note_ctor("_ZN3ccc9DD8x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD8x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x12y13E, buf);
    ::ccc::DD8x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x12y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD8x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x12y13E);
    dp->::ccc::DD8x12y13::~DD8x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x12y13E(Test__ZN3ccc9DD8x12y13E, "_ZN3ccc9DD8x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x12y13C1Ev();
extern void _ZN3ccc9DD8x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD8x12y13E[] = {
  NSPAIR(_ZN3ccc9DD8x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD8x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD8x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y13E[];
extern void _ZN3ccc9DD8x12y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x12y13E[] = {
  {&(_ZTVN3ccc9DD8x12y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x12y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x12y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x12y13E[];
Class_Descriptor cd__ZN3ccc9DD8x12y13E = {  "_ZN3ccc9DD8x12y13E", // class name
  bases__ZN3ccc9DD8x12y13E, 2,
  &(vtc__ZN3ccc9DD8x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x12y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x12y13E),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  CC8x12y14  : virtual ::ccc::AA8 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC8x12y143pqrEv
  ~CC8x12y14(); // tgen
  CC8x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y14E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC8x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x12y143pqrEv");}
ccc::CC8x12y14 ::~CC8x12y14(){ note_dtor("_ZN3ccc9CC8x12y14E", this);} // tgen
ccc::CC8x12y14 ::CC8x12y14(){ note_ctor("_ZN3ccc9CC8x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC8x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x12y14E, buf);
    ::ccc::CC8x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x12y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC8x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x12y14E);
    dp->::ccc::CC8x12y14::~CC8x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x12y14E(Test__ZN3ccc9CC8x12y14E, "_ZN3ccc9CC8x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x12y14C1Ev();
extern void _ZN3ccc9CC8x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC8x12y14E[] = {
  NSPAIR(_ZN3ccc9CC8x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC8x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC8x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC8x12y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x12y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x12y14E[] = {
  {&(_ZTVN3ccc9CC8x12y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x12y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x12y14E[];
Class_Descriptor cd__ZN3ccc9CC8x12y14E = {  "_ZN3ccc9CC8x12y14E", // class name
  bases__ZN3ccc9CC8x12y14E, 2,
  &(vtc__ZN3ccc9CC8x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x12y14E),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  DD8x12y14  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD8x12y143pqrEv
  ~DD8x12y14(); // tgen
  DD8x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD8x12y14E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD8x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x12y143pqrEv");}
ccc::DD8x12y14 ::~DD8x12y14(){ note_dtor("_ZN3ccc9DD8x12y14E", this);} // tgen
ccc::DD8x12y14 ::DD8x12y14(){ note_ctor("_ZN3ccc9DD8x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD8x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x12y14E, buf);
    ::ccc::DD8x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x12y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD8x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x12y14E);
    dp->::ccc::DD8x12y14::~DD8x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x12y14E(Test__ZN3ccc9DD8x12y14E, "_ZN3ccc9DD8x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x12y14C1Ev();
extern void _ZN3ccc9DD8x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD8x12y14E[] = {
  NSPAIR(_ZN3ccc9DD8x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD8x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD8x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x12y14E[] = {
  {&(_ZTVN3ccc9DD8x12y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x12y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x12y14E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x12y14E[];
Class_Descriptor cd__ZN3ccc9DD8x12y14E = {  "_ZN3ccc9DD8x12y14E", // class name
  bases__ZN3ccc9DD8x12y14E, 2,
  &(vtc__ZN3ccc9DD8x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x12y14E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x12y14E),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  CC8x12y15  : virtual ::ccc::AA8 , ::ccc::BB12 {
  ~CC8x12y15(); // tgen
  CC8x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x12y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC8x12y15 ::~CC8x12y15(){ note_dtor("_ZN3ccc9CC8x12y15E", this);} // tgen
ccc::CC8x12y15 ::CC8x12y15(){ note_ctor("_ZN3ccc9CC8x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC8x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x12y15E, buf);
    ::ccc::CC8x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x12y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC8x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x12y15E);
    dp->::ccc::CC8x12y15::~CC8x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x12y15E(Test__ZN3ccc9CC8x12y15E, "_ZN3ccc9CC8x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x12y15C1Ev();
extern void _ZN3ccc9CC8x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC8x12y15E[] = {
  NSPAIR(_ZN3ccc9CC8x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC8x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC8x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x12y15E[] = {
  {&(_ZTVN3ccc9CC8x12y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC8x12y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x12y15E[];
Class_Descriptor cd__ZN3ccc9CC8x12y15E = {  "_ZN3ccc9CC8x12y15E", // class name
  bases__ZN3ccc9CC8x12y15E, 2,
  &(vtc__ZN3ccc9CC8x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x12y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x12y15E),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  DD8x12y15  : virtual ::ccc::AA8 , virtual ::ccc::BB12 {
  ~DD8x12y15(); // tgen
  DD8x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD8x12y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD8x12y15 ::~DD8x12y15(){ note_dtor("_ZN3ccc9DD8x12y15E", this);} // tgen
ccc::DD8x12y15 ::DD8x12y15(){ note_ctor("_ZN3ccc9DD8x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD8x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x12y15E, buf);
    ::ccc::DD8x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x12y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD8x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x12y15E);
    dp->::ccc::DD8x12y15::~DD8x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x12y15E(Test__ZN3ccc9DD8x12y15E, "_ZN3ccc9DD8x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x12y15C1Ev();
extern void _ZN3ccc9DD8x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD8x12y15E[] = {
  NSPAIR(_ZN3ccc9DD8x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD8x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD8x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x12y15E[] = {
  {&(_ZTVN3ccc9DD8x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x12y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x12y15E[];
Class_Descriptor cd__ZN3ccc9DD8x12y15E = {  "_ZN3ccc9DD8x12y15E", // class name
  bases__ZN3ccc9DD8x12y15E, 2,
  &(vtc__ZN3ccc9DD8x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x12y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x12y15E),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  CC8x13y0  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y03pqrEv
  ~CC8x13y0(); // tgen
  CC8x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y0E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y03abcEv");}
void  ccc::CC8x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y03efgEv");}
void  ccc::CC8x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y03pqrEv");}
ccc::CC8x13y0 ::~CC8x13y0(){ note_dtor("_ZN3ccc8CC8x13y0E", this);} // tgen
ccc::CC8x13y0 ::CC8x13y0(){ note_ctor("_ZN3ccc8CC8x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y0E, buf);
    ::ccc::CC8x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y0E);
    dp->::ccc::CC8x13y0::~CC8x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y0E(Test__ZN3ccc8CC8x13y0E, "_ZN3ccc8CC8x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y0C1Ev();
extern void _ZN3ccc8CC8x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y0E[] = {
  NSPAIR(_ZN3ccc8CC8x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y0E[];
extern void _ZN3ccc8CC8x13y03efgEv();
extern void _ZN3ccc8CC8x13y03abcEv();
extern void _ZN3ccc8CC8x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y03efgEv,_ZTv0_n12_N3ccc8CC8x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y03efgEv,_ZThn4_N3ccc8CC8x13y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y03abcEv,_ZTv0_n16_N3ccc8CC8x13y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y03abcEv,_ZThn4_N3ccc8CC8x13y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y03efgEv,_ZTv0_n12_N3ccc8CC8x13y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y03abcEv,_ZTv0_n16_N3ccc8CC8x13y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y0E[] = {
  {&(_ZTVN3ccc8CC8x13y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y0E[];
static VTBL_ENTRY alt_thunk_names1540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y03abcEv,_ZTv0_n16_N3ccc8CC8x13y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y03abcEv,_ZThn4_N3ccc8CC8x13y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y03efgEv,_ZTv0_n12_N3ccc8CC8x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y03efgEv,_ZThn4_N3ccc8CC8x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y0E = {  "_ZN3ccc8CC8x13y0E", // class name
  bases__ZN3ccc8CC8x13y0E, 2,
  &(vtc__ZN3ccc8CC8x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y0E),2, //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  DD8x13y0  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD8x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD8x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x13y03pqrEv
  ~DD8x13y0(); // tgen
  DD8x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y0E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y03abcEv");}
void  ccc::DD8x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y03efgEv");}
void  ccc::DD8x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y03pqrEv");}
ccc::DD8x13y0 ::~DD8x13y0(){ note_dtor("_ZN3ccc8DD8x13y0E", this);} // tgen
ccc::DD8x13y0 ::DD8x13y0(){ note_ctor("_ZN3ccc8DD8x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y0E, buf);
    ::ccc::DD8x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y0E);
    dp->::ccc::DD8x13y0::~DD8x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y0E(Test__ZN3ccc8DD8x13y0E, "_ZN3ccc8DD8x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y0C1Ev();
extern void _ZN3ccc8DD8x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y0E[] = {
  NSPAIR(_ZN3ccc8DD8x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y0E[];
extern void _ZN3ccc8DD8x13y03efgEv();
extern void _ZN3ccc8DD8x13y03abcEv();
extern void _ZN3ccc8DD8x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y03efgEv,_ZTv0_n12_N3ccc8DD8x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y03efgEv,_ZThn4_N3ccc8DD8x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y03efgEv,_ZTv0_n12_N3ccc8DD8x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y0E[] = {
  {&(_ZTVN3ccc8DD8x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y0E[];
static VTBL_ENTRY alt_thunk_names1541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y03efgEv,_ZTv0_n12_N3ccc8DD8x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y03efgEv,_ZThn4_N3ccc8DD8x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y0E = {  "_ZN3ccc8DD8x13y0E", // class name
  bases__ZN3ccc8DD8x13y0E, 2,
  &(vtc__ZN3ccc8DD8x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y0E),3, //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  CC8x13y1  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x13y13efgEv
  ~CC8x13y1(); // tgen
  CC8x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y1E) C1{ VBC2{ v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y13abcEv");}
void  ccc::CC8x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y13pqrEv");}
void  ccc::CC8x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y13efgEv");}
ccc::CC8x13y1 ::~CC8x13y1(){ note_dtor("_ZN3ccc8CC8x13y1E", this);} // tgen
ccc::CC8x13y1 ::CC8x13y1(){ note_ctor("_ZN3ccc8CC8x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y1E, buf);
    ::ccc::CC8x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y1E);
    dp->::ccc::CC8x13y1::~CC8x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y1E(Test__ZN3ccc8CC8x13y1E, "_ZN3ccc8CC8x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y1C1Ev();
extern void _ZN3ccc8CC8x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y1E[] = {
  NSPAIR(_ZN3ccc8CC8x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y1E[];
extern void _ZN3ccc8CC8x13y13efgEv();
extern void _ZN3ccc8CC8x13y13abcEv();
extern void _ZN3ccc8CC8x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y13efgEv,_ZTv0_n12_N3ccc8CC8x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y13efgEv,_ZThn4_N3ccc8CC8x13y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y13abcEv,_ZTv0_n16_N3ccc8CC8x13y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y13abcEv,_ZThn4_N3ccc8CC8x13y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y13efgEv,_ZTv0_n12_N3ccc8CC8x13y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y13abcEv,_ZTv0_n16_N3ccc8CC8x13y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y1E[] = {
  {&(_ZTVN3ccc8CC8x13y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y1E[];
static VTBL_ENTRY alt_thunk_names1542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y13abcEv,_ZTv0_n16_N3ccc8CC8x13y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y13abcEv,_ZThn4_N3ccc8CC8x13y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y13efgEv,_ZTv0_n12_N3ccc8CC8x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y13efgEv,_ZThn4_N3ccc8CC8x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y1E = {  "_ZN3ccc8CC8x13y1E", // class name
  bases__ZN3ccc8CC8x13y1E, 2,
  &(vtc__ZN3ccc8CC8x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y1E),2, //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  DD8x13y1  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD8x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x13y13efgEv
  ~DD8x13y1(); // tgen
  DD8x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y1E) C1{ VBC2{ v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y13abcEv");}
void  ccc::DD8x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y13pqrEv");}
void  ccc::DD8x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y13efgEv");}
ccc::DD8x13y1 ::~DD8x13y1(){ note_dtor("_ZN3ccc8DD8x13y1E", this);} // tgen
ccc::DD8x13y1 ::DD8x13y1(){ note_ctor("_ZN3ccc8DD8x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y1E, buf);
    ::ccc::DD8x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y1E);
    dp->::ccc::DD8x13y1::~DD8x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y1E(Test__ZN3ccc8DD8x13y1E, "_ZN3ccc8DD8x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y1C1Ev();
extern void _ZN3ccc8DD8x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y1E[] = {
  NSPAIR(_ZN3ccc8DD8x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y1E[];
extern void _ZN3ccc8DD8x13y13efgEv();
extern void _ZN3ccc8DD8x13y13abcEv();
extern void _ZN3ccc8DD8x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y13efgEv,_ZTv0_n12_N3ccc8DD8x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y13efgEv,_ZThn4_N3ccc8DD8x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y13efgEv,_ZTv0_n12_N3ccc8DD8x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y1E[] = {
  {&(_ZTVN3ccc8DD8x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y1E[];
static VTBL_ENTRY alt_thunk_names1543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y13efgEv,_ZTv0_n12_N3ccc8DD8x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y13efgEv,_ZThn4_N3ccc8DD8x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y1E = {  "_ZN3ccc8DD8x13y1E", // class name
  bases__ZN3ccc8DD8x13y1E, 2,
  &(vtc__ZN3ccc8DD8x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y1E),3, //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  CC8x13y2  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y23pqrEv
  ~CC8x13y2(); // tgen
  CC8x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y2E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y23efgEv");}
void  ccc::CC8x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y23abcEv");}
void  ccc::CC8x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y23pqrEv");}
ccc::CC8x13y2 ::~CC8x13y2(){ note_dtor("_ZN3ccc8CC8x13y2E", this);} // tgen
ccc::CC8x13y2 ::CC8x13y2(){ note_ctor("_ZN3ccc8CC8x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y2E, buf);
    ::ccc::CC8x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y2E);
    dp->::ccc::CC8x13y2::~CC8x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y2E(Test__ZN3ccc8CC8x13y2E, "_ZN3ccc8CC8x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y2C1Ev();
extern void _ZN3ccc8CC8x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y2E[] = {
  NSPAIR(_ZN3ccc8CC8x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y2E[];
extern void _ZN3ccc8CC8x13y23efgEv();
extern void _ZN3ccc8CC8x13y23abcEv();
extern void _ZN3ccc8CC8x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y23efgEv,_ZTv0_n12_N3ccc8CC8x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y23efgEv,_ZThn4_N3ccc8CC8x13y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y23abcEv,_ZTv0_n16_N3ccc8CC8x13y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y23abcEv,_ZThn4_N3ccc8CC8x13y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y23efgEv,_ZTv0_n12_N3ccc8CC8x13y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y23abcEv,_ZTv0_n16_N3ccc8CC8x13y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y2E[] = {
  {&(_ZTVN3ccc8CC8x13y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y2E[];
static VTBL_ENTRY alt_thunk_names1544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y23abcEv,_ZTv0_n16_N3ccc8CC8x13y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y23abcEv,_ZThn4_N3ccc8CC8x13y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y23efgEv,_ZTv0_n12_N3ccc8CC8x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y23efgEv,_ZThn4_N3ccc8CC8x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y2E = {  "_ZN3ccc8CC8x13y2E", // class name
  bases__ZN3ccc8CC8x13y2E, 2,
  &(vtc__ZN3ccc8CC8x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y2E),2, //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  DD8x13y2  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD8x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD8x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x13y23pqrEv
  ~DD8x13y2(); // tgen
  DD8x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y2E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y23efgEv");}
void  ccc::DD8x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y23abcEv");}
void  ccc::DD8x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y23pqrEv");}
ccc::DD8x13y2 ::~DD8x13y2(){ note_dtor("_ZN3ccc8DD8x13y2E", this);} // tgen
ccc::DD8x13y2 ::DD8x13y2(){ note_ctor("_ZN3ccc8DD8x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y2E, buf);
    ::ccc::DD8x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y2E);
    dp->::ccc::DD8x13y2::~DD8x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y2E(Test__ZN3ccc8DD8x13y2E, "_ZN3ccc8DD8x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y2C1Ev();
extern void _ZN3ccc8DD8x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y2E[] = {
  NSPAIR(_ZN3ccc8DD8x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y2E[];
extern void _ZN3ccc8DD8x13y23efgEv();
extern void _ZN3ccc8DD8x13y23abcEv();
extern void _ZN3ccc8DD8x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y23efgEv,_ZTv0_n12_N3ccc8DD8x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y23efgEv,_ZThn4_N3ccc8DD8x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y23efgEv,_ZTv0_n12_N3ccc8DD8x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y2E[] = {
  {&(_ZTVN3ccc8DD8x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y2E[];
static VTBL_ENTRY alt_thunk_names1545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y23efgEv,_ZTv0_n12_N3ccc8DD8x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y23efgEv,_ZThn4_N3ccc8DD8x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y2E = {  "_ZN3ccc8DD8x13y2E", // class name
  bases__ZN3ccc8DD8x13y2E, 2,
  &(vtc__ZN3ccc8DD8x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y2E),3, //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  CC8x13y3  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x13y33abcEv
  ~CC8x13y3(); // tgen
  CC8x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y3E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y33efgEv");}
void  ccc::CC8x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y33pqrEv");}
void  ccc::CC8x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y33abcEv");}
ccc::CC8x13y3 ::~CC8x13y3(){ note_dtor("_ZN3ccc8CC8x13y3E", this);} // tgen
ccc::CC8x13y3 ::CC8x13y3(){ note_ctor("_ZN3ccc8CC8x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y3E, buf);
    ::ccc::CC8x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y3E);
    dp->::ccc::CC8x13y3::~CC8x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y3E(Test__ZN3ccc8CC8x13y3E, "_ZN3ccc8CC8x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y3C1Ev();
extern void _ZN3ccc8CC8x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y3E[] = {
  NSPAIR(_ZN3ccc8CC8x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y3E[];
extern void _ZN3ccc8CC8x13y33efgEv();
extern void _ZN3ccc8CC8x13y33pqrEv();
extern void _ZN3ccc8CC8x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y33efgEv,_ZTv0_n12_N3ccc8CC8x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y33efgEv,_ZThn4_N3ccc8CC8x13y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y33abcEv,_ZTv0_n16_N3ccc8CC8x13y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y33abcEv,_ZThn4_N3ccc8CC8x13y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y33efgEv,_ZTv0_n12_N3ccc8CC8x13y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y33abcEv,_ZTv0_n16_N3ccc8CC8x13y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y3E[] = {
  {&(_ZTVN3ccc8CC8x13y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y3E[];
static VTBL_ENTRY alt_thunk_names1546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y33abcEv,_ZTv0_n16_N3ccc8CC8x13y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y33abcEv,_ZThn4_N3ccc8CC8x13y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y33efgEv,_ZTv0_n12_N3ccc8CC8x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y33efgEv,_ZThn4_N3ccc8CC8x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y3E = {  "_ZN3ccc8CC8x13y3E", // class name
  bases__ZN3ccc8CC8x13y3E, 2,
  &(vtc__ZN3ccc8CC8x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y3E),2, //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  DD8x13y3  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD8x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x13y33abcEv
  ~DD8x13y3(); // tgen
  DD8x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y3E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y33efgEv");}
void  ccc::DD8x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y33pqrEv");}
void  ccc::DD8x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y33abcEv");}
ccc::DD8x13y3 ::~DD8x13y3(){ note_dtor("_ZN3ccc8DD8x13y3E", this);} // tgen
ccc::DD8x13y3 ::DD8x13y3(){ note_ctor("_ZN3ccc8DD8x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y3E, buf);
    ::ccc::DD8x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y3E);
    dp->::ccc::DD8x13y3::~DD8x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y3E(Test__ZN3ccc8DD8x13y3E, "_ZN3ccc8DD8x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y3C1Ev();
extern void _ZN3ccc8DD8x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y3E[] = {
  NSPAIR(_ZN3ccc8DD8x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y3E[];
extern void _ZN3ccc8DD8x13y33efgEv();
extern void _ZN3ccc8DD8x13y33abcEv();
extern void _ZN3ccc8DD8x13y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y33efgEv,_ZTv0_n12_N3ccc8DD8x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y33efgEv,_ZThn4_N3ccc8DD8x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y33efgEv,_ZTv0_n12_N3ccc8DD8x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y3E[] = {
  {&(_ZTVN3ccc8DD8x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y3E[];
static VTBL_ENTRY alt_thunk_names1547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y33efgEv,_ZTv0_n12_N3ccc8DD8x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y33efgEv,_ZThn4_N3ccc8DD8x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y3E = {  "_ZN3ccc8DD8x13y3E", // class name
  bases__ZN3ccc8DD8x13y3E, 2,
  &(vtc__ZN3ccc8DD8x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y3E),3, //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  CC8x13y4  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC8x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x13y43efgEv
  ~CC8x13y4(); // tgen
  CC8x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y4E) C1{ VBC2{ v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y43pqrEv");}
void  ccc::CC8x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y43abcEv");}
void  ccc::CC8x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y43efgEv");}
ccc::CC8x13y4 ::~CC8x13y4(){ note_dtor("_ZN3ccc8CC8x13y4E", this);} // tgen
ccc::CC8x13y4 ::CC8x13y4(){ note_ctor("_ZN3ccc8CC8x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y4E, buf);
    ::ccc::CC8x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y4E);
    dp->::ccc::CC8x13y4::~CC8x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y4E(Test__ZN3ccc8CC8x13y4E, "_ZN3ccc8CC8x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y4C1Ev();
extern void _ZN3ccc8CC8x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y4E[] = {
  NSPAIR(_ZN3ccc8CC8x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y4E[];
extern void _ZN3ccc8CC8x13y43efgEv();
extern void _ZN3ccc8CC8x13y43pqrEv();
extern void _ZN3ccc8CC8x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y43efgEv,_ZTv0_n12_N3ccc8CC8x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y43efgEv,_ZThn4_N3ccc8CC8x13y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y43abcEv,_ZTv0_n16_N3ccc8CC8x13y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y43abcEv,_ZThn4_N3ccc8CC8x13y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y43efgEv,_ZTv0_n12_N3ccc8CC8x13y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y43abcEv,_ZTv0_n16_N3ccc8CC8x13y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y4E[] = {
  {&(_ZTVN3ccc8CC8x13y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y4E[];
static VTBL_ENTRY alt_thunk_names1548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y43abcEv,_ZTv0_n16_N3ccc8CC8x13y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y43abcEv,_ZThn4_N3ccc8CC8x13y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y43efgEv,_ZTv0_n12_N3ccc8CC8x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y43efgEv,_ZThn4_N3ccc8CC8x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y4E = {  "_ZN3ccc8CC8x13y4E", // class name
  bases__ZN3ccc8CC8x13y4E, 2,
  &(vtc__ZN3ccc8CC8x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y4E),2, //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  DD8x13y4  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD8x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD8x13y43efgEv
  ~DD8x13y4(); // tgen
  DD8x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y4E) C1{ VBC2{ v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y43pqrEv");}
void  ccc::DD8x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y43abcEv");}
void  ccc::DD8x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y43efgEv");}
ccc::DD8x13y4 ::~DD8x13y4(){ note_dtor("_ZN3ccc8DD8x13y4E", this);} // tgen
ccc::DD8x13y4 ::DD8x13y4(){ note_ctor("_ZN3ccc8DD8x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y4E, buf);
    ::ccc::DD8x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y4E);
    dp->::ccc::DD8x13y4::~DD8x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y4E(Test__ZN3ccc8DD8x13y4E, "_ZN3ccc8DD8x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y4C1Ev();
extern void _ZN3ccc8DD8x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y4E[] = {
  NSPAIR(_ZN3ccc8DD8x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y4E[];
extern void _ZN3ccc8DD8x13y43efgEv();
extern void _ZN3ccc8DD8x13y43abcEv();
extern void _ZN3ccc8DD8x13y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y43efgEv,_ZTv0_n12_N3ccc8DD8x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y43efgEv,_ZThn4_N3ccc8DD8x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y43efgEv,_ZTv0_n12_N3ccc8DD8x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y4E[] = {
  {&(_ZTVN3ccc8DD8x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y4E[];
static VTBL_ENTRY alt_thunk_names1549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y43efgEv,_ZTv0_n12_N3ccc8DD8x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y43efgEv,_ZThn4_N3ccc8DD8x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y4E = {  "_ZN3ccc8DD8x13y4E", // class name
  bases__ZN3ccc8DD8x13y4E, 2,
  &(vtc__ZN3ccc8DD8x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y4E),3, //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  CC8x13y5  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC8x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x13y53abcEv
  ~CC8x13y5(); // tgen
  CC8x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y5E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y53pqrEv");}
void  ccc::CC8x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y53efgEv");}
void  ccc::CC8x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y53abcEv");}
ccc::CC8x13y5 ::~CC8x13y5(){ note_dtor("_ZN3ccc8CC8x13y5E", this);} // tgen
ccc::CC8x13y5 ::CC8x13y5(){ note_ctor("_ZN3ccc8CC8x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y5E, buf);
    ::ccc::CC8x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y5E);
    dp->::ccc::CC8x13y5::~CC8x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y5E(Test__ZN3ccc8CC8x13y5E, "_ZN3ccc8CC8x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y5C1Ev();
extern void _ZN3ccc8CC8x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y5E[] = {
  NSPAIR(_ZN3ccc8CC8x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y5E[];
extern void _ZN3ccc8CC8x13y53efgEv();
extern void _ZN3ccc8CC8x13y53pqrEv();
extern void _ZN3ccc8CC8x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y53efgEv,_ZTv0_n12_N3ccc8CC8x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y53efgEv,_ZThn4_N3ccc8CC8x13y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y53abcEv,_ZTv0_n16_N3ccc8CC8x13y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y53abcEv,_ZThn4_N3ccc8CC8x13y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y53efgEv,_ZTv0_n12_N3ccc8CC8x13y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y53abcEv,_ZTv0_n16_N3ccc8CC8x13y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y5E[] = {
  {&(_ZTVN3ccc8CC8x13y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y5E[];
static VTBL_ENTRY alt_thunk_names1550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y53abcEv,_ZTv0_n16_N3ccc8CC8x13y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y53abcEv,_ZThn4_N3ccc8CC8x13y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y53efgEv,_ZTv0_n12_N3ccc8CC8x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y53efgEv,_ZThn4_N3ccc8CC8x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y5E = {  "_ZN3ccc8CC8x13y5E", // class name
  bases__ZN3ccc8CC8x13y5E, 2,
  &(vtc__ZN3ccc8CC8x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y5E),2, //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  DD8x13y5  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD8x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD8x13y53abcEv
  ~DD8x13y5(); // tgen
  DD8x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y5E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y53pqrEv");}
void  ccc::DD8x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y53efgEv");}
void  ccc::DD8x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y53abcEv");}
ccc::DD8x13y5 ::~DD8x13y5(){ note_dtor("_ZN3ccc8DD8x13y5E", this);} // tgen
ccc::DD8x13y5 ::DD8x13y5(){ note_ctor("_ZN3ccc8DD8x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y5E, buf);
    ::ccc::DD8x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y5E);
    dp->::ccc::DD8x13y5::~DD8x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y5E(Test__ZN3ccc8DD8x13y5E, "_ZN3ccc8DD8x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y5C1Ev();
extern void _ZN3ccc8DD8x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y5E[] = {
  NSPAIR(_ZN3ccc8DD8x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y5E[];
extern void _ZN3ccc8DD8x13y53efgEv();
extern void _ZN3ccc8DD8x13y53abcEv();
extern void _ZN3ccc8DD8x13y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y53efgEv,_ZTv0_n12_N3ccc8DD8x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y53efgEv,_ZThn4_N3ccc8DD8x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y53efgEv,_ZTv0_n12_N3ccc8DD8x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y5E[] = {
  {&(_ZTVN3ccc8DD8x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y5E[];
static VTBL_ENTRY alt_thunk_names1551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y53efgEv,_ZTv0_n12_N3ccc8DD8x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y53efgEv,_ZThn4_N3ccc8DD8x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y5E = {  "_ZN3ccc8DD8x13y5E", // class name
  bases__ZN3ccc8DD8x13y5E, 2,
  &(vtc__ZN3ccc8DD8x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y5E),3, //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  CC8x13y6  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x13y63efgEv
  ~CC8x13y6(); // tgen
  CC8x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y6E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y63abcEv");}
void  ccc::CC8x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y63efgEv");}
ccc::CC8x13y6 ::~CC8x13y6(){ note_dtor("_ZN3ccc8CC8x13y6E", this);} // tgen
ccc::CC8x13y6 ::CC8x13y6(){ note_ctor("_ZN3ccc8CC8x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y6E, buf);
    ::ccc::CC8x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y6E);
    dp->::ccc::CC8x13y6::~CC8x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y6E(Test__ZN3ccc8CC8x13y6E, "_ZN3ccc8CC8x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y6C1Ev();
extern void _ZN3ccc8CC8x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y6E[] = {
  NSPAIR(_ZN3ccc8CC8x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y6E[];
extern void _ZN3ccc8CC8x13y63efgEv();
extern void _ZN3ccc8CC8x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y63efgEv,_ZTv0_n12_N3ccc8CC8x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y63efgEv,_ZThn4_N3ccc8CC8x13y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y63abcEv,_ZTv0_n16_N3ccc8CC8x13y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y63abcEv,_ZThn4_N3ccc8CC8x13y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y63efgEv,_ZTv0_n12_N3ccc8CC8x13y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y63abcEv,_ZTv0_n16_N3ccc8CC8x13y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y6E[] = {
  {&(_ZTVN3ccc8CC8x13y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x13y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y6E[];
static VTBL_ENTRY alt_thunk_names1552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y63abcEv,_ZTv0_n16_N3ccc8CC8x13y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y63abcEv,_ZThn4_N3ccc8CC8x13y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y63efgEv,_ZTv0_n12_N3ccc8CC8x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y63efgEv,_ZThn4_N3ccc8CC8x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y6E = {  "_ZN3ccc8CC8x13y6E", // class name
  bases__ZN3ccc8CC8x13y6E, 2,
  &(vtc__ZN3ccc8CC8x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y6E),2, //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  DD8x13y6  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD8x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD8x13y63efgEv
  ~DD8x13y6(); // tgen
  DD8x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y6E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y63abcEv");}
void  ccc::DD8x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y63efgEv");}
ccc::DD8x13y6 ::~DD8x13y6(){ note_dtor("_ZN3ccc8DD8x13y6E", this);} // tgen
ccc::DD8x13y6 ::DD8x13y6(){ note_ctor("_ZN3ccc8DD8x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y6E, buf);
    ::ccc::DD8x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y6E);
    dp->::ccc::DD8x13y6::~DD8x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y6E(Test__ZN3ccc8DD8x13y6E, "_ZN3ccc8DD8x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y6C1Ev();
extern void _ZN3ccc8DD8x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y6E[] = {
  NSPAIR(_ZN3ccc8DD8x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y6E[];
extern void _ZN3ccc8DD8x13y63efgEv();
extern void _ZN3ccc8DD8x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y63efgEv,_ZTv0_n12_N3ccc8DD8x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y63efgEv,_ZThn4_N3ccc8DD8x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y63efgEv,_ZTv0_n12_N3ccc8DD8x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y6E[] = {
  {&(_ZTVN3ccc8DD8x13y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x13y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x13y6E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y6E[];
static VTBL_ENTRY alt_thunk_names1553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y63efgEv,_ZTv0_n12_N3ccc8DD8x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y63efgEv,_ZThn4_N3ccc8DD8x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y6E = {  "_ZN3ccc8DD8x13y6E", // class name
  bases__ZN3ccc8DD8x13y6E, 2,
  &(vtc__ZN3ccc8DD8x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y6E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y6E),3, //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  CC8x13y7  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC8x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y73pqrEv
  ~CC8x13y7(); // tgen
  CC8x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y7E) C1{ VBC2{ v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y73abcEv");}
void  ccc::CC8x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y73pqrEv");}
ccc::CC8x13y7 ::~CC8x13y7(){ note_dtor("_ZN3ccc8CC8x13y7E", this);} // tgen
ccc::CC8x13y7 ::CC8x13y7(){ note_ctor("_ZN3ccc8CC8x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y7E, buf);
    ::ccc::CC8x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y7E);
    dp->::ccc::CC8x13y7::~CC8x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y7E(Test__ZN3ccc8CC8x13y7E, "_ZN3ccc8CC8x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y7C1Ev();
extern void _ZN3ccc8CC8x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y7E[] = {
  NSPAIR(_ZN3ccc8CC8x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC8x13y73abcEv();
extern void _ZN3ccc8CC8x13y73pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y73abcEv,_ZTv0_n16_N3ccc8CC8x13y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y73abcEv,_ZThn4_N3ccc8CC8x13y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y73abcEv,_ZTv0_n16_N3ccc8CC8x13y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y7E[] = {
  {&(_ZTVN3ccc8CC8x13y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x13y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y7E[];
static VTBL_ENTRY alt_thunk_names1554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y73abcEv,_ZTv0_n16_N3ccc8CC8x13y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y73abcEv,_ZThn4_N3ccc8CC8x13y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y7E = {  "_ZN3ccc8CC8x13y7E", // class name
  bases__ZN3ccc8CC8x13y7E, 2,
  &(vtc__ZN3ccc8CC8x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y7E),2, //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  DD8x13y7  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD8x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x13y73pqrEv
  ~DD8x13y7(); // tgen
  DD8x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y7E) C1{ VBC2{ v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y73abcEv");}
void  ccc::DD8x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y73pqrEv");}
ccc::DD8x13y7 ::~DD8x13y7(){ note_dtor("_ZN3ccc8DD8x13y7E", this);} // tgen
ccc::DD8x13y7 ::DD8x13y7(){ note_ctor("_ZN3ccc8DD8x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y7E, buf);
    ::ccc::DD8x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y7E);
    dp->::ccc::DD8x13y7::~DD8x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y7E(Test__ZN3ccc8DD8x13y7E, "_ZN3ccc8DD8x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y7C1Ev();
extern void _ZN3ccc8DD8x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y7E[] = {
  NSPAIR(_ZN3ccc8DD8x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x13y73abcEv();
extern void _ZN3ccc8DD8x13y73pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y73pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y7E[] = {
  {&(_ZTVN3ccc8DD8x13y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y7E[];
Class_Descriptor cd__ZN3ccc8DD8x13y7E = {  "_ZN3ccc8DD8x13y7E", // class name
  bases__ZN3ccc8DD8x13y7E, 2,
  &(vtc__ZN3ccc8DD8x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y7E),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  CC8x13y8  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x13y83abcEv
  ~CC8x13y8(); // tgen
  CC8x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y8E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y83efgEv");}
void  ccc::CC8x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x13y83abcEv");}
ccc::CC8x13y8 ::~CC8x13y8(){ note_dtor("_ZN3ccc8CC8x13y8E", this);} // tgen
ccc::CC8x13y8 ::CC8x13y8(){ note_ctor("_ZN3ccc8CC8x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y8E, buf);
    ::ccc::CC8x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y8E);
    dp->::ccc::CC8x13y8::~CC8x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y8E(Test__ZN3ccc8CC8x13y8E, "_ZN3ccc8CC8x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y8C1Ev();
extern void _ZN3ccc8CC8x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y8E[] = {
  NSPAIR(_ZN3ccc8CC8x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y8E[];
extern void _ZN3ccc8CC8x13y83efgEv();
extern void _ZN3ccc8CC8x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y83efgEv,_ZTv0_n12_N3ccc8CC8x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y83efgEv,_ZThn4_N3ccc8CC8x13y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x13y83abcEv,_ZTv0_n16_N3ccc8CC8x13y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y83abcEv,_ZThn4_N3ccc8CC8x13y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y83efgEv,_ZTv0_n12_N3ccc8CC8x13y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x13y83abcEv,_ZTv0_n16_N3ccc8CC8x13y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y8E[] = {
  {&(_ZTVN3ccc8CC8x13y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x13y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y8E[];
static VTBL_ENTRY alt_thunk_names1555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x13y83abcEv,_ZTv0_n16_N3ccc8CC8x13y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y83abcEv,_ZThn4_N3ccc8CC8x13y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y83efgEv,_ZTv0_n12_N3ccc8CC8x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y83efgEv,_ZThn4_N3ccc8CC8x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y8E = {  "_ZN3ccc8CC8x13y8E", // class name
  bases__ZN3ccc8CC8x13y8E, 2,
  &(vtc__ZN3ccc8CC8x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y8E),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  DD8x13y8  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD8x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD8x13y83abcEv
  ~DD8x13y8(); // tgen
  DD8x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y8E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y83efgEv");}
void  ccc::DD8x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x13y83abcEv");}
ccc::DD8x13y8 ::~DD8x13y8(){ note_dtor("_ZN3ccc8DD8x13y8E", this);} // tgen
ccc::DD8x13y8 ::DD8x13y8(){ note_ctor("_ZN3ccc8DD8x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y8E, buf);
    ::ccc::DD8x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y8E);
    dp->::ccc::DD8x13y8::~DD8x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y8E(Test__ZN3ccc8DD8x13y8E, "_ZN3ccc8DD8x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y8C1Ev();
extern void _ZN3ccc8DD8x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y8E[] = {
  NSPAIR(_ZN3ccc8DD8x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y8E[];
extern void _ZN3ccc8DD8x13y83efgEv();
extern void _ZN3ccc8DD8x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y83efgEv,_ZTv0_n12_N3ccc8DD8x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y83efgEv,_ZThn4_N3ccc8DD8x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y83efgEv,_ZTv0_n12_N3ccc8DD8x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y8E[] = {
  {&(_ZTVN3ccc8DD8x13y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x13y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x13y8E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y8E[];
static VTBL_ENTRY alt_thunk_names1556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y83efgEv,_ZTv0_n12_N3ccc8DD8x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y83efgEv,_ZThn4_N3ccc8DD8x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y8E = {  "_ZN3ccc8DD8x13y8E", // class name
  bases__ZN3ccc8DD8x13y8E, 2,
  &(vtc__ZN3ccc8DD8x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y8E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y8E),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  CC8x13y9  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC8x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x13y93pqrEv
  ~CC8x13y9(); // tgen
  CC8x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x13y9E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x13y93efgEv");}
void  ccc::CC8x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x13y93pqrEv");}
ccc::CC8x13y9 ::~CC8x13y9(){ note_dtor("_ZN3ccc8CC8x13y9E", this);} // tgen
ccc::CC8x13y9 ::CC8x13y9(){ note_ctor("_ZN3ccc8CC8x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC8x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x13y9E, buf);
    ::ccc::CC8x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x13y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC8x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x13y9E);
    dp->::ccc::CC8x13y9::~CC8x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x13y9E(Test__ZN3ccc8CC8x13y9E, "_ZN3ccc8CC8x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x13y9C1Ev();
extern void _ZN3ccc8CC8x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC8x13y9E[] = {
  NSPAIR(_ZN3ccc8CC8x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC8x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC8x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x13y9E[];
extern void _ZN3ccc8CC8x13y93efgEv();
extern void _ZN3ccc8CC8x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x13y93efgEv,_ZTv0_n12_N3ccc8CC8x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x13y93efgEv,_ZThn4_N3ccc8CC8x13y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x13y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x13y93efgEv,_ZTv0_n12_N3ccc8CC8x13y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x13y9E[] = {
  {&(_ZTVN3ccc8CC8x13y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x13y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x13y9E[];
static VTBL_ENTRY alt_thunk_names1557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x13y93efgEv,_ZTv0_n12_N3ccc8CC8x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x13y93efgEv,_ZThn4_N3ccc8CC8x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x13y9E = {  "_ZN3ccc8CC8x13y9E", // class name
  bases__ZN3ccc8CC8x13y9E, 2,
  &(vtc__ZN3ccc8CC8x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x13y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x13y9E),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  DD8x13y9  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD8x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x13y93pqrEv
  ~DD8x13y9(); // tgen
  DD8x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD8x13y9E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x13y93efgEv");}
void  ccc::DD8x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x13y93pqrEv");}
ccc::DD8x13y9 ::~DD8x13y9(){ note_dtor("_ZN3ccc8DD8x13y9E", this);} // tgen
ccc::DD8x13y9 ::DD8x13y9(){ note_ctor("_ZN3ccc8DD8x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD8x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x13y9E, buf);
    ::ccc::DD8x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x13y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD8x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x13y9E);
    dp->::ccc::DD8x13y9::~DD8x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x13y9E(Test__ZN3ccc8DD8x13y9E, "_ZN3ccc8DD8x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x13y9C1Ev();
extern void _ZN3ccc8DD8x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD8x13y9E[] = {
  NSPAIR(_ZN3ccc8DD8x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD8x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD8x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y9E[];
extern void _ZN3ccc8DD8x13y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x13y93efgEv,_ZTv0_n12_N3ccc8DD8x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x13y93efgEv,_ZThn4_N3ccc8DD8x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x13y93efgEv,_ZTv0_n12_N3ccc8DD8x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x13y9E[] = {
  {&(_ZTVN3ccc8DD8x13y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x13y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x13y9E[];
static VTBL_ENTRY alt_thunk_names1558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x13y93efgEv,_ZTv0_n12_N3ccc8DD8x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x13y93efgEv,_ZThn4_N3ccc8DD8x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x13y9E = {  "_ZN3ccc8DD8x13y9E", // class name
  bases__ZN3ccc8DD8x13y9E, 2,
  &(vtc__ZN3ccc8DD8x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x13y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x13y9E),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  CC8x13y10  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC8x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x13y103abcEv
  ~CC8x13y10(); // tgen
  CC8x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y10E) C1{ VBC2{ v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC8x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x13y103pqrEv");}
void  ccc::CC8x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x13y103abcEv");}
ccc::CC8x13y10 ::~CC8x13y10(){ note_dtor("_ZN3ccc9CC8x13y10E", this);} // tgen
ccc::CC8x13y10 ::CC8x13y10(){ note_ctor("_ZN3ccc9CC8x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC8x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x13y10E, buf);
    ::ccc::CC8x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x13y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC8x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x13y10E);
    dp->::ccc::CC8x13y10::~CC8x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x13y10E(Test__ZN3ccc9CC8x13y10E, "_ZN3ccc9CC8x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x13y10C1Ev();
extern void _ZN3ccc9CC8x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC8x13y10E[] = {
  NSPAIR(_ZN3ccc9CC8x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC8x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC8x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC8x13y103pqrEv();
extern void _ZN3ccc9CC8x13y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x13y103abcEv,_ZTv0_n16_N3ccc9CC8x13y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x13y103abcEv,_ZThn4_N3ccc9CC8x13y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x13y103abcEv,_ZTv0_n16_N3ccc9CC8x13y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x13y10E[] = {
  {&(_ZTVN3ccc9CC8x13y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC8x13y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x13y10E[];
static VTBL_ENTRY alt_thunk_names1559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x13y103abcEv,_ZTv0_n16_N3ccc9CC8x13y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x13y103abcEv,_ZThn4_N3ccc9CC8x13y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x13y10E = {  "_ZN3ccc9CC8x13y10E", // class name
  bases__ZN3ccc9CC8x13y10E, 2,
  &(vtc__ZN3ccc9CC8x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x13y10E),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  DD8x13y10  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD8x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD8x13y103abcEv
  ~DD8x13y10(); // tgen
  DD8x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD8x13y10E) C1{ VBC2{ v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD8x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x13y103pqrEv");}
void  ccc::DD8x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x13y103abcEv");}
ccc::DD8x13y10 ::~DD8x13y10(){ note_dtor("_ZN3ccc9DD8x13y10E", this);} // tgen
ccc::DD8x13y10 ::DD8x13y10(){ note_ctor("_ZN3ccc9DD8x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD8x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x13y10E, buf);
    ::ccc::DD8x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x13y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD8x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x13y10E);
    dp->::ccc::DD8x13y10::~DD8x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x13y10E(Test__ZN3ccc9DD8x13y10E, "_ZN3ccc9DD8x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x13y10C1Ev();
extern void _ZN3ccc9DD8x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD8x13y10E[] = {
  NSPAIR(_ZN3ccc9DD8x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD8x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD8x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x13y103abcEv();
extern void _ZN3ccc9DD8x13y103pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y103pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x13y10E[] = {
  {&(_ZTVN3ccc9DD8x13y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x13y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x13y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x13y10E[];
Class_Descriptor cd__ZN3ccc9DD8x13y10E = {  "_ZN3ccc9DD8x13y10E", // class name
  bases__ZN3ccc9DD8x13y10E, 2,
  &(vtc__ZN3ccc9DD8x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x13y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x13y10E),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  CC8x13y11  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC8x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x13y113efgEv
  ~CC8x13y11(); // tgen
  CC8x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y11E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x13y113pqrEv");}
void  ccc::CC8x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x13y113efgEv");}
ccc::CC8x13y11 ::~CC8x13y11(){ note_dtor("_ZN3ccc9CC8x13y11E", this);} // tgen
ccc::CC8x13y11 ::CC8x13y11(){ note_ctor("_ZN3ccc9CC8x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC8x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x13y11E, buf);
    ::ccc::CC8x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x13y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC8x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x13y11E);
    dp->::ccc::CC8x13y11::~CC8x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x13y11E(Test__ZN3ccc9CC8x13y11E, "_ZN3ccc9CC8x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x13y11C1Ev();
extern void _ZN3ccc9CC8x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC8x13y11E[] = {
  NSPAIR(_ZN3ccc9CC8x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC8x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC8x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x13y11E[];
extern void _ZN3ccc9CC8x13y113efgEv();
extern void _ZN3ccc9CC8x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x13y113efgEv,_ZTv0_n12_N3ccc9CC8x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x13y113efgEv,_ZThn4_N3ccc9CC8x13y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x13y113efgEv,_ZTv0_n12_N3ccc9CC8x13y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x13y11E[] = {
  {&(_ZTVN3ccc9CC8x13y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x13y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x13y11E[];
static VTBL_ENTRY alt_thunk_names1560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x13y113efgEv,_ZTv0_n12_N3ccc9CC8x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x13y113efgEv,_ZThn4_N3ccc9CC8x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x13y11E = {  "_ZN3ccc9CC8x13y11E", // class name
  bases__ZN3ccc9CC8x13y11E, 2,
  &(vtc__ZN3ccc9CC8x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x13y11E),2, //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  DD8x13y11  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD8x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD8x13y113efgEv
  ~DD8x13y11(); // tgen
  DD8x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD8x13y11E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x13y113pqrEv");}
void  ccc::DD8x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x13y113efgEv");}
ccc::DD8x13y11 ::~DD8x13y11(){ note_dtor("_ZN3ccc9DD8x13y11E", this);} // tgen
ccc::DD8x13y11 ::DD8x13y11(){ note_ctor("_ZN3ccc9DD8x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD8x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x13y11E, buf);
    ::ccc::DD8x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x13y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD8x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x13y11E);
    dp->::ccc::DD8x13y11::~DD8x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x13y11E(Test__ZN3ccc9DD8x13y11E, "_ZN3ccc9DD8x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x13y11C1Ev();
extern void _ZN3ccc9DD8x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD8x13y11E[] = {
  NSPAIR(_ZN3ccc9DD8x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD8x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD8x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y11E[];
extern void _ZN3ccc9DD8x13y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x13y113efgEv,_ZTv0_n12_N3ccc9DD8x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x13y113efgEv,_ZThn4_N3ccc9DD8x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x13y113efgEv,_ZTv0_n12_N3ccc9DD8x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x13y11E[] = {
  {&(_ZTVN3ccc9DD8x13y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x13y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x13y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x13y11E[];
static VTBL_ENTRY alt_thunk_names1561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x13y113efgEv,_ZTv0_n12_N3ccc9DD8x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x13y113efgEv,_ZThn4_N3ccc9DD8x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x13y11E = {  "_ZN3ccc9DD8x13y11E", // class name
  bases__ZN3ccc9DD8x13y11E, 2,
  &(vtc__ZN3ccc9DD8x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x13y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x13y11E),3, //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  CC8x13y12  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC8x13y123abcEv
  ~CC8x13y12(); // tgen
  CC8x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y12E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC8x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x13y123abcEv");}
ccc::CC8x13y12 ::~CC8x13y12(){ note_dtor("_ZN3ccc9CC8x13y12E", this);} // tgen
ccc::CC8x13y12 ::CC8x13y12(){ note_ctor("_ZN3ccc9CC8x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC8x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x13y12E, buf);
    ::ccc::CC8x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x13y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC8x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x13y12E);
    dp->::ccc::CC8x13y12::~CC8x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x13y12E(Test__ZN3ccc9CC8x13y12E, "_ZN3ccc9CC8x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x13y12C1Ev();
extern void _ZN3ccc9CC8x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC8x13y12E[] = {
  NSPAIR(_ZN3ccc9CC8x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC8x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC8x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC8x13y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x13y123abcEv,_ZTv0_n16_N3ccc9CC8x13y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x13y123abcEv,_ZThn4_N3ccc9CC8x13y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x13y123abcEv,_ZTv0_n16_N3ccc9CC8x13y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x13y12E[] = {
  {&(_ZTVN3ccc9CC8x13y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x13y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x13y12E[];
static VTBL_ENTRY alt_thunk_names1562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x13y123abcEv,_ZTv0_n16_N3ccc9CC8x13y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x13y123abcEv,_ZThn4_N3ccc9CC8x13y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x13y12E = {  "_ZN3ccc9CC8x13y12E", // class name
  bases__ZN3ccc9CC8x13y12E, 2,
  &(vtc__ZN3ccc9CC8x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x13y12E),2, //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  DD8x13y12  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD8x13y123abcEv
  ~DD8x13y12(); // tgen
  DD8x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD8x13y12E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD8x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x13y123abcEv");}
ccc::DD8x13y12 ::~DD8x13y12(){ note_dtor("_ZN3ccc9DD8x13y12E", this);} // tgen
ccc::DD8x13y12 ::DD8x13y12(){ note_ctor("_ZN3ccc9DD8x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD8x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x13y12E, buf);
    ::ccc::DD8x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x13y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD8x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x13y12E);
    dp->::ccc::DD8x13y12::~DD8x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x13y12E(Test__ZN3ccc9DD8x13y12E, "_ZN3ccc9DD8x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x13y12C1Ev();
extern void _ZN3ccc9DD8x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD8x13y12E[] = {
  NSPAIR(_ZN3ccc9DD8x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD8x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD8x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x13y12E[] = {
  {&(_ZTVN3ccc9DD8x13y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x13y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x13y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x13y12E[];
Class_Descriptor cd__ZN3ccc9DD8x13y12E = {  "_ZN3ccc9DD8x13y12E", // class name
  bases__ZN3ccc9DD8x13y12E, 2,
  &(vtc__ZN3ccc9DD8x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x13y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x13y12E),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  CC8x13y13  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC8x13y133efgEv
  ~CC8x13y13(); // tgen
  CC8x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y13E) C1{ VBC2{ v1 v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC8x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x13y133efgEv");}
ccc::CC8x13y13 ::~CC8x13y13(){ note_dtor("_ZN3ccc9CC8x13y13E", this);} // tgen
ccc::CC8x13y13 ::CC8x13y13(){ note_ctor("_ZN3ccc9CC8x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC8x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x13y13E, buf);
    ::ccc::CC8x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x13y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC8x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x13y13E);
    dp->::ccc::CC8x13y13::~CC8x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x13y13E(Test__ZN3ccc9CC8x13y13E, "_ZN3ccc9CC8x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x13y13C1Ev();
extern void _ZN3ccc9CC8x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC8x13y13E[] = {
  NSPAIR(_ZN3ccc9CC8x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC8x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC8x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x13y13E[];
extern void _ZN3ccc9CC8x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x13y133efgEv,_ZTv0_n12_N3ccc9CC8x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x13y133efgEv,_ZThn4_N3ccc9CC8x13y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x13y133efgEv,_ZTv0_n12_N3ccc9CC8x13y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x13y13E[] = {
  {&(_ZTVN3ccc9CC8x13y13E[3]),  3,10},
  {&(_ZTVN3ccc9CC8x13y13E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x13y13E[];
static VTBL_ENTRY alt_thunk_names1563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x13y133efgEv,_ZTv0_n12_N3ccc9CC8x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x13y133efgEv,_ZThn4_N3ccc9CC8x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x13y13E = {  "_ZN3ccc9CC8x13y13E", // class name
  bases__ZN3ccc9CC8x13y13E, 2,
  &(vtc__ZN3ccc9CC8x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y13E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x13y13E),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  DD8x13y13  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD8x13y133efgEv
  ~DD8x13y13(); // tgen
  DD8x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD8x13y13E) C1{ VBC2{ v1 v2} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD8x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x13y133efgEv");}
ccc::DD8x13y13 ::~DD8x13y13(){ note_dtor("_ZN3ccc9DD8x13y13E", this);} // tgen
ccc::DD8x13y13 ::DD8x13y13(){ note_ctor("_ZN3ccc9DD8x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD8x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x13y13E, buf);
    ::ccc::DD8x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x13y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD8x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x13y13E);
    dp->::ccc::DD8x13y13::~DD8x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x13y13E(Test__ZN3ccc9DD8x13y13E, "_ZN3ccc9DD8x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x13y13C1Ev();
extern void _ZN3ccc9DD8x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD8x13y13E[] = {
  NSPAIR(_ZN3ccc9DD8x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD8x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD8x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y13E[];
extern void _ZN3ccc9DD8x13y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x13y133efgEv,_ZTv0_n12_N3ccc9DD8x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x13y133efgEv,_ZThn4_N3ccc9DD8x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x13y133efgEv,_ZTv0_n12_N3ccc9DD8x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x13y13E[] = {
  {&(_ZTVN3ccc9DD8x13y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x13y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x13y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x13y13E[];
static VTBL_ENTRY alt_thunk_names1564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x13y133efgEv,_ZTv0_n12_N3ccc9DD8x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x13y133efgEv,_ZThn4_N3ccc9DD8x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x13y13E = {  "_ZN3ccc9DD8x13y13E", // class name
  bases__ZN3ccc9DD8x13y13E, 2,
  &(vtc__ZN3ccc9DD8x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x13y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x13y13E),3, //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  CC8x13y14  : virtual ::ccc::AA8 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC8x13y143pqrEv
  ~CC8x13y14(); // tgen
  CC8x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y14E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC8x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x13y143pqrEv");}
ccc::CC8x13y14 ::~CC8x13y14(){ note_dtor("_ZN3ccc9CC8x13y14E", this);} // tgen
ccc::CC8x13y14 ::CC8x13y14(){ note_ctor("_ZN3ccc9CC8x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC8x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x13y14E, buf);
    ::ccc::CC8x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x13y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC8x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x13y14E);
    dp->::ccc::CC8x13y14::~CC8x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x13y14E(Test__ZN3ccc9CC8x13y14E, "_ZN3ccc9CC8x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x13y14C1Ev();
extern void _ZN3ccc9CC8x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC8x13y14E[] = {
  NSPAIR(_ZN3ccc9CC8x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC8x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC8x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC8x13y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x13y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x13y14E[] = {
  {&(_ZTVN3ccc9CC8x13y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x13y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x13y14E[];
Class_Descriptor cd__ZN3ccc9CC8x13y14E = {  "_ZN3ccc9CC8x13y14E", // class name
  bases__ZN3ccc9CC8x13y14E, 2,
  &(vtc__ZN3ccc9CC8x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x13y14E),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  DD8x13y14  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD8x13y143pqrEv
  ~DD8x13y14(); // tgen
  DD8x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD8x13y14E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD8x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x13y143pqrEv");}
ccc::DD8x13y14 ::~DD8x13y14(){ note_dtor("_ZN3ccc9DD8x13y14E", this);} // tgen
ccc::DD8x13y14 ::DD8x13y14(){ note_ctor("_ZN3ccc9DD8x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD8x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x13y14E, buf);
    ::ccc::DD8x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x13y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD8x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x13y14E);
    dp->::ccc::DD8x13y14::~DD8x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x13y14E(Test__ZN3ccc9DD8x13y14E, "_ZN3ccc9DD8x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x13y14C1Ev();
extern void _ZN3ccc9DD8x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD8x13y14E[] = {
  NSPAIR(_ZN3ccc9DD8x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD8x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD8x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x13y14E[] = {
  {&(_ZTVN3ccc9DD8x13y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x13y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x13y14E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x13y14E[];
Class_Descriptor cd__ZN3ccc9DD8x13y14E = {  "_ZN3ccc9DD8x13y14E", // class name
  bases__ZN3ccc9DD8x13y14E, 2,
  &(vtc__ZN3ccc9DD8x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x13y14E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x13y14E),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  CC8x13y15  : virtual ::ccc::AA8 , ::ccc::BB13 {
  ~CC8x13y15(); // tgen
  CC8x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x13y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC8x13y15 ::~CC8x13y15(){ note_dtor("_ZN3ccc9CC8x13y15E", this);} // tgen
ccc::CC8x13y15 ::CC8x13y15(){ note_ctor("_ZN3ccc9CC8x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC8x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x13y15E, buf);
    ::ccc::CC8x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x13y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC8x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x13y15E);
    dp->::ccc::CC8x13y15::~CC8x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x13y15E(Test__ZN3ccc9CC8x13y15E, "_ZN3ccc9CC8x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x13y15C1Ev();
extern void _ZN3ccc9CC8x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC8x13y15E[] = {
  NSPAIR(_ZN3ccc9CC8x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC8x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC8x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x13y15E[] = {
  {&(_ZTVN3ccc9CC8x13y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC8x13y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x13y15E[];
Class_Descriptor cd__ZN3ccc9CC8x13y15E = {  "_ZN3ccc9CC8x13y15E", // class name
  bases__ZN3ccc9CC8x13y15E, 2,
  &(vtc__ZN3ccc9CC8x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x13y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x13y15E),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  DD8x13y15  : virtual ::ccc::AA8 , virtual ::ccc::BB13 {
  ~DD8x13y15(); // tgen
  DD8x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD8x13y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD8x13y15 ::~DD8x13y15(){ note_dtor("_ZN3ccc9DD8x13y15E", this);} // tgen
ccc::DD8x13y15 ::DD8x13y15(){ note_ctor("_ZN3ccc9DD8x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD8x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x13y15E, buf);
    ::ccc::DD8x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x13y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD8x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x13y15E);
    dp->::ccc::DD8x13y15::~DD8x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x13y15E(Test__ZN3ccc9DD8x13y15E, "_ZN3ccc9DD8x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x13y15C1Ev();
extern void _ZN3ccc9DD8x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD8x13y15E[] = {
  NSPAIR(_ZN3ccc9DD8x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD8x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD8x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x13y15E[] = {
  {&(_ZTVN3ccc9DD8x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x13y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x13y15E[];
Class_Descriptor cd__ZN3ccc9DD8x13y15E = {  "_ZN3ccc9DD8x13y15E", // class name
  bases__ZN3ccc9DD8x13y15E, 2,
  &(vtc__ZN3ccc9DD8x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x13y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x13y15E),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  CC8x14y0  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y03pqrEv
  ~CC8x14y0(); // tgen
  CC8x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y0E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y03abcEv");}
void  ccc::CC8x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y03efgEv");}
void  ccc::CC8x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y03pqrEv");}
ccc::CC8x14y0 ::~CC8x14y0(){ note_dtor("_ZN3ccc8CC8x14y0E", this);} // tgen
ccc::CC8x14y0 ::CC8x14y0(){ note_ctor("_ZN3ccc8CC8x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y0E, buf);
    ::ccc::CC8x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y0E);
    dp->::ccc::CC8x14y0::~CC8x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y0E(Test__ZN3ccc8CC8x14y0E, "_ZN3ccc8CC8x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y0C1Ev();
extern void _ZN3ccc8CC8x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y0E[] = {
  NSPAIR(_ZN3ccc8CC8x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y0E[];
extern void _ZN3ccc8CC8x14y03pqrEv();
extern void _ZN3ccc8CC8x14y03abcEv();
extern void _ZN3ccc8CC8x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y03efgEv,_ZTv0_n12_N3ccc8CC8x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y03efgEv,_ZThn4_N3ccc8CC8x14y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y03abcEv,_ZTv0_n16_N3ccc8CC8x14y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y03abcEv,_ZThn4_N3ccc8CC8x14y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y03efgEv,_ZTv0_n12_N3ccc8CC8x14y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y03abcEv,_ZTv0_n16_N3ccc8CC8x14y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y0E[] = {
  {&(_ZTVN3ccc8CC8x14y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y0E[];
static VTBL_ENTRY alt_thunk_names1565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y03abcEv,_ZTv0_n16_N3ccc8CC8x14y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y03abcEv,_ZThn4_N3ccc8CC8x14y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y03efgEv,_ZTv0_n12_N3ccc8CC8x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y03efgEv,_ZThn4_N3ccc8CC8x14y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y0E = {  "_ZN3ccc8CC8x14y0E", // class name
  bases__ZN3ccc8CC8x14y0E, 2,
  &(vtc__ZN3ccc8CC8x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y0E),2, //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  DD8x14y0  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD8x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD8x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x14y03pqrEv
  ~DD8x14y0(); // tgen
  DD8x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y0E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y03abcEv");}
void  ccc::DD8x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y03efgEv");}
void  ccc::DD8x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y03pqrEv");}
ccc::DD8x14y0 ::~DD8x14y0(){ note_dtor("_ZN3ccc8DD8x14y0E", this);} // tgen
ccc::DD8x14y0 ::DD8x14y0(){ note_ctor("_ZN3ccc8DD8x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y0E, buf);
    ::ccc::DD8x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y0E);
    dp->::ccc::DD8x14y0::~DD8x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y0E(Test__ZN3ccc8DD8x14y0E, "_ZN3ccc8DD8x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y0C1Ev();
extern void _ZN3ccc8DD8x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y0E[] = {
  NSPAIR(_ZN3ccc8DD8x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y0E[];
extern void _ZN3ccc8DD8x14y03efgEv();
extern void _ZN3ccc8DD8x14y03abcEv();
extern void _ZN3ccc8DD8x14y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y03pqrEv,_ZTv0_n12_N3ccc8DD8x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y03pqrEv,_ZThn4_N3ccc8DD8x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y03pqrEv,_ZTv0_n12_N3ccc8DD8x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y0E[] = {
  {&(_ZTVN3ccc8DD8x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y0E[];
static VTBL_ENTRY alt_thunk_names1566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y03pqrEv,_ZTv0_n12_N3ccc8DD8x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y03pqrEv,_ZThn4_N3ccc8DD8x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y0E = {  "_ZN3ccc8DD8x14y0E", // class name
  bases__ZN3ccc8DD8x14y0E, 2,
  &(vtc__ZN3ccc8DD8x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y0E),3, //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  CC8x14y1  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x14y13efgEv
  ~CC8x14y1(); // tgen
  CC8x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y1E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y13abcEv");}
void  ccc::CC8x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y13pqrEv");}
void  ccc::CC8x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y13efgEv");}
ccc::CC8x14y1 ::~CC8x14y1(){ note_dtor("_ZN3ccc8CC8x14y1E", this);} // tgen
ccc::CC8x14y1 ::CC8x14y1(){ note_ctor("_ZN3ccc8CC8x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y1E, buf);
    ::ccc::CC8x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y1E);
    dp->::ccc::CC8x14y1::~CC8x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y1E(Test__ZN3ccc8CC8x14y1E, "_ZN3ccc8CC8x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y1C1Ev();
extern void _ZN3ccc8CC8x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y1E[] = {
  NSPAIR(_ZN3ccc8CC8x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y1E[];
extern void _ZN3ccc8CC8x14y13pqrEv();
extern void _ZN3ccc8CC8x14y13abcEv();
extern void _ZN3ccc8CC8x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y13efgEv,_ZTv0_n12_N3ccc8CC8x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y13efgEv,_ZThn4_N3ccc8CC8x14y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y13abcEv,_ZTv0_n16_N3ccc8CC8x14y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y13abcEv,_ZThn4_N3ccc8CC8x14y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y13efgEv,_ZTv0_n12_N3ccc8CC8x14y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y13abcEv,_ZTv0_n16_N3ccc8CC8x14y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y1E[] = {
  {&(_ZTVN3ccc8CC8x14y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y1E[];
static VTBL_ENTRY alt_thunk_names1567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y13abcEv,_ZTv0_n16_N3ccc8CC8x14y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y13abcEv,_ZThn4_N3ccc8CC8x14y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y13efgEv,_ZTv0_n12_N3ccc8CC8x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y13efgEv,_ZThn4_N3ccc8CC8x14y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y1E = {  "_ZN3ccc8CC8x14y1E", // class name
  bases__ZN3ccc8CC8x14y1E, 2,
  &(vtc__ZN3ccc8CC8x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y1E),2, //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  DD8x14y1  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD8x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x14y13efgEv
  ~DD8x14y1(); // tgen
  DD8x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y1E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y13abcEv");}
void  ccc::DD8x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y13pqrEv");}
void  ccc::DD8x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y13efgEv");}
ccc::DD8x14y1 ::~DD8x14y1(){ note_dtor("_ZN3ccc8DD8x14y1E", this);} // tgen
ccc::DD8x14y1 ::DD8x14y1(){ note_ctor("_ZN3ccc8DD8x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y1E, buf);
    ::ccc::DD8x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y1E);
    dp->::ccc::DD8x14y1::~DD8x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y1E(Test__ZN3ccc8DD8x14y1E, "_ZN3ccc8DD8x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y1C1Ev();
extern void _ZN3ccc8DD8x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y1E[] = {
  NSPAIR(_ZN3ccc8DD8x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y1E[];
extern void _ZN3ccc8DD8x14y13efgEv();
extern void _ZN3ccc8DD8x14y13abcEv();
extern void _ZN3ccc8DD8x14y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y13pqrEv,_ZTv0_n12_N3ccc8DD8x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y13pqrEv,_ZThn4_N3ccc8DD8x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y13pqrEv,_ZTv0_n12_N3ccc8DD8x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y1E[] = {
  {&(_ZTVN3ccc8DD8x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y1E[];
static VTBL_ENTRY alt_thunk_names1568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y13pqrEv,_ZTv0_n12_N3ccc8DD8x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y13pqrEv,_ZThn4_N3ccc8DD8x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y1E = {  "_ZN3ccc8DD8x14y1E", // class name
  bases__ZN3ccc8DD8x14y1E, 2,
  &(vtc__ZN3ccc8DD8x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y1E),3, //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  CC8x14y2  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y23pqrEv
  ~CC8x14y2(); // tgen
  CC8x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y2E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y23efgEv");}
void  ccc::CC8x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y23abcEv");}
void  ccc::CC8x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y23pqrEv");}
ccc::CC8x14y2 ::~CC8x14y2(){ note_dtor("_ZN3ccc8CC8x14y2E", this);} // tgen
ccc::CC8x14y2 ::CC8x14y2(){ note_ctor("_ZN3ccc8CC8x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y2E, buf);
    ::ccc::CC8x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y2E);
    dp->::ccc::CC8x14y2::~CC8x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y2E(Test__ZN3ccc8CC8x14y2E, "_ZN3ccc8CC8x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y2C1Ev();
extern void _ZN3ccc8CC8x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y2E[] = {
  NSPAIR(_ZN3ccc8CC8x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y2E[];
extern void _ZN3ccc8CC8x14y23pqrEv();
extern void _ZN3ccc8CC8x14y23efgEv();
extern void _ZN3ccc8CC8x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y23efgEv,_ZTv0_n12_N3ccc8CC8x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y23efgEv,_ZThn4_N3ccc8CC8x14y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y23abcEv,_ZTv0_n16_N3ccc8CC8x14y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y23abcEv,_ZThn4_N3ccc8CC8x14y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y23efgEv,_ZTv0_n12_N3ccc8CC8x14y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y23abcEv,_ZTv0_n16_N3ccc8CC8x14y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y2E[] = {
  {&(_ZTVN3ccc8CC8x14y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y2E[];
static VTBL_ENTRY alt_thunk_names1569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y23abcEv,_ZTv0_n16_N3ccc8CC8x14y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y23abcEv,_ZThn4_N3ccc8CC8x14y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y23efgEv,_ZTv0_n12_N3ccc8CC8x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y23efgEv,_ZThn4_N3ccc8CC8x14y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y2E = {  "_ZN3ccc8CC8x14y2E", // class name
  bases__ZN3ccc8CC8x14y2E, 2,
  &(vtc__ZN3ccc8CC8x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y2E),2, //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  DD8x14y2  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD8x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD8x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x14y23pqrEv
  ~DD8x14y2(); // tgen
  DD8x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y2E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y23efgEv");}
void  ccc::DD8x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y23abcEv");}
void  ccc::DD8x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y23pqrEv");}
ccc::DD8x14y2 ::~DD8x14y2(){ note_dtor("_ZN3ccc8DD8x14y2E", this);} // tgen
ccc::DD8x14y2 ::DD8x14y2(){ note_ctor("_ZN3ccc8DD8x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y2E, buf);
    ::ccc::DD8x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y2E);
    dp->::ccc::DD8x14y2::~DD8x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y2E(Test__ZN3ccc8DD8x14y2E, "_ZN3ccc8DD8x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y2C1Ev();
extern void _ZN3ccc8DD8x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y2E[] = {
  NSPAIR(_ZN3ccc8DD8x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y2E[];
extern void _ZN3ccc8DD8x14y23efgEv();
extern void _ZN3ccc8DD8x14y23abcEv();
extern void _ZN3ccc8DD8x14y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y23pqrEv,_ZTv0_n12_N3ccc8DD8x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y23pqrEv,_ZThn4_N3ccc8DD8x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y23pqrEv,_ZTv0_n12_N3ccc8DD8x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y2E[] = {
  {&(_ZTVN3ccc8DD8x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y2E[];
static VTBL_ENTRY alt_thunk_names1570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y23pqrEv,_ZTv0_n12_N3ccc8DD8x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y23pqrEv,_ZThn4_N3ccc8DD8x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y2E = {  "_ZN3ccc8DD8x14y2E", // class name
  bases__ZN3ccc8DD8x14y2E, 2,
  &(vtc__ZN3ccc8DD8x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y2E),3, //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  CC8x14y3  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x14y33abcEv
  ~CC8x14y3(); // tgen
  CC8x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y3E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y33efgEv");}
void  ccc::CC8x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y33pqrEv");}
void  ccc::CC8x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y33abcEv");}
ccc::CC8x14y3 ::~CC8x14y3(){ note_dtor("_ZN3ccc8CC8x14y3E", this);} // tgen
ccc::CC8x14y3 ::CC8x14y3(){ note_ctor("_ZN3ccc8CC8x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y3E, buf);
    ::ccc::CC8x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y3E);
    dp->::ccc::CC8x14y3::~CC8x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y3E(Test__ZN3ccc8CC8x14y3E, "_ZN3ccc8CC8x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y3C1Ev();
extern void _ZN3ccc8CC8x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y3E[] = {
  NSPAIR(_ZN3ccc8CC8x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y3E[];
extern void _ZN3ccc8CC8x14y33pqrEv();
extern void _ZN3ccc8CC8x14y33efgEv();
extern void _ZN3ccc8CC8x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y33efgEv,_ZTv0_n12_N3ccc8CC8x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y33efgEv,_ZThn4_N3ccc8CC8x14y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y33abcEv,_ZTv0_n16_N3ccc8CC8x14y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y33abcEv,_ZThn4_N3ccc8CC8x14y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y33efgEv,_ZTv0_n12_N3ccc8CC8x14y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y33abcEv,_ZTv0_n16_N3ccc8CC8x14y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y3E[] = {
  {&(_ZTVN3ccc8CC8x14y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y3E[];
static VTBL_ENTRY alt_thunk_names1571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y33abcEv,_ZTv0_n16_N3ccc8CC8x14y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y33abcEv,_ZThn4_N3ccc8CC8x14y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y33efgEv,_ZTv0_n12_N3ccc8CC8x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y33efgEv,_ZThn4_N3ccc8CC8x14y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y3E = {  "_ZN3ccc8CC8x14y3E", // class name
  bases__ZN3ccc8CC8x14y3E, 2,
  &(vtc__ZN3ccc8CC8x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y3E),2, //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  DD8x14y3  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD8x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x14y33abcEv
  ~DD8x14y3(); // tgen
  DD8x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y3E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y33efgEv");}
void  ccc::DD8x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y33pqrEv");}
void  ccc::DD8x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y33abcEv");}
ccc::DD8x14y3 ::~DD8x14y3(){ note_dtor("_ZN3ccc8DD8x14y3E", this);} // tgen
ccc::DD8x14y3 ::DD8x14y3(){ note_ctor("_ZN3ccc8DD8x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y3E, buf);
    ::ccc::DD8x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y3E);
    dp->::ccc::DD8x14y3::~DD8x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y3E(Test__ZN3ccc8DD8x14y3E, "_ZN3ccc8DD8x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y3C1Ev();
extern void _ZN3ccc8DD8x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y3E[] = {
  NSPAIR(_ZN3ccc8DD8x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y3E[];
extern void _ZN3ccc8DD8x14y33efgEv();
extern void _ZN3ccc8DD8x14y33abcEv();
extern void _ZN3ccc8DD8x14y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y33pqrEv,_ZTv0_n12_N3ccc8DD8x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y33pqrEv,_ZThn4_N3ccc8DD8x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y33pqrEv,_ZTv0_n12_N3ccc8DD8x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y3E[] = {
  {&(_ZTVN3ccc8DD8x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y3E[];
static VTBL_ENTRY alt_thunk_names1572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y33pqrEv,_ZTv0_n12_N3ccc8DD8x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y33pqrEv,_ZThn4_N3ccc8DD8x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y3E = {  "_ZN3ccc8DD8x14y3E", // class name
  bases__ZN3ccc8DD8x14y3E, 2,
  &(vtc__ZN3ccc8DD8x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y3E),3, //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  CC8x14y4  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC8x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x14y43efgEv
  ~CC8x14y4(); // tgen
  CC8x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y4E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y43pqrEv");}
void  ccc::CC8x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y43abcEv");}
void  ccc::CC8x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y43efgEv");}
ccc::CC8x14y4 ::~CC8x14y4(){ note_dtor("_ZN3ccc8CC8x14y4E", this);} // tgen
ccc::CC8x14y4 ::CC8x14y4(){ note_ctor("_ZN3ccc8CC8x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y4E, buf);
    ::ccc::CC8x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y4E);
    dp->::ccc::CC8x14y4::~CC8x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y4E(Test__ZN3ccc8CC8x14y4E, "_ZN3ccc8CC8x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y4C1Ev();
extern void _ZN3ccc8CC8x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y4E[] = {
  NSPAIR(_ZN3ccc8CC8x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y4E[];
extern void _ZN3ccc8CC8x14y43pqrEv();
extern void _ZN3ccc8CC8x14y43abcEv();
extern void _ZN3ccc8CC8x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y43efgEv,_ZTv0_n12_N3ccc8CC8x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y43efgEv,_ZThn4_N3ccc8CC8x14y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y43abcEv,_ZTv0_n16_N3ccc8CC8x14y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y43abcEv,_ZThn4_N3ccc8CC8x14y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y43efgEv,_ZTv0_n12_N3ccc8CC8x14y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y43abcEv,_ZTv0_n16_N3ccc8CC8x14y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y4E[] = {
  {&(_ZTVN3ccc8CC8x14y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y4E[];
static VTBL_ENTRY alt_thunk_names1573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y43abcEv,_ZTv0_n16_N3ccc8CC8x14y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y43abcEv,_ZThn4_N3ccc8CC8x14y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y43efgEv,_ZTv0_n12_N3ccc8CC8x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y43efgEv,_ZThn4_N3ccc8CC8x14y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y4E = {  "_ZN3ccc8CC8x14y4E", // class name
  bases__ZN3ccc8CC8x14y4E, 2,
  &(vtc__ZN3ccc8CC8x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y4E),2, //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  DD8x14y4  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD8x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD8x14y43efgEv
  ~DD8x14y4(); // tgen
  DD8x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y4E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y43pqrEv");}
void  ccc::DD8x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y43abcEv");}
void  ccc::DD8x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y43efgEv");}
ccc::DD8x14y4 ::~DD8x14y4(){ note_dtor("_ZN3ccc8DD8x14y4E", this);} // tgen
ccc::DD8x14y4 ::DD8x14y4(){ note_ctor("_ZN3ccc8DD8x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y4E, buf);
    ::ccc::DD8x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y4E);
    dp->::ccc::DD8x14y4::~DD8x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y4E(Test__ZN3ccc8DD8x14y4E, "_ZN3ccc8DD8x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y4C1Ev();
extern void _ZN3ccc8DD8x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y4E[] = {
  NSPAIR(_ZN3ccc8DD8x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y4E[];
extern void _ZN3ccc8DD8x14y43efgEv();
extern void _ZN3ccc8DD8x14y43abcEv();
extern void _ZN3ccc8DD8x14y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y43pqrEv,_ZTv0_n12_N3ccc8DD8x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y43pqrEv,_ZThn4_N3ccc8DD8x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y43pqrEv,_ZTv0_n12_N3ccc8DD8x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y4E[] = {
  {&(_ZTVN3ccc8DD8x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y4E[];
static VTBL_ENTRY alt_thunk_names1574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y43pqrEv,_ZTv0_n12_N3ccc8DD8x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y43pqrEv,_ZThn4_N3ccc8DD8x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y4E = {  "_ZN3ccc8DD8x14y4E", // class name
  bases__ZN3ccc8DD8x14y4E, 2,
  &(vtc__ZN3ccc8DD8x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y4E),3, //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  CC8x14y5  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC8x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x14y53abcEv
  ~CC8x14y5(); // tgen
  CC8x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y5E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y53pqrEv");}
void  ccc::CC8x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y53efgEv");}
void  ccc::CC8x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y53abcEv");}
ccc::CC8x14y5 ::~CC8x14y5(){ note_dtor("_ZN3ccc8CC8x14y5E", this);} // tgen
ccc::CC8x14y5 ::CC8x14y5(){ note_ctor("_ZN3ccc8CC8x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y5E, buf);
    ::ccc::CC8x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y5E);
    dp->::ccc::CC8x14y5::~CC8x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y5E(Test__ZN3ccc8CC8x14y5E, "_ZN3ccc8CC8x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y5C1Ev();
extern void _ZN3ccc8CC8x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y5E[] = {
  NSPAIR(_ZN3ccc8CC8x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y5E[];
extern void _ZN3ccc8CC8x14y53pqrEv();
extern void _ZN3ccc8CC8x14y53efgEv();
extern void _ZN3ccc8CC8x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y53efgEv,_ZTv0_n12_N3ccc8CC8x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y53efgEv,_ZThn4_N3ccc8CC8x14y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y53abcEv,_ZTv0_n16_N3ccc8CC8x14y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y53abcEv,_ZThn4_N3ccc8CC8x14y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y53efgEv,_ZTv0_n12_N3ccc8CC8x14y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y53abcEv,_ZTv0_n16_N3ccc8CC8x14y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y5E[] = {
  {&(_ZTVN3ccc8CC8x14y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y5E[];
static VTBL_ENTRY alt_thunk_names1575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y53abcEv,_ZTv0_n16_N3ccc8CC8x14y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y53abcEv,_ZThn4_N3ccc8CC8x14y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y53efgEv,_ZTv0_n12_N3ccc8CC8x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y53efgEv,_ZThn4_N3ccc8CC8x14y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y5E = {  "_ZN3ccc8CC8x14y5E", // class name
  bases__ZN3ccc8CC8x14y5E, 2,
  &(vtc__ZN3ccc8CC8x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y5E),2, //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  DD8x14y5  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD8x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD8x14y53abcEv
  ~DD8x14y5(); // tgen
  DD8x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y5E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y53pqrEv");}
void  ccc::DD8x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y53efgEv");}
void  ccc::DD8x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y53abcEv");}
ccc::DD8x14y5 ::~DD8x14y5(){ note_dtor("_ZN3ccc8DD8x14y5E", this);} // tgen
ccc::DD8x14y5 ::DD8x14y5(){ note_ctor("_ZN3ccc8DD8x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y5E, buf);
    ::ccc::DD8x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y5E);
    dp->::ccc::DD8x14y5::~DD8x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y5E(Test__ZN3ccc8DD8x14y5E, "_ZN3ccc8DD8x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y5C1Ev();
extern void _ZN3ccc8DD8x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y5E[] = {
  NSPAIR(_ZN3ccc8DD8x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y5E[];
extern void _ZN3ccc8DD8x14y53efgEv();
extern void _ZN3ccc8DD8x14y53abcEv();
extern void _ZN3ccc8DD8x14y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y53pqrEv,_ZTv0_n12_N3ccc8DD8x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y53pqrEv,_ZThn4_N3ccc8DD8x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y53pqrEv,_ZTv0_n12_N3ccc8DD8x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y5E[] = {
  {&(_ZTVN3ccc8DD8x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y5E[];
static VTBL_ENTRY alt_thunk_names1576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y53pqrEv,_ZTv0_n12_N3ccc8DD8x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y53pqrEv,_ZThn4_N3ccc8DD8x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y5E = {  "_ZN3ccc8DD8x14y5E", // class name
  bases__ZN3ccc8DD8x14y5E, 2,
  &(vtc__ZN3ccc8DD8x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y5E),3, //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  CC8x14y6  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x14y63efgEv
  ~CC8x14y6(); // tgen
  CC8x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y6E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y63abcEv");}
void  ccc::CC8x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y63efgEv");}
ccc::CC8x14y6 ::~CC8x14y6(){ note_dtor("_ZN3ccc8CC8x14y6E", this);} // tgen
ccc::CC8x14y6 ::CC8x14y6(){ note_ctor("_ZN3ccc8CC8x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y6E, buf);
    ::ccc::CC8x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y6E);
    dp->::ccc::CC8x14y6::~CC8x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y6E(Test__ZN3ccc8CC8x14y6E, "_ZN3ccc8CC8x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y6C1Ev();
extern void _ZN3ccc8CC8x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y6E[] = {
  NSPAIR(_ZN3ccc8CC8x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC8x14y63abcEv();
extern void _ZN3ccc8CC8x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y63efgEv,_ZTv0_n12_N3ccc8CC8x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y63efgEv,_ZThn4_N3ccc8CC8x14y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y63abcEv,_ZTv0_n16_N3ccc8CC8x14y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y63abcEv,_ZThn4_N3ccc8CC8x14y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y63efgEv,_ZTv0_n12_N3ccc8CC8x14y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y63abcEv,_ZTv0_n16_N3ccc8CC8x14y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y6E[] = {
  {&(_ZTVN3ccc8CC8x14y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y6E[];
static VTBL_ENTRY alt_thunk_names1577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y63abcEv,_ZTv0_n16_N3ccc8CC8x14y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y63abcEv,_ZThn4_N3ccc8CC8x14y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y63efgEv,_ZTv0_n12_N3ccc8CC8x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y63efgEv,_ZThn4_N3ccc8CC8x14y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y6E = {  "_ZN3ccc8CC8x14y6E", // class name
  bases__ZN3ccc8CC8x14y6E, 2,
  &(vtc__ZN3ccc8CC8x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y6E),2, //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  DD8x14y6  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD8x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD8x14y63efgEv
  ~DD8x14y6(); // tgen
  DD8x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y6E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y63abcEv");}
void  ccc::DD8x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y63efgEv");}
ccc::DD8x14y6 ::~DD8x14y6(){ note_dtor("_ZN3ccc8DD8x14y6E", this);} // tgen
ccc::DD8x14y6 ::DD8x14y6(){ note_ctor("_ZN3ccc8DD8x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y6E, buf);
    ::ccc::DD8x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y6E);
    dp->::ccc::DD8x14y6::~DD8x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y6E(Test__ZN3ccc8DD8x14y6E, "_ZN3ccc8DD8x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y6C1Ev();
extern void _ZN3ccc8DD8x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y6E[] = {
  NSPAIR(_ZN3ccc8DD8x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y6E[];
extern void _ZN3ccc8DD8x14y63efgEv();
extern void _ZN3ccc8DD8x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y63abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y6E[] = {
  {&(_ZTVN3ccc8DD8x14y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x14y6E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x14y6E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y6E[];
Class_Descriptor cd__ZN3ccc8DD8x14y6E = {  "_ZN3ccc8DD8x14y6E", // class name
  bases__ZN3ccc8DD8x14y6E, 2,
  &(vtc__ZN3ccc8DD8x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y6E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y6E),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  CC8x14y7  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC8x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y73pqrEv
  ~CC8x14y7(); // tgen
  CC8x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y7E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y73abcEv");}
void  ccc::CC8x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y73pqrEv");}
ccc::CC8x14y7 ::~CC8x14y7(){ note_dtor("_ZN3ccc8CC8x14y7E", this);} // tgen
ccc::CC8x14y7 ::CC8x14y7(){ note_ctor("_ZN3ccc8CC8x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y7E, buf);
    ::ccc::CC8x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y7E);
    dp->::ccc::CC8x14y7::~CC8x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y7E(Test__ZN3ccc8CC8x14y7E, "_ZN3ccc8CC8x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y7C1Ev();
extern void _ZN3ccc8CC8x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y7E[] = {
  NSPAIR(_ZN3ccc8CC8x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y7E[];
extern void _ZN3ccc8CC8x14y73pqrEv();
extern void _ZN3ccc8CC8x14y73abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y73abcEv,_ZTv0_n16_N3ccc8CC8x14y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y73abcEv,_ZThn4_N3ccc8CC8x14y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y73abcEv,_ZTv0_n16_N3ccc8CC8x14y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y7E[] = {
  {&(_ZTVN3ccc8CC8x14y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x14y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y7E[];
static VTBL_ENTRY alt_thunk_names1578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y73abcEv,_ZTv0_n16_N3ccc8CC8x14y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y73abcEv,_ZThn4_N3ccc8CC8x14y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y7E = {  "_ZN3ccc8CC8x14y7E", // class name
  bases__ZN3ccc8CC8x14y7E, 2,
  &(vtc__ZN3ccc8CC8x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y7E),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  DD8x14y7  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD8x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x14y73pqrEv
  ~DD8x14y7(); // tgen
  DD8x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y7E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y73abcEv");}
void  ccc::DD8x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y73pqrEv");}
ccc::DD8x14y7 ::~DD8x14y7(){ note_dtor("_ZN3ccc8DD8x14y7E", this);} // tgen
ccc::DD8x14y7 ::DD8x14y7(){ note_ctor("_ZN3ccc8DD8x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y7E, buf);
    ::ccc::DD8x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y7E);
    dp->::ccc::DD8x14y7::~DD8x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y7E(Test__ZN3ccc8DD8x14y7E, "_ZN3ccc8DD8x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y7C1Ev();
extern void _ZN3ccc8DD8x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y7E[] = {
  NSPAIR(_ZN3ccc8DD8x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x14y73abcEv();
extern void _ZN3ccc8DD8x14y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y73pqrEv,_ZTv0_n12_N3ccc8DD8x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y73pqrEv,_ZThn4_N3ccc8DD8x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y73pqrEv,_ZTv0_n12_N3ccc8DD8x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y7E[] = {
  {&(_ZTVN3ccc8DD8x14y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y7E[];
static VTBL_ENTRY alt_thunk_names1579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y73pqrEv,_ZTv0_n12_N3ccc8DD8x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y73pqrEv,_ZThn4_N3ccc8DD8x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y7E = {  "_ZN3ccc8DD8x14y7E", // class name
  bases__ZN3ccc8DD8x14y7E, 2,
  &(vtc__ZN3ccc8DD8x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y7E),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  CC8x14y8  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x14y83abcEv
  ~CC8x14y8(); // tgen
  CC8x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y8E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC8x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y83efgEv");}
void  ccc::CC8x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x14y83abcEv");}
ccc::CC8x14y8 ::~CC8x14y8(){ note_dtor("_ZN3ccc8CC8x14y8E", this);} // tgen
ccc::CC8x14y8 ::CC8x14y8(){ note_ctor("_ZN3ccc8CC8x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y8E, buf);
    ::ccc::CC8x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y8E);
    dp->::ccc::CC8x14y8::~CC8x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y8E(Test__ZN3ccc8CC8x14y8E, "_ZN3ccc8CC8x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y8C1Ev();
extern void _ZN3ccc8CC8x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y8E[] = {
  NSPAIR(_ZN3ccc8CC8x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC8x14y83efgEv();
extern void _ZN3ccc8CC8x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y83efgEv,_ZTv0_n12_N3ccc8CC8x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y83efgEv,_ZThn4_N3ccc8CC8x14y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC8x14y83abcEv,_ZTv0_n16_N3ccc8CC8x14y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y83abcEv,_ZThn4_N3ccc8CC8x14y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y83efgEv,_ZTv0_n12_N3ccc8CC8x14y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC8x14y83abcEv,_ZTv0_n16_N3ccc8CC8x14y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y8E[] = {
  {&(_ZTVN3ccc8CC8x14y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC8x14y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y8E[];
static VTBL_ENTRY alt_thunk_names1580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC8x14y83abcEv,_ZTv0_n16_N3ccc8CC8x14y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y83abcEv,_ZThn4_N3ccc8CC8x14y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y83efgEv,_ZTv0_n12_N3ccc8CC8x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y83efgEv,_ZThn4_N3ccc8CC8x14y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y8E = {  "_ZN3ccc8CC8x14y8E", // class name
  bases__ZN3ccc8CC8x14y8E, 2,
  &(vtc__ZN3ccc8CC8x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y8E),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  DD8x14y8  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD8x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD8x14y83abcEv
  ~DD8x14y8(); // tgen
  DD8x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y8E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD8x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y83efgEv");}
void  ccc::DD8x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x14y83abcEv");}
ccc::DD8x14y8 ::~DD8x14y8(){ note_dtor("_ZN3ccc8DD8x14y8E", this);} // tgen
ccc::DD8x14y8 ::DD8x14y8(){ note_ctor("_ZN3ccc8DD8x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y8E, buf);
    ::ccc::DD8x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y8E);
    dp->::ccc::DD8x14y8::~DD8x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y8E(Test__ZN3ccc8DD8x14y8E, "_ZN3ccc8DD8x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y8C1Ev();
extern void _ZN3ccc8DD8x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y8E[] = {
  NSPAIR(_ZN3ccc8DD8x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y8E[];
extern void _ZN3ccc8DD8x14y83efgEv();
extern void _ZN3ccc8DD8x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y8E[] = {
  {&(_ZTVN3ccc8DD8x14y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x14y8E[6]),  6,12},
  {&(_ZTVN3ccc8DD8x14y8E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y8E[];
Class_Descriptor cd__ZN3ccc8DD8x14y8E = {  "_ZN3ccc8DD8x14y8E", // class name
  bases__ZN3ccc8DD8x14y8E, 2,
  &(vtc__ZN3ccc8DD8x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y8E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y8E),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  CC8x14y9  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC8x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x14y93pqrEv
  ~CC8x14y9(); // tgen
  CC8x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x14y9E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC8x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x14y93efgEv");}
void  ccc::CC8x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x14y93pqrEv");}
ccc::CC8x14y9 ::~CC8x14y9(){ note_dtor("_ZN3ccc8CC8x14y9E", this);} // tgen
ccc::CC8x14y9 ::CC8x14y9(){ note_ctor("_ZN3ccc8CC8x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC8x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC8x14y9E, buf);
    ::ccc::CC8x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC8x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x14y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc8CC8x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC8x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x14y9E);
    dp->::ccc::CC8x14y9::~CC8x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x14y9E(Test__ZN3ccc8CC8x14y9E, "_ZN3ccc8CC8x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC8x14y9C1Ev();
extern void _ZN3ccc8CC8x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC8x14y9E[] = {
  NSPAIR(_ZN3ccc8CC8x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC8x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC8x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x14y9E[];
extern void _ZN3ccc8CC8x14y93pqrEv();
extern void _ZN3ccc8CC8x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC8x14y93efgEv,_ZTv0_n12_N3ccc8CC8x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC8x14y93efgEv,_ZThn4_N3ccc8CC8x14y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x14y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC8x14y93efgEv,_ZTv0_n12_N3ccc8CC8x14y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x14y9E[] = {
  {&(_ZTVN3ccc8CC8x14y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC8x14y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x14y9E[];
static VTBL_ENTRY alt_thunk_names1581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC8x14y93efgEv,_ZTv0_n12_N3ccc8CC8x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC8x14y93efgEv,_ZThn4_N3ccc8CC8x14y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC8x14y9E = {  "_ZN3ccc8CC8x14y9E", // class name
  bases__ZN3ccc8CC8x14y9E, 2,
  &(vtc__ZN3ccc8CC8x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC8x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x14y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x14y9E),2, //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  DD8x14y9  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD8x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x14y93pqrEv
  ~DD8x14y9(); // tgen
  DD8x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD8x14y9E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD8x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x14y93efgEv");}
void  ccc::DD8x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x14y93pqrEv");}
ccc::DD8x14y9 ::~DD8x14y9(){ note_dtor("_ZN3ccc8DD8x14y9E", this);} // tgen
ccc::DD8x14y9 ::DD8x14y9(){ note_ctor("_ZN3ccc8DD8x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD8x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD8x14y9E, buf);
    ::ccc::DD8x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD8x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x14y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD8x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x14y9E);
    dp->::ccc::DD8x14y9::~DD8x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x14y9E(Test__ZN3ccc8DD8x14y9E, "_ZN3ccc8DD8x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD8x14y9C1Ev();
extern void _ZN3ccc8DD8x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD8x14y9E[] = {
  NSPAIR(_ZN3ccc8DD8x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD8x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD8x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y9E[];
extern void _ZN3ccc8DD8x14y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x14y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD8x14y93pqrEv,_ZTv0_n12_N3ccc8DD8x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD8x14y93pqrEv,_ZThn4_N3ccc8DD8x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD8x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x14y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD8x14y93pqrEv,_ZTv0_n12_N3ccc8DD8x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x14y9E[] = {
  {&(_ZTVN3ccc8DD8x14y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y9E[6]),  6,13},
  {&(_ZTVN3ccc8DD8x14y9E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x14y9E[];
static VTBL_ENTRY alt_thunk_names1582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD8x14y93pqrEv,_ZTv0_n12_N3ccc8DD8x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD8x14y93pqrEv,_ZThn4_N3ccc8DD8x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD8x14y9E = {  "_ZN3ccc8DD8x14y9E", // class name
  bases__ZN3ccc8DD8x14y9E, 2,
  &(vtc__ZN3ccc8DD8x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD8x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x14y9E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x14y9E),3, //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  CC8x14y10  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC8x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x14y103abcEv
  ~CC8x14y10(); // tgen
  CC8x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y10E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x14y103pqrEv");}
void  ccc::CC8x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x14y103abcEv");}
ccc::CC8x14y10 ::~CC8x14y10(){ note_dtor("_ZN3ccc9CC8x14y10E", this);} // tgen
ccc::CC8x14y10 ::CC8x14y10(){ note_ctor("_ZN3ccc9CC8x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC8x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x14y10E, buf);
    ::ccc::CC8x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x14y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC8x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x14y10E);
    dp->::ccc::CC8x14y10::~CC8x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x14y10E(Test__ZN3ccc9CC8x14y10E, "_ZN3ccc9CC8x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x14y10C1Ev();
extern void _ZN3ccc9CC8x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC8x14y10E[] = {
  NSPAIR(_ZN3ccc9CC8x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC8x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC8x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x14y10E[];
extern void _ZN3ccc9CC8x14y103pqrEv();
extern void _ZN3ccc9CC8x14y103abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x14y103abcEv,_ZTv0_n16_N3ccc9CC8x14y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y103abcEv,_ZThn4_N3ccc9CC8x14y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x14y103abcEv,_ZTv0_n16_N3ccc9CC8x14y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x14y10E[] = {
  {&(_ZTVN3ccc9CC8x14y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x14y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x14y10E[];
static VTBL_ENTRY alt_thunk_names1583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x14y103abcEv,_ZTv0_n16_N3ccc9CC8x14y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x14y103abcEv,_ZThn4_N3ccc9CC8x14y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x14y10E = {  "_ZN3ccc9CC8x14y10E", // class name
  bases__ZN3ccc9CC8x14y10E, 2,
  &(vtc__ZN3ccc9CC8x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x14y10E),2, //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  DD8x14y10  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD8x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD8x14y103abcEv
  ~DD8x14y10(); // tgen
  DD8x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD8x14y10E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x14y103pqrEv");}
void  ccc::DD8x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x14y103abcEv");}
ccc::DD8x14y10 ::~DD8x14y10(){ note_dtor("_ZN3ccc9DD8x14y10E", this);} // tgen
ccc::DD8x14y10 ::DD8x14y10(){ note_ctor("_ZN3ccc9DD8x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD8x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x14y10E, buf);
    ::ccc::DD8x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x14y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD8x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x14y10E);
    dp->::ccc::DD8x14y10::~DD8x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x14y10E(Test__ZN3ccc9DD8x14y10E, "_ZN3ccc9DD8x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x14y10C1Ev();
extern void _ZN3ccc9DD8x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD8x14y10E[] = {
  NSPAIR(_ZN3ccc9DD8x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD8x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD8x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x14y103abcEv();
extern void _ZN3ccc9DD8x14y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x14y103pqrEv,_ZTv0_n12_N3ccc9DD8x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x14y103pqrEv,_ZThn4_N3ccc9DD8x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x14y103pqrEv,_ZTv0_n12_N3ccc9DD8x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x14y10E[] = {
  {&(_ZTVN3ccc9DD8x14y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x14y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x14y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x14y10E[];
static VTBL_ENTRY alt_thunk_names1584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x14y103pqrEv,_ZTv0_n12_N3ccc9DD8x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x14y103pqrEv,_ZThn4_N3ccc9DD8x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x14y10E = {  "_ZN3ccc9DD8x14y10E", // class name
  bases__ZN3ccc9DD8x14y10E, 2,
  &(vtc__ZN3ccc9DD8x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x14y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x14y10E),3, //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  CC8x14y11  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC8x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x14y113efgEv
  ~CC8x14y11(); // tgen
  CC8x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y11E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC8x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x14y113pqrEv");}
void  ccc::CC8x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x14y113efgEv");}
ccc::CC8x14y11 ::~CC8x14y11(){ note_dtor("_ZN3ccc9CC8x14y11E", this);} // tgen
ccc::CC8x14y11 ::CC8x14y11(){ note_ctor("_ZN3ccc9CC8x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC8x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x14y11E, buf);
    ::ccc::CC8x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x14y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC8x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x14y11E);
    dp->::ccc::CC8x14y11::~CC8x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x14y11E(Test__ZN3ccc9CC8x14y11E, "_ZN3ccc9CC8x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x14y11C1Ev();
extern void _ZN3ccc9CC8x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC8x14y11E[] = {
  NSPAIR(_ZN3ccc9CC8x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC8x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC8x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x14y11E[];
extern void _ZN3ccc9CC8x14y113pqrEv();
extern void _ZN3ccc9CC8x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x14y113efgEv,_ZTv0_n12_N3ccc9CC8x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y113efgEv,_ZThn4_N3ccc9CC8x14y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x14y113efgEv,_ZTv0_n12_N3ccc9CC8x14y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x14y11E[] = {
  {&(_ZTVN3ccc9CC8x14y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x14y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x14y11E[];
static VTBL_ENTRY alt_thunk_names1585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x14y113efgEv,_ZTv0_n12_N3ccc9CC8x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x14y113efgEv,_ZThn4_N3ccc9CC8x14y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x14y11E = {  "_ZN3ccc9CC8x14y11E", // class name
  bases__ZN3ccc9CC8x14y11E, 2,
  &(vtc__ZN3ccc9CC8x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x14y11E),2, //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  DD8x14y11  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD8x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD8x14y113efgEv
  ~DD8x14y11(); // tgen
  DD8x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD8x14y11E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD8x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x14y113pqrEv");}
void  ccc::DD8x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x14y113efgEv");}
ccc::DD8x14y11 ::~DD8x14y11(){ note_dtor("_ZN3ccc9DD8x14y11E", this);} // tgen
ccc::DD8x14y11 ::DD8x14y11(){ note_ctor("_ZN3ccc9DD8x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD8x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x14y11E, buf);
    ::ccc::DD8x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x14y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD8x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x14y11E);
    dp->::ccc::DD8x14y11::~DD8x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x14y11E(Test__ZN3ccc9DD8x14y11E, "_ZN3ccc9DD8x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x14y11C1Ev();
extern void _ZN3ccc9DD8x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD8x14y11E[] = {
  NSPAIR(_ZN3ccc9DD8x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD8x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD8x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y11E[];
extern void _ZN3ccc9DD8x14y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x14y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x14y113pqrEv,_ZTv0_n12_N3ccc9DD8x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x14y113pqrEv,_ZThn4_N3ccc9DD8x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x14y113pqrEv,_ZTv0_n12_N3ccc9DD8x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x14y11E[] = {
  {&(_ZTVN3ccc9DD8x14y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x14y11E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x14y11E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x14y11E[];
static VTBL_ENTRY alt_thunk_names1586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x14y113pqrEv,_ZTv0_n12_N3ccc9DD8x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x14y113pqrEv,_ZThn4_N3ccc9DD8x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x14y11E = {  "_ZN3ccc9DD8x14y11E", // class name
  bases__ZN3ccc9DD8x14y11E, 2,
  &(vtc__ZN3ccc9DD8x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x14y11E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x14y11E),3, //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  CC8x14y12  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC8x14y123abcEv
  ~CC8x14y12(); // tgen
  CC8x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y12E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC8x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x14y123abcEv");}
ccc::CC8x14y12 ::~CC8x14y12(){ note_dtor("_ZN3ccc9CC8x14y12E", this);} // tgen
ccc::CC8x14y12 ::CC8x14y12(){ note_ctor("_ZN3ccc9CC8x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC8x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x14y12E, buf);
    ::ccc::CC8x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x14y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC8x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x14y12E);
    dp->::ccc::CC8x14y12::~CC8x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x14y12E(Test__ZN3ccc9CC8x14y12E, "_ZN3ccc9CC8x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x14y12C1Ev();
extern void _ZN3ccc9CC8x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC8x14y12E[] = {
  NSPAIR(_ZN3ccc9CC8x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC8x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC8x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC8x14y123abcEv();
extern void _ZN3ccc3AA83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC8x14y123abcEv,_ZTv0_n16_N3ccc9CC8x14y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y123abcEv,_ZThn4_N3ccc9CC8x14y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC8x14y123abcEv,_ZTv0_n16_N3ccc9CC8x14y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x14y12E[] = {
  {&(_ZTVN3ccc9CC8x14y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x14y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x14y12E[];
static VTBL_ENTRY alt_thunk_names1587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC8x14y123abcEv,_ZTv0_n16_N3ccc9CC8x14y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x14y123abcEv,_ZThn4_N3ccc9CC8x14y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x14y12E = {  "_ZN3ccc9CC8x14y12E", // class name
  bases__ZN3ccc9CC8x14y12E, 2,
  &(vtc__ZN3ccc9CC8x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x14y12E),2, //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  DD8x14y12  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD8x14y123abcEv
  ~DD8x14y12(); // tgen
  DD8x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD8x14y12E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD8x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x14y123abcEv");}
ccc::DD8x14y12 ::~DD8x14y12(){ note_dtor("_ZN3ccc9DD8x14y12E", this);} // tgen
ccc::DD8x14y12 ::DD8x14y12(){ note_ctor("_ZN3ccc9DD8x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD8x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x14y12E, buf);
    ::ccc::DD8x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x14y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD8x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x14y12E);
    dp->::ccc::DD8x14y12::~DD8x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x14y12E(Test__ZN3ccc9DD8x14y12E, "_ZN3ccc9DD8x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x14y12C1Ev();
extern void _ZN3ccc9DD8x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD8x14y12E[] = {
  NSPAIR(_ZN3ccc9DD8x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD8x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD8x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x14y12E[] = {
  {&(_ZTVN3ccc9DD8x14y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x14y12E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x14y12E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x14y12E[];
Class_Descriptor cd__ZN3ccc9DD8x14y12E = {  "_ZN3ccc9DD8x14y12E", // class name
  bases__ZN3ccc9DD8x14y12E, 2,
  &(vtc__ZN3ccc9DD8x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x14y12E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x14y12E),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  CC8x14y13  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC8x14y133efgEv
  ~CC8x14y13(); // tgen
  CC8x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y13E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC8x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x14y133efgEv");}
ccc::CC8x14y13 ::~CC8x14y13(){ note_dtor("_ZN3ccc9CC8x14y13E", this);} // tgen
ccc::CC8x14y13 ::CC8x14y13(){ note_ctor("_ZN3ccc9CC8x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC8x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x14y13E, buf);
    ::ccc::CC8x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x14y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC8x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x14y13E);
    dp->::ccc::CC8x14y13::~CC8x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x14y13E(Test__ZN3ccc9CC8x14y13E, "_ZN3ccc9CC8x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x14y13C1Ev();
extern void _ZN3ccc9CC8x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC8x14y13E[] = {
  NSPAIR(_ZN3ccc9CC8x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC8x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC8x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC8x14y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC8x14y133efgEv,_ZTv0_n12_N3ccc9CC8x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC8x14y133efgEv,_ZThn4_N3ccc9CC8x14y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC8x14y133efgEv,_ZTv0_n12_N3ccc9CC8x14y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x14y13E[] = {
  {&(_ZTVN3ccc9CC8x14y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC8x14y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x14y13E[];
static VTBL_ENTRY alt_thunk_names1588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC8x14y133efgEv,_ZTv0_n12_N3ccc9CC8x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC8x14y133efgEv,_ZThn4_N3ccc9CC8x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC8x14y13E = {  "_ZN3ccc9CC8x14y13E", // class name
  bases__ZN3ccc9CC8x14y13E, 2,
  &(vtc__ZN3ccc9CC8x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x14y13E),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  DD8x14y13  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD8x14y133efgEv
  ~DD8x14y13(); // tgen
  DD8x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD8x14y13E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD8x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x14y133efgEv");}
ccc::DD8x14y13 ::~DD8x14y13(){ note_dtor("_ZN3ccc9DD8x14y13E", this);} // tgen
ccc::DD8x14y13 ::DD8x14y13(){ note_ctor("_ZN3ccc9DD8x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD8x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x14y13E, buf);
    ::ccc::DD8x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x14y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD8x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x14y13E);
    dp->::ccc::DD8x14y13::~DD8x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x14y13E(Test__ZN3ccc9DD8x14y13E, "_ZN3ccc9DD8x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x14y13C1Ev();
extern void _ZN3ccc9DD8x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD8x14y13E[] = {
  NSPAIR(_ZN3ccc9DD8x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD8x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD8x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y13E[];
extern void _ZN3ccc9DD8x14y133efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x14y13E[] = {
  {&(_ZTVN3ccc9DD8x14y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x14y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x14y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x14y13E[];
Class_Descriptor cd__ZN3ccc9DD8x14y13E = {  "_ZN3ccc9DD8x14y13E", // class name
  bases__ZN3ccc9DD8x14y13E, 2,
  &(vtc__ZN3ccc9DD8x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x14y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x14y13E),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  CC8x14y14  : virtual ::ccc::AA8 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC8x14y143pqrEv
  ~CC8x14y14(); // tgen
  CC8x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y14E) C1{ VBC2{ v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC8x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x14y143pqrEv");}
ccc::CC8x14y14 ::~CC8x14y14(){ note_dtor("_ZN3ccc9CC8x14y14E", this);} // tgen
ccc::CC8x14y14 ::CC8x14y14(){ note_ctor("_ZN3ccc9CC8x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC8x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x14y14E, buf);
    ::ccc::CC8x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x14y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC8x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x14y14E);
    dp->::ccc::CC8x14y14::~CC8x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x14y14E(Test__ZN3ccc9CC8x14y14E, "_ZN3ccc9CC8x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x14y14C1Ev();
extern void _ZN3ccc9CC8x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC8x14y14E[] = {
  NSPAIR(_ZN3ccc9CC8x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC8x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC8x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x14y14E[];
extern void _ZN3ccc9CC8x14y143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x14y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x14y14E[] = {
  {&(_ZTVN3ccc9CC8x14y14E[3]),  3,10},
  {&(_ZTVN3ccc9CC8x14y14E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x14y14E[];
Class_Descriptor cd__ZN3ccc9CC8x14y14E = {  "_ZN3ccc9CC8x14y14E", // class name
  bases__ZN3ccc9CC8x14y14E, 2,
  &(vtc__ZN3ccc9CC8x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y14E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x14y14E),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  DD8x14y14  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD8x14y143pqrEv
  ~DD8x14y14(); // tgen
  DD8x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD8x14y14E) C1{ VBC2{ v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD8x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x14y143pqrEv");}
ccc::DD8x14y14 ::~DD8x14y14(){ note_dtor("_ZN3ccc9DD8x14y14E", this);} // tgen
ccc::DD8x14y14 ::DD8x14y14(){ note_ctor("_ZN3ccc9DD8x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD8x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x14y14E, buf);
    ::ccc::DD8x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x14y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD8x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x14y14E);
    dp->::ccc::DD8x14y14::~DD8x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x14y14E(Test__ZN3ccc9DD8x14y14E, "_ZN3ccc9DD8x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x14y14C1Ev();
extern void _ZN3ccc9DD8x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD8x14y14E[] = {
  NSPAIR(_ZN3ccc9DD8x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD8x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD8x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD8x14y143pqrEv,_ZTv0_n12_N3ccc9DD8x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD8x14y143pqrEv,_ZThn4_N3ccc9DD8x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD8x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x14y143pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD8x14y143pqrEv,_ZTv0_n12_N3ccc9DD8x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x14y14E[] = {
  {&(_ZTVN3ccc9DD8x14y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x14y14E[6]),  6,13},
  {&(_ZTVN3ccc9DD8x14y14E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x14y14E[];
static VTBL_ENTRY alt_thunk_names1589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD8x14y143pqrEv,_ZTv0_n12_N3ccc9DD8x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD8x14y143pqrEv,_ZThn4_N3ccc9DD8x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD8x14y14E = {  "_ZN3ccc9DD8x14y14E", // class name
  bases__ZN3ccc9DD8x14y14E, 2,
  &(vtc__ZN3ccc9DD8x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x14y14E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x14y14E),3, //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  CC8x14y15  : virtual ::ccc::AA8 , ::ccc::BB14 {
  ~CC8x14y15(); // tgen
  CC8x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x14y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC8x14y15 ::~CC8x14y15(){ note_dtor("_ZN3ccc9CC8x14y15E", this);} // tgen
ccc::CC8x14y15 ::CC8x14y15(){ note_ctor("_ZN3ccc9CC8x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC8x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC8x14y15E, buf);
    ::ccc::CC8x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC8x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x14y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), ABISELECT(8,4), "_ZN3ccc9CC8x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC8x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x14y15E);
    dp->::ccc::CC8x14y15::~CC8x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x14y15E(Test__ZN3ccc9CC8x14y15E, "_ZN3ccc9CC8x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC8x14y15C1Ev();
extern void _ZN3ccc9CC8x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC8x14y15E[] = {
  NSPAIR(_ZN3ccc9CC8x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC8x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC8x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x14y15E[] = {
  {&(_ZTVN3ccc9CC8x14y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC8x14y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x14y15E[];
Class_Descriptor cd__ZN3ccc9CC8x14y15E = {  "_ZN3ccc9CC8x14y15E", // class name
  bases__ZN3ccc9CC8x14y15E, 2,
  &(vtc__ZN3ccc9CC8x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC8x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x14y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x14y15E),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  DD8x14y15  : virtual ::ccc::AA8 , virtual ::ccc::BB14 {
  ~DD8x14y15(); // tgen
  DD8x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD8x14y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD8x14y15 ::~DD8x14y15(){ note_dtor("_ZN3ccc9DD8x14y15E", this);} // tgen
ccc::DD8x14y15 ::DD8x14y15(){ note_ctor("_ZN3ccc9DD8x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD8x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD8x14y15E, buf);
    ::ccc::DD8x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD8x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x14y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD8x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x14y15E);
    dp->::ccc::DD8x14y15::~DD8x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x14y15E(Test__ZN3ccc9DD8x14y15E, "_ZN3ccc9DD8x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD8x14y15C1Ev();
extern void _ZN3ccc9DD8x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD8x14y15E[] = {
  NSPAIR(_ZN3ccc9DD8x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD8x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD8x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x14y15E[] = {
  {&(_ZTVN3ccc9DD8x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD8x14y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x14y15E[];
Class_Descriptor cd__ZN3ccc9DD8x14y15E = {  "_ZN3ccc9DD8x14y15E", // class name
  bases__ZN3ccc9DD8x14y15E, 2,
  &(vtc__ZN3ccc9DD8x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD8x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x14y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x14y15E),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  CC8x15y0  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC8x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y03pqrEv
  ~CC8x15y0(); // tgen
  CC8x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y0E) C1{ VBC2{ v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y03abcEv");}
void  ccc::CC8x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y03efgEv");}
void  ccc::CC8x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y03pqrEv");}
ccc::CC8x15y0 ::~CC8x15y0(){ note_dtor("_ZN3ccc8CC8x15y0E", this);} // tgen
ccc::CC8x15y0 ::CC8x15y0(){ note_ctor("_ZN3ccc8CC8x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y0E, buf);
    ::ccc::CC8x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y0E);
    dp->::ccc::CC8x15y0::~CC8x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y0E(Test__ZN3ccc8CC8x15y0E, "_ZN3ccc8CC8x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y0C1Ev();
extern void _ZN3ccc8CC8x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y0E[] = {
  NSPAIR(_ZN3ccc8CC8x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y0E[];
extern void _ZN3ccc8CC8x15y03efgEv();
extern void _ZN3ccc8CC8x15y03abcEv();
extern void _ZN3ccc8CC8x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y0E[] = {
  {&(_ZTVN3ccc8CC8x15y0E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y0E[];
Class_Descriptor cd__ZN3ccc8CC8x15y0E = {  "_ZN3ccc8CC8x15y0E", // class name
  bases__ZN3ccc8CC8x15y0E, 2,
  &(vtc__ZN3ccc8CC8x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y0  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD8x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD8x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x15y03pqrEv
  ~DD8x15y0(); // tgen
  DD8x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y0E) C1{ VBC2{ v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y03abcEv");}
void  ccc::DD8x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y03efgEv");}
void  ccc::DD8x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y03pqrEv");}
ccc::DD8x15y0 ::~DD8x15y0(){ note_dtor("_ZN3ccc8DD8x15y0E", this);} // tgen
ccc::DD8x15y0 ::DD8x15y0(){ note_ctor("_ZN3ccc8DD8x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y0E, buf);
    ::ccc::DD8x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y0E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y0E);
    dp->::ccc::DD8x15y0::~DD8x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y0E(Test__ZN3ccc8DD8x15y0E, "_ZN3ccc8DD8x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y0C1Ev();
extern void _ZN3ccc8DD8x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y0E[] = {
  NSPAIR(_ZN3ccc8DD8x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y0E[];
extern void _ZN3ccc8DD8x15y03efgEv();
extern void _ZN3ccc8DD8x15y03abcEv();
extern void _ZN3ccc8DD8x15y03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y0E[] = {
  {&(_ZTVN3ccc8DD8x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y0E[];
Class_Descriptor cd__ZN3ccc8DD8x15y0E = {  "_ZN3ccc8DD8x15y0E", // class name
  bases__ZN3ccc8DD8x15y0E, 2,
  &(vtc__ZN3ccc8DD8x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y1  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x15y13efgEv
  ~CC8x15y1(); // tgen
  CC8x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y1E) C1{ VBC2{ v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y13abcEv");}
void  ccc::CC8x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y13pqrEv");}
void  ccc::CC8x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y13efgEv");}
ccc::CC8x15y1 ::~CC8x15y1(){ note_dtor("_ZN3ccc8CC8x15y1E", this);} // tgen
ccc::CC8x15y1 ::CC8x15y1(){ note_ctor("_ZN3ccc8CC8x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y1E, buf);
    ::ccc::CC8x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y1E);
    dp->::ccc::CC8x15y1::~CC8x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y1E(Test__ZN3ccc8CC8x15y1E, "_ZN3ccc8CC8x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y1C1Ev();
extern void _ZN3ccc8CC8x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y1E[] = {
  NSPAIR(_ZN3ccc8CC8x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y1E[];
extern void _ZN3ccc8CC8x15y13efgEv();
extern void _ZN3ccc8CC8x15y13abcEv();
extern void _ZN3ccc8CC8x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y1E[] = {
  {&(_ZTVN3ccc8CC8x15y1E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y1E[];
Class_Descriptor cd__ZN3ccc8CC8x15y1E = {  "_ZN3ccc8CC8x15y1E", // class name
  bases__ZN3ccc8CC8x15y1E, 2,
  &(vtc__ZN3ccc8CC8x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y1  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD8x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x15y13efgEv
  ~DD8x15y1(); // tgen
  DD8x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y1E) C1{ VBC2{ v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y13abcEv");}
void  ccc::DD8x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y13pqrEv");}
void  ccc::DD8x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y13efgEv");}
ccc::DD8x15y1 ::~DD8x15y1(){ note_dtor("_ZN3ccc8DD8x15y1E", this);} // tgen
ccc::DD8x15y1 ::DD8x15y1(){ note_ctor("_ZN3ccc8DD8x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y1E, buf);
    ::ccc::DD8x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y1E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y1E);
    dp->::ccc::DD8x15y1::~DD8x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y1E(Test__ZN3ccc8DD8x15y1E, "_ZN3ccc8DD8x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y1C1Ev();
extern void _ZN3ccc8DD8x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y1E[] = {
  NSPAIR(_ZN3ccc8DD8x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y1E[];
extern void _ZN3ccc8DD8x15y13efgEv();
extern void _ZN3ccc8DD8x15y13abcEv();
extern void _ZN3ccc8DD8x15y13pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y13pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y1E[] = {
  {&(_ZTVN3ccc8DD8x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y1E[];
Class_Descriptor cd__ZN3ccc8DD8x15y1E = {  "_ZN3ccc8DD8x15y1E", // class name
  bases__ZN3ccc8DD8x15y1E, 2,
  &(vtc__ZN3ccc8DD8x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y2  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC8x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y23pqrEv
  ~CC8x15y2(); // tgen
  CC8x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y2E) C1{ VBC2{ v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y23efgEv");}
void  ccc::CC8x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y23abcEv");}
void  ccc::CC8x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y23pqrEv");}
ccc::CC8x15y2 ::~CC8x15y2(){ note_dtor("_ZN3ccc8CC8x15y2E", this);} // tgen
ccc::CC8x15y2 ::CC8x15y2(){ note_ctor("_ZN3ccc8CC8x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y2E, buf);
    ::ccc::CC8x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y2E);
    dp->::ccc::CC8x15y2::~CC8x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y2E(Test__ZN3ccc8CC8x15y2E, "_ZN3ccc8CC8x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y2C1Ev();
extern void _ZN3ccc8CC8x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y2E[] = {
  NSPAIR(_ZN3ccc8CC8x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y2E[];
extern void _ZN3ccc8CC8x15y23efgEv();
extern void _ZN3ccc8CC8x15y23abcEv();
extern void _ZN3ccc8CC8x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y2E[] = {
  {&(_ZTVN3ccc8CC8x15y2E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y2E[];
Class_Descriptor cd__ZN3ccc8CC8x15y2E = {  "_ZN3ccc8CC8x15y2E", // class name
  bases__ZN3ccc8CC8x15y2E, 2,
  &(vtc__ZN3ccc8CC8x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y2  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD8x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD8x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x15y23pqrEv
  ~DD8x15y2(); // tgen
  DD8x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y2E) C1{ VBC2{ v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y23efgEv");}
void  ccc::DD8x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y23abcEv");}
void  ccc::DD8x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y23pqrEv");}
ccc::DD8x15y2 ::~DD8x15y2(){ note_dtor("_ZN3ccc8DD8x15y2E", this);} // tgen
ccc::DD8x15y2 ::DD8x15y2(){ note_ctor("_ZN3ccc8DD8x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y2E, buf);
    ::ccc::DD8x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y2E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y2E);
    dp->::ccc::DD8x15y2::~DD8x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y2E(Test__ZN3ccc8DD8x15y2E, "_ZN3ccc8DD8x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y2C1Ev();
extern void _ZN3ccc8DD8x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y2E[] = {
  NSPAIR(_ZN3ccc8DD8x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y2E[];
extern void _ZN3ccc8DD8x15y23efgEv();
extern void _ZN3ccc8DD8x15y23abcEv();
extern void _ZN3ccc8DD8x15y23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y2E[] = {
  {&(_ZTVN3ccc8DD8x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y2E[];
Class_Descriptor cd__ZN3ccc8DD8x15y2E = {  "_ZN3ccc8DD8x15y2E", // class name
  bases__ZN3ccc8DD8x15y2E, 2,
  &(vtc__ZN3ccc8DD8x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y3  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x15y33abcEv
  ~CC8x15y3(); // tgen
  CC8x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y3E) C1{ VBC2{ v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y33efgEv");}
void  ccc::CC8x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y33pqrEv");}
void  ccc::CC8x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y33abcEv");}
ccc::CC8x15y3 ::~CC8x15y3(){ note_dtor("_ZN3ccc8CC8x15y3E", this);} // tgen
ccc::CC8x15y3 ::CC8x15y3(){ note_ctor("_ZN3ccc8CC8x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y3E, buf);
    ::ccc::CC8x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y3E);
    dp->::ccc::CC8x15y3::~CC8x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y3E(Test__ZN3ccc8CC8x15y3E, "_ZN3ccc8CC8x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y3C1Ev();
extern void _ZN3ccc8CC8x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y3E[] = {
  NSPAIR(_ZN3ccc8CC8x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y3E[];
extern void _ZN3ccc8CC8x15y33efgEv();
extern void _ZN3ccc8CC8x15y33abcEv();
extern void _ZN3ccc8CC8x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y3E[] = {
  {&(_ZTVN3ccc8CC8x15y3E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y3E[];
Class_Descriptor cd__ZN3ccc8CC8x15y3E = {  "_ZN3ccc8CC8x15y3E", // class name
  bases__ZN3ccc8CC8x15y3E, 2,
  &(vtc__ZN3ccc8CC8x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y3  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD8x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x15y33abcEv
  ~DD8x15y3(); // tgen
  DD8x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y3E) C1{ VBC2{ v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y33efgEv");}
void  ccc::DD8x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y33pqrEv");}
void  ccc::DD8x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y33abcEv");}
ccc::DD8x15y3 ::~DD8x15y3(){ note_dtor("_ZN3ccc8DD8x15y3E", this);} // tgen
ccc::DD8x15y3 ::DD8x15y3(){ note_ctor("_ZN3ccc8DD8x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y3E, buf);
    ::ccc::DD8x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y3E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y3E);
    dp->::ccc::DD8x15y3::~DD8x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y3E(Test__ZN3ccc8DD8x15y3E, "_ZN3ccc8DD8x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y3C1Ev();
extern void _ZN3ccc8DD8x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y3E[] = {
  NSPAIR(_ZN3ccc8DD8x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y3E[];
extern void _ZN3ccc8DD8x15y33efgEv();
extern void _ZN3ccc8DD8x15y33abcEv();
extern void _ZN3ccc8DD8x15y33pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y33pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y3E[] = {
  {&(_ZTVN3ccc8DD8x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y3E[];
Class_Descriptor cd__ZN3ccc8DD8x15y3E = {  "_ZN3ccc8DD8x15y3E", // class name
  bases__ZN3ccc8DD8x15y3E, 2,
  &(vtc__ZN3ccc8DD8x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y4  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC8x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC8x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC8x15y43efgEv
  ~CC8x15y4(); // tgen
  CC8x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y4E) C1{ VBC2{ v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y43pqrEv");}
void  ccc::CC8x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y43abcEv");}
void  ccc::CC8x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y43efgEv");}
ccc::CC8x15y4 ::~CC8x15y4(){ note_dtor("_ZN3ccc8CC8x15y4E", this);} // tgen
ccc::CC8x15y4 ::CC8x15y4(){ note_ctor("_ZN3ccc8CC8x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y4E, buf);
    ::ccc::CC8x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y4E);
    dp->::ccc::CC8x15y4::~CC8x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y4E(Test__ZN3ccc8CC8x15y4E, "_ZN3ccc8CC8x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y4C1Ev();
extern void _ZN3ccc8CC8x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y4E[] = {
  NSPAIR(_ZN3ccc8CC8x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y4E[];
extern void _ZN3ccc8CC8x15y43efgEv();
extern void _ZN3ccc8CC8x15y43abcEv();
extern void _ZN3ccc8CC8x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y4E[] = {
  {&(_ZTVN3ccc8CC8x15y4E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y4E[];
Class_Descriptor cd__ZN3ccc8CC8x15y4E = {  "_ZN3ccc8CC8x15y4E", // class name
  bases__ZN3ccc8CC8x15y4E, 2,
  &(vtc__ZN3ccc8CC8x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y4  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD8x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD8x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD8x15y43efgEv
  ~DD8x15y4(); // tgen
  DD8x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y4E) C1{ VBC2{ v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y43pqrEv");}
void  ccc::DD8x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y43abcEv");}
void  ccc::DD8x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y43efgEv");}
ccc::DD8x15y4 ::~DD8x15y4(){ note_dtor("_ZN3ccc8DD8x15y4E", this);} // tgen
ccc::DD8x15y4 ::DD8x15y4(){ note_ctor("_ZN3ccc8DD8x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y4E, buf);
    ::ccc::DD8x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y4E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y4E);
    dp->::ccc::DD8x15y4::~DD8x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y4E(Test__ZN3ccc8DD8x15y4E, "_ZN3ccc8DD8x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y4C1Ev();
extern void _ZN3ccc8DD8x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y4E[] = {
  NSPAIR(_ZN3ccc8DD8x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y4E[];
extern void _ZN3ccc8DD8x15y43efgEv();
extern void _ZN3ccc8DD8x15y43abcEv();
extern void _ZN3ccc8DD8x15y43pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y43pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y4E[] = {
  {&(_ZTVN3ccc8DD8x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y4E[];
Class_Descriptor cd__ZN3ccc8DD8x15y4E = {  "_ZN3ccc8DD8x15y4E", // class name
  bases__ZN3ccc8DD8x15y4E, 2,
  &(vtc__ZN3ccc8DD8x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y5  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC8x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC8x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC8x15y53abcEv
  ~CC8x15y5(); // tgen
  CC8x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y5E) C1{ VBC2{ v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC8x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y53pqrEv");}
void  ccc::CC8x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y53efgEv");}
void  ccc::CC8x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y53abcEv");}
ccc::CC8x15y5 ::~CC8x15y5(){ note_dtor("_ZN3ccc8CC8x15y5E", this);} // tgen
ccc::CC8x15y5 ::CC8x15y5(){ note_ctor("_ZN3ccc8CC8x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y5E, buf);
    ::ccc::CC8x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y5E);
    dp->::ccc::CC8x15y5::~CC8x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y5E(Test__ZN3ccc8CC8x15y5E, "_ZN3ccc8CC8x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y5C1Ev();
extern void _ZN3ccc8CC8x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y5E[] = {
  NSPAIR(_ZN3ccc8CC8x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y5E[];
extern void _ZN3ccc8CC8x15y53efgEv();
extern void _ZN3ccc8CC8x15y53abcEv();
extern void _ZN3ccc8CC8x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y5E[] = {
  {&(_ZTVN3ccc8CC8x15y5E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y5E[];
Class_Descriptor cd__ZN3ccc8CC8x15y5E = {  "_ZN3ccc8CC8x15y5E", // class name
  bases__ZN3ccc8CC8x15y5E, 2,
  &(vtc__ZN3ccc8CC8x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y5  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD8x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD8x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD8x15y53abcEv
  ~DD8x15y5(); // tgen
  DD8x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y5E) C1{ VBC2{ v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD8x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y53pqrEv");}
void  ccc::DD8x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y53efgEv");}
void  ccc::DD8x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y53abcEv");}
ccc::DD8x15y5 ::~DD8x15y5(){ note_dtor("_ZN3ccc8DD8x15y5E", this);} // tgen
ccc::DD8x15y5 ::DD8x15y5(){ note_ctor("_ZN3ccc8DD8x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y5E, buf);
    ::ccc::DD8x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y5E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y5E);
    dp->::ccc::DD8x15y5::~DD8x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y5E(Test__ZN3ccc8DD8x15y5E, "_ZN3ccc8DD8x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y5C1Ev();
extern void _ZN3ccc8DD8x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y5E[] = {
  NSPAIR(_ZN3ccc8DD8x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y5E[];
extern void _ZN3ccc8DD8x15y53efgEv();
extern void _ZN3ccc8DD8x15y53abcEv();
extern void _ZN3ccc8DD8x15y53pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y53pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y5E[] = {
  {&(_ZTVN3ccc8DD8x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y5E[];
Class_Descriptor cd__ZN3ccc8DD8x15y5E = {  "_ZN3ccc8DD8x15y5E", // class name
  bases__ZN3ccc8DD8x15y5E, 2,
  &(vtc__ZN3ccc8DD8x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y6  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC8x15y63efgEv
  ~CC8x15y6(); // tgen
  CC8x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y6E) C1{ VBC2{ v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC8x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y63abcEv");}
void  ccc::CC8x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y63efgEv");}
ccc::CC8x15y6 ::~CC8x15y6(){ note_dtor("_ZN3ccc8CC8x15y6E", this);} // tgen
ccc::CC8x15y6 ::CC8x15y6(){ note_ctor("_ZN3ccc8CC8x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y6E, buf);
    ::ccc::CC8x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y6E);
    dp->::ccc::CC8x15y6::~CC8x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y6E(Test__ZN3ccc8CC8x15y6E, "_ZN3ccc8CC8x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y6C1Ev();
extern void _ZN3ccc8CC8x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y6E[] = {
  NSPAIR(_ZN3ccc8CC8x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y6E[];
extern void _ZN3ccc8CC8x15y63efgEv();
extern void _ZN3ccc8CC8x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y6E[] = {
  {&(_ZTVN3ccc8CC8x15y6E[5]),  5,7},
  {&(_ZTVN3ccc8CC8x15y6E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y6E[];
Class_Descriptor cd__ZN3ccc8CC8x15y6E = {  "_ZN3ccc8CC8x15y6E", // class name
  bases__ZN3ccc8CC8x15y6E, 2,
  &(vtc__ZN3ccc8CC8x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y6E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y6  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD8x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD8x15y63efgEv
  ~DD8x15y6(); // tgen
  DD8x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y6E) C1{ VBC2{ v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD8x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y63abcEv");}
void  ccc::DD8x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y63efgEv");}
ccc::DD8x15y6 ::~DD8x15y6(){ note_dtor("_ZN3ccc8DD8x15y6E", this);} // tgen
ccc::DD8x15y6 ::DD8x15y6(){ note_ctor("_ZN3ccc8DD8x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y6E, buf);
    ::ccc::DD8x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y6E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y6E);
    dp->::ccc::DD8x15y6::~DD8x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y6E(Test__ZN3ccc8DD8x15y6E, "_ZN3ccc8DD8x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y6C1Ev();
extern void _ZN3ccc8DD8x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y6E[] = {
  NSPAIR(_ZN3ccc8DD8x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y6E[];
extern void _ZN3ccc8DD8x15y63efgEv();
extern void _ZN3ccc8DD8x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y6E[] = {
  {&(_ZTVN3ccc8DD8x15y6E[6]),  6,8},
  {&(_ZTVN3ccc8DD8x15y6E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y6E[];
Class_Descriptor cd__ZN3ccc8DD8x15y6E = {  "_ZN3ccc8DD8x15y6E", // class name
  bases__ZN3ccc8DD8x15y6E, 2,
  &(vtc__ZN3ccc8DD8x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y6E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y7  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC8x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y73pqrEv
  ~CC8x15y7(); // tgen
  CC8x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y7E) C1{ VBC2{ v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC8x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y73abcEv");}
void  ccc::CC8x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y73pqrEv");}
ccc::CC8x15y7 ::~CC8x15y7(){ note_dtor("_ZN3ccc8CC8x15y7E", this);} // tgen
ccc::CC8x15y7 ::CC8x15y7(){ note_ctor("_ZN3ccc8CC8x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y7E, buf);
    ::ccc::CC8x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y7E);
    dp->::ccc::CC8x15y7::~CC8x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y7E(Test__ZN3ccc8CC8x15y7E, "_ZN3ccc8CC8x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y7C1Ev();
extern void _ZN3ccc8CC8x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y7E[] = {
  NSPAIR(_ZN3ccc8CC8x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8CC8x15y73abcEv();
extern void _ZN3ccc8CC8x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y7E[] = {
  {&(_ZTVN3ccc8CC8x15y7E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y7E[];
Class_Descriptor cd__ZN3ccc8CC8x15y7E = {  "_ZN3ccc8CC8x15y7E", // class name
  bases__ZN3ccc8CC8x15y7E, 2,
  &(vtc__ZN3ccc8CC8x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y7  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD8x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD8x15y73pqrEv
  ~DD8x15y7(); // tgen
  DD8x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y7E) C1{ VBC2{ v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD8x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y73abcEv");}
void  ccc::DD8x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y73pqrEv");}
ccc::DD8x15y7 ::~DD8x15y7(){ note_dtor("_ZN3ccc8DD8x15y7E", this);} // tgen
ccc::DD8x15y7 ::DD8x15y7(){ note_ctor("_ZN3ccc8DD8x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y7E, buf);
    ::ccc::DD8x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y7E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y7E);
    dp->::ccc::DD8x15y7::~DD8x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y7E(Test__ZN3ccc8DD8x15y7E, "_ZN3ccc8DD8x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y7C1Ev();
extern void _ZN3ccc8DD8x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y7E[] = {
  NSPAIR(_ZN3ccc8DD8x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y7E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc8DD8x15y73abcEv();
extern void _ZN3ccc8DD8x15y73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y7E[] = {
  {&(_ZTVN3ccc8DD8x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y7E[];
Class_Descriptor cd__ZN3ccc8DD8x15y7E = {  "_ZN3ccc8DD8x15y7E", // class name
  bases__ZN3ccc8DD8x15y7E, 2,
  &(vtc__ZN3ccc8DD8x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y8  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC8x15y83abcEv
  ~CC8x15y8(); // tgen
  CC8x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y8E) C1{ VBC2{ v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC8x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y83efgEv");}
void  ccc::CC8x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC8x15y83abcEv");}
ccc::CC8x15y8 ::~CC8x15y8(){ note_dtor("_ZN3ccc8CC8x15y8E", this);} // tgen
ccc::CC8x15y8 ::CC8x15y8(){ note_ctor("_ZN3ccc8CC8x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y8E, buf);
    ::ccc::CC8x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y8E);
    dp->::ccc::CC8x15y8::~CC8x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y8E(Test__ZN3ccc8CC8x15y8E, "_ZN3ccc8CC8x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y8C1Ev();
extern void _ZN3ccc8CC8x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y8E[] = {
  NSPAIR(_ZN3ccc8CC8x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y8E[];
extern void _ZN3ccc8CC8x15y83efgEv();
extern void _ZN3ccc8CC8x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y8E[] = {
  {&(_ZTVN3ccc8CC8x15y8E[5]),  5,7},
  {&(_ZTVN3ccc8CC8x15y8E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y8E[];
Class_Descriptor cd__ZN3ccc8CC8x15y8E = {  "_ZN3ccc8CC8x15y8E", // class name
  bases__ZN3ccc8CC8x15y8E, 2,
  &(vtc__ZN3ccc8CC8x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y8E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y8  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD8x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD8x15y83abcEv
  ~DD8x15y8(); // tgen
  DD8x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y8E) C1{ VBC2{ v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD8x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y83efgEv");}
void  ccc::DD8x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD8x15y83abcEv");}
ccc::DD8x15y8 ::~DD8x15y8(){ note_dtor("_ZN3ccc8DD8x15y8E", this);} // tgen
ccc::DD8x15y8 ::DD8x15y8(){ note_ctor("_ZN3ccc8DD8x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y8E, buf);
    ::ccc::DD8x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y8E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y8E);
    dp->::ccc::DD8x15y8::~DD8x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y8E(Test__ZN3ccc8DD8x15y8E, "_ZN3ccc8DD8x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y8C1Ev();
extern void _ZN3ccc8DD8x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y8E[] = {
  NSPAIR(_ZN3ccc8DD8x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y8E[];
extern void _ZN3ccc8DD8x15y83efgEv();
extern void _ZN3ccc8DD8x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y8E[] = {
  {&(_ZTVN3ccc8DD8x15y8E[6]),  6,8},
  {&(_ZTVN3ccc8DD8x15y8E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y8E[];
Class_Descriptor cd__ZN3ccc8DD8x15y8E = {  "_ZN3ccc8DD8x15y8E", // class name
  bases__ZN3ccc8DD8x15y8E, 2,
  &(vtc__ZN3ccc8DD8x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y8E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y9  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC8x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC8x15y93pqrEv
  ~CC8x15y9(); // tgen
  CC8x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC8x15y9E) C1{ VBC2{ v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC8x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC8x15y93efgEv");}
void  ccc::CC8x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC8x15y93pqrEv");}
ccc::CC8x15y9 ::~CC8x15y9(){ note_dtor("_ZN3ccc8CC8x15y9E", this);} // tgen
ccc::CC8x15y9 ::CC8x15y9(){ note_ctor("_ZN3ccc8CC8x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC8x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC8x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC8x15y9E, buf);
    ::ccc::CC8x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC8x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC8x15y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8CC8x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC8x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC8x15y9E);
    dp->::ccc::CC8x15y9::~CC8x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC8x15y9E(Test__ZN3ccc8CC8x15y9E, "_ZN3ccc8CC8x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC8x15y9C1Ev();
extern void _ZN3ccc8CC8x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC8x15y9E[] = {
  NSPAIR(_ZN3ccc8CC8x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC8x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC8x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC8x15y9E[];
extern void _ZN3ccc8CC8x15y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8CC8x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC8x15y9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC8x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC8x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC8x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC8x15y9E[] = {
  {&(_ZTVN3ccc8CC8x15y9E[5]),  5,8},
  {&(_ZTVN3ccc8CC8x15y9E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC8x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC8x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC8x15y9E[];
Class_Descriptor cd__ZN3ccc8CC8x15y9E = {  "_ZN3ccc8CC8x15y9E", // class name
  bases__ZN3ccc8CC8x15y9E, 2,
  &(vtc__ZN3ccc8CC8x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC8x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC8x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC8x15y9E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC8x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y9  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD8x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD8x15y93pqrEv
  ~DD8x15y9(); // tgen
  DD8x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD8x15y9E) C1{ VBC2{ v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD8x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD8x15y93efgEv");}
void  ccc::DD8x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD8x15y93pqrEv");}
ccc::DD8x15y9 ::~DD8x15y9(){ note_dtor("_ZN3ccc8DD8x15y9E", this);} // tgen
ccc::DD8x15y9 ::DD8x15y9(){ note_ctor("_ZN3ccc8DD8x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD8x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD8x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD8x15y9E, buf);
    ::ccc::DD8x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD8x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD8x15y9E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc8DD8x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD8x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD8x15y9E);
    dp->::ccc::DD8x15y9::~DD8x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD8x15y9E(Test__ZN3ccc8DD8x15y9E, "_ZN3ccc8DD8x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD8x15y9C1Ev();
extern void _ZN3ccc8DD8x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD8x15y9E[] = {
  NSPAIR(_ZN3ccc8DD8x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD8x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD8x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD8x15y9E[];
extern void _ZN3ccc8DD8x15y93efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc8DD8x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD8x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD8x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD8x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD8x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD8x15y9E[] = {
  {&(_ZTVN3ccc8DD8x15y9E[6]),  6,9},
  {&(_ZTVN3ccc8DD8x15y9E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD8x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD8x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD8x15y9E[];
Class_Descriptor cd__ZN3ccc8DD8x15y9E = {  "_ZN3ccc8DD8x15y9E", // class name
  bases__ZN3ccc8DD8x15y9E, 2,
  &(vtc__ZN3ccc8DD8x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD8x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD8x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD8x15y9E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD8x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y10  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC8x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC8x15y103abcEv
  ~CC8x15y10(); // tgen
  CC8x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y10E) C1{ VBC2{ v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC8x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x15y103pqrEv");}
void  ccc::CC8x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x15y103abcEv");}
ccc::CC8x15y10 ::~CC8x15y10(){ note_dtor("_ZN3ccc9CC8x15y10E", this);} // tgen
ccc::CC8x15y10 ::CC8x15y10(){ note_ctor("_ZN3ccc9CC8x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC8x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC8x15y10E, buf);
    ::ccc::CC8x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC8x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x15y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9CC8x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC8x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x15y10E);
    dp->::ccc::CC8x15y10::~CC8x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x15y10E(Test__ZN3ccc9CC8x15y10E, "_ZN3ccc9CC8x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC8x15y10C1Ev();
extern void _ZN3ccc9CC8x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC8x15y10E[] = {
  NSPAIR(_ZN3ccc9CC8x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC8x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC8x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x15y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x15y103abcEv();
extern void _ZN3ccc9CC8x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x15y10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x15y10E[] = {
  {&(_ZTVN3ccc9CC8x15y10E[5]),  5,8},
  {&(_ZTVN3ccc9CC8x15y10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x15y10E[];
Class_Descriptor cd__ZN3ccc9CC8x15y10E = {  "_ZN3ccc9CC8x15y10E", // class name
  bases__ZN3ccc9CC8x15y10E, 2,
  &(vtc__ZN3ccc9CC8x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y10  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD8x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD8x15y103abcEv
  ~DD8x15y10(); // tgen
  DD8x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD8x15y10E) C1{ VBC2{ v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD8x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x15y103pqrEv");}
void  ccc::DD8x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x15y103abcEv");}
ccc::DD8x15y10 ::~DD8x15y10(){ note_dtor("_ZN3ccc9DD8x15y10E", this);} // tgen
ccc::DD8x15y10 ::DD8x15y10(){ note_ctor("_ZN3ccc9DD8x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD8x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD8x15y10E, buf);
    ::ccc::DD8x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD8x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x15y10E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD8x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x15y10E);
    dp->::ccc::DD8x15y10::~DD8x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x15y10E(Test__ZN3ccc9DD8x15y10E, "_ZN3ccc9DD8x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD8x15y10C1Ev();
extern void _ZN3ccc9DD8x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD8x15y10E[] = {
  NSPAIR(_ZN3ccc9DD8x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD8x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD8x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD8x15y10E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x15y103abcEv();
extern void _ZN3ccc9DD8x15y103pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y103pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x15y10E[] = {
  {&(_ZTVN3ccc9DD8x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9DD8x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x15y10E[];
Class_Descriptor cd__ZN3ccc9DD8x15y10E = {  "_ZN3ccc9DD8x15y10E", // class name
  bases__ZN3ccc9DD8x15y10E, 2,
  &(vtc__ZN3ccc9DD8x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD8x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y11  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC8x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC8x15y113efgEv
  ~CC8x15y11(); // tgen
  CC8x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y11E) C1{ VBC2{ v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC8x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x15y113pqrEv");}
void  ccc::CC8x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x15y113efgEv");}
ccc::CC8x15y11 ::~CC8x15y11(){ note_dtor("_ZN3ccc9CC8x15y11E", this);} // tgen
ccc::CC8x15y11 ::CC8x15y11(){ note_ctor("_ZN3ccc9CC8x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC8x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC8x15y11E, buf);
    ::ccc::CC8x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC8x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x15y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9CC8x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC8x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x15y11E);
    dp->::ccc::CC8x15y11::~CC8x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x15y11E(Test__ZN3ccc9CC8x15y11E, "_ZN3ccc9CC8x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC8x15y11C1Ev();
extern void _ZN3ccc9CC8x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC8x15y11E[] = {
  NSPAIR(_ZN3ccc9CC8x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC8x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC8x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x15y11E[];
extern void _ZN3ccc9CC8x15y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x15y11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x15y11E[] = {
  {&(_ZTVN3ccc9CC8x15y11E[5]),  5,8},
  {&(_ZTVN3ccc9CC8x15y11E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x15y11E[];
Class_Descriptor cd__ZN3ccc9CC8x15y11E = {  "_ZN3ccc9CC8x15y11E", // class name
  bases__ZN3ccc9CC8x15y11E, 2,
  &(vtc__ZN3ccc9CC8x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y11E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y11  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD8x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD8x15y113efgEv
  ~DD8x15y11(); // tgen
  DD8x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD8x15y11E) C1{ VBC2{ v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD8x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x15y113pqrEv");}
void  ccc::DD8x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x15y113efgEv");}
ccc::DD8x15y11 ::~DD8x15y11(){ note_dtor("_ZN3ccc9DD8x15y11E", this);} // tgen
ccc::DD8x15y11 ::DD8x15y11(){ note_ctor("_ZN3ccc9DD8x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD8x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD8x15y11E, buf);
    ::ccc::DD8x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD8x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x15y11E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD8x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x15y11E);
    dp->::ccc::DD8x15y11::~DD8x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x15y11E(Test__ZN3ccc9DD8x15y11E, "_ZN3ccc9DD8x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD8x15y11C1Ev();
extern void _ZN3ccc9DD8x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD8x15y11E[] = {
  NSPAIR(_ZN3ccc9DD8x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD8x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD8x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD8x15y11E[];
extern void _ZN3ccc9DD8x15y113efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x15y11E[] = {
  {&(_ZTVN3ccc9DD8x15y11E[6]),  6,9},
  {&(_ZTVN3ccc9DD8x15y11E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x15y11E[];
Class_Descriptor cd__ZN3ccc9DD8x15y11E = {  "_ZN3ccc9DD8x15y11E", // class name
  bases__ZN3ccc9DD8x15y11E, 2,
  &(vtc__ZN3ccc9DD8x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD8x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x15y11E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y12  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC8x15y123abcEv
  ~CC8x15y12(); // tgen
  CC8x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y12E) C1{ VBC2{ v2 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC8x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC8x15y123abcEv");}
ccc::CC8x15y12 ::~CC8x15y12(){ note_dtor("_ZN3ccc9CC8x15y12E", this);} // tgen
ccc::CC8x15y12 ::CC8x15y12(){ note_ctor("_ZN3ccc9CC8x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC8x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC8x15y12E, buf);
    ::ccc::CC8x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC8x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x15y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9CC8x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC8x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x15y12E);
    dp->::ccc::CC8x15y12::~CC8x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x15y12E(Test__ZN3ccc9CC8x15y12E, "_ZN3ccc9CC8x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC8x15y12C1Ev();
extern void _ZN3ccc9CC8x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC8x15y12E[] = {
  NSPAIR(_ZN3ccc9CC8x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC8x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC8x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x15y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9CC8x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x15y12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x15y12E[] = {
  {&(_ZTVN3ccc9CC8x15y12E[5]),  5,7},
  {&(_ZTVN3ccc9CC8x15y12E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x15y12E[];
Class_Descriptor cd__ZN3ccc9CC8x15y12E = {  "_ZN3ccc9CC8x15y12E", // class name
  bases__ZN3ccc9CC8x15y12E, 2,
  &(vtc__ZN3ccc9CC8x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y12E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y12  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD8x15y123abcEv
  ~DD8x15y12(); // tgen
  DD8x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD8x15y12E) C1{ VBC2{ v2 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD8x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD8x15y123abcEv");}
ccc::DD8x15y12 ::~DD8x15y12(){ note_dtor("_ZN3ccc9DD8x15y12E", this);} // tgen
ccc::DD8x15y12 ::DD8x15y12(){ note_ctor("_ZN3ccc9DD8x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD8x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD8x15y12E, buf);
    ::ccc::DD8x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD8x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x15y12E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD8x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x15y12E);
    dp->::ccc::DD8x15y12::~DD8x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x15y12E(Test__ZN3ccc9DD8x15y12E, "_ZN3ccc9DD8x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD8x15y12C1Ev();
extern void _ZN3ccc9DD8x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD8x15y12E[] = {
  NSPAIR(_ZN3ccc9DD8x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD8x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD8x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD8x15y12E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc9DD8x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x15y12E[] = {
  {&(_ZTVN3ccc9DD8x15y12E[6]),  6,8},
  {&(_ZTVN3ccc9DD8x15y12E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x15y12E[];
Class_Descriptor cd__ZN3ccc9DD8x15y12E = {  "_ZN3ccc9DD8x15y12E", // class name
  bases__ZN3ccc9DD8x15y12E, 2,
  &(vtc__ZN3ccc9DD8x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD8x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x15y12E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y13  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC8x15y133efgEv
  ~CC8x15y13(); // tgen
  CC8x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y13E) C1{ VBC2{ v1 v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC8x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC8x15y133efgEv");}
ccc::CC8x15y13 ::~CC8x15y13(){ note_dtor("_ZN3ccc9CC8x15y13E", this);} // tgen
ccc::CC8x15y13 ::CC8x15y13(){ note_ctor("_ZN3ccc9CC8x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC8x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC8x15y13E, buf);
    ::ccc::CC8x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC8x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x15y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9CC8x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC8x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x15y13E);
    dp->::ccc::CC8x15y13::~CC8x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x15y13E(Test__ZN3ccc9CC8x15y13E, "_ZN3ccc9CC8x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC8x15y13C1Ev();
extern void _ZN3ccc9CC8x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC8x15y13E[] = {
  NSPAIR(_ZN3ccc9CC8x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC8x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC8x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x15y13E[];
extern void _ZN3ccc9CC8x15y133efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x15y13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x15y13E[] = {
  {&(_ZTVN3ccc9CC8x15y13E[5]),  5,7},
  {&(_ZTVN3ccc9CC8x15y13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x15y13E[];
Class_Descriptor cd__ZN3ccc9CC8x15y13E = {  "_ZN3ccc9CC8x15y13E", // class name
  bases__ZN3ccc9CC8x15y13E, 2,
  &(vtc__ZN3ccc9CC8x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y13  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD8x15y133efgEv
  ~DD8x15y13(); // tgen
  DD8x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD8x15y13E) C1{ VBC2{ v1 v2} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD8x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD8x15y133efgEv");}
ccc::DD8x15y13 ::~DD8x15y13(){ note_dtor("_ZN3ccc9DD8x15y13E", this);} // tgen
ccc::DD8x15y13 ::DD8x15y13(){ note_ctor("_ZN3ccc9DD8x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD8x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD8x15y13E, buf);
    ::ccc::DD8x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD8x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x15y13E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD8x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x15y13E);
    dp->::ccc::DD8x15y13::~DD8x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x15y13E(Test__ZN3ccc9DD8x15y13E, "_ZN3ccc9DD8x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD8x15y13C1Ev();
extern void _ZN3ccc9DD8x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD8x15y13E[] = {
  NSPAIR(_ZN3ccc9DD8x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD8x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD8x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD8x15y13E[];
extern void _ZN3ccc9DD8x15y133efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x15y13E[] = {
  {&(_ZTVN3ccc9DD8x15y13E[6]),  6,8},
  {&(_ZTVN3ccc9DD8x15y13E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x15y13E[];
Class_Descriptor cd__ZN3ccc9DD8x15y13E = {  "_ZN3ccc9DD8x15y13E", // class name
  bases__ZN3ccc9DD8x15y13E, 2,
  &(vtc__ZN3ccc9DD8x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD8x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x15y13E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y14  : virtual ::ccc::AA8 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC8x15y143pqrEv
  ~CC8x15y14(); // tgen
  CC8x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y14E) C1{ VBC2{ v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC8x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC8x15y143pqrEv");}
ccc::CC8x15y14 ::~CC8x15y14(){ note_dtor("_ZN3ccc9CC8x15y14E", this);} // tgen
ccc::CC8x15y14 ::CC8x15y14(){ note_ctor("_ZN3ccc9CC8x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC8x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC8x15y14E, buf);
    ::ccc::CC8x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC8x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x15y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9CC8x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC8x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x15y14E);
    dp->::ccc::CC8x15y14::~CC8x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x15y14E(Test__ZN3ccc9CC8x15y14E, "_ZN3ccc9CC8x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC8x15y14C1Ev();
extern void _ZN3ccc9CC8x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC8x15y14E[] = {
  NSPAIR(_ZN3ccc9CC8x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC8x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC8x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x15y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9CC8x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x15y14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC8x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x15y14E[] = {
  {&(_ZTVN3ccc9CC8x15y14E[5]),  5,8},
  {&(_ZTVN3ccc9CC8x15y14E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x15y14E[];
Class_Descriptor cd__ZN3ccc9CC8x15y14E = {  "_ZN3ccc9CC8x15y14E", // class name
  bases__ZN3ccc9CC8x15y14E, 2,
  &(vtc__ZN3ccc9CC8x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y14E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y14  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD8x15y143pqrEv
  ~DD8x15y14(); // tgen
  DD8x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD8x15y14E) C1{ VBC2{ v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD8x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD8x15y143pqrEv");}
ccc::DD8x15y14 ::~DD8x15y14(){ note_dtor("_ZN3ccc9DD8x15y14E", this);} // tgen
ccc::DD8x15y14 ::DD8x15y14(){ note_ctor("_ZN3ccc9DD8x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD8x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD8x15y14E, buf);
    ::ccc::DD8x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD8x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x15y14E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD8x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x15y14E);
    dp->::ccc::DD8x15y14::~DD8x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x15y14E(Test__ZN3ccc9DD8x15y14E, "_ZN3ccc9DD8x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD8x15y14C1Ev();
extern void _ZN3ccc9DD8x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD8x15y14E[] = {
  NSPAIR(_ZN3ccc9DD8x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD8x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD8x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD8x15y14E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
extern void _ZN3ccc9DD8x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD8x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x15y14E[] = {
  {&(_ZTVN3ccc9DD8x15y14E[6]),  6,9},
  {&(_ZTVN3ccc9DD8x15y14E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x15y14E[];
Class_Descriptor cd__ZN3ccc9DD8x15y14E = {  "_ZN3ccc9DD8x15y14E", // class name
  bases__ZN3ccc9DD8x15y14E, 2,
  &(vtc__ZN3ccc9DD8x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD8x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x15y14E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC8x15y15  : virtual ::ccc::AA8 , ::ccc::BB15 {
  ~CC8x15y15(); // tgen
  CC8x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC8x15y15E) C1{ VBC2{ v1 v2} BC3{}}
}
namespace ccc { 
ccc::CC8x15y15 ::~CC8x15y15(){ note_dtor("_ZN3ccc9CC8x15y15E", this);} // tgen
ccc::CC8x15y15 ::CC8x15y15(){ note_ctor("_ZN3ccc9CC8x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC8x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC8x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC8x15y15E, buf);
    ::ccc::CC8x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC8x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC8x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC8x15y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9CC8x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC8x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC8x15y15E);
    dp->::ccc::CC8x15y15::~CC8x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC8x15y15E(Test__ZN3ccc9CC8x15y15E, "_ZN3ccc9CC8x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC8x15y15C1Ev();
extern void _ZN3ccc9CC8x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC8x15y15E[] = {
  NSPAIR(_ZN3ccc9CC8x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC8x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC8x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC8x15y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC8x15y15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC8x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC8x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC8x15y15E[] = {
  {&(_ZTVN3ccc9CC8x15y15E[5]),  5,7},
  {&(_ZTVN3ccc9CC8x15y15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC8x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC8x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC8x15y15E[];
Class_Descriptor cd__ZN3ccc9CC8x15y15E = {  "_ZN3ccc9CC8x15y15E", // class name
  bases__ZN3ccc9CC8x15y15E, 2,
  &(vtc__ZN3ccc9CC8x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC8x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC8x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC8x15y15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC8x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD8x15y15  : virtual ::ccc::AA8 , virtual ::ccc::BB15 {
  ~DD8x15y15(); // tgen
  DD8x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD8x15y15E) C1{ VBC2{ v1 v2} VBC3{}}
}
namespace ccc { 
ccc::DD8x15y15 ::~DD8x15y15(){ note_dtor("_ZN3ccc9DD8x15y15E", this);} // tgen
ccc::DD8x15y15 ::DD8x15y15(){ note_ctor("_ZN3ccc9DD8x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD8x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD8x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD8x15y15E, buf);
    ::ccc::DD8x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD8x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD8x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD8x15y15E)");
    check_base_class_offset(lv, (::ccc::AA8*), 0, "_ZN3ccc9DD8x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD8x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD8x15y15E);
    dp->::ccc::DD8x15y15::~DD8x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD8x15y15E(Test__ZN3ccc9DD8x15y15E, "_ZN3ccc9DD8x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD8x15y15C1Ev();
extern void _ZN3ccc9DD8x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD8x15y15E[] = {
  NSPAIR(_ZN3ccc9DD8x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD8x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA8E;
extern VTBL_ENTRY _ZTIN3ccc3AA8E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA8E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD8x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA8E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD8x15y15E[];
extern void _ZN3ccc3AA83efgEv();
extern void _ZN3ccc3AA83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD8x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD8x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD8x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD8x15y15E[] = {
  {&(_ZTVN3ccc9DD8x15y15E[6]),  6,8},
  {&(_ZTVN3ccc9DD8x15y15E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD8x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD8x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD8x15y15E[];
Class_Descriptor cd__ZN3ccc9DD8x15y15E = {  "_ZN3ccc9DD8x15y15E", // class name
  bases__ZN3ccc9DD8x15y15E, 2,
  &(vtc__ZN3ccc9DD8x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD8x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD8x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD8x15y15E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD8x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x0y0  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y03pqrEv
  ~CC9x0y0(); // tgen
  CC9x0y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y0E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y03abcEv");}
void  ccc::CC9x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y03efgEv");}
void  ccc::CC9x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y03pqrEv");}
ccc::CC9x0y0 ::~CC9x0y0(){ note_dtor("_ZN3ccc7CC9x0y0E", this);} // tgen
ccc::CC9x0y0 ::CC9x0y0(){ note_ctor("_ZN3ccc7CC9x0y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y0E, buf);
    ::ccc::CC9x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y0E);
    dp->::ccc::CC9x0y0::~CC9x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y0E(Test__ZN3ccc7CC9x0y0E, "_ZN3ccc7CC9x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y0C1Ev();
extern void _ZN3ccc7CC9x0y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y0E[] = {
  NSPAIR(_ZN3ccc7CC9x0y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y0E[];
extern void _ZN3ccc7CC9x0y03abcEv();
extern void _ZN3ccc7CC9x0y03efgEv();
extern void _ZN3ccc7CC9x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y03efgEv,_ZTv0_n12_N3ccc7CC9x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y03efgEv,_ZThn4_N3ccc7CC9x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y03pqrEv,_ZTv0_n16_N3ccc7CC9x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y03pqrEv,_ZThn4_N3ccc7CC9x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y03efgEv,_ZTv0_n12_N3ccc7CC9x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y03pqrEv,_ZTv0_n16_N3ccc7CC9x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y0E[] = {
  {&(_ZTVN3ccc7CC9x0y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y0E[];
static VTBL_ENTRY alt_thunk_names1590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y03pqrEv,_ZTv0_n16_N3ccc7CC9x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y03pqrEv,_ZThn4_N3ccc7CC9x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y03efgEv,_ZTv0_n12_N3ccc7CC9x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y03efgEv,_ZThn4_N3ccc7CC9x0y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y0E = {  "_ZN3ccc7CC9x0y0E", // class name
  bases__ZN3ccc7CC9x0y0E, 2,
  &(vtc__ZN3ccc7CC9x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y0E),2, //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  DD9x0y0  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD9x0y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x0y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x0y03pqrEv
  ~DD9x0y0(); // tgen
  DD9x0y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y0E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x0y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y03abcEv");}
void  ccc::DD9x0y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y03efgEv");}
void  ccc::DD9x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y03pqrEv");}
ccc::DD9x0y0 ::~DD9x0y0(){ note_dtor("_ZN3ccc7DD9x0y0E", this);} // tgen
ccc::DD9x0y0 ::DD9x0y0(){ note_ctor("_ZN3ccc7DD9x0y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y0E, buf);
    ::ccc::DD9x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y0E);
    dp->::ccc::DD9x0y0::~DD9x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y0E(Test__ZN3ccc7DD9x0y0E, "_ZN3ccc7DD9x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y0C1Ev();
extern void _ZN3ccc7DD9x0y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y0E[] = {
  NSPAIR(_ZN3ccc7DD9x0y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y0E[];
extern void _ZN3ccc7DD9x0y03efgEv();
extern void _ZN3ccc7DD9x0y03pqrEv();
extern void _ZN3ccc7DD9x0y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y03abcEv,_ZTv0_n12_N3ccc7DD9x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y03abcEv,_ZThn4_N3ccc7DD9x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y03efgEv,_ZTv0_n16_N3ccc7DD9x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y03efgEv,_ZThn4_N3ccc7DD9x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y03pqrEv,_ZTv0_n20_N3ccc7DD9x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y03pqrEv,_ZThn4_N3ccc7DD9x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y03abcEv,_ZTv0_n12_N3ccc7DD9x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y03efgEv,_ZTv0_n16_N3ccc7DD9x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y03pqrEv,_ZTv0_n20_N3ccc7DD9x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y0E[] = {
  {&(_ZTVN3ccc7DD9x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y0E[];
static VTBL_ENTRY alt_thunk_names1591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y03pqrEv,_ZTv0_n20_N3ccc7DD9x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y03pqrEv,_ZThn4_N3ccc7DD9x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y03efgEv,_ZTv0_n16_N3ccc7DD9x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y03efgEv,_ZThn4_N3ccc7DD9x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y03abcEv,_ZTv0_n12_N3ccc7DD9x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y03abcEv,_ZThn4_N3ccc7DD9x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y0E = {  "_ZN3ccc7DD9x0y0E", // class name
  bases__ZN3ccc7DD9x0y0E, 2,
  &(vtc__ZN3ccc7DD9x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y0E),3, //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  CC9x0y1  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x0y13efgEv
  ~CC9x0y1(); // tgen
  CC9x0y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y1E) C1{ VBC2{ v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y13abcEv");}
void  ccc::CC9x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y13pqrEv");}
void  ccc::CC9x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y13efgEv");}
ccc::CC9x0y1 ::~CC9x0y1(){ note_dtor("_ZN3ccc7CC9x0y1E", this);} // tgen
ccc::CC9x0y1 ::CC9x0y1(){ note_ctor("_ZN3ccc7CC9x0y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y1E, buf);
    ::ccc::CC9x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y1E);
    dp->::ccc::CC9x0y1::~CC9x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y1E(Test__ZN3ccc7CC9x0y1E, "_ZN3ccc7CC9x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y1C1Ev();
extern void _ZN3ccc7CC9x0y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y1E[] = {
  NSPAIR(_ZN3ccc7CC9x0y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y1E[];
extern void _ZN3ccc7CC9x0y13abcEv();
extern void _ZN3ccc7CC9x0y13efgEv();
extern void _ZN3ccc7CC9x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y13efgEv,_ZTv0_n12_N3ccc7CC9x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y13efgEv,_ZThn4_N3ccc7CC9x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y13pqrEv,_ZTv0_n16_N3ccc7CC9x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y13pqrEv,_ZThn4_N3ccc7CC9x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y13efgEv,_ZTv0_n12_N3ccc7CC9x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y13pqrEv,_ZTv0_n16_N3ccc7CC9x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y1E[] = {
  {&(_ZTVN3ccc7CC9x0y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y1E[];
static VTBL_ENTRY alt_thunk_names1592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y13pqrEv,_ZTv0_n16_N3ccc7CC9x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y13pqrEv,_ZThn4_N3ccc7CC9x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y13efgEv,_ZTv0_n12_N3ccc7CC9x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y13efgEv,_ZThn4_N3ccc7CC9x0y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y1E = {  "_ZN3ccc7CC9x0y1E", // class name
  bases__ZN3ccc7CC9x0y1E, 2,
  &(vtc__ZN3ccc7CC9x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y1E),2, //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  DD9x0y1  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD9x0y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x0y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x0y13efgEv
  ~DD9x0y1(); // tgen
  DD9x0y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y1E) C1{ VBC2{ v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x0y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y13abcEv");}
void  ccc::DD9x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y13pqrEv");}
void  ccc::DD9x0y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y13efgEv");}
ccc::DD9x0y1 ::~DD9x0y1(){ note_dtor("_ZN3ccc7DD9x0y1E", this);} // tgen
ccc::DD9x0y1 ::DD9x0y1(){ note_ctor("_ZN3ccc7DD9x0y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y1E, buf);
    ::ccc::DD9x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y1E);
    dp->::ccc::DD9x0y1::~DD9x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y1E(Test__ZN3ccc7DD9x0y1E, "_ZN3ccc7DD9x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y1C1Ev();
extern void _ZN3ccc7DD9x0y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y1E[] = {
  NSPAIR(_ZN3ccc7DD9x0y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y1E[];
extern void _ZN3ccc7DD9x0y13efgEv();
extern void _ZN3ccc7DD9x0y13pqrEv();
extern void _ZN3ccc7DD9x0y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y13abcEv,_ZTv0_n12_N3ccc7DD9x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y13abcEv,_ZThn4_N3ccc7DD9x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y13efgEv,_ZTv0_n16_N3ccc7DD9x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y13efgEv,_ZThn4_N3ccc7DD9x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y13pqrEv,_ZTv0_n20_N3ccc7DD9x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y13pqrEv,_ZThn4_N3ccc7DD9x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y13abcEv,_ZTv0_n12_N3ccc7DD9x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y13efgEv,_ZTv0_n16_N3ccc7DD9x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y13pqrEv,_ZTv0_n20_N3ccc7DD9x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y1E[] = {
  {&(_ZTVN3ccc7DD9x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y1E[];
static VTBL_ENTRY alt_thunk_names1593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y13pqrEv,_ZTv0_n20_N3ccc7DD9x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y13pqrEv,_ZThn4_N3ccc7DD9x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y13efgEv,_ZTv0_n16_N3ccc7DD9x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y13efgEv,_ZThn4_N3ccc7DD9x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y13abcEv,_ZTv0_n12_N3ccc7DD9x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y13abcEv,_ZThn4_N3ccc7DD9x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y1E = {  "_ZN3ccc7DD9x0y1E", // class name
  bases__ZN3ccc7DD9x0y1E, 2,
  &(vtc__ZN3ccc7DD9x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y1E),3, //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  CC9x0y2  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y23pqrEv
  ~CC9x0y2(); // tgen
  CC9x0y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y2E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y23efgEv");}
void  ccc::CC9x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y23abcEv");}
void  ccc::CC9x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y23pqrEv");}
ccc::CC9x0y2 ::~CC9x0y2(){ note_dtor("_ZN3ccc7CC9x0y2E", this);} // tgen
ccc::CC9x0y2 ::CC9x0y2(){ note_ctor("_ZN3ccc7CC9x0y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y2E, buf);
    ::ccc::CC9x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y2E);
    dp->::ccc::CC9x0y2::~CC9x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y2E(Test__ZN3ccc7CC9x0y2E, "_ZN3ccc7CC9x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y2C1Ev();
extern void _ZN3ccc7CC9x0y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y2E[] = {
  NSPAIR(_ZN3ccc7CC9x0y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y2E[];
extern void _ZN3ccc7CC9x0y23abcEv();
extern void _ZN3ccc7CC9x0y23efgEv();
extern void _ZN3ccc7CC9x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y23efgEv,_ZTv0_n12_N3ccc7CC9x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y23efgEv,_ZThn4_N3ccc7CC9x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y23pqrEv,_ZTv0_n16_N3ccc7CC9x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y23pqrEv,_ZThn4_N3ccc7CC9x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y23efgEv,_ZTv0_n12_N3ccc7CC9x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y23pqrEv,_ZTv0_n16_N3ccc7CC9x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y2E[] = {
  {&(_ZTVN3ccc7CC9x0y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y2E[];
static VTBL_ENTRY alt_thunk_names1594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y23pqrEv,_ZTv0_n16_N3ccc7CC9x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y23pqrEv,_ZThn4_N3ccc7CC9x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y23efgEv,_ZTv0_n12_N3ccc7CC9x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y23efgEv,_ZThn4_N3ccc7CC9x0y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y2E = {  "_ZN3ccc7CC9x0y2E", // class name
  bases__ZN3ccc7CC9x0y2E, 2,
  &(vtc__ZN3ccc7CC9x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y2E),2, //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  DD9x0y2  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD9x0y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x0y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x0y23pqrEv
  ~DD9x0y2(); // tgen
  DD9x0y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y2E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x0y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y23efgEv");}
void  ccc::DD9x0y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y23abcEv");}
void  ccc::DD9x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y23pqrEv");}
ccc::DD9x0y2 ::~DD9x0y2(){ note_dtor("_ZN3ccc7DD9x0y2E", this);} // tgen
ccc::DD9x0y2 ::DD9x0y2(){ note_ctor("_ZN3ccc7DD9x0y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y2E, buf);
    ::ccc::DD9x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y2E);
    dp->::ccc::DD9x0y2::~DD9x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y2E(Test__ZN3ccc7DD9x0y2E, "_ZN3ccc7DD9x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y2C1Ev();
extern void _ZN3ccc7DD9x0y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y2E[] = {
  NSPAIR(_ZN3ccc7DD9x0y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y2E[];
extern void _ZN3ccc7DD9x0y23efgEv();
extern void _ZN3ccc7DD9x0y23pqrEv();
extern void _ZN3ccc7DD9x0y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y23abcEv,_ZTv0_n12_N3ccc7DD9x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y23abcEv,_ZThn4_N3ccc7DD9x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y23efgEv,_ZTv0_n16_N3ccc7DD9x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y23efgEv,_ZThn4_N3ccc7DD9x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y23pqrEv,_ZTv0_n20_N3ccc7DD9x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y23pqrEv,_ZThn4_N3ccc7DD9x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y23abcEv,_ZTv0_n12_N3ccc7DD9x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y23efgEv,_ZTv0_n16_N3ccc7DD9x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y23pqrEv,_ZTv0_n20_N3ccc7DD9x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y2E[] = {
  {&(_ZTVN3ccc7DD9x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y2E[];
static VTBL_ENTRY alt_thunk_names1595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y23pqrEv,_ZTv0_n20_N3ccc7DD9x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y23pqrEv,_ZThn4_N3ccc7DD9x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y23efgEv,_ZTv0_n16_N3ccc7DD9x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y23efgEv,_ZThn4_N3ccc7DD9x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y23abcEv,_ZTv0_n12_N3ccc7DD9x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y23abcEv,_ZThn4_N3ccc7DD9x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y2E = {  "_ZN3ccc7DD9x0y2E", // class name
  bases__ZN3ccc7DD9x0y2E, 2,
  &(vtc__ZN3ccc7DD9x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y2E),3, //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  CC9x0y3  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x0y33abcEv
  ~CC9x0y3(); // tgen
  CC9x0y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y3E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y33efgEv");}
void  ccc::CC9x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y33pqrEv");}
void  ccc::CC9x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y33abcEv");}
ccc::CC9x0y3 ::~CC9x0y3(){ note_dtor("_ZN3ccc7CC9x0y3E", this);} // tgen
ccc::CC9x0y3 ::CC9x0y3(){ note_ctor("_ZN3ccc7CC9x0y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y3E, buf);
    ::ccc::CC9x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y3E);
    dp->::ccc::CC9x0y3::~CC9x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y3E(Test__ZN3ccc7CC9x0y3E, "_ZN3ccc7CC9x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y3C1Ev();
extern void _ZN3ccc7CC9x0y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y3E[] = {
  NSPAIR(_ZN3ccc7CC9x0y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y3E[];
extern void _ZN3ccc7CC9x0y33abcEv();
extern void _ZN3ccc7CC9x0y33efgEv();
extern void _ZN3ccc7CC9x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y33efgEv,_ZTv0_n12_N3ccc7CC9x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y33efgEv,_ZThn4_N3ccc7CC9x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y33pqrEv,_ZTv0_n16_N3ccc7CC9x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y33pqrEv,_ZThn4_N3ccc7CC9x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y33efgEv,_ZTv0_n12_N3ccc7CC9x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y33pqrEv,_ZTv0_n16_N3ccc7CC9x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y3E[] = {
  {&(_ZTVN3ccc7CC9x0y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y3E[];
static VTBL_ENTRY alt_thunk_names1596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y33pqrEv,_ZTv0_n16_N3ccc7CC9x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y33pqrEv,_ZThn4_N3ccc7CC9x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y33efgEv,_ZTv0_n12_N3ccc7CC9x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y33efgEv,_ZThn4_N3ccc7CC9x0y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y3E = {  "_ZN3ccc7CC9x0y3E", // class name
  bases__ZN3ccc7CC9x0y3E, 2,
  &(vtc__ZN3ccc7CC9x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y3E),2, //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  DD9x0y3  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD9x0y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x0y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x0y33abcEv
  ~DD9x0y3(); // tgen
  DD9x0y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y3E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x0y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y33efgEv");}
void  ccc::DD9x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y33pqrEv");}
void  ccc::DD9x0y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y33abcEv");}
ccc::DD9x0y3 ::~DD9x0y3(){ note_dtor("_ZN3ccc7DD9x0y3E", this);} // tgen
ccc::DD9x0y3 ::DD9x0y3(){ note_ctor("_ZN3ccc7DD9x0y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y3E, buf);
    ::ccc::DD9x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y3E);
    dp->::ccc::DD9x0y3::~DD9x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y3E(Test__ZN3ccc7DD9x0y3E, "_ZN3ccc7DD9x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y3C1Ev();
extern void _ZN3ccc7DD9x0y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y3E[] = {
  NSPAIR(_ZN3ccc7DD9x0y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y3E[];
extern void _ZN3ccc7DD9x0y33efgEv();
extern void _ZN3ccc7DD9x0y33pqrEv();
extern void _ZN3ccc7DD9x0y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y33abcEv,_ZTv0_n12_N3ccc7DD9x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y33abcEv,_ZThn4_N3ccc7DD9x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y33efgEv,_ZTv0_n16_N3ccc7DD9x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y33efgEv,_ZThn4_N3ccc7DD9x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y33pqrEv,_ZTv0_n20_N3ccc7DD9x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y33pqrEv,_ZThn4_N3ccc7DD9x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y33abcEv,_ZTv0_n12_N3ccc7DD9x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y33efgEv,_ZTv0_n16_N3ccc7DD9x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y33pqrEv,_ZTv0_n20_N3ccc7DD9x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y3E[] = {
  {&(_ZTVN3ccc7DD9x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y3E[];
static VTBL_ENTRY alt_thunk_names1597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y33pqrEv,_ZTv0_n20_N3ccc7DD9x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y33pqrEv,_ZThn4_N3ccc7DD9x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y33efgEv,_ZTv0_n16_N3ccc7DD9x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y33efgEv,_ZThn4_N3ccc7DD9x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y33abcEv,_ZTv0_n12_N3ccc7DD9x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y33abcEv,_ZThn4_N3ccc7DD9x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y3E = {  "_ZN3ccc7DD9x0y3E", // class name
  bases__ZN3ccc7DD9x0y3E, 2,
  &(vtc__ZN3ccc7DD9x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y3E),3, //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  CC9x0y4  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC9x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x0y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x0y43efgEv
  ~CC9x0y4(); // tgen
  CC9x0y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y4E) C1{ VBC2{ v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y43pqrEv");}
void  ccc::CC9x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y43abcEv");}
void  ccc::CC9x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y43efgEv");}
ccc::CC9x0y4 ::~CC9x0y4(){ note_dtor("_ZN3ccc7CC9x0y4E", this);} // tgen
ccc::CC9x0y4 ::CC9x0y4(){ note_ctor("_ZN3ccc7CC9x0y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y4E, buf);
    ::ccc::CC9x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y4E);
    dp->::ccc::CC9x0y4::~CC9x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y4E(Test__ZN3ccc7CC9x0y4E, "_ZN3ccc7CC9x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y4C1Ev();
extern void _ZN3ccc7CC9x0y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y4E[] = {
  NSPAIR(_ZN3ccc7CC9x0y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y4E[];
extern void _ZN3ccc7CC9x0y43abcEv();
extern void _ZN3ccc7CC9x0y43efgEv();
extern void _ZN3ccc7CC9x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y43efgEv,_ZTv0_n12_N3ccc7CC9x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y43efgEv,_ZThn4_N3ccc7CC9x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y43pqrEv,_ZTv0_n16_N3ccc7CC9x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y43pqrEv,_ZThn4_N3ccc7CC9x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y43efgEv,_ZTv0_n12_N3ccc7CC9x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y43pqrEv,_ZTv0_n16_N3ccc7CC9x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y4E[] = {
  {&(_ZTVN3ccc7CC9x0y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y4E[];
static VTBL_ENTRY alt_thunk_names1598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y43pqrEv,_ZTv0_n16_N3ccc7CC9x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y43pqrEv,_ZThn4_N3ccc7CC9x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y43efgEv,_ZTv0_n12_N3ccc7CC9x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y43efgEv,_ZThn4_N3ccc7CC9x0y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y4E = {  "_ZN3ccc7CC9x0y4E", // class name
  bases__ZN3ccc7CC9x0y4E, 2,
  &(vtc__ZN3ccc7CC9x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y4E),2, //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  DD9x0y4  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD9x0y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x0y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x0y43efgEv
  ~DD9x0y4(); // tgen
  DD9x0y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y4E) C1{ VBC2{ v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y43pqrEv");}
void  ccc::DD9x0y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y43abcEv");}
void  ccc::DD9x0y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y43efgEv");}
ccc::DD9x0y4 ::~DD9x0y4(){ note_dtor("_ZN3ccc7DD9x0y4E", this);} // tgen
ccc::DD9x0y4 ::DD9x0y4(){ note_ctor("_ZN3ccc7DD9x0y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y4E, buf);
    ::ccc::DD9x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y4E);
    dp->::ccc::DD9x0y4::~DD9x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y4E(Test__ZN3ccc7DD9x0y4E, "_ZN3ccc7DD9x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y4C1Ev();
extern void _ZN3ccc7DD9x0y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y4E[] = {
  NSPAIR(_ZN3ccc7DD9x0y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y4E[];
extern void _ZN3ccc7DD9x0y43efgEv();
extern void _ZN3ccc7DD9x0y43pqrEv();
extern void _ZN3ccc7DD9x0y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y43abcEv,_ZTv0_n12_N3ccc7DD9x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y43abcEv,_ZThn4_N3ccc7DD9x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y43efgEv,_ZTv0_n16_N3ccc7DD9x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y43efgEv,_ZThn4_N3ccc7DD9x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y43pqrEv,_ZTv0_n20_N3ccc7DD9x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y43pqrEv,_ZThn4_N3ccc7DD9x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y43abcEv,_ZTv0_n12_N3ccc7DD9x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y43efgEv,_ZTv0_n16_N3ccc7DD9x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y43pqrEv,_ZTv0_n20_N3ccc7DD9x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y4E[] = {
  {&(_ZTVN3ccc7DD9x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y4E[];
static VTBL_ENTRY alt_thunk_names1599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y43pqrEv,_ZTv0_n20_N3ccc7DD9x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y43pqrEv,_ZThn4_N3ccc7DD9x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y43efgEv,_ZTv0_n16_N3ccc7DD9x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y43efgEv,_ZThn4_N3ccc7DD9x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y43abcEv,_ZTv0_n12_N3ccc7DD9x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y43abcEv,_ZThn4_N3ccc7DD9x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y4E = {  "_ZN3ccc7DD9x0y4E", // class name
  bases__ZN3ccc7DD9x0y4E, 2,
  &(vtc__ZN3ccc7DD9x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y4E),3, //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  CC9x0y5  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7CC9x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x0y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x0y53abcEv
  ~CC9x0y5(); // tgen
  CC9x0y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y5E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y53pqrEv");}
void  ccc::CC9x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y53efgEv");}
void  ccc::CC9x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y53abcEv");}
ccc::CC9x0y5 ::~CC9x0y5(){ note_dtor("_ZN3ccc7CC9x0y5E", this);} // tgen
ccc::CC9x0y5 ::CC9x0y5(){ note_ctor("_ZN3ccc7CC9x0y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y5E, buf);
    ::ccc::CC9x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y5E);
    dp->::ccc::CC9x0y5::~CC9x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y5E(Test__ZN3ccc7CC9x0y5E, "_ZN3ccc7CC9x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y5C1Ev();
extern void _ZN3ccc7CC9x0y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y5E[] = {
  NSPAIR(_ZN3ccc7CC9x0y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y5E[];
extern void _ZN3ccc7CC9x0y53abcEv();
extern void _ZN3ccc7CC9x0y53efgEv();
extern void _ZN3ccc7CC9x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y53efgEv,_ZTv0_n12_N3ccc7CC9x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y53efgEv,_ZThn4_N3ccc7CC9x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y53pqrEv,_ZTv0_n16_N3ccc7CC9x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y53pqrEv,_ZThn4_N3ccc7CC9x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y53efgEv,_ZTv0_n12_N3ccc7CC9x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y53pqrEv,_ZTv0_n16_N3ccc7CC9x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y5E[] = {
  {&(_ZTVN3ccc7CC9x0y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y5E[];
static VTBL_ENTRY alt_thunk_names1600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y53pqrEv,_ZTv0_n16_N3ccc7CC9x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y53pqrEv,_ZThn4_N3ccc7CC9x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y53efgEv,_ZTv0_n12_N3ccc7CC9x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y53efgEv,_ZThn4_N3ccc7CC9x0y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y5E = {  "_ZN3ccc7CC9x0y5E", // class name
  bases__ZN3ccc7CC9x0y5E, 2,
  &(vtc__ZN3ccc7CC9x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y5E),2, //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  DD9x0y5  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc7DD9x0y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x0y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x0y53abcEv
  ~DD9x0y5(); // tgen
  DD9x0y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y5E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y53pqrEv");}
void  ccc::DD9x0y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y53efgEv");}
void  ccc::DD9x0y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y53abcEv");}
ccc::DD9x0y5 ::~DD9x0y5(){ note_dtor("_ZN3ccc7DD9x0y5E", this);} // tgen
ccc::DD9x0y5 ::DD9x0y5(){ note_ctor("_ZN3ccc7DD9x0y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y5E, buf);
    ::ccc::DD9x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y5E);
    dp->::ccc::DD9x0y5::~DD9x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y5E(Test__ZN3ccc7DD9x0y5E, "_ZN3ccc7DD9x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y5C1Ev();
extern void _ZN3ccc7DD9x0y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y5E[] = {
  NSPAIR(_ZN3ccc7DD9x0y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y5E[];
extern void _ZN3ccc7DD9x0y53efgEv();
extern void _ZN3ccc7DD9x0y53pqrEv();
extern void _ZN3ccc7DD9x0y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y53abcEv,_ZTv0_n12_N3ccc7DD9x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y53abcEv,_ZThn4_N3ccc7DD9x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y53efgEv,_ZTv0_n16_N3ccc7DD9x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y53efgEv,_ZThn4_N3ccc7DD9x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y53pqrEv,_ZTv0_n20_N3ccc7DD9x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y53pqrEv,_ZThn4_N3ccc7DD9x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y53abcEv,_ZTv0_n12_N3ccc7DD9x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y53efgEv,_ZTv0_n16_N3ccc7DD9x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y53pqrEv,_ZTv0_n20_N3ccc7DD9x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y5E[] = {
  {&(_ZTVN3ccc7DD9x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y5E[];
static VTBL_ENTRY alt_thunk_names1601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y53pqrEv,_ZTv0_n20_N3ccc7DD9x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y53pqrEv,_ZThn4_N3ccc7DD9x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y53efgEv,_ZTv0_n16_N3ccc7DD9x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y53efgEv,_ZThn4_N3ccc7DD9x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y53abcEv,_ZTv0_n12_N3ccc7DD9x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y53abcEv,_ZThn4_N3ccc7DD9x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y5E = {  "_ZN3ccc7DD9x0y5E", // class name
  bases__ZN3ccc7DD9x0y5E, 2,
  &(vtc__ZN3ccc7DD9x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y5E),3, //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  CC9x0y6  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x0y63efgEv
  ~CC9x0y6(); // tgen
  CC9x0y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y6E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y63abcEv");}
void  ccc::CC9x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y63efgEv");}
ccc::CC9x0y6 ::~CC9x0y6(){ note_dtor("_ZN3ccc7CC9x0y6E", this);} // tgen
ccc::CC9x0y6 ::CC9x0y6(){ note_ctor("_ZN3ccc7CC9x0y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y6E, buf);
    ::ccc::CC9x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y6E);
    dp->::ccc::CC9x0y6::~CC9x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y6E(Test__ZN3ccc7CC9x0y6E, "_ZN3ccc7CC9x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y6C1Ev();
extern void _ZN3ccc7CC9x0y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y6E[] = {
  NSPAIR(_ZN3ccc7CC9x0y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y6E[];
extern void _ZN3ccc7CC9x0y63abcEv();
extern void _ZN3ccc7CC9x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y63efgEv,_ZTv0_n12_N3ccc7CC9x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y63efgEv,_ZThn4_N3ccc7CC9x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y63efgEv,_ZTv0_n12_N3ccc7CC9x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y6E[] = {
  {&(_ZTVN3ccc7CC9x0y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y6E[];
static VTBL_ENTRY alt_thunk_names1602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y63efgEv,_ZTv0_n12_N3ccc7CC9x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y63efgEv,_ZThn4_N3ccc7CC9x0y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y6E = {  "_ZN3ccc7CC9x0y6E", // class name
  bases__ZN3ccc7CC9x0y6E, 2,
  &(vtc__ZN3ccc7CC9x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y6E),2, //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  DD9x0y6  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD9x0y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x0y63efgEv
  ~DD9x0y6(); // tgen
  DD9x0y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y6E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x0y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y63abcEv");}
void  ccc::DD9x0y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y63efgEv");}
ccc::DD9x0y6 ::~DD9x0y6(){ note_dtor("_ZN3ccc7DD9x0y6E", this);} // tgen
ccc::DD9x0y6 ::DD9x0y6(){ note_ctor("_ZN3ccc7DD9x0y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y6E, buf);
    ::ccc::DD9x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y6E);
    dp->::ccc::DD9x0y6::~DD9x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y6E(Test__ZN3ccc7DD9x0y6E, "_ZN3ccc7DD9x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y6C1Ev();
extern void _ZN3ccc7DD9x0y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y6E[] = {
  NSPAIR(_ZN3ccc7DD9x0y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y6E[];
extern void _ZN3ccc7DD9x0y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x0y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y63abcEv,_ZTv0_n12_N3ccc7DD9x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y63abcEv,_ZThn4_N3ccc7DD9x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y63efgEv,_ZTv0_n16_N3ccc7DD9x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y63efgEv,_ZThn4_N3ccc7DD9x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y63abcEv,_ZTv0_n12_N3ccc7DD9x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y63efgEv,_ZTv0_n16_N3ccc7DD9x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y6E[] = {
  {&(_ZTVN3ccc7DD9x0y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y6E[];
static VTBL_ENTRY alt_thunk_names1603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y63efgEv,_ZTv0_n16_N3ccc7DD9x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y63efgEv,_ZThn4_N3ccc7DD9x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y63abcEv,_ZTv0_n12_N3ccc7DD9x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y63abcEv,_ZThn4_N3ccc7DD9x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y6E = {  "_ZN3ccc7DD9x0y6E", // class name
  bases__ZN3ccc7DD9x0y6E, 2,
  &(vtc__ZN3ccc7DD9x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y6E),3, //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  CC9x0y7  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7CC9x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y73pqrEv
  ~CC9x0y7(); // tgen
  CC9x0y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y7E) C1{ VBC2{ v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y73abcEv");}
void  ccc::CC9x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y73pqrEv");}
ccc::CC9x0y7 ::~CC9x0y7(){ note_dtor("_ZN3ccc7CC9x0y7E", this);} // tgen
ccc::CC9x0y7 ::CC9x0y7(){ note_ctor("_ZN3ccc7CC9x0y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y7E, buf);
    ::ccc::CC9x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y7E);
    dp->::ccc::CC9x0y7::~CC9x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y7E(Test__ZN3ccc7CC9x0y7E, "_ZN3ccc7CC9x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y7C1Ev();
extern void _ZN3ccc7CC9x0y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y7E[] = {
  NSPAIR(_ZN3ccc7CC9x0y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y7E[];
extern void _ZN3ccc7CC9x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc7CC9x0y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y73pqrEv,_ZTv0_n16_N3ccc7CC9x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y73pqrEv,_ZThn4_N3ccc7CC9x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y73pqrEv,_ZTv0_n16_N3ccc7CC9x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y7E[] = {
  {&(_ZTVN3ccc7CC9x0y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y7E[];
static VTBL_ENTRY alt_thunk_names1604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y73pqrEv,_ZTv0_n16_N3ccc7CC9x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y73pqrEv,_ZThn4_N3ccc7CC9x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y7E = {  "_ZN3ccc7CC9x0y7E", // class name
  bases__ZN3ccc7CC9x0y7E, 2,
  &(vtc__ZN3ccc7CC9x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y7E),2, //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  DD9x0y7  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc7DD9x0y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x0y73pqrEv
  ~DD9x0y7(); // tgen
  DD9x0y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y7E) C1{ VBC2{ v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x0y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y73abcEv");}
void  ccc::DD9x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y73pqrEv");}
ccc::DD9x0y7 ::~DD9x0y7(){ note_dtor("_ZN3ccc7DD9x0y7E", this);} // tgen
ccc::DD9x0y7 ::DD9x0y7(){ note_ctor("_ZN3ccc7DD9x0y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y7E, buf);
    ::ccc::DD9x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y7E);
    dp->::ccc::DD9x0y7::~DD9x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y7E(Test__ZN3ccc7DD9x0y7E, "_ZN3ccc7DD9x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y7C1Ev();
extern void _ZN3ccc7DD9x0y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y7E[] = {
  NSPAIR(_ZN3ccc7DD9x0y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x0y73pqrEv();
extern void _ZN3ccc7DD9x0y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y73abcEv,_ZTv0_n12_N3ccc7DD9x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y73abcEv,_ZThn4_N3ccc7DD9x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y73pqrEv,_ZTv0_n20_N3ccc7DD9x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y73pqrEv,_ZThn4_N3ccc7DD9x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y73abcEv,_ZTv0_n12_N3ccc7DD9x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y73pqrEv,_ZTv0_n20_N3ccc7DD9x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y7E[] = {
  {&(_ZTVN3ccc7DD9x0y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y7E[];
static VTBL_ENTRY alt_thunk_names1605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y73pqrEv,_ZTv0_n20_N3ccc7DD9x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y73pqrEv,_ZThn4_N3ccc7DD9x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y73abcEv,_ZTv0_n12_N3ccc7DD9x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y73abcEv,_ZThn4_N3ccc7DD9x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y7E = {  "_ZN3ccc7DD9x0y7E", // class name
  bases__ZN3ccc7DD9x0y7E, 2,
  &(vtc__ZN3ccc7DD9x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y7E),3, //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  CC9x0y8  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x0y83abcEv
  ~CC9x0y8(); // tgen
  CC9x0y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y8E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y83efgEv");}
void  ccc::CC9x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x0y83abcEv");}
ccc::CC9x0y8 ::~CC9x0y8(){ note_dtor("_ZN3ccc7CC9x0y8E", this);} // tgen
ccc::CC9x0y8 ::CC9x0y8(){ note_ctor("_ZN3ccc7CC9x0y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y8E, buf);
    ::ccc::CC9x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y8E);
    dp->::ccc::CC9x0y8::~CC9x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y8E(Test__ZN3ccc7CC9x0y8E, "_ZN3ccc7CC9x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y8C1Ev();
extern void _ZN3ccc7CC9x0y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y8E[] = {
  NSPAIR(_ZN3ccc7CC9x0y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y8E[];
extern void _ZN3ccc7CC9x0y83abcEv();
extern void _ZN3ccc7CC9x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y83efgEv,_ZTv0_n12_N3ccc7CC9x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y83efgEv,_ZThn4_N3ccc7CC9x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y83efgEv,_ZTv0_n12_N3ccc7CC9x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y8E[] = {
  {&(_ZTVN3ccc7CC9x0y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y8E[];
static VTBL_ENTRY alt_thunk_names1606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y83efgEv,_ZTv0_n12_N3ccc7CC9x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y83efgEv,_ZThn4_N3ccc7CC9x0y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y8E = {  "_ZN3ccc7CC9x0y8E", // class name
  bases__ZN3ccc7CC9x0y8E, 2,
  &(vtc__ZN3ccc7CC9x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y8E),2, //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  DD9x0y8  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD9x0y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x0y83abcEv
  ~DD9x0y8(); // tgen
  DD9x0y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y8E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x0y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y83efgEv");}
void  ccc::DD9x0y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x0y83abcEv");}
ccc::DD9x0y8 ::~DD9x0y8(){ note_dtor("_ZN3ccc7DD9x0y8E", this);} // tgen
ccc::DD9x0y8 ::DD9x0y8(){ note_ctor("_ZN3ccc7DD9x0y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y8E, buf);
    ::ccc::DD9x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y8E);
    dp->::ccc::DD9x0y8::~DD9x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y8E(Test__ZN3ccc7DD9x0y8E, "_ZN3ccc7DD9x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y8C1Ev();
extern void _ZN3ccc7DD9x0y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y8E[] = {
  NSPAIR(_ZN3ccc7DD9x0y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y8E[];
extern void _ZN3ccc7DD9x0y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x0y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x0y83abcEv,_ZTv0_n12_N3ccc7DD9x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y83abcEv,_ZThn4_N3ccc7DD9x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y83efgEv,_ZTv0_n16_N3ccc7DD9x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y83efgEv,_ZThn4_N3ccc7DD9x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x0y83abcEv,_ZTv0_n12_N3ccc7DD9x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y83efgEv,_ZTv0_n16_N3ccc7DD9x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y8E[] = {
  {&(_ZTVN3ccc7DD9x0y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x0y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y8E[];
static VTBL_ENTRY alt_thunk_names1607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y83efgEv,_ZTv0_n16_N3ccc7DD9x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y83efgEv,_ZThn4_N3ccc7DD9x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x0y83abcEv,_ZTv0_n12_N3ccc7DD9x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y83abcEv,_ZThn4_N3ccc7DD9x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y8E = {  "_ZN3ccc7DD9x0y8E", // class name
  bases__ZN3ccc7DD9x0y8E, 2,
  &(vtc__ZN3ccc7DD9x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y8E),3, //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  CC9x0y9  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7CC9x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x0y93pqrEv
  ~CC9x0y9(); // tgen
  CC9x0y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x0y9E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x0y93efgEv");}
void  ccc::CC9x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x0y93pqrEv");}
ccc::CC9x0y9 ::~CC9x0y9(){ note_dtor("_ZN3ccc7CC9x0y9E", this);} // tgen
ccc::CC9x0y9 ::CC9x0y9(){ note_ctor("_ZN3ccc7CC9x0y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x0y9E, buf);
    ::ccc::CC9x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x0y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc7CC9x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x0y9E);
    dp->::ccc::CC9x0y9::~CC9x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x0y9E(Test__ZN3ccc7CC9x0y9E, "_ZN3ccc7CC9x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x0y9C1Ev();
extern void _ZN3ccc7CC9x0y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x0y9E[] = {
  NSPAIR(_ZN3ccc7CC9x0y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7CC9x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc7CC9x0y93efgEv();
extern void _ZN3ccc7CC9x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x0y93efgEv,_ZTv0_n12_N3ccc7CC9x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y93efgEv,_ZThn4_N3ccc7CC9x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x0y93pqrEv,_ZTv0_n16_N3ccc7CC9x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x0y93pqrEv,_ZThn4_N3ccc7CC9x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x0y93efgEv,_ZTv0_n12_N3ccc7CC9x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x0y93pqrEv,_ZTv0_n16_N3ccc7CC9x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x0y9E[] = {
  {&(_ZTVN3ccc7CC9x0y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x0y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x0y9E[];
static VTBL_ENTRY alt_thunk_names1608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x0y93pqrEv,_ZTv0_n16_N3ccc7CC9x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y93pqrEv,_ZThn4_N3ccc7CC9x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x0y93efgEv,_ZTv0_n12_N3ccc7CC9x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x0y93efgEv,_ZThn4_N3ccc7CC9x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x0y9E = {  "_ZN3ccc7CC9x0y9E", // class name
  bases__ZN3ccc7CC9x0y9E, 2,
  &(vtc__ZN3ccc7CC9x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x0y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x0y9E),2, //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  DD9x0y9  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc7DD9x0y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x0y93pqrEv
  ~DD9x0y9(); // tgen
  DD9x0y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x0y9E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x0y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x0y93efgEv");}
void  ccc::DD9x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x0y93pqrEv");}
ccc::DD9x0y9 ::~DD9x0y9(){ note_dtor("_ZN3ccc7DD9x0y9E", this);} // tgen
ccc::DD9x0y9 ::DD9x0y9(){ note_ctor("_ZN3ccc7DD9x0y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x0y9E, buf);
    ::ccc::DD9x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x0y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc7DD9x0y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x0y9E);
    dp->::ccc::DD9x0y9::~DD9x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x0y9E(Test__ZN3ccc7DD9x0y9E, "_ZN3ccc7DD9x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x0y9C1Ev();
extern void _ZN3ccc7DD9x0y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x0y9E[] = {
  NSPAIR(_ZN3ccc7DD9x0y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc7DD9x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y9E[];
extern void _ZN3ccc7DD9x0y93efgEv();
extern void _ZN3ccc7DD9x0y93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x0y93efgEv,_ZTv0_n16_N3ccc7DD9x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y93efgEv,_ZThn4_N3ccc7DD9x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x0y93pqrEv,_ZTv0_n20_N3ccc7DD9x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x0y93pqrEv,_ZThn4_N3ccc7DD9x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x0y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x0y93efgEv,_ZTv0_n16_N3ccc7DD9x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x0y93pqrEv,_ZTv0_n20_N3ccc7DD9x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x0y9E[] = {
  {&(_ZTVN3ccc7DD9x0y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x0y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x0y9E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x0y9E[];
static VTBL_ENTRY alt_thunk_names1609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x0y93pqrEv,_ZTv0_n20_N3ccc7DD9x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y93pqrEv,_ZThn4_N3ccc7DD9x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x0y93efgEv,_ZTv0_n16_N3ccc7DD9x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x0y93efgEv,_ZThn4_N3ccc7DD9x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x0y9E = {  "_ZN3ccc7DD9x0y9E", // class name
  bases__ZN3ccc7DD9x0y9E, 2,
  &(vtc__ZN3ccc7DD9x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x0y9E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x0y9E),3, //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  CC9x0y10  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC9x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x0y103abcEv
  ~CC9x0y10(); // tgen
  CC9x0y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y10E) C1{ VBC2{ v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x0y103pqrEv");}
void  ccc::CC9x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x0y103abcEv");}
ccc::CC9x0y10 ::~CC9x0y10(){ note_dtor("_ZN3ccc8CC9x0y10E", this);} // tgen
ccc::CC9x0y10 ::CC9x0y10(){ note_ctor("_ZN3ccc8CC9x0y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x0y10E, buf);
    ::ccc::CC9x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x0y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC9x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x0y10E);
    dp->::ccc::CC9x0y10::~CC9x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x0y10E(Test__ZN3ccc8CC9x0y10E, "_ZN3ccc8CC9x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x0y10C1Ev();
extern void _ZN3ccc8CC9x0y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x0y10E[] = {
  NSPAIR(_ZN3ccc8CC9x0y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC9x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x0y10E[];
extern void _ZN3ccc8CC9x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC9x0y103pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x0y103pqrEv,_ZTv0_n16_N3ccc8CC9x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y103pqrEv,_ZThn4_N3ccc8CC9x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x0y103pqrEv,_ZTv0_n16_N3ccc8CC9x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x0y10E[] = {
  {&(_ZTVN3ccc8CC9x0y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x0y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x0y10E[];
static VTBL_ENTRY alt_thunk_names1610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x0y103pqrEv,_ZTv0_n16_N3ccc8CC9x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x0y103pqrEv,_ZThn4_N3ccc8CC9x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x0y10E = {  "_ZN3ccc8CC9x0y10E", // class name
  bases__ZN3ccc8CC9x0y10E, 2,
  &(vtc__ZN3ccc8CC9x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x0y10E),2, //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  DD9x0y10  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD9x0y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x0y103abcEv
  ~DD9x0y10(); // tgen
  DD9x0y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x0y10E) C1{ VBC2{ v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x0y103pqrEv");}
void  ccc::DD9x0y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x0y103abcEv");}
ccc::DD9x0y10 ::~DD9x0y10(){ note_dtor("_ZN3ccc8DD9x0y10E", this);} // tgen
ccc::DD9x0y10 ::DD9x0y10(){ note_ctor("_ZN3ccc8DD9x0y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x0y10E, buf);
    ::ccc::DD9x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x0y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD9x0y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x0y10E);
    dp->::ccc::DD9x0y10::~DD9x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x0y10E(Test__ZN3ccc8DD9x0y10E, "_ZN3ccc8DD9x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x0y10C1Ev();
extern void _ZN3ccc8DD9x0y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x0y10E[] = {
  NSPAIR(_ZN3ccc8DD9x0y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD9x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x0y103pqrEv();
extern void _ZN3ccc8DD9x0y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x0y103abcEv,_ZTv0_n12_N3ccc8DD9x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y103abcEv,_ZThn4_N3ccc8DD9x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x0y103pqrEv,_ZTv0_n20_N3ccc8DD9x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y103pqrEv,_ZThn4_N3ccc8DD9x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x0y103abcEv,_ZTv0_n12_N3ccc8DD9x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x0y103pqrEv,_ZTv0_n20_N3ccc8DD9x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x0y10E[] = {
  {&(_ZTVN3ccc8DD9x0y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x0y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x0y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x0y10E[];
static VTBL_ENTRY alt_thunk_names1611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x0y103pqrEv,_ZTv0_n20_N3ccc8DD9x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y103pqrEv,_ZThn4_N3ccc8DD9x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x0y103abcEv,_ZTv0_n12_N3ccc8DD9x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y103abcEv,_ZThn4_N3ccc8DD9x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x0y10E = {  "_ZN3ccc8DD9x0y10E", // class name
  bases__ZN3ccc8DD9x0y10E, 2,
  &(vtc__ZN3ccc8DD9x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x0y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x0y10E),3, //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  CC9x0y11  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC9x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x0y113efgEv
  ~CC9x0y11(); // tgen
  CC9x0y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y11E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x0y113pqrEv");}
void  ccc::CC9x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x0y113efgEv");}
ccc::CC9x0y11 ::~CC9x0y11(){ note_dtor("_ZN3ccc8CC9x0y11E", this);} // tgen
ccc::CC9x0y11 ::CC9x0y11(){ note_ctor("_ZN3ccc8CC9x0y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x0y11E, buf);
    ::ccc::CC9x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x0y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC9x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x0y11E);
    dp->::ccc::CC9x0y11::~CC9x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x0y11E(Test__ZN3ccc8CC9x0y11E, "_ZN3ccc8CC9x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x0y11C1Ev();
extern void _ZN3ccc8CC9x0y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x0y11E[] = {
  NSPAIR(_ZN3ccc8CC9x0y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC9x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC9x0y113efgEv();
extern void _ZN3ccc8CC9x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x0y113efgEv,_ZTv0_n12_N3ccc8CC9x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y113efgEv,_ZThn4_N3ccc8CC9x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x0y113pqrEv,_ZTv0_n16_N3ccc8CC9x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y113pqrEv,_ZThn4_N3ccc8CC9x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x0y113efgEv,_ZTv0_n12_N3ccc8CC9x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x0y113pqrEv,_ZTv0_n16_N3ccc8CC9x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x0y11E[] = {
  {&(_ZTVN3ccc8CC9x0y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x0y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x0y11E[];
static VTBL_ENTRY alt_thunk_names1612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x0y113pqrEv,_ZTv0_n16_N3ccc8CC9x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x0y113pqrEv,_ZThn4_N3ccc8CC9x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x0y113efgEv,_ZTv0_n12_N3ccc8CC9x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x0y113efgEv,_ZThn4_N3ccc8CC9x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x0y11E = {  "_ZN3ccc8CC9x0y11E", // class name
  bases__ZN3ccc8CC9x0y11E, 2,
  &(vtc__ZN3ccc8CC9x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x0y11E),2, //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  DD9x0y11  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD9x0y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x0y113efgEv
  ~DD9x0y11(); // tgen
  DD9x0y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x0y11E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x0y113pqrEv");}
void  ccc::DD9x0y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x0y113efgEv");}
ccc::DD9x0y11 ::~DD9x0y11(){ note_dtor("_ZN3ccc8DD9x0y11E", this);} // tgen
ccc::DD9x0y11 ::DD9x0y11(){ note_ctor("_ZN3ccc8DD9x0y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x0y11E, buf);
    ::ccc::DD9x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x0y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD9x0y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x0y11E);
    dp->::ccc::DD9x0y11::~DD9x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x0y11E(Test__ZN3ccc8DD9x0y11E, "_ZN3ccc8DD9x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x0y11C1Ev();
extern void _ZN3ccc8DD9x0y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x0y11E[] = {
  NSPAIR(_ZN3ccc8DD9x0y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD9x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y11E[];
extern void _ZN3ccc8DD9x0y113efgEv();
extern void _ZN3ccc8DD9x0y113pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x0y113efgEv,_ZTv0_n16_N3ccc8DD9x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y113efgEv,_ZThn4_N3ccc8DD9x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x0y113pqrEv,_ZTv0_n20_N3ccc8DD9x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y113pqrEv,_ZThn4_N3ccc8DD9x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x0y113efgEv,_ZTv0_n16_N3ccc8DD9x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x0y113pqrEv,_ZTv0_n20_N3ccc8DD9x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x0y11E[] = {
  {&(_ZTVN3ccc8DD9x0y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y11E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x0y11E[];
static VTBL_ENTRY alt_thunk_names1613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x0y113pqrEv,_ZTv0_n20_N3ccc8DD9x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y113pqrEv,_ZThn4_N3ccc8DD9x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x0y113efgEv,_ZTv0_n16_N3ccc8DD9x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y113efgEv,_ZThn4_N3ccc8DD9x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x0y11E = {  "_ZN3ccc8DD9x0y11E", // class name
  bases__ZN3ccc8DD9x0y11E, 2,
  &(vtc__ZN3ccc8DD9x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x0y11E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x0y11E),3, //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  CC9x0y12  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC9x0y123abcEv
  ~CC9x0y12(); // tgen
  CC9x0y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y12E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC9x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x0y123abcEv");}
ccc::CC9x0y12 ::~CC9x0y12(){ note_dtor("_ZN3ccc8CC9x0y12E", this);} // tgen
ccc::CC9x0y12 ::CC9x0y12(){ note_ctor("_ZN3ccc8CC9x0y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x0y12E, buf);
    ::ccc::CC9x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x0y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC9x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x0y12E);
    dp->::ccc::CC9x0y12::~CC9x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x0y12E(Test__ZN3ccc8CC9x0y12E, "_ZN3ccc8CC9x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x0y12C1Ev();
extern void _ZN3ccc8CC9x0y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x0y12E[] = {
  NSPAIR(_ZN3ccc8CC9x0y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC9x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x0y12E[];
extern void _ZN3ccc8CC9x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x0y12E[] = {
  {&(_ZTVN3ccc8CC9x0y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x0y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x0y12E[];
Class_Descriptor cd__ZN3ccc8CC9x0y12E = {  "_ZN3ccc8CC9x0y12E", // class name
  bases__ZN3ccc8CC9x0y12E, 2,
  &(vtc__ZN3ccc8CC9x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x0y12E),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  DD9x0y12  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD9x0y123abcEv
  ~DD9x0y12(); // tgen
  DD9x0y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x0y12E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD9x0y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x0y123abcEv");}
ccc::DD9x0y12 ::~DD9x0y12(){ note_dtor("_ZN3ccc8DD9x0y12E", this);} // tgen
ccc::DD9x0y12 ::DD9x0y12(){ note_ctor("_ZN3ccc8DD9x0y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x0y12E, buf);
    ::ccc::DD9x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x0y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD9x0y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x0y12E);
    dp->::ccc::DD9x0y12::~DD9x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x0y12E(Test__ZN3ccc8DD9x0y12E, "_ZN3ccc8DD9x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x0y12C1Ev();
extern void _ZN3ccc8DD9x0y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x0y12E[] = {
  NSPAIR(_ZN3ccc8DD9x0y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD9x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x0y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x0y123abcEv,_ZTv0_n12_N3ccc8DD9x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y123abcEv,_ZThn4_N3ccc8DD9x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x0y123abcEv,_ZTv0_n12_N3ccc8DD9x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x0y12E[] = {
  {&(_ZTVN3ccc8DD9x0y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x0y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x0y12E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x0y12E[];
static VTBL_ENTRY alt_thunk_names1614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x0y123abcEv,_ZTv0_n12_N3ccc8DD9x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y123abcEv,_ZThn4_N3ccc8DD9x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x0y12E = {  "_ZN3ccc8DD9x0y12E", // class name
  bases__ZN3ccc8DD9x0y12E, 2,
  &(vtc__ZN3ccc8DD9x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x0y12E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x0y12E),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  CC9x0y13  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC9x0y133efgEv
  ~CC9x0y13(); // tgen
  CC9x0y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC9x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x0y133efgEv");}
ccc::CC9x0y13 ::~CC9x0y13(){ note_dtor("_ZN3ccc8CC9x0y13E", this);} // tgen
ccc::CC9x0y13 ::CC9x0y13(){ note_ctor("_ZN3ccc8CC9x0y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x0y13E, buf);
    ::ccc::CC9x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x0y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC9x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x0y13E);
    dp->::ccc::CC9x0y13::~CC9x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x0y13E(Test__ZN3ccc8CC9x0y13E, "_ZN3ccc8CC9x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x0y13C1Ev();
extern void _ZN3ccc8CC9x0y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x0y13E[] = {
  NSPAIR(_ZN3ccc8CC9x0y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC9x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC9x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x0y133efgEv,_ZTv0_n12_N3ccc8CC9x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y133efgEv,_ZThn4_N3ccc8CC9x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x0y133efgEv,_ZTv0_n12_N3ccc8CC9x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x0y13E[] = {
  {&(_ZTVN3ccc8CC9x0y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x0y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x0y13E[];
static VTBL_ENTRY alt_thunk_names1615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x0y133efgEv,_ZTv0_n12_N3ccc8CC9x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x0y133efgEv,_ZThn4_N3ccc8CC9x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x0y13E = {  "_ZN3ccc8CC9x0y13E", // class name
  bases__ZN3ccc8CC9x0y13E, 2,
  &(vtc__ZN3ccc8CC9x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x0y13E),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  DD9x0y13  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD9x0y133efgEv
  ~DD9x0y13(); // tgen
  DD9x0y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x0y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD9x0y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x0y133efgEv");}
ccc::DD9x0y13 ::~DD9x0y13(){ note_dtor("_ZN3ccc8DD9x0y13E", this);} // tgen
ccc::DD9x0y13 ::DD9x0y13(){ note_ctor("_ZN3ccc8DD9x0y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x0y13E, buf);
    ::ccc::DD9x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x0y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD9x0y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x0y13E);
    dp->::ccc::DD9x0y13::~DD9x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x0y13E(Test__ZN3ccc8DD9x0y13E, "_ZN3ccc8DD9x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x0y13C1Ev();
extern void _ZN3ccc8DD9x0y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x0y13E[] = {
  NSPAIR(_ZN3ccc8DD9x0y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD9x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y13E[];
extern void _ZN3ccc8DD9x0y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x0y133efgEv,_ZTv0_n16_N3ccc8DD9x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y133efgEv,_ZThn4_N3ccc8DD9x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x0y133efgEv,_ZTv0_n16_N3ccc8DD9x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x0y13E[] = {
  {&(_ZTVN3ccc8DD9x0y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x0y13E[];
static VTBL_ENTRY alt_thunk_names1616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x0y133efgEv,_ZTv0_n16_N3ccc8DD9x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y133efgEv,_ZThn4_N3ccc8DD9x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x0y13E = {  "_ZN3ccc8DD9x0y13E", // class name
  bases__ZN3ccc8DD9x0y13E, 2,
  &(vtc__ZN3ccc8DD9x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x0y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x0y13E),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  CC9x0y14  : virtual ::ccc::AA9 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC9x0y143pqrEv
  ~CC9x0y14(); // tgen
  CC9x0y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC9x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x0y143pqrEv");}
ccc::CC9x0y14 ::~CC9x0y14(){ note_dtor("_ZN3ccc8CC9x0y14E", this);} // tgen
ccc::CC9x0y14 ::CC9x0y14(){ note_ctor("_ZN3ccc8CC9x0y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x0y14E, buf);
    ::ccc::CC9x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x0y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC9x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x0y14E);
    dp->::ccc::CC9x0y14::~CC9x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x0y14E(Test__ZN3ccc8CC9x0y14E, "_ZN3ccc8CC9x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x0y14C1Ev();
extern void _ZN3ccc8CC9x0y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x0y14E[] = {
  NSPAIR(_ZN3ccc8CC9x0y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC9x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC9x0y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x0y143pqrEv,_ZTv0_n16_N3ccc8CC9x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x0y143pqrEv,_ZThn4_N3ccc8CC9x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x0y143pqrEv,_ZTv0_n16_N3ccc8CC9x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x0y14E[] = {
  {&(_ZTVN3ccc8CC9x0y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x0y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x0y14E[];
static VTBL_ENTRY alt_thunk_names1617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x0y143pqrEv,_ZTv0_n16_N3ccc8CC9x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x0y143pqrEv,_ZThn4_N3ccc8CC9x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x0y14E = {  "_ZN3ccc8CC9x0y14E", // class name
  bases__ZN3ccc8CC9x0y14E, 2,
  &(vtc__ZN3ccc8CC9x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x0y14E),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  DD9x0y14  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD9x0y143pqrEv
  ~DD9x0y14(); // tgen
  DD9x0y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x0y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD9x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x0y143pqrEv");}
ccc::DD9x0y14 ::~DD9x0y14(){ note_dtor("_ZN3ccc8DD9x0y14E", this);} // tgen
ccc::DD9x0y14 ::DD9x0y14(){ note_ctor("_ZN3ccc8DD9x0y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x0y14E, buf);
    ::ccc::DD9x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x0y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD9x0y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x0y14E);
    dp->::ccc::DD9x0y14::~DD9x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x0y14E(Test__ZN3ccc8DD9x0y14E, "_ZN3ccc8DD9x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x0y14C1Ev();
extern void _ZN3ccc8DD9x0y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x0y14E[] = {
  NSPAIR(_ZN3ccc8DD9x0y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD9x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x0y143pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x0y143pqrEv,_ZTv0_n20_N3ccc8DD9x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x0y143pqrEv,_ZThn4_N3ccc8DD9x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x0y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x0y143pqrEv,_ZTv0_n20_N3ccc8DD9x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x0y14E[] = {
  {&(_ZTVN3ccc8DD9x0y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x0y14E[];
static VTBL_ENTRY alt_thunk_names1618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x0y143pqrEv,_ZTv0_n20_N3ccc8DD9x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x0y143pqrEv,_ZThn4_N3ccc8DD9x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x0y14E = {  "_ZN3ccc8DD9x0y14E", // class name
  bases__ZN3ccc8DD9x0y14E, 2,
  &(vtc__ZN3ccc8DD9x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x0y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x0y14E),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  CC9x0y15  : virtual ::ccc::AA9 , ::ccc::BB0 {
  ~CC9x0y15(); // tgen
  CC9x0y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x0y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC9x0y15 ::~CC9x0y15(){ note_dtor("_ZN3ccc8CC9x0y15E", this);} // tgen
ccc::CC9x0y15 ::CC9x0y15(){ note_ctor("_ZN3ccc8CC9x0y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x0y15E, buf);
    ::ccc::CC9x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x0y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC9x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x0y15E);
    dp->::ccc::CC9x0y15::~CC9x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x0y15E(Test__ZN3ccc8CC9x0y15E, "_ZN3ccc8CC9x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x0y15C1Ev();
extern void _ZN3ccc8CC9x0y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x0y15E[] = {
  NSPAIR(_ZN3ccc8CC9x0y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC9x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x0y15E[] = {
  {&(_ZTVN3ccc8CC9x0y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x0y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x0y15E[];
Class_Descriptor cd__ZN3ccc8CC9x0y15E = {  "_ZN3ccc8CC9x0y15E", // class name
  bases__ZN3ccc8CC9x0y15E, 2,
  &(vtc__ZN3ccc8CC9x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x0y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x0y15E),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  DD9x0y15  : virtual ::ccc::AA9 , virtual ::ccc::BB0 {
  ~DD9x0y15(); // tgen
  DD9x0y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x0y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD9x0y15 ::~DD9x0y15(){ note_dtor("_ZN3ccc8DD9x0y15E", this);} // tgen
ccc::DD9x0y15 ::DD9x0y15(){ note_ctor("_ZN3ccc8DD9x0y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x0y15E, buf);
    ::ccc::DD9x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x0y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD9x0y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x0y15E);
    dp->::ccc::DD9x0y15::~DD9x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x0y15E(Test__ZN3ccc8DD9x0y15E, "_ZN3ccc8DD9x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x0y15C1Ev();
extern void _ZN3ccc8DD9x0y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x0y15E[] = {
  NSPAIR(_ZN3ccc8DD9x0y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD9x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x0y15E[] = {
  {&(_ZTVN3ccc8DD9x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x0y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x0y15E[];
Class_Descriptor cd__ZN3ccc8DD9x0y15E = {  "_ZN3ccc8DD9x0y15E", // class name
  bases__ZN3ccc8DD9x0y15E, 2,
  &(vtc__ZN3ccc8DD9x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x0y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x0y15E),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  CC9x1y0  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y03pqrEv
  ~CC9x1y0(); // tgen
  CC9x1y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y0E) C1{ VBC2{ v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y03abcEv");}
void  ccc::CC9x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y03efgEv");}
void  ccc::CC9x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y03pqrEv");}
ccc::CC9x1y0 ::~CC9x1y0(){ note_dtor("_ZN3ccc7CC9x1y0E", this);} // tgen
ccc::CC9x1y0 ::CC9x1y0(){ note_ctor("_ZN3ccc7CC9x1y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y0E, buf);
    ::ccc::CC9x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y0E);
    dp->::ccc::CC9x1y0::~CC9x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y0E(Test__ZN3ccc7CC9x1y0E, "_ZN3ccc7CC9x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y0C1Ev();
extern void _ZN3ccc7CC9x1y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y0E[] = {
  NSPAIR(_ZN3ccc7CC9x1y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y0E[];
extern void _ZN3ccc7CC9x1y03abcEv();
extern void _ZN3ccc7CC9x1y03pqrEv();
extern void _ZN3ccc7CC9x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y03efgEv,_ZTv0_n12_N3ccc7CC9x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y03efgEv,_ZThn4_N3ccc7CC9x1y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y03pqrEv,_ZTv0_n16_N3ccc7CC9x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y03pqrEv,_ZThn4_N3ccc7CC9x1y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y03efgEv,_ZTv0_n12_N3ccc7CC9x1y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y03pqrEv,_ZTv0_n16_N3ccc7CC9x1y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y0E[] = {
  {&(_ZTVN3ccc7CC9x1y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y0E[];
static VTBL_ENTRY alt_thunk_names1619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y03pqrEv,_ZTv0_n16_N3ccc7CC9x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y03pqrEv,_ZThn4_N3ccc7CC9x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y03efgEv,_ZTv0_n12_N3ccc7CC9x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y03efgEv,_ZThn4_N3ccc7CC9x1y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y0E = {  "_ZN3ccc7CC9x1y0E", // class name
  bases__ZN3ccc7CC9x1y0E, 2,
  &(vtc__ZN3ccc7CC9x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y0E),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  DD9x1y0  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD9x1y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x1y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x1y03pqrEv
  ~DD9x1y0(); // tgen
  DD9x1y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y0E) C1{ VBC2{ v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x1y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y03abcEv");}
void  ccc::DD9x1y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y03efgEv");}
void  ccc::DD9x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y03pqrEv");}
ccc::DD9x1y0 ::~DD9x1y0(){ note_dtor("_ZN3ccc7DD9x1y0E", this);} // tgen
ccc::DD9x1y0 ::DD9x1y0(){ note_ctor("_ZN3ccc7DD9x1y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y0E, buf);
    ::ccc::DD9x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y0E);
    dp->::ccc::DD9x1y0::~DD9x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y0E(Test__ZN3ccc7DD9x1y0E, "_ZN3ccc7DD9x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y0C1Ev();
extern void _ZN3ccc7DD9x1y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y0E[] = {
  NSPAIR(_ZN3ccc7DD9x1y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y0E[];
extern void _ZN3ccc7DD9x1y03efgEv();
extern void _ZN3ccc7DD9x1y03pqrEv();
extern void _ZN3ccc7DD9x1y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y03abcEv,_ZTv0_n12_N3ccc7DD9x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y03abcEv,_ZThn4_N3ccc7DD9x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y03pqrEv,_ZTv0_n16_N3ccc7DD9x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y03pqrEv,_ZThn4_N3ccc7DD9x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y03efgEv,_ZTv0_n20_N3ccc7DD9x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y03efgEv,_ZThn4_N3ccc7DD9x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y03abcEv,_ZTv0_n12_N3ccc7DD9x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y03pqrEv,_ZTv0_n16_N3ccc7DD9x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y03efgEv,_ZTv0_n20_N3ccc7DD9x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y0E[] = {
  {&(_ZTVN3ccc7DD9x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y0E[];
static VTBL_ENTRY alt_thunk_names1620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y03efgEv,_ZTv0_n20_N3ccc7DD9x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y03efgEv,_ZThn4_N3ccc7DD9x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y03pqrEv,_ZTv0_n16_N3ccc7DD9x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y03pqrEv,_ZThn4_N3ccc7DD9x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y03abcEv,_ZTv0_n12_N3ccc7DD9x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y03abcEv,_ZThn4_N3ccc7DD9x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y0E = {  "_ZN3ccc7DD9x1y0E", // class name
  bases__ZN3ccc7DD9x1y0E, 2,
  &(vtc__ZN3ccc7DD9x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y0E),3, //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  CC9x1y1  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x1y13efgEv
  ~CC9x1y1(); // tgen
  CC9x1y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y1E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y13abcEv");}
void  ccc::CC9x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y13pqrEv");}
void  ccc::CC9x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y13efgEv");}
ccc::CC9x1y1 ::~CC9x1y1(){ note_dtor("_ZN3ccc7CC9x1y1E", this);} // tgen
ccc::CC9x1y1 ::CC9x1y1(){ note_ctor("_ZN3ccc7CC9x1y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y1E, buf);
    ::ccc::CC9x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y1E);
    dp->::ccc::CC9x1y1::~CC9x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y1E(Test__ZN3ccc7CC9x1y1E, "_ZN3ccc7CC9x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y1C1Ev();
extern void _ZN3ccc7CC9x1y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y1E[] = {
  NSPAIR(_ZN3ccc7CC9x1y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y1E[];
extern void _ZN3ccc7CC9x1y13abcEv();
extern void _ZN3ccc7CC9x1y13pqrEv();
extern void _ZN3ccc7CC9x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y13efgEv,_ZTv0_n12_N3ccc7CC9x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y13efgEv,_ZThn4_N3ccc7CC9x1y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y13pqrEv,_ZTv0_n16_N3ccc7CC9x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y13pqrEv,_ZThn4_N3ccc7CC9x1y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y13efgEv,_ZTv0_n12_N3ccc7CC9x1y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y13pqrEv,_ZTv0_n16_N3ccc7CC9x1y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y1E[] = {
  {&(_ZTVN3ccc7CC9x1y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y1E[];
static VTBL_ENTRY alt_thunk_names1621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y13pqrEv,_ZTv0_n16_N3ccc7CC9x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y13pqrEv,_ZThn4_N3ccc7CC9x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y13efgEv,_ZTv0_n12_N3ccc7CC9x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y13efgEv,_ZThn4_N3ccc7CC9x1y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y1E = {  "_ZN3ccc7CC9x1y1E", // class name
  bases__ZN3ccc7CC9x1y1E, 2,
  &(vtc__ZN3ccc7CC9x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y1E),2, //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  DD9x1y1  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD9x1y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x1y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x1y13efgEv
  ~DD9x1y1(); // tgen
  DD9x1y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y1E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x1y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y13abcEv");}
void  ccc::DD9x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y13pqrEv");}
void  ccc::DD9x1y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y13efgEv");}
ccc::DD9x1y1 ::~DD9x1y1(){ note_dtor("_ZN3ccc7DD9x1y1E", this);} // tgen
ccc::DD9x1y1 ::DD9x1y1(){ note_ctor("_ZN3ccc7DD9x1y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y1E, buf);
    ::ccc::DD9x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y1E);
    dp->::ccc::DD9x1y1::~DD9x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y1E(Test__ZN3ccc7DD9x1y1E, "_ZN3ccc7DD9x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y1C1Ev();
extern void _ZN3ccc7DD9x1y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y1E[] = {
  NSPAIR(_ZN3ccc7DD9x1y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y1E[];
extern void _ZN3ccc7DD9x1y13efgEv();
extern void _ZN3ccc7DD9x1y13pqrEv();
extern void _ZN3ccc7DD9x1y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y13abcEv,_ZTv0_n12_N3ccc7DD9x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y13abcEv,_ZThn4_N3ccc7DD9x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y13pqrEv,_ZTv0_n16_N3ccc7DD9x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y13pqrEv,_ZThn4_N3ccc7DD9x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y13efgEv,_ZTv0_n20_N3ccc7DD9x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y13efgEv,_ZThn4_N3ccc7DD9x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y13abcEv,_ZTv0_n12_N3ccc7DD9x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y13pqrEv,_ZTv0_n16_N3ccc7DD9x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y13efgEv,_ZTv0_n20_N3ccc7DD9x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y1E[] = {
  {&(_ZTVN3ccc7DD9x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y1E[];
static VTBL_ENTRY alt_thunk_names1622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y13efgEv,_ZTv0_n20_N3ccc7DD9x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y13efgEv,_ZThn4_N3ccc7DD9x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y13pqrEv,_ZTv0_n16_N3ccc7DD9x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y13pqrEv,_ZThn4_N3ccc7DD9x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y13abcEv,_ZTv0_n12_N3ccc7DD9x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y13abcEv,_ZThn4_N3ccc7DD9x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y1E = {  "_ZN3ccc7DD9x1y1E", // class name
  bases__ZN3ccc7DD9x1y1E, 2,
  &(vtc__ZN3ccc7DD9x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y1E),3, //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  CC9x1y2  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y23pqrEv
  ~CC9x1y2(); // tgen
  CC9x1y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y2E) C1{ VBC2{ v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y23efgEv");}
void  ccc::CC9x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y23abcEv");}
void  ccc::CC9x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y23pqrEv");}
ccc::CC9x1y2 ::~CC9x1y2(){ note_dtor("_ZN3ccc7CC9x1y2E", this);} // tgen
ccc::CC9x1y2 ::CC9x1y2(){ note_ctor("_ZN3ccc7CC9x1y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y2E, buf);
    ::ccc::CC9x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y2E);
    dp->::ccc::CC9x1y2::~CC9x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y2E(Test__ZN3ccc7CC9x1y2E, "_ZN3ccc7CC9x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y2C1Ev();
extern void _ZN3ccc7CC9x1y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y2E[] = {
  NSPAIR(_ZN3ccc7CC9x1y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y2E[];
extern void _ZN3ccc7CC9x1y23abcEv();
extern void _ZN3ccc7CC9x1y23pqrEv();
extern void _ZN3ccc7CC9x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y23efgEv,_ZTv0_n12_N3ccc7CC9x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y23efgEv,_ZThn4_N3ccc7CC9x1y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y23pqrEv,_ZTv0_n16_N3ccc7CC9x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y23pqrEv,_ZThn4_N3ccc7CC9x1y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y23efgEv,_ZTv0_n12_N3ccc7CC9x1y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y23pqrEv,_ZTv0_n16_N3ccc7CC9x1y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y2E[] = {
  {&(_ZTVN3ccc7CC9x1y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y2E[];
static VTBL_ENTRY alt_thunk_names1623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y23pqrEv,_ZTv0_n16_N3ccc7CC9x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y23pqrEv,_ZThn4_N3ccc7CC9x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y23efgEv,_ZTv0_n12_N3ccc7CC9x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y23efgEv,_ZThn4_N3ccc7CC9x1y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y2E = {  "_ZN3ccc7CC9x1y2E", // class name
  bases__ZN3ccc7CC9x1y2E, 2,
  &(vtc__ZN3ccc7CC9x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y2E),2, //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  DD9x1y2  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD9x1y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x1y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x1y23pqrEv
  ~DD9x1y2(); // tgen
  DD9x1y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y2E) C1{ VBC2{ v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x1y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y23efgEv");}
void  ccc::DD9x1y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y23abcEv");}
void  ccc::DD9x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y23pqrEv");}
ccc::DD9x1y2 ::~DD9x1y2(){ note_dtor("_ZN3ccc7DD9x1y2E", this);} // tgen
ccc::DD9x1y2 ::DD9x1y2(){ note_ctor("_ZN3ccc7DD9x1y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y2E, buf);
    ::ccc::DD9x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y2E);
    dp->::ccc::DD9x1y2::~DD9x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y2E(Test__ZN3ccc7DD9x1y2E, "_ZN3ccc7DD9x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y2C1Ev();
extern void _ZN3ccc7DD9x1y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y2E[] = {
  NSPAIR(_ZN3ccc7DD9x1y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y2E[];
extern void _ZN3ccc7DD9x1y23efgEv();
extern void _ZN3ccc7DD9x1y23pqrEv();
extern void _ZN3ccc7DD9x1y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y23abcEv,_ZTv0_n12_N3ccc7DD9x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y23abcEv,_ZThn4_N3ccc7DD9x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y23pqrEv,_ZTv0_n16_N3ccc7DD9x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y23pqrEv,_ZThn4_N3ccc7DD9x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y23efgEv,_ZTv0_n20_N3ccc7DD9x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y23efgEv,_ZThn4_N3ccc7DD9x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y23abcEv,_ZTv0_n12_N3ccc7DD9x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y23pqrEv,_ZTv0_n16_N3ccc7DD9x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y23efgEv,_ZTv0_n20_N3ccc7DD9x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y2E[] = {
  {&(_ZTVN3ccc7DD9x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y2E[];
static VTBL_ENTRY alt_thunk_names1624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y23efgEv,_ZTv0_n20_N3ccc7DD9x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y23efgEv,_ZThn4_N3ccc7DD9x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y23pqrEv,_ZTv0_n16_N3ccc7DD9x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y23pqrEv,_ZThn4_N3ccc7DD9x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y23abcEv,_ZTv0_n12_N3ccc7DD9x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y23abcEv,_ZThn4_N3ccc7DD9x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y2E = {  "_ZN3ccc7DD9x1y2E", // class name
  bases__ZN3ccc7DD9x1y2E, 2,
  &(vtc__ZN3ccc7DD9x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y2E),3, //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  CC9x1y3  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x1y33abcEv
  ~CC9x1y3(); // tgen
  CC9x1y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y3E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y33efgEv");}
void  ccc::CC9x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y33pqrEv");}
void  ccc::CC9x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y33abcEv");}
ccc::CC9x1y3 ::~CC9x1y3(){ note_dtor("_ZN3ccc7CC9x1y3E", this);} // tgen
ccc::CC9x1y3 ::CC9x1y3(){ note_ctor("_ZN3ccc7CC9x1y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y3E, buf);
    ::ccc::CC9x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y3E);
    dp->::ccc::CC9x1y3::~CC9x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y3E(Test__ZN3ccc7CC9x1y3E, "_ZN3ccc7CC9x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y3C1Ev();
extern void _ZN3ccc7CC9x1y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y3E[] = {
  NSPAIR(_ZN3ccc7CC9x1y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y3E[];
extern void _ZN3ccc7CC9x1y33abcEv();
extern void _ZN3ccc7CC9x1y33pqrEv();
extern void _ZN3ccc7CC9x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y33efgEv,_ZTv0_n12_N3ccc7CC9x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y33efgEv,_ZThn4_N3ccc7CC9x1y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y33pqrEv,_ZTv0_n16_N3ccc7CC9x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y33pqrEv,_ZThn4_N3ccc7CC9x1y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y33efgEv,_ZTv0_n12_N3ccc7CC9x1y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y33pqrEv,_ZTv0_n16_N3ccc7CC9x1y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y3E[] = {
  {&(_ZTVN3ccc7CC9x1y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y3E[];
static VTBL_ENTRY alt_thunk_names1625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y33pqrEv,_ZTv0_n16_N3ccc7CC9x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y33pqrEv,_ZThn4_N3ccc7CC9x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y33efgEv,_ZTv0_n12_N3ccc7CC9x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y33efgEv,_ZThn4_N3ccc7CC9x1y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y3E = {  "_ZN3ccc7CC9x1y3E", // class name
  bases__ZN3ccc7CC9x1y3E, 2,
  &(vtc__ZN3ccc7CC9x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y3E),2, //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  DD9x1y3  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD9x1y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x1y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x1y33abcEv
  ~DD9x1y3(); // tgen
  DD9x1y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y3E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x1y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y33efgEv");}
void  ccc::DD9x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y33pqrEv");}
void  ccc::DD9x1y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y33abcEv");}
ccc::DD9x1y3 ::~DD9x1y3(){ note_dtor("_ZN3ccc7DD9x1y3E", this);} // tgen
ccc::DD9x1y3 ::DD9x1y3(){ note_ctor("_ZN3ccc7DD9x1y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y3E, buf);
    ::ccc::DD9x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y3E);
    dp->::ccc::DD9x1y3::~DD9x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y3E(Test__ZN3ccc7DD9x1y3E, "_ZN3ccc7DD9x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y3C1Ev();
extern void _ZN3ccc7DD9x1y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y3E[] = {
  NSPAIR(_ZN3ccc7DD9x1y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y3E[];
extern void _ZN3ccc7DD9x1y33efgEv();
extern void _ZN3ccc7DD9x1y33pqrEv();
extern void _ZN3ccc7DD9x1y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y33abcEv,_ZTv0_n12_N3ccc7DD9x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y33abcEv,_ZThn4_N3ccc7DD9x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y33pqrEv,_ZTv0_n16_N3ccc7DD9x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y33pqrEv,_ZThn4_N3ccc7DD9x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y33efgEv,_ZTv0_n20_N3ccc7DD9x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y33efgEv,_ZThn4_N3ccc7DD9x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y33abcEv,_ZTv0_n12_N3ccc7DD9x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y33pqrEv,_ZTv0_n16_N3ccc7DD9x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y33efgEv,_ZTv0_n20_N3ccc7DD9x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y3E[] = {
  {&(_ZTVN3ccc7DD9x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y3E[];
static VTBL_ENTRY alt_thunk_names1626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y33efgEv,_ZTv0_n20_N3ccc7DD9x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y33efgEv,_ZThn4_N3ccc7DD9x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y33pqrEv,_ZTv0_n16_N3ccc7DD9x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y33pqrEv,_ZThn4_N3ccc7DD9x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y33abcEv,_ZTv0_n12_N3ccc7DD9x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y33abcEv,_ZThn4_N3ccc7DD9x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y3E = {  "_ZN3ccc7DD9x1y3E", // class name
  bases__ZN3ccc7DD9x1y3E, 2,
  &(vtc__ZN3ccc7DD9x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y3E),3, //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  CC9x1y4  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC9x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x1y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x1y43efgEv
  ~CC9x1y4(); // tgen
  CC9x1y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y4E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y43pqrEv");}
void  ccc::CC9x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y43abcEv");}
void  ccc::CC9x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y43efgEv");}
ccc::CC9x1y4 ::~CC9x1y4(){ note_dtor("_ZN3ccc7CC9x1y4E", this);} // tgen
ccc::CC9x1y4 ::CC9x1y4(){ note_ctor("_ZN3ccc7CC9x1y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y4E, buf);
    ::ccc::CC9x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y4E);
    dp->::ccc::CC9x1y4::~CC9x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y4E(Test__ZN3ccc7CC9x1y4E, "_ZN3ccc7CC9x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y4C1Ev();
extern void _ZN3ccc7CC9x1y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y4E[] = {
  NSPAIR(_ZN3ccc7CC9x1y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y4E[];
extern void _ZN3ccc7CC9x1y43abcEv();
extern void _ZN3ccc7CC9x1y43pqrEv();
extern void _ZN3ccc7CC9x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y43efgEv,_ZTv0_n12_N3ccc7CC9x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y43efgEv,_ZThn4_N3ccc7CC9x1y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y43pqrEv,_ZTv0_n16_N3ccc7CC9x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y43pqrEv,_ZThn4_N3ccc7CC9x1y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y43efgEv,_ZTv0_n12_N3ccc7CC9x1y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y43pqrEv,_ZTv0_n16_N3ccc7CC9x1y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y4E[] = {
  {&(_ZTVN3ccc7CC9x1y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y4E[];
static VTBL_ENTRY alt_thunk_names1627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y43pqrEv,_ZTv0_n16_N3ccc7CC9x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y43pqrEv,_ZThn4_N3ccc7CC9x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y43efgEv,_ZTv0_n12_N3ccc7CC9x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y43efgEv,_ZThn4_N3ccc7CC9x1y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y4E = {  "_ZN3ccc7CC9x1y4E", // class name
  bases__ZN3ccc7CC9x1y4E, 2,
  &(vtc__ZN3ccc7CC9x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y4E),2, //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  DD9x1y4  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD9x1y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x1y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x1y43efgEv
  ~DD9x1y4(); // tgen
  DD9x1y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y4E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y43pqrEv");}
void  ccc::DD9x1y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y43abcEv");}
void  ccc::DD9x1y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y43efgEv");}
ccc::DD9x1y4 ::~DD9x1y4(){ note_dtor("_ZN3ccc7DD9x1y4E", this);} // tgen
ccc::DD9x1y4 ::DD9x1y4(){ note_ctor("_ZN3ccc7DD9x1y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y4E, buf);
    ::ccc::DD9x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y4E);
    dp->::ccc::DD9x1y4::~DD9x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y4E(Test__ZN3ccc7DD9x1y4E, "_ZN3ccc7DD9x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y4C1Ev();
extern void _ZN3ccc7DD9x1y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y4E[] = {
  NSPAIR(_ZN3ccc7DD9x1y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y4E[];
extern void _ZN3ccc7DD9x1y43efgEv();
extern void _ZN3ccc7DD9x1y43pqrEv();
extern void _ZN3ccc7DD9x1y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y43abcEv,_ZTv0_n12_N3ccc7DD9x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y43abcEv,_ZThn4_N3ccc7DD9x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y43pqrEv,_ZTv0_n16_N3ccc7DD9x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y43pqrEv,_ZThn4_N3ccc7DD9x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y43efgEv,_ZTv0_n20_N3ccc7DD9x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y43efgEv,_ZThn4_N3ccc7DD9x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y43abcEv,_ZTv0_n12_N3ccc7DD9x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y43pqrEv,_ZTv0_n16_N3ccc7DD9x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y43efgEv,_ZTv0_n20_N3ccc7DD9x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y4E[] = {
  {&(_ZTVN3ccc7DD9x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y4E[];
static VTBL_ENTRY alt_thunk_names1628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y43efgEv,_ZTv0_n20_N3ccc7DD9x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y43efgEv,_ZThn4_N3ccc7DD9x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y43pqrEv,_ZTv0_n16_N3ccc7DD9x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y43pqrEv,_ZThn4_N3ccc7DD9x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y43abcEv,_ZTv0_n12_N3ccc7DD9x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y43abcEv,_ZThn4_N3ccc7DD9x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y4E = {  "_ZN3ccc7DD9x1y4E", // class name
  bases__ZN3ccc7DD9x1y4E, 2,
  &(vtc__ZN3ccc7DD9x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y4E),3, //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  CC9x1y5  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7CC9x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x1y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x1y53abcEv
  ~CC9x1y5(); // tgen
  CC9x1y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y5E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y53pqrEv");}
void  ccc::CC9x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y53efgEv");}
void  ccc::CC9x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y53abcEv");}
ccc::CC9x1y5 ::~CC9x1y5(){ note_dtor("_ZN3ccc7CC9x1y5E", this);} // tgen
ccc::CC9x1y5 ::CC9x1y5(){ note_ctor("_ZN3ccc7CC9x1y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y5E, buf);
    ::ccc::CC9x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y5E);
    dp->::ccc::CC9x1y5::~CC9x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y5E(Test__ZN3ccc7CC9x1y5E, "_ZN3ccc7CC9x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y5C1Ev();
extern void _ZN3ccc7CC9x1y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y5E[] = {
  NSPAIR(_ZN3ccc7CC9x1y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y5E[];
extern void _ZN3ccc7CC9x1y53abcEv();
extern void _ZN3ccc7CC9x1y53pqrEv();
extern void _ZN3ccc7CC9x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y53efgEv,_ZTv0_n12_N3ccc7CC9x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y53efgEv,_ZThn4_N3ccc7CC9x1y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y53pqrEv,_ZTv0_n16_N3ccc7CC9x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y53pqrEv,_ZThn4_N3ccc7CC9x1y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y53efgEv,_ZTv0_n12_N3ccc7CC9x1y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y53pqrEv,_ZTv0_n16_N3ccc7CC9x1y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y5E[] = {
  {&(_ZTVN3ccc7CC9x1y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y5E[];
static VTBL_ENTRY alt_thunk_names1629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y53pqrEv,_ZTv0_n16_N3ccc7CC9x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y53pqrEv,_ZThn4_N3ccc7CC9x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y53efgEv,_ZTv0_n12_N3ccc7CC9x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y53efgEv,_ZThn4_N3ccc7CC9x1y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y5E = {  "_ZN3ccc7CC9x1y5E", // class name
  bases__ZN3ccc7CC9x1y5E, 2,
  &(vtc__ZN3ccc7CC9x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y5E),2, //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  DD9x1y5  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc7DD9x1y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x1y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x1y53abcEv
  ~DD9x1y5(); // tgen
  DD9x1y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y5E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y53pqrEv");}
void  ccc::DD9x1y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y53efgEv");}
void  ccc::DD9x1y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y53abcEv");}
ccc::DD9x1y5 ::~DD9x1y5(){ note_dtor("_ZN3ccc7DD9x1y5E", this);} // tgen
ccc::DD9x1y5 ::DD9x1y5(){ note_ctor("_ZN3ccc7DD9x1y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y5E, buf);
    ::ccc::DD9x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y5E);
    dp->::ccc::DD9x1y5::~DD9x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y5E(Test__ZN3ccc7DD9x1y5E, "_ZN3ccc7DD9x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y5C1Ev();
extern void _ZN3ccc7DD9x1y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y5E[] = {
  NSPAIR(_ZN3ccc7DD9x1y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y5E[];
extern void _ZN3ccc7DD9x1y53efgEv();
extern void _ZN3ccc7DD9x1y53pqrEv();
extern void _ZN3ccc7DD9x1y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y53abcEv,_ZTv0_n12_N3ccc7DD9x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y53abcEv,_ZThn4_N3ccc7DD9x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y53pqrEv,_ZTv0_n16_N3ccc7DD9x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y53pqrEv,_ZThn4_N3ccc7DD9x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y53efgEv,_ZTv0_n20_N3ccc7DD9x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y53efgEv,_ZThn4_N3ccc7DD9x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y53abcEv,_ZTv0_n12_N3ccc7DD9x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y53pqrEv,_ZTv0_n16_N3ccc7DD9x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y53efgEv,_ZTv0_n20_N3ccc7DD9x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y5E[] = {
  {&(_ZTVN3ccc7DD9x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y5E[];
static VTBL_ENTRY alt_thunk_names1630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y53efgEv,_ZTv0_n20_N3ccc7DD9x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y53efgEv,_ZThn4_N3ccc7DD9x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y53pqrEv,_ZTv0_n16_N3ccc7DD9x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y53pqrEv,_ZThn4_N3ccc7DD9x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y53abcEv,_ZTv0_n12_N3ccc7DD9x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y53abcEv,_ZThn4_N3ccc7DD9x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y5E = {  "_ZN3ccc7DD9x1y5E", // class name
  bases__ZN3ccc7DD9x1y5E, 2,
  &(vtc__ZN3ccc7DD9x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y5E),3, //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  CC9x1y6  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x1y63efgEv
  ~CC9x1y6(); // tgen
  CC9x1y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y6E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y63abcEv");}
void  ccc::CC9x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y63efgEv");}
ccc::CC9x1y6 ::~CC9x1y6(){ note_dtor("_ZN3ccc7CC9x1y6E", this);} // tgen
ccc::CC9x1y6 ::CC9x1y6(){ note_ctor("_ZN3ccc7CC9x1y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y6E, buf);
    ::ccc::CC9x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y6E);
    dp->::ccc::CC9x1y6::~CC9x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y6E(Test__ZN3ccc7CC9x1y6E, "_ZN3ccc7CC9x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y6C1Ev();
extern void _ZN3ccc7CC9x1y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y6E[] = {
  NSPAIR(_ZN3ccc7CC9x1y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y6E[];
extern void _ZN3ccc7CC9x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC9x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y63efgEv,_ZTv0_n12_N3ccc7CC9x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y63efgEv,_ZThn4_N3ccc7CC9x1y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y63efgEv,_ZTv0_n12_N3ccc7CC9x1y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y6E[] = {
  {&(_ZTVN3ccc7CC9x1y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y6E[];
static VTBL_ENTRY alt_thunk_names1631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y63efgEv,_ZTv0_n12_N3ccc7CC9x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y63efgEv,_ZThn4_N3ccc7CC9x1y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y6E = {  "_ZN3ccc7CC9x1y6E", // class name
  bases__ZN3ccc7CC9x1y6E, 2,
  &(vtc__ZN3ccc7CC9x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y6E),2, //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  DD9x1y6  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD9x1y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x1y63efgEv
  ~DD9x1y6(); // tgen
  DD9x1y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y6E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x1y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y63abcEv");}
void  ccc::DD9x1y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y63efgEv");}
ccc::DD9x1y6 ::~DD9x1y6(){ note_dtor("_ZN3ccc7DD9x1y6E", this);} // tgen
ccc::DD9x1y6 ::DD9x1y6(){ note_ctor("_ZN3ccc7DD9x1y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y6E, buf);
    ::ccc::DD9x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y6E);
    dp->::ccc::DD9x1y6::~DD9x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y6E(Test__ZN3ccc7DD9x1y6E, "_ZN3ccc7DD9x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y6C1Ev();
extern void _ZN3ccc7DD9x1y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y6E[] = {
  NSPAIR(_ZN3ccc7DD9x1y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y6E[];
extern void _ZN3ccc7DD9x1y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x1y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y63abcEv,_ZTv0_n12_N3ccc7DD9x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y63abcEv,_ZThn4_N3ccc7DD9x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y63efgEv,_ZTv0_n20_N3ccc7DD9x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y63efgEv,_ZThn4_N3ccc7DD9x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y63abcEv,_ZTv0_n12_N3ccc7DD9x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y63efgEv,_ZTv0_n20_N3ccc7DD9x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y6E[] = {
  {&(_ZTVN3ccc7DD9x1y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y6E[];
static VTBL_ENTRY alt_thunk_names1632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y63efgEv,_ZTv0_n20_N3ccc7DD9x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y63efgEv,_ZThn4_N3ccc7DD9x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y63abcEv,_ZTv0_n12_N3ccc7DD9x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y63abcEv,_ZThn4_N3ccc7DD9x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y6E = {  "_ZN3ccc7DD9x1y6E", // class name
  bases__ZN3ccc7DD9x1y6E, 2,
  &(vtc__ZN3ccc7DD9x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y6E),3, //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  CC9x1y7  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7CC9x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y73pqrEv
  ~CC9x1y7(); // tgen
  CC9x1y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y7E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y73abcEv");}
void  ccc::CC9x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y73pqrEv");}
ccc::CC9x1y7 ::~CC9x1y7(){ note_dtor("_ZN3ccc7CC9x1y7E", this);} // tgen
ccc::CC9x1y7 ::CC9x1y7(){ note_ctor("_ZN3ccc7CC9x1y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y7E, buf);
    ::ccc::CC9x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y7E);
    dp->::ccc::CC9x1y7::~CC9x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y7E(Test__ZN3ccc7CC9x1y7E, "_ZN3ccc7CC9x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y7C1Ev();
extern void _ZN3ccc7CC9x1y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y7E[] = {
  NSPAIR(_ZN3ccc7CC9x1y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y7E[];
extern void _ZN3ccc7CC9x1y73abcEv();
extern void _ZN3ccc7CC9x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y73pqrEv,_ZTv0_n16_N3ccc7CC9x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y73pqrEv,_ZThn4_N3ccc7CC9x1y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y73pqrEv,_ZTv0_n16_N3ccc7CC9x1y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y7E[] = {
  {&(_ZTVN3ccc7CC9x1y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y7E[];
static VTBL_ENTRY alt_thunk_names1633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y73pqrEv,_ZTv0_n16_N3ccc7CC9x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y73pqrEv,_ZThn4_N3ccc7CC9x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y7E = {  "_ZN3ccc7CC9x1y7E", // class name
  bases__ZN3ccc7CC9x1y7E, 2,
  &(vtc__ZN3ccc7CC9x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y7E),2, //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  DD9x1y7  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc7DD9x1y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x1y73pqrEv
  ~DD9x1y7(); // tgen
  DD9x1y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y7E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x1y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y73abcEv");}
void  ccc::DD9x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y73pqrEv");}
ccc::DD9x1y7 ::~DD9x1y7(){ note_dtor("_ZN3ccc7DD9x1y7E", this);} // tgen
ccc::DD9x1y7 ::DD9x1y7(){ note_ctor("_ZN3ccc7DD9x1y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y7E, buf);
    ::ccc::DD9x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y7E);
    dp->::ccc::DD9x1y7::~DD9x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y7E(Test__ZN3ccc7DD9x1y7E, "_ZN3ccc7DD9x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y7C1Ev();
extern void _ZN3ccc7DD9x1y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y7E[] = {
  NSPAIR(_ZN3ccc7DD9x1y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x1y73pqrEv();
extern void _ZN3ccc7DD9x1y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y73abcEv,_ZTv0_n12_N3ccc7DD9x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y73abcEv,_ZThn4_N3ccc7DD9x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y73pqrEv,_ZTv0_n16_N3ccc7DD9x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y73pqrEv,_ZThn4_N3ccc7DD9x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y73abcEv,_ZTv0_n12_N3ccc7DD9x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y73pqrEv,_ZTv0_n16_N3ccc7DD9x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y7E[] = {
  {&(_ZTVN3ccc7DD9x1y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y7E[];
static VTBL_ENTRY alt_thunk_names1634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y73pqrEv,_ZTv0_n16_N3ccc7DD9x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y73pqrEv,_ZThn4_N3ccc7DD9x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y73abcEv,_ZTv0_n12_N3ccc7DD9x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y73abcEv,_ZThn4_N3ccc7DD9x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y7E = {  "_ZN3ccc7DD9x1y7E", // class name
  bases__ZN3ccc7DD9x1y7E, 2,
  &(vtc__ZN3ccc7DD9x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y7E),3, //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  CC9x1y8  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x1y83abcEv
  ~CC9x1y8(); // tgen
  CC9x1y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y8E) C1{ VBC2{ v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y83efgEv");}
void  ccc::CC9x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x1y83abcEv");}
ccc::CC9x1y8 ::~CC9x1y8(){ note_dtor("_ZN3ccc7CC9x1y8E", this);} // tgen
ccc::CC9x1y8 ::CC9x1y8(){ note_ctor("_ZN3ccc7CC9x1y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y8E, buf);
    ::ccc::CC9x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y8E);
    dp->::ccc::CC9x1y8::~CC9x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y8E(Test__ZN3ccc7CC9x1y8E, "_ZN3ccc7CC9x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y8C1Ev();
extern void _ZN3ccc7CC9x1y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y8E[] = {
  NSPAIR(_ZN3ccc7CC9x1y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y8E[];
extern void _ZN3ccc7CC9x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc7CC9x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y83efgEv,_ZTv0_n12_N3ccc7CC9x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y83efgEv,_ZThn4_N3ccc7CC9x1y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y83efgEv,_ZTv0_n12_N3ccc7CC9x1y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y8E[] = {
  {&(_ZTVN3ccc7CC9x1y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y8E[];
static VTBL_ENTRY alt_thunk_names1635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y83efgEv,_ZTv0_n12_N3ccc7CC9x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y83efgEv,_ZThn4_N3ccc7CC9x1y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y8E = {  "_ZN3ccc7CC9x1y8E", // class name
  bases__ZN3ccc7CC9x1y8E, 2,
  &(vtc__ZN3ccc7CC9x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y8E),2, //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  DD9x1y8  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD9x1y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x1y83abcEv
  ~DD9x1y8(); // tgen
  DD9x1y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y8E) C1{ VBC2{ v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x1y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y83efgEv");}
void  ccc::DD9x1y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x1y83abcEv");}
ccc::DD9x1y8 ::~DD9x1y8(){ note_dtor("_ZN3ccc7DD9x1y8E", this);} // tgen
ccc::DD9x1y8 ::DD9x1y8(){ note_ctor("_ZN3ccc7DD9x1y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y8E, buf);
    ::ccc::DD9x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y8E);
    dp->::ccc::DD9x1y8::~DD9x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y8E(Test__ZN3ccc7DD9x1y8E, "_ZN3ccc7DD9x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y8C1Ev();
extern void _ZN3ccc7DD9x1y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y8E[] = {
  NSPAIR(_ZN3ccc7DD9x1y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y8E[];
extern void _ZN3ccc7DD9x1y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x1y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x1y83abcEv,_ZTv0_n12_N3ccc7DD9x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y83abcEv,_ZThn4_N3ccc7DD9x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y83efgEv,_ZTv0_n20_N3ccc7DD9x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y83efgEv,_ZThn4_N3ccc7DD9x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x1y83abcEv,_ZTv0_n12_N3ccc7DD9x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y83efgEv,_ZTv0_n20_N3ccc7DD9x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y8E[] = {
  {&(_ZTVN3ccc7DD9x1y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x1y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y8E[];
static VTBL_ENTRY alt_thunk_names1636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y83efgEv,_ZTv0_n20_N3ccc7DD9x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y83efgEv,_ZThn4_N3ccc7DD9x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x1y83abcEv,_ZTv0_n12_N3ccc7DD9x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y83abcEv,_ZThn4_N3ccc7DD9x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y8E = {  "_ZN3ccc7DD9x1y8E", // class name
  bases__ZN3ccc7DD9x1y8E, 2,
  &(vtc__ZN3ccc7DD9x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y8E),3, //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  CC9x1y9  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7CC9x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x1y93pqrEv
  ~CC9x1y9(); // tgen
  CC9x1y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x1y9E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x1y93efgEv");}
void  ccc::CC9x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x1y93pqrEv");}
ccc::CC9x1y9 ::~CC9x1y9(){ note_dtor("_ZN3ccc7CC9x1y9E", this);} // tgen
ccc::CC9x1y9 ::CC9x1y9(){ note_ctor("_ZN3ccc7CC9x1y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x1y9E, buf);
    ::ccc::CC9x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x1y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc7CC9x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x1y9E);
    dp->::ccc::CC9x1y9::~CC9x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x1y9E(Test__ZN3ccc7CC9x1y9E, "_ZN3ccc7CC9x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x1y9C1Ev();
extern void _ZN3ccc7CC9x1y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x1y9E[] = {
  NSPAIR(_ZN3ccc7CC9x1y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7CC9x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc7CC9x1y93pqrEv();
extern void _ZN3ccc7CC9x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x1y93efgEv,_ZTv0_n12_N3ccc7CC9x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y93efgEv,_ZThn4_N3ccc7CC9x1y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x1y93pqrEv,_ZTv0_n16_N3ccc7CC9x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x1y93pqrEv,_ZThn4_N3ccc7CC9x1y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x1y93efgEv,_ZTv0_n12_N3ccc7CC9x1y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x1y93pqrEv,_ZTv0_n16_N3ccc7CC9x1y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x1y9E[] = {
  {&(_ZTVN3ccc7CC9x1y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x1y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x1y9E[];
static VTBL_ENTRY alt_thunk_names1637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x1y93pqrEv,_ZTv0_n16_N3ccc7CC9x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y93pqrEv,_ZThn4_N3ccc7CC9x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x1y93efgEv,_ZTv0_n12_N3ccc7CC9x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x1y93efgEv,_ZThn4_N3ccc7CC9x1y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x1y9E = {  "_ZN3ccc7CC9x1y9E", // class name
  bases__ZN3ccc7CC9x1y9E, 2,
  &(vtc__ZN3ccc7CC9x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x1y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x1y9E),2, //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  DD9x1y9  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc7DD9x1y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x1y93pqrEv
  ~DD9x1y9(); // tgen
  DD9x1y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x1y9E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x1y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x1y93efgEv");}
void  ccc::DD9x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x1y93pqrEv");}
ccc::DD9x1y9 ::~DD9x1y9(){ note_dtor("_ZN3ccc7DD9x1y9E", this);} // tgen
ccc::DD9x1y9 ::DD9x1y9(){ note_ctor("_ZN3ccc7DD9x1y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x1y9E, buf);
    ::ccc::DD9x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x1y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc7DD9x1y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x1y9E);
    dp->::ccc::DD9x1y9::~DD9x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x1y9E(Test__ZN3ccc7DD9x1y9E, "_ZN3ccc7DD9x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x1y9C1Ev();
extern void _ZN3ccc7DD9x1y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x1y9E[] = {
  NSPAIR(_ZN3ccc7DD9x1y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc7DD9x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y9E[];
extern void _ZN3ccc7DD9x1y93efgEv();
extern void _ZN3ccc7DD9x1y93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x1y93pqrEv,_ZTv0_n16_N3ccc7DD9x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y93pqrEv,_ZThn4_N3ccc7DD9x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x1y93efgEv,_ZTv0_n20_N3ccc7DD9x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x1y93efgEv,_ZThn4_N3ccc7DD9x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x1y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x1y93pqrEv,_ZTv0_n16_N3ccc7DD9x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x1y93efgEv,_ZTv0_n20_N3ccc7DD9x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x1y9E[] = {
  {&(_ZTVN3ccc7DD9x1y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x1y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x1y9E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x1y9E[];
static VTBL_ENTRY alt_thunk_names1638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x1y93efgEv,_ZTv0_n20_N3ccc7DD9x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y93efgEv,_ZThn4_N3ccc7DD9x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x1y93pqrEv,_ZTv0_n16_N3ccc7DD9x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x1y93pqrEv,_ZThn4_N3ccc7DD9x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x1y9E = {  "_ZN3ccc7DD9x1y9E", // class name
  bases__ZN3ccc7DD9x1y9E, 2,
  &(vtc__ZN3ccc7DD9x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x1y9E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x1y9E),3, //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  CC9x1y10  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC9x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x1y103abcEv
  ~CC9x1y10(); // tgen
  CC9x1y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y10E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x1y103pqrEv");}
void  ccc::CC9x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x1y103abcEv");}
ccc::CC9x1y10 ::~CC9x1y10(){ note_dtor("_ZN3ccc8CC9x1y10E", this);} // tgen
ccc::CC9x1y10 ::CC9x1y10(){ note_ctor("_ZN3ccc8CC9x1y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x1y10E, buf);
    ::ccc::CC9x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x1y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC9x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x1y10E);
    dp->::ccc::CC9x1y10::~CC9x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x1y10E(Test__ZN3ccc8CC9x1y10E, "_ZN3ccc8CC9x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x1y10C1Ev();
extern void _ZN3ccc8CC9x1y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x1y10E[] = {
  NSPAIR(_ZN3ccc8CC9x1y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC9x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x1y10E[];
extern void _ZN3ccc8CC9x1y103abcEv();
extern void _ZN3ccc8CC9x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x1y103pqrEv,_ZTv0_n16_N3ccc8CC9x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y103pqrEv,_ZThn4_N3ccc8CC9x1y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x1y103pqrEv,_ZTv0_n16_N3ccc8CC9x1y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x1y10E[] = {
  {&(_ZTVN3ccc8CC9x1y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x1y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x1y10E[];
static VTBL_ENTRY alt_thunk_names1639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x1y103pqrEv,_ZTv0_n16_N3ccc8CC9x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x1y103pqrEv,_ZThn4_N3ccc8CC9x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x1y10E = {  "_ZN3ccc8CC9x1y10E", // class name
  bases__ZN3ccc8CC9x1y10E, 2,
  &(vtc__ZN3ccc8CC9x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x1y10E),2, //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  DD9x1y10  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD9x1y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x1y103abcEv
  ~DD9x1y10(); // tgen
  DD9x1y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x1y10E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x1y103pqrEv");}
void  ccc::DD9x1y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x1y103abcEv");}
ccc::DD9x1y10 ::~DD9x1y10(){ note_dtor("_ZN3ccc8DD9x1y10E", this);} // tgen
ccc::DD9x1y10 ::DD9x1y10(){ note_ctor("_ZN3ccc8DD9x1y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x1y10E, buf);
    ::ccc::DD9x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x1y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD9x1y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x1y10E);
    dp->::ccc::DD9x1y10::~DD9x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x1y10E(Test__ZN3ccc8DD9x1y10E, "_ZN3ccc8DD9x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x1y10C1Ev();
extern void _ZN3ccc8DD9x1y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x1y10E[] = {
  NSPAIR(_ZN3ccc8DD9x1y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD9x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x1y103pqrEv();
extern void _ZN3ccc8DD9x1y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x1y103abcEv,_ZTv0_n12_N3ccc8DD9x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y103abcEv,_ZThn4_N3ccc8DD9x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x1y103pqrEv,_ZTv0_n16_N3ccc8DD9x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y103pqrEv,_ZThn4_N3ccc8DD9x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x1y103abcEv,_ZTv0_n12_N3ccc8DD9x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x1y103pqrEv,_ZTv0_n16_N3ccc8DD9x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x1y10E[] = {
  {&(_ZTVN3ccc8DD9x1y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x1y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x1y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x1y10E[];
static VTBL_ENTRY alt_thunk_names1640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x1y103pqrEv,_ZTv0_n16_N3ccc8DD9x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y103pqrEv,_ZThn4_N3ccc8DD9x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x1y103abcEv,_ZTv0_n12_N3ccc8DD9x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y103abcEv,_ZThn4_N3ccc8DD9x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x1y10E = {  "_ZN3ccc8DD9x1y10E", // class name
  bases__ZN3ccc8DD9x1y10E, 2,
  &(vtc__ZN3ccc8DD9x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x1y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x1y10E),3, //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  CC9x1y11  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC9x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x1y113efgEv
  ~CC9x1y11(); // tgen
  CC9x1y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y11E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x1y113pqrEv");}
void  ccc::CC9x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x1y113efgEv");}
ccc::CC9x1y11 ::~CC9x1y11(){ note_dtor("_ZN3ccc8CC9x1y11E", this);} // tgen
ccc::CC9x1y11 ::CC9x1y11(){ note_ctor("_ZN3ccc8CC9x1y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x1y11E, buf);
    ::ccc::CC9x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x1y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC9x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x1y11E);
    dp->::ccc::CC9x1y11::~CC9x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x1y11E(Test__ZN3ccc8CC9x1y11E, "_ZN3ccc8CC9x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x1y11C1Ev();
extern void _ZN3ccc8CC9x1y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x1y11E[] = {
  NSPAIR(_ZN3ccc8CC9x1y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC9x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC9x1y113pqrEv();
extern void _ZN3ccc8CC9x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x1y113efgEv,_ZTv0_n12_N3ccc8CC9x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y113efgEv,_ZThn4_N3ccc8CC9x1y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x1y113pqrEv,_ZTv0_n16_N3ccc8CC9x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y113pqrEv,_ZThn4_N3ccc8CC9x1y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x1y113efgEv,_ZTv0_n12_N3ccc8CC9x1y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x1y113pqrEv,_ZTv0_n16_N3ccc8CC9x1y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x1y11E[] = {
  {&(_ZTVN3ccc8CC9x1y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x1y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x1y11E[];
static VTBL_ENTRY alt_thunk_names1641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x1y113pqrEv,_ZTv0_n16_N3ccc8CC9x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x1y113pqrEv,_ZThn4_N3ccc8CC9x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x1y113efgEv,_ZTv0_n12_N3ccc8CC9x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x1y113efgEv,_ZThn4_N3ccc8CC9x1y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x1y11E = {  "_ZN3ccc8CC9x1y11E", // class name
  bases__ZN3ccc8CC9x1y11E, 2,
  &(vtc__ZN3ccc8CC9x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x1y11E),2, //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  DD9x1y11  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD9x1y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x1y113efgEv
  ~DD9x1y11(); // tgen
  DD9x1y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x1y11E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x1y113pqrEv");}
void  ccc::DD9x1y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x1y113efgEv");}
ccc::DD9x1y11 ::~DD9x1y11(){ note_dtor("_ZN3ccc8DD9x1y11E", this);} // tgen
ccc::DD9x1y11 ::DD9x1y11(){ note_ctor("_ZN3ccc8DD9x1y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x1y11E, buf);
    ::ccc::DD9x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x1y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD9x1y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x1y11E);
    dp->::ccc::DD9x1y11::~DD9x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x1y11E(Test__ZN3ccc8DD9x1y11E, "_ZN3ccc8DD9x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x1y11C1Ev();
extern void _ZN3ccc8DD9x1y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x1y11E[] = {
  NSPAIR(_ZN3ccc8DD9x1y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD9x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y11E[];
extern void _ZN3ccc8DD9x1y113efgEv();
extern void _ZN3ccc8DD9x1y113pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x1y113pqrEv,_ZTv0_n16_N3ccc8DD9x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y113pqrEv,_ZThn4_N3ccc8DD9x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x1y113efgEv,_ZTv0_n20_N3ccc8DD9x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y113efgEv,_ZThn4_N3ccc8DD9x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x1y113pqrEv,_ZTv0_n16_N3ccc8DD9x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x1y113efgEv,_ZTv0_n20_N3ccc8DD9x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x1y11E[] = {
  {&(_ZTVN3ccc8DD9x1y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y11E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x1y11E[];
static VTBL_ENTRY alt_thunk_names1642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x1y113efgEv,_ZTv0_n20_N3ccc8DD9x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y113efgEv,_ZThn4_N3ccc8DD9x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x1y113pqrEv,_ZTv0_n16_N3ccc8DD9x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y113pqrEv,_ZThn4_N3ccc8DD9x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x1y11E = {  "_ZN3ccc8DD9x1y11E", // class name
  bases__ZN3ccc8DD9x1y11E, 2,
  &(vtc__ZN3ccc8DD9x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x1y11E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x1y11E),3, //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  CC9x1y12  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC9x1y123abcEv
  ~CC9x1y12(); // tgen
  CC9x1y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y12E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC9x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x1y123abcEv");}
ccc::CC9x1y12 ::~CC9x1y12(){ note_dtor("_ZN3ccc8CC9x1y12E", this);} // tgen
ccc::CC9x1y12 ::CC9x1y12(){ note_ctor("_ZN3ccc8CC9x1y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x1y12E, buf);
    ::ccc::CC9x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x1y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC9x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x1y12E);
    dp->::ccc::CC9x1y12::~CC9x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x1y12E(Test__ZN3ccc8CC9x1y12E, "_ZN3ccc8CC9x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x1y12C1Ev();
extern void _ZN3ccc8CC9x1y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x1y12E[] = {
  NSPAIR(_ZN3ccc8CC9x1y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC9x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x1y12E[];
extern void _ZN3ccc8CC9x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x1y12E[] = {
  {&(_ZTVN3ccc8CC9x1y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x1y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x1y12E[];
Class_Descriptor cd__ZN3ccc8CC9x1y12E = {  "_ZN3ccc8CC9x1y12E", // class name
  bases__ZN3ccc8CC9x1y12E, 2,
  &(vtc__ZN3ccc8CC9x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x1y12E),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  DD9x1y12  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD9x1y123abcEv
  ~DD9x1y12(); // tgen
  DD9x1y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x1y12E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD9x1y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x1y123abcEv");}
ccc::DD9x1y12 ::~DD9x1y12(){ note_dtor("_ZN3ccc8DD9x1y12E", this);} // tgen
ccc::DD9x1y12 ::DD9x1y12(){ note_ctor("_ZN3ccc8DD9x1y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x1y12E, buf);
    ::ccc::DD9x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x1y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD9x1y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x1y12E);
    dp->::ccc::DD9x1y12::~DD9x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x1y12E(Test__ZN3ccc8DD9x1y12E, "_ZN3ccc8DD9x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x1y12C1Ev();
extern void _ZN3ccc8DD9x1y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x1y12E[] = {
  NSPAIR(_ZN3ccc8DD9x1y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD9x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x1y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x1y123abcEv,_ZTv0_n12_N3ccc8DD9x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y123abcEv,_ZThn4_N3ccc8DD9x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x1y123abcEv,_ZTv0_n12_N3ccc8DD9x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x1y12E[] = {
  {&(_ZTVN3ccc8DD9x1y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x1y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x1y12E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x1y12E[];
static VTBL_ENTRY alt_thunk_names1643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x1y123abcEv,_ZTv0_n12_N3ccc8DD9x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y123abcEv,_ZThn4_N3ccc8DD9x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x1y12E = {  "_ZN3ccc8DD9x1y12E", // class name
  bases__ZN3ccc8DD9x1y12E, 2,
  &(vtc__ZN3ccc8DD9x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x1y12E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x1y12E),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  CC9x1y13  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC9x1y133efgEv
  ~CC9x1y13(); // tgen
  CC9x1y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC9x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x1y133efgEv");}
ccc::CC9x1y13 ::~CC9x1y13(){ note_dtor("_ZN3ccc8CC9x1y13E", this);} // tgen
ccc::CC9x1y13 ::CC9x1y13(){ note_ctor("_ZN3ccc8CC9x1y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x1y13E, buf);
    ::ccc::CC9x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x1y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC9x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x1y13E);
    dp->::ccc::CC9x1y13::~CC9x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x1y13E(Test__ZN3ccc8CC9x1y13E, "_ZN3ccc8CC9x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x1y13C1Ev();
extern void _ZN3ccc8CC9x1y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x1y13E[] = {
  NSPAIR(_ZN3ccc8CC9x1y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC9x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC9x1y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x1y133efgEv,_ZTv0_n12_N3ccc8CC9x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y133efgEv,_ZThn4_N3ccc8CC9x1y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x1y133efgEv,_ZTv0_n12_N3ccc8CC9x1y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x1y13E[] = {
  {&(_ZTVN3ccc8CC9x1y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x1y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x1y13E[];
static VTBL_ENTRY alt_thunk_names1644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x1y133efgEv,_ZTv0_n12_N3ccc8CC9x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x1y133efgEv,_ZThn4_N3ccc8CC9x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x1y13E = {  "_ZN3ccc8CC9x1y13E", // class name
  bases__ZN3ccc8CC9x1y13E, 2,
  &(vtc__ZN3ccc8CC9x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x1y13E),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  DD9x1y13  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD9x1y133efgEv
  ~DD9x1y13(); // tgen
  DD9x1y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x1y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD9x1y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x1y133efgEv");}
ccc::DD9x1y13 ::~DD9x1y13(){ note_dtor("_ZN3ccc8DD9x1y13E", this);} // tgen
ccc::DD9x1y13 ::DD9x1y13(){ note_ctor("_ZN3ccc8DD9x1y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x1y13E, buf);
    ::ccc::DD9x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x1y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD9x1y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x1y13E);
    dp->::ccc::DD9x1y13::~DD9x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x1y13E(Test__ZN3ccc8DD9x1y13E, "_ZN3ccc8DD9x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x1y13C1Ev();
extern void _ZN3ccc8DD9x1y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x1y13E[] = {
  NSPAIR(_ZN3ccc8DD9x1y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD9x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y13E[];
extern void _ZN3ccc8DD9x1y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x1y133efgEv,_ZTv0_n20_N3ccc8DD9x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y133efgEv,_ZThn4_N3ccc8DD9x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x1y133efgEv,_ZTv0_n20_N3ccc8DD9x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x1y13E[] = {
  {&(_ZTVN3ccc8DD9x1y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x1y13E[];
static VTBL_ENTRY alt_thunk_names1645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x1y133efgEv,_ZTv0_n20_N3ccc8DD9x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y133efgEv,_ZThn4_N3ccc8DD9x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x1y13E = {  "_ZN3ccc8DD9x1y13E", // class name
  bases__ZN3ccc8DD9x1y13E, 2,
  &(vtc__ZN3ccc8DD9x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x1y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x1y13E),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  CC9x1y14  : virtual ::ccc::AA9 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC9x1y143pqrEv
  ~CC9x1y14(); // tgen
  CC9x1y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC9x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x1y143pqrEv");}
ccc::CC9x1y14 ::~CC9x1y14(){ note_dtor("_ZN3ccc8CC9x1y14E", this);} // tgen
ccc::CC9x1y14 ::CC9x1y14(){ note_ctor("_ZN3ccc8CC9x1y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x1y14E, buf);
    ::ccc::CC9x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x1y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC9x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x1y14E);
    dp->::ccc::CC9x1y14::~CC9x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x1y14E(Test__ZN3ccc8CC9x1y14E, "_ZN3ccc8CC9x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x1y14C1Ev();
extern void _ZN3ccc8CC9x1y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x1y14E[] = {
  NSPAIR(_ZN3ccc8CC9x1y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC9x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC9x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x1y143pqrEv,_ZTv0_n16_N3ccc8CC9x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x1y143pqrEv,_ZThn4_N3ccc8CC9x1y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x1y143pqrEv,_ZTv0_n16_N3ccc8CC9x1y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x1y14E[] = {
  {&(_ZTVN3ccc8CC9x1y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x1y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x1y14E[];
static VTBL_ENTRY alt_thunk_names1646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x1y143pqrEv,_ZTv0_n16_N3ccc8CC9x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x1y143pqrEv,_ZThn4_N3ccc8CC9x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x1y14E = {  "_ZN3ccc8CC9x1y14E", // class name
  bases__ZN3ccc8CC9x1y14E, 2,
  &(vtc__ZN3ccc8CC9x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x1y14E),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  DD9x1y14  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD9x1y143pqrEv
  ~DD9x1y14(); // tgen
  DD9x1y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x1y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD9x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x1y143pqrEv");}
ccc::DD9x1y14 ::~DD9x1y14(){ note_dtor("_ZN3ccc8DD9x1y14E", this);} // tgen
ccc::DD9x1y14 ::DD9x1y14(){ note_ctor("_ZN3ccc8DD9x1y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x1y14E, buf);
    ::ccc::DD9x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x1y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD9x1y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x1y14E);
    dp->::ccc::DD9x1y14::~DD9x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x1y14E(Test__ZN3ccc8DD9x1y14E, "_ZN3ccc8DD9x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x1y14C1Ev();
extern void _ZN3ccc8DD9x1y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x1y14E[] = {
  NSPAIR(_ZN3ccc8DD9x1y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD9x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x1y143pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x1y143pqrEv,_ZTv0_n16_N3ccc8DD9x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x1y143pqrEv,_ZThn4_N3ccc8DD9x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x1y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x1y143pqrEv,_ZTv0_n16_N3ccc8DD9x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x1y14E[] = {
  {&(_ZTVN3ccc8DD9x1y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x1y14E[];
static VTBL_ENTRY alt_thunk_names1647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x1y143pqrEv,_ZTv0_n16_N3ccc8DD9x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x1y143pqrEv,_ZThn4_N3ccc8DD9x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x1y14E = {  "_ZN3ccc8DD9x1y14E", // class name
  bases__ZN3ccc8DD9x1y14E, 2,
  &(vtc__ZN3ccc8DD9x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x1y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x1y14E),3, //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  CC9x1y15  : virtual ::ccc::AA9 , ::ccc::BB1 {
  ~CC9x1y15(); // tgen
  CC9x1y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x1y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC9x1y15 ::~CC9x1y15(){ note_dtor("_ZN3ccc8CC9x1y15E", this);} // tgen
ccc::CC9x1y15 ::CC9x1y15(){ note_ctor("_ZN3ccc8CC9x1y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x1y15E, buf);
    ::ccc::CC9x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x1y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC9x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x1y15E);
    dp->::ccc::CC9x1y15::~CC9x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x1y15E(Test__ZN3ccc8CC9x1y15E, "_ZN3ccc8CC9x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x1y15C1Ev();
extern void _ZN3ccc8CC9x1y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x1y15E[] = {
  NSPAIR(_ZN3ccc8CC9x1y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC9x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x1y15E[] = {
  {&(_ZTVN3ccc8CC9x1y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x1y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x1y15E[];
Class_Descriptor cd__ZN3ccc8CC9x1y15E = {  "_ZN3ccc8CC9x1y15E", // class name
  bases__ZN3ccc8CC9x1y15E, 2,
  &(vtc__ZN3ccc8CC9x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x1y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x1y15E),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  DD9x1y15  : virtual ::ccc::AA9 , virtual ::ccc::BB1 {
  ~DD9x1y15(); // tgen
  DD9x1y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x1y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD9x1y15 ::~DD9x1y15(){ note_dtor("_ZN3ccc8DD9x1y15E", this);} // tgen
ccc::DD9x1y15 ::DD9x1y15(){ note_ctor("_ZN3ccc8DD9x1y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x1y15E, buf);
    ::ccc::DD9x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x1y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD9x1y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x1y15E);
    dp->::ccc::DD9x1y15::~DD9x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x1y15E(Test__ZN3ccc8DD9x1y15E, "_ZN3ccc8DD9x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x1y15C1Ev();
extern void _ZN3ccc8DD9x1y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x1y15E[] = {
  NSPAIR(_ZN3ccc8DD9x1y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD9x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x1y15E[] = {
  {&(_ZTVN3ccc8DD9x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x1y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x1y15E[];
Class_Descriptor cd__ZN3ccc8DD9x1y15E = {  "_ZN3ccc8DD9x1y15E", // class name
  bases__ZN3ccc8DD9x1y15E, 2,
  &(vtc__ZN3ccc8DD9x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x1y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x1y15E),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  CC9x2y0  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y03pqrEv
  ~CC9x2y0(); // tgen
  CC9x2y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y0E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y03abcEv");}
void  ccc::CC9x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y03efgEv");}
void  ccc::CC9x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y03pqrEv");}
ccc::CC9x2y0 ::~CC9x2y0(){ note_dtor("_ZN3ccc7CC9x2y0E", this);} // tgen
ccc::CC9x2y0 ::CC9x2y0(){ note_ctor("_ZN3ccc7CC9x2y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y0E, buf);
    ::ccc::CC9x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y0E);
    dp->::ccc::CC9x2y0::~CC9x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y0E(Test__ZN3ccc7CC9x2y0E, "_ZN3ccc7CC9x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y0C1Ev();
extern void _ZN3ccc7CC9x2y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y0E[] = {
  NSPAIR(_ZN3ccc7CC9x2y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y0E[];
extern void _ZN3ccc7CC9x2y03efgEv();
extern void _ZN3ccc7CC9x2y03abcEv();
extern void _ZN3ccc7CC9x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y03efgEv,_ZTv0_n12_N3ccc7CC9x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y03efgEv,_ZThn4_N3ccc7CC9x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y03pqrEv,_ZTv0_n16_N3ccc7CC9x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y03pqrEv,_ZThn4_N3ccc7CC9x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y03efgEv,_ZTv0_n12_N3ccc7CC9x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y03pqrEv,_ZTv0_n16_N3ccc7CC9x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y0E[] = {
  {&(_ZTVN3ccc7CC9x2y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y0E[];
static VTBL_ENTRY alt_thunk_names1648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y03pqrEv,_ZTv0_n16_N3ccc7CC9x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y03pqrEv,_ZThn4_N3ccc7CC9x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y03efgEv,_ZTv0_n12_N3ccc7CC9x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y03efgEv,_ZThn4_N3ccc7CC9x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y0E = {  "_ZN3ccc7CC9x2y0E", // class name
  bases__ZN3ccc7CC9x2y0E, 2,
  &(vtc__ZN3ccc7CC9x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y0E),2, //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  DD9x2y0  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD9x2y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x2y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x2y03pqrEv
  ~DD9x2y0(); // tgen
  DD9x2y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y0E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x2y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y03abcEv");}
void  ccc::DD9x2y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y03efgEv");}
void  ccc::DD9x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y03pqrEv");}
ccc::DD9x2y0 ::~DD9x2y0(){ note_dtor("_ZN3ccc7DD9x2y0E", this);} // tgen
ccc::DD9x2y0 ::DD9x2y0(){ note_ctor("_ZN3ccc7DD9x2y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y0E, buf);
    ::ccc::DD9x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y0E);
    dp->::ccc::DD9x2y0::~DD9x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y0E(Test__ZN3ccc7DD9x2y0E, "_ZN3ccc7DD9x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y0C1Ev();
extern void _ZN3ccc7DD9x2y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y0E[] = {
  NSPAIR(_ZN3ccc7DD9x2y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y0E[];
extern void _ZN3ccc7DD9x2y03efgEv();
extern void _ZN3ccc7DD9x2y03pqrEv();
extern void _ZN3ccc7DD9x2y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y03efgEv,_ZTv0_n12_N3ccc7DD9x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y03efgEv,_ZThn4_N3ccc7DD9x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y03abcEv,_ZTv0_n16_N3ccc7DD9x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y03abcEv,_ZThn4_N3ccc7DD9x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y03pqrEv,_ZTv0_n20_N3ccc7DD9x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y03pqrEv,_ZThn4_N3ccc7DD9x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y03efgEv,_ZTv0_n12_N3ccc7DD9x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y03abcEv,_ZTv0_n16_N3ccc7DD9x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y03pqrEv,_ZTv0_n20_N3ccc7DD9x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y0E[] = {
  {&(_ZTVN3ccc7DD9x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y0E[];
static VTBL_ENTRY alt_thunk_names1649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y03pqrEv,_ZTv0_n20_N3ccc7DD9x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y03pqrEv,_ZThn4_N3ccc7DD9x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y03abcEv,_ZTv0_n16_N3ccc7DD9x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y03abcEv,_ZThn4_N3ccc7DD9x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y03efgEv,_ZTv0_n12_N3ccc7DD9x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y03efgEv,_ZThn4_N3ccc7DD9x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y0E = {  "_ZN3ccc7DD9x2y0E", // class name
  bases__ZN3ccc7DD9x2y0E, 2,
  &(vtc__ZN3ccc7DD9x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y0E),3, //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  CC9x2y1  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x2y13efgEv
  ~CC9x2y1(); // tgen
  CC9x2y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y1E) C1{ VBC2{ v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y13abcEv");}
void  ccc::CC9x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y13pqrEv");}
void  ccc::CC9x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y13efgEv");}
ccc::CC9x2y1 ::~CC9x2y1(){ note_dtor("_ZN3ccc7CC9x2y1E", this);} // tgen
ccc::CC9x2y1 ::CC9x2y1(){ note_ctor("_ZN3ccc7CC9x2y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y1E, buf);
    ::ccc::CC9x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y1E);
    dp->::ccc::CC9x2y1::~CC9x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y1E(Test__ZN3ccc7CC9x2y1E, "_ZN3ccc7CC9x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y1C1Ev();
extern void _ZN3ccc7CC9x2y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y1E[] = {
  NSPAIR(_ZN3ccc7CC9x2y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y1E[];
extern void _ZN3ccc7CC9x2y13efgEv();
extern void _ZN3ccc7CC9x2y13abcEv();
extern void _ZN3ccc7CC9x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y13efgEv,_ZTv0_n12_N3ccc7CC9x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y13efgEv,_ZThn4_N3ccc7CC9x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y13pqrEv,_ZTv0_n16_N3ccc7CC9x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y13pqrEv,_ZThn4_N3ccc7CC9x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y13efgEv,_ZTv0_n12_N3ccc7CC9x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y13pqrEv,_ZTv0_n16_N3ccc7CC9x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y1E[] = {
  {&(_ZTVN3ccc7CC9x2y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y1E[];
static VTBL_ENTRY alt_thunk_names1650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y13pqrEv,_ZTv0_n16_N3ccc7CC9x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y13pqrEv,_ZThn4_N3ccc7CC9x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y13efgEv,_ZTv0_n12_N3ccc7CC9x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y13efgEv,_ZThn4_N3ccc7CC9x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y1E = {  "_ZN3ccc7CC9x2y1E", // class name
  bases__ZN3ccc7CC9x2y1E, 2,
  &(vtc__ZN3ccc7CC9x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y1E),2, //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  DD9x2y1  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD9x2y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x2y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x2y13efgEv
  ~DD9x2y1(); // tgen
  DD9x2y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y1E) C1{ VBC2{ v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x2y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y13abcEv");}
void  ccc::DD9x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y13pqrEv");}
void  ccc::DD9x2y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y13efgEv");}
ccc::DD9x2y1 ::~DD9x2y1(){ note_dtor("_ZN3ccc7DD9x2y1E", this);} // tgen
ccc::DD9x2y1 ::DD9x2y1(){ note_ctor("_ZN3ccc7DD9x2y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y1E, buf);
    ::ccc::DD9x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y1E);
    dp->::ccc::DD9x2y1::~DD9x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y1E(Test__ZN3ccc7DD9x2y1E, "_ZN3ccc7DD9x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y1C1Ev();
extern void _ZN3ccc7DD9x2y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y1E[] = {
  NSPAIR(_ZN3ccc7DD9x2y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y1E[];
extern void _ZN3ccc7DD9x2y13efgEv();
extern void _ZN3ccc7DD9x2y13pqrEv();
extern void _ZN3ccc7DD9x2y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y13efgEv,_ZTv0_n12_N3ccc7DD9x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y13efgEv,_ZThn4_N3ccc7DD9x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y13abcEv,_ZTv0_n16_N3ccc7DD9x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y13abcEv,_ZThn4_N3ccc7DD9x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y13pqrEv,_ZTv0_n20_N3ccc7DD9x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y13pqrEv,_ZThn4_N3ccc7DD9x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y13efgEv,_ZTv0_n12_N3ccc7DD9x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y13abcEv,_ZTv0_n16_N3ccc7DD9x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y13pqrEv,_ZTv0_n20_N3ccc7DD9x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y1E[] = {
  {&(_ZTVN3ccc7DD9x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y1E[];
static VTBL_ENTRY alt_thunk_names1651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y13pqrEv,_ZTv0_n20_N3ccc7DD9x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y13pqrEv,_ZThn4_N3ccc7DD9x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y13abcEv,_ZTv0_n16_N3ccc7DD9x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y13abcEv,_ZThn4_N3ccc7DD9x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y13efgEv,_ZTv0_n12_N3ccc7DD9x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y13efgEv,_ZThn4_N3ccc7DD9x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y1E = {  "_ZN3ccc7DD9x2y1E", // class name
  bases__ZN3ccc7DD9x2y1E, 2,
  &(vtc__ZN3ccc7DD9x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y1E),3, //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  CC9x2y2  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y23pqrEv
  ~CC9x2y2(); // tgen
  CC9x2y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y2E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y23efgEv");}
void  ccc::CC9x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y23abcEv");}
void  ccc::CC9x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y23pqrEv");}
ccc::CC9x2y2 ::~CC9x2y2(){ note_dtor("_ZN3ccc7CC9x2y2E", this);} // tgen
ccc::CC9x2y2 ::CC9x2y2(){ note_ctor("_ZN3ccc7CC9x2y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y2E, buf);
    ::ccc::CC9x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y2E);
    dp->::ccc::CC9x2y2::~CC9x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y2E(Test__ZN3ccc7CC9x2y2E, "_ZN3ccc7CC9x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y2C1Ev();
extern void _ZN3ccc7CC9x2y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y2E[] = {
  NSPAIR(_ZN3ccc7CC9x2y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y2E[];
extern void _ZN3ccc7CC9x2y23efgEv();
extern void _ZN3ccc7CC9x2y23abcEv();
extern void _ZN3ccc7CC9x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y23efgEv,_ZTv0_n12_N3ccc7CC9x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y23efgEv,_ZThn4_N3ccc7CC9x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y23pqrEv,_ZTv0_n16_N3ccc7CC9x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y23pqrEv,_ZThn4_N3ccc7CC9x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y23efgEv,_ZTv0_n12_N3ccc7CC9x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y23pqrEv,_ZTv0_n16_N3ccc7CC9x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y2E[] = {
  {&(_ZTVN3ccc7CC9x2y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y2E[];
static VTBL_ENTRY alt_thunk_names1652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y23pqrEv,_ZTv0_n16_N3ccc7CC9x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y23pqrEv,_ZThn4_N3ccc7CC9x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y23efgEv,_ZTv0_n12_N3ccc7CC9x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y23efgEv,_ZThn4_N3ccc7CC9x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y2E = {  "_ZN3ccc7CC9x2y2E", // class name
  bases__ZN3ccc7CC9x2y2E, 2,
  &(vtc__ZN3ccc7CC9x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y2E),2, //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  DD9x2y2  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD9x2y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x2y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x2y23pqrEv
  ~DD9x2y2(); // tgen
  DD9x2y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y2E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x2y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y23efgEv");}
void  ccc::DD9x2y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y23abcEv");}
void  ccc::DD9x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y23pqrEv");}
ccc::DD9x2y2 ::~DD9x2y2(){ note_dtor("_ZN3ccc7DD9x2y2E", this);} // tgen
ccc::DD9x2y2 ::DD9x2y2(){ note_ctor("_ZN3ccc7DD9x2y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y2E, buf);
    ::ccc::DD9x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y2E);
    dp->::ccc::DD9x2y2::~DD9x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y2E(Test__ZN3ccc7DD9x2y2E, "_ZN3ccc7DD9x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y2C1Ev();
extern void _ZN3ccc7DD9x2y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y2E[] = {
  NSPAIR(_ZN3ccc7DD9x2y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y2E[];
extern void _ZN3ccc7DD9x2y23efgEv();
extern void _ZN3ccc7DD9x2y23pqrEv();
extern void _ZN3ccc7DD9x2y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y23efgEv,_ZTv0_n12_N3ccc7DD9x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y23efgEv,_ZThn4_N3ccc7DD9x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y23abcEv,_ZTv0_n16_N3ccc7DD9x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y23abcEv,_ZThn4_N3ccc7DD9x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y23pqrEv,_ZTv0_n20_N3ccc7DD9x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y23pqrEv,_ZThn4_N3ccc7DD9x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y23efgEv,_ZTv0_n12_N3ccc7DD9x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y23abcEv,_ZTv0_n16_N3ccc7DD9x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y23pqrEv,_ZTv0_n20_N3ccc7DD9x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y2E[] = {
  {&(_ZTVN3ccc7DD9x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y2E[];
static VTBL_ENTRY alt_thunk_names1653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y23pqrEv,_ZTv0_n20_N3ccc7DD9x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y23pqrEv,_ZThn4_N3ccc7DD9x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y23abcEv,_ZTv0_n16_N3ccc7DD9x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y23abcEv,_ZThn4_N3ccc7DD9x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y23efgEv,_ZTv0_n12_N3ccc7DD9x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y23efgEv,_ZThn4_N3ccc7DD9x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y2E = {  "_ZN3ccc7DD9x2y2E", // class name
  bases__ZN3ccc7DD9x2y2E, 2,
  &(vtc__ZN3ccc7DD9x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y2E),3, //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  CC9x2y3  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x2y33abcEv
  ~CC9x2y3(); // tgen
  CC9x2y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y3E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y33efgEv");}
void  ccc::CC9x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y33pqrEv");}
void  ccc::CC9x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y33abcEv");}
ccc::CC9x2y3 ::~CC9x2y3(){ note_dtor("_ZN3ccc7CC9x2y3E", this);} // tgen
ccc::CC9x2y3 ::CC9x2y3(){ note_ctor("_ZN3ccc7CC9x2y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y3E, buf);
    ::ccc::CC9x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y3E);
    dp->::ccc::CC9x2y3::~CC9x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y3E(Test__ZN3ccc7CC9x2y3E, "_ZN3ccc7CC9x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y3C1Ev();
extern void _ZN3ccc7CC9x2y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y3E[] = {
  NSPAIR(_ZN3ccc7CC9x2y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y3E[];
extern void _ZN3ccc7CC9x2y33efgEv();
extern void _ZN3ccc7CC9x2y33abcEv();
extern void _ZN3ccc7CC9x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y33efgEv,_ZTv0_n12_N3ccc7CC9x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y33efgEv,_ZThn4_N3ccc7CC9x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y33pqrEv,_ZTv0_n16_N3ccc7CC9x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y33pqrEv,_ZThn4_N3ccc7CC9x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y33efgEv,_ZTv0_n12_N3ccc7CC9x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y33pqrEv,_ZTv0_n16_N3ccc7CC9x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y3E[] = {
  {&(_ZTVN3ccc7CC9x2y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y3E[];
static VTBL_ENTRY alt_thunk_names1654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y33pqrEv,_ZTv0_n16_N3ccc7CC9x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y33pqrEv,_ZThn4_N3ccc7CC9x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y33efgEv,_ZTv0_n12_N3ccc7CC9x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y33efgEv,_ZThn4_N3ccc7CC9x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y3E = {  "_ZN3ccc7CC9x2y3E", // class name
  bases__ZN3ccc7CC9x2y3E, 2,
  &(vtc__ZN3ccc7CC9x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y3E),2, //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  DD9x2y3  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD9x2y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x2y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x2y33abcEv
  ~DD9x2y3(); // tgen
  DD9x2y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y3E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x2y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y33efgEv");}
void  ccc::DD9x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y33pqrEv");}
void  ccc::DD9x2y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y33abcEv");}
ccc::DD9x2y3 ::~DD9x2y3(){ note_dtor("_ZN3ccc7DD9x2y3E", this);} // tgen
ccc::DD9x2y3 ::DD9x2y3(){ note_ctor("_ZN3ccc7DD9x2y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y3E, buf);
    ::ccc::DD9x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y3E);
    dp->::ccc::DD9x2y3::~DD9x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y3E(Test__ZN3ccc7DD9x2y3E, "_ZN3ccc7DD9x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y3C1Ev();
extern void _ZN3ccc7DD9x2y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y3E[] = {
  NSPAIR(_ZN3ccc7DD9x2y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y3E[];
extern void _ZN3ccc7DD9x2y33efgEv();
extern void _ZN3ccc7DD9x2y33pqrEv();
extern void _ZN3ccc7DD9x2y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y33efgEv,_ZTv0_n12_N3ccc7DD9x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y33efgEv,_ZThn4_N3ccc7DD9x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y33abcEv,_ZTv0_n16_N3ccc7DD9x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y33abcEv,_ZThn4_N3ccc7DD9x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y33pqrEv,_ZTv0_n20_N3ccc7DD9x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y33pqrEv,_ZThn4_N3ccc7DD9x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y33efgEv,_ZTv0_n12_N3ccc7DD9x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y33abcEv,_ZTv0_n16_N3ccc7DD9x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y33pqrEv,_ZTv0_n20_N3ccc7DD9x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y3E[] = {
  {&(_ZTVN3ccc7DD9x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y3E[];
static VTBL_ENTRY alt_thunk_names1655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y33pqrEv,_ZTv0_n20_N3ccc7DD9x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y33pqrEv,_ZThn4_N3ccc7DD9x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y33abcEv,_ZTv0_n16_N3ccc7DD9x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y33abcEv,_ZThn4_N3ccc7DD9x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y33efgEv,_ZTv0_n12_N3ccc7DD9x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y33efgEv,_ZThn4_N3ccc7DD9x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y3E = {  "_ZN3ccc7DD9x2y3E", // class name
  bases__ZN3ccc7DD9x2y3E, 2,
  &(vtc__ZN3ccc7DD9x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y3E),3, //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  CC9x2y4  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC9x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x2y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x2y43efgEv
  ~CC9x2y4(); // tgen
  CC9x2y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y4E) C1{ VBC2{ v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y43pqrEv");}
void  ccc::CC9x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y43abcEv");}
void  ccc::CC9x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y43efgEv");}
ccc::CC9x2y4 ::~CC9x2y4(){ note_dtor("_ZN3ccc7CC9x2y4E", this);} // tgen
ccc::CC9x2y4 ::CC9x2y4(){ note_ctor("_ZN3ccc7CC9x2y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y4E, buf);
    ::ccc::CC9x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y4E);
    dp->::ccc::CC9x2y4::~CC9x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y4E(Test__ZN3ccc7CC9x2y4E, "_ZN3ccc7CC9x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y4C1Ev();
extern void _ZN3ccc7CC9x2y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y4E[] = {
  NSPAIR(_ZN3ccc7CC9x2y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y4E[];
extern void _ZN3ccc7CC9x2y43efgEv();
extern void _ZN3ccc7CC9x2y43abcEv();
extern void _ZN3ccc7CC9x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y43efgEv,_ZTv0_n12_N3ccc7CC9x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y43efgEv,_ZThn4_N3ccc7CC9x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y43pqrEv,_ZTv0_n16_N3ccc7CC9x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y43pqrEv,_ZThn4_N3ccc7CC9x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y43efgEv,_ZTv0_n12_N3ccc7CC9x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y43pqrEv,_ZTv0_n16_N3ccc7CC9x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y4E[] = {
  {&(_ZTVN3ccc7CC9x2y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y4E[];
static VTBL_ENTRY alt_thunk_names1656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y43pqrEv,_ZTv0_n16_N3ccc7CC9x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y43pqrEv,_ZThn4_N3ccc7CC9x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y43efgEv,_ZTv0_n12_N3ccc7CC9x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y43efgEv,_ZThn4_N3ccc7CC9x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y4E = {  "_ZN3ccc7CC9x2y4E", // class name
  bases__ZN3ccc7CC9x2y4E, 2,
  &(vtc__ZN3ccc7CC9x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y4E),2, //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  DD9x2y4  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD9x2y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x2y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x2y43efgEv
  ~DD9x2y4(); // tgen
  DD9x2y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y4E) C1{ VBC2{ v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y43pqrEv");}
void  ccc::DD9x2y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y43abcEv");}
void  ccc::DD9x2y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y43efgEv");}
ccc::DD9x2y4 ::~DD9x2y4(){ note_dtor("_ZN3ccc7DD9x2y4E", this);} // tgen
ccc::DD9x2y4 ::DD9x2y4(){ note_ctor("_ZN3ccc7DD9x2y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y4E, buf);
    ::ccc::DD9x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y4E);
    dp->::ccc::DD9x2y4::~DD9x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y4E(Test__ZN3ccc7DD9x2y4E, "_ZN3ccc7DD9x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y4C1Ev();
extern void _ZN3ccc7DD9x2y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y4E[] = {
  NSPAIR(_ZN3ccc7DD9x2y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y4E[];
extern void _ZN3ccc7DD9x2y43efgEv();
extern void _ZN3ccc7DD9x2y43pqrEv();
extern void _ZN3ccc7DD9x2y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y43efgEv,_ZTv0_n12_N3ccc7DD9x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y43efgEv,_ZThn4_N3ccc7DD9x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y43abcEv,_ZTv0_n16_N3ccc7DD9x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y43abcEv,_ZThn4_N3ccc7DD9x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y43pqrEv,_ZTv0_n20_N3ccc7DD9x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y43pqrEv,_ZThn4_N3ccc7DD9x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y43efgEv,_ZTv0_n12_N3ccc7DD9x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y43abcEv,_ZTv0_n16_N3ccc7DD9x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y43pqrEv,_ZTv0_n20_N3ccc7DD9x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y4E[] = {
  {&(_ZTVN3ccc7DD9x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y4E[];
static VTBL_ENTRY alt_thunk_names1657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y43pqrEv,_ZTv0_n20_N3ccc7DD9x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y43pqrEv,_ZThn4_N3ccc7DD9x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y43abcEv,_ZTv0_n16_N3ccc7DD9x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y43abcEv,_ZThn4_N3ccc7DD9x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y43efgEv,_ZTv0_n12_N3ccc7DD9x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y43efgEv,_ZThn4_N3ccc7DD9x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y4E = {  "_ZN3ccc7DD9x2y4E", // class name
  bases__ZN3ccc7DD9x2y4E, 2,
  &(vtc__ZN3ccc7DD9x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y4E),3, //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  CC9x2y5  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7CC9x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x2y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x2y53abcEv
  ~CC9x2y5(); // tgen
  CC9x2y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y5E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y53pqrEv");}
void  ccc::CC9x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y53efgEv");}
void  ccc::CC9x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y53abcEv");}
ccc::CC9x2y5 ::~CC9x2y5(){ note_dtor("_ZN3ccc7CC9x2y5E", this);} // tgen
ccc::CC9x2y5 ::CC9x2y5(){ note_ctor("_ZN3ccc7CC9x2y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y5E, buf);
    ::ccc::CC9x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y5E);
    dp->::ccc::CC9x2y5::~CC9x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y5E(Test__ZN3ccc7CC9x2y5E, "_ZN3ccc7CC9x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y5C1Ev();
extern void _ZN3ccc7CC9x2y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y5E[] = {
  NSPAIR(_ZN3ccc7CC9x2y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y5E[];
extern void _ZN3ccc7CC9x2y53efgEv();
extern void _ZN3ccc7CC9x2y53abcEv();
extern void _ZN3ccc7CC9x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y53efgEv,_ZTv0_n12_N3ccc7CC9x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y53efgEv,_ZThn4_N3ccc7CC9x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y53pqrEv,_ZTv0_n16_N3ccc7CC9x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y53pqrEv,_ZThn4_N3ccc7CC9x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y53efgEv,_ZTv0_n12_N3ccc7CC9x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y53pqrEv,_ZTv0_n16_N3ccc7CC9x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y5E[] = {
  {&(_ZTVN3ccc7CC9x2y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y5E[];
static VTBL_ENTRY alt_thunk_names1658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y53pqrEv,_ZTv0_n16_N3ccc7CC9x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y53pqrEv,_ZThn4_N3ccc7CC9x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y53efgEv,_ZTv0_n12_N3ccc7CC9x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y53efgEv,_ZThn4_N3ccc7CC9x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y5E = {  "_ZN3ccc7CC9x2y5E", // class name
  bases__ZN3ccc7CC9x2y5E, 2,
  &(vtc__ZN3ccc7CC9x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y5E),2, //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  DD9x2y5  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc7DD9x2y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x2y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x2y53abcEv
  ~DD9x2y5(); // tgen
  DD9x2y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y5E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y53pqrEv");}
void  ccc::DD9x2y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y53efgEv");}
void  ccc::DD9x2y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y53abcEv");}
ccc::DD9x2y5 ::~DD9x2y5(){ note_dtor("_ZN3ccc7DD9x2y5E", this);} // tgen
ccc::DD9x2y5 ::DD9x2y5(){ note_ctor("_ZN3ccc7DD9x2y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y5E, buf);
    ::ccc::DD9x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y5E);
    dp->::ccc::DD9x2y5::~DD9x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y5E(Test__ZN3ccc7DD9x2y5E, "_ZN3ccc7DD9x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y5C1Ev();
extern void _ZN3ccc7DD9x2y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y5E[] = {
  NSPAIR(_ZN3ccc7DD9x2y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y5E[];
extern void _ZN3ccc7DD9x2y53efgEv();
extern void _ZN3ccc7DD9x2y53pqrEv();
extern void _ZN3ccc7DD9x2y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y53efgEv,_ZTv0_n12_N3ccc7DD9x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y53efgEv,_ZThn4_N3ccc7DD9x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y53abcEv,_ZTv0_n16_N3ccc7DD9x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y53abcEv,_ZThn4_N3ccc7DD9x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y53pqrEv,_ZTv0_n20_N3ccc7DD9x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y53pqrEv,_ZThn4_N3ccc7DD9x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y53efgEv,_ZTv0_n12_N3ccc7DD9x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y53abcEv,_ZTv0_n16_N3ccc7DD9x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y53pqrEv,_ZTv0_n20_N3ccc7DD9x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y5E[] = {
  {&(_ZTVN3ccc7DD9x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y5E[];
static VTBL_ENTRY alt_thunk_names1659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y53pqrEv,_ZTv0_n20_N3ccc7DD9x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y53pqrEv,_ZThn4_N3ccc7DD9x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y53abcEv,_ZTv0_n16_N3ccc7DD9x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y53abcEv,_ZThn4_N3ccc7DD9x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y53efgEv,_ZTv0_n12_N3ccc7DD9x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y53efgEv,_ZThn4_N3ccc7DD9x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y5E = {  "_ZN3ccc7DD9x2y5E", // class name
  bases__ZN3ccc7DD9x2y5E, 2,
  &(vtc__ZN3ccc7DD9x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y5E),3, //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  CC9x2y6  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x2y63efgEv
  ~CC9x2y6(); // tgen
  CC9x2y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y6E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y63abcEv");}
void  ccc::CC9x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y63efgEv");}
ccc::CC9x2y6 ::~CC9x2y6(){ note_dtor("_ZN3ccc7CC9x2y6E", this);} // tgen
ccc::CC9x2y6 ::CC9x2y6(){ note_ctor("_ZN3ccc7CC9x2y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y6E, buf);
    ::ccc::CC9x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y6E);
    dp->::ccc::CC9x2y6::~CC9x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y6E(Test__ZN3ccc7CC9x2y6E, "_ZN3ccc7CC9x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y6C1Ev();
extern void _ZN3ccc7CC9x2y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y6E[] = {
  NSPAIR(_ZN3ccc7CC9x2y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y6E[];
extern void _ZN3ccc7CC9x2y63efgEv();
extern void _ZN3ccc7CC9x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y63efgEv,_ZTv0_n12_N3ccc7CC9x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y63efgEv,_ZThn4_N3ccc7CC9x2y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y63efgEv,_ZTv0_n12_N3ccc7CC9x2y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y6E[] = {
  {&(_ZTVN3ccc7CC9x2y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y6E[];
static VTBL_ENTRY alt_thunk_names1660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y63efgEv,_ZTv0_n12_N3ccc7CC9x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y63efgEv,_ZThn4_N3ccc7CC9x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y6E = {  "_ZN3ccc7CC9x2y6E", // class name
  bases__ZN3ccc7CC9x2y6E, 2,
  &(vtc__ZN3ccc7CC9x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y6E),2, //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  DD9x2y6  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD9x2y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x2y63efgEv
  ~DD9x2y6(); // tgen
  DD9x2y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y6E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x2y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y63abcEv");}
void  ccc::DD9x2y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y63efgEv");}
ccc::DD9x2y6 ::~DD9x2y6(){ note_dtor("_ZN3ccc7DD9x2y6E", this);} // tgen
ccc::DD9x2y6 ::DD9x2y6(){ note_ctor("_ZN3ccc7DD9x2y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y6E, buf);
    ::ccc::DD9x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y6E);
    dp->::ccc::DD9x2y6::~DD9x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y6E(Test__ZN3ccc7DD9x2y6E, "_ZN3ccc7DD9x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y6C1Ev();
extern void _ZN3ccc7DD9x2y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y6E[] = {
  NSPAIR(_ZN3ccc7DD9x2y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y6E[];
extern void _ZN3ccc7DD9x2y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x2y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y63efgEv,_ZTv0_n12_N3ccc7DD9x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y63efgEv,_ZThn4_N3ccc7DD9x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y63abcEv,_ZTv0_n16_N3ccc7DD9x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y63abcEv,_ZThn4_N3ccc7DD9x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y63efgEv,_ZTv0_n12_N3ccc7DD9x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y63abcEv,_ZTv0_n16_N3ccc7DD9x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y6E[] = {
  {&(_ZTVN3ccc7DD9x2y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y6E[];
static VTBL_ENTRY alt_thunk_names1661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y63abcEv,_ZTv0_n16_N3ccc7DD9x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y63abcEv,_ZThn4_N3ccc7DD9x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y63efgEv,_ZTv0_n12_N3ccc7DD9x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y63efgEv,_ZThn4_N3ccc7DD9x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y6E = {  "_ZN3ccc7DD9x2y6E", // class name
  bases__ZN3ccc7DD9x2y6E, 2,
  &(vtc__ZN3ccc7DD9x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y6E),3, //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  CC9x2y7  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7CC9x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y73pqrEv
  ~CC9x2y7(); // tgen
  CC9x2y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y7E) C1{ VBC2{ v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y73abcEv");}
void  ccc::CC9x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y73pqrEv");}
ccc::CC9x2y7 ::~CC9x2y7(){ note_dtor("_ZN3ccc7CC9x2y7E", this);} // tgen
ccc::CC9x2y7 ::CC9x2y7(){ note_ctor("_ZN3ccc7CC9x2y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y7E, buf);
    ::ccc::CC9x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y7E);
    dp->::ccc::CC9x2y7::~CC9x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y7E(Test__ZN3ccc7CC9x2y7E, "_ZN3ccc7CC9x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y7C1Ev();
extern void _ZN3ccc7CC9x2y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y7E[] = {
  NSPAIR(_ZN3ccc7CC9x2y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc7CC9x2y73abcEv();
extern void _ZN3ccc7CC9x2y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y73pqrEv,_ZTv0_n16_N3ccc7CC9x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y73pqrEv,_ZThn4_N3ccc7CC9x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y73pqrEv,_ZTv0_n16_N3ccc7CC9x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y7E[] = {
  {&(_ZTVN3ccc7CC9x2y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y7E[];
static VTBL_ENTRY alt_thunk_names1662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y73pqrEv,_ZTv0_n16_N3ccc7CC9x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y73pqrEv,_ZThn4_N3ccc7CC9x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y7E = {  "_ZN3ccc7CC9x2y7E", // class name
  bases__ZN3ccc7CC9x2y7E, 2,
  &(vtc__ZN3ccc7CC9x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y7E),2, //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  DD9x2y7  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc7DD9x2y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x2y73pqrEv
  ~DD9x2y7(); // tgen
  DD9x2y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y7E) C1{ VBC2{ v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x2y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y73abcEv");}
void  ccc::DD9x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y73pqrEv");}
ccc::DD9x2y7 ::~DD9x2y7(){ note_dtor("_ZN3ccc7DD9x2y7E", this);} // tgen
ccc::DD9x2y7 ::DD9x2y7(){ note_ctor("_ZN3ccc7DD9x2y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y7E, buf);
    ::ccc::DD9x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y7E);
    dp->::ccc::DD9x2y7::~DD9x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y7E(Test__ZN3ccc7DD9x2y7E, "_ZN3ccc7DD9x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y7C1Ev();
extern void _ZN3ccc7DD9x2y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y7E[] = {
  NSPAIR(_ZN3ccc7DD9x2y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x2y73pqrEv();
extern void _ZN3ccc7DD9x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y73abcEv,_ZTv0_n16_N3ccc7DD9x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y73abcEv,_ZThn4_N3ccc7DD9x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y73pqrEv,_ZTv0_n20_N3ccc7DD9x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y73pqrEv,_ZThn4_N3ccc7DD9x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y73abcEv,_ZTv0_n16_N3ccc7DD9x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y73pqrEv,_ZTv0_n20_N3ccc7DD9x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y7E[] = {
  {&(_ZTVN3ccc7DD9x2y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y7E[];
static VTBL_ENTRY alt_thunk_names1663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y73pqrEv,_ZTv0_n20_N3ccc7DD9x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y73pqrEv,_ZThn4_N3ccc7DD9x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y73abcEv,_ZTv0_n16_N3ccc7DD9x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y73abcEv,_ZThn4_N3ccc7DD9x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y7E = {  "_ZN3ccc7DD9x2y7E", // class name
  bases__ZN3ccc7DD9x2y7E, 2,
  &(vtc__ZN3ccc7DD9x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y7E),3, //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  CC9x2y8  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x2y83abcEv
  ~CC9x2y8(); // tgen
  CC9x2y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y8E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y83efgEv");}
void  ccc::CC9x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x2y83abcEv");}
ccc::CC9x2y8 ::~CC9x2y8(){ note_dtor("_ZN3ccc7CC9x2y8E", this);} // tgen
ccc::CC9x2y8 ::CC9x2y8(){ note_ctor("_ZN3ccc7CC9x2y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y8E, buf);
    ::ccc::CC9x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y8E);
    dp->::ccc::CC9x2y8::~CC9x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y8E(Test__ZN3ccc7CC9x2y8E, "_ZN3ccc7CC9x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y8C1Ev();
extern void _ZN3ccc7CC9x2y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y8E[] = {
  NSPAIR(_ZN3ccc7CC9x2y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y8E[];
extern void _ZN3ccc7CC9x2y83efgEv();
extern void _ZN3ccc7CC9x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y83efgEv,_ZTv0_n12_N3ccc7CC9x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y83efgEv,_ZThn4_N3ccc7CC9x2y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y83efgEv,_ZTv0_n12_N3ccc7CC9x2y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y8E[] = {
  {&(_ZTVN3ccc7CC9x2y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y8E[];
static VTBL_ENTRY alt_thunk_names1664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y83efgEv,_ZTv0_n12_N3ccc7CC9x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y83efgEv,_ZThn4_N3ccc7CC9x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y8E = {  "_ZN3ccc7CC9x2y8E", // class name
  bases__ZN3ccc7CC9x2y8E, 2,
  &(vtc__ZN3ccc7CC9x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y8E),2, //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  DD9x2y8  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD9x2y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x2y83abcEv
  ~DD9x2y8(); // tgen
  DD9x2y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y8E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x2y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y83efgEv");}
void  ccc::DD9x2y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x2y83abcEv");}
ccc::DD9x2y8 ::~DD9x2y8(){ note_dtor("_ZN3ccc7DD9x2y8E", this);} // tgen
ccc::DD9x2y8 ::DD9x2y8(){ note_ctor("_ZN3ccc7DD9x2y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y8E, buf);
    ::ccc::DD9x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y8E);
    dp->::ccc::DD9x2y8::~DD9x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y8E(Test__ZN3ccc7DD9x2y8E, "_ZN3ccc7DD9x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y8C1Ev();
extern void _ZN3ccc7DD9x2y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y8E[] = {
  NSPAIR(_ZN3ccc7DD9x2y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y8E[];
extern void _ZN3ccc7DD9x2y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x2y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y83efgEv,_ZTv0_n12_N3ccc7DD9x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y83efgEv,_ZThn4_N3ccc7DD9x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x2y83abcEv,_ZTv0_n16_N3ccc7DD9x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y83abcEv,_ZThn4_N3ccc7DD9x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y83efgEv,_ZTv0_n12_N3ccc7DD9x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x2y83abcEv,_ZTv0_n16_N3ccc7DD9x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y8E[] = {
  {&(_ZTVN3ccc7DD9x2y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x2y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y8E[];
static VTBL_ENTRY alt_thunk_names1665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x2y83abcEv,_ZTv0_n16_N3ccc7DD9x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y83abcEv,_ZThn4_N3ccc7DD9x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y83efgEv,_ZTv0_n12_N3ccc7DD9x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y83efgEv,_ZThn4_N3ccc7DD9x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y8E = {  "_ZN3ccc7DD9x2y8E", // class name
  bases__ZN3ccc7DD9x2y8E, 2,
  &(vtc__ZN3ccc7DD9x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y8E),3, //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  CC9x2y9  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7CC9x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x2y93pqrEv
  ~CC9x2y9(); // tgen
  CC9x2y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x2y9E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x2y93efgEv");}
void  ccc::CC9x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x2y93pqrEv");}
ccc::CC9x2y9 ::~CC9x2y9(){ note_dtor("_ZN3ccc7CC9x2y9E", this);} // tgen
ccc::CC9x2y9 ::CC9x2y9(){ note_ctor("_ZN3ccc7CC9x2y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x2y9E, buf);
    ::ccc::CC9x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x2y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc7CC9x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x2y9E);
    dp->::ccc::CC9x2y9::~CC9x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x2y9E(Test__ZN3ccc7CC9x2y9E, "_ZN3ccc7CC9x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x2y9C1Ev();
extern void _ZN3ccc7CC9x2y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x2y9E[] = {
  NSPAIR(_ZN3ccc7CC9x2y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7CC9x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x2y9E[];
extern void _ZN3ccc7CC9x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc7CC9x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x2y93efgEv,_ZTv0_n12_N3ccc7CC9x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y93efgEv,_ZThn4_N3ccc7CC9x2y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x2y93pqrEv,_ZTv0_n16_N3ccc7CC9x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x2y93pqrEv,_ZThn4_N3ccc7CC9x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x2y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x2y93efgEv,_ZTv0_n12_N3ccc7CC9x2y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x2y93pqrEv,_ZTv0_n16_N3ccc7CC9x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x2y9E[] = {
  {&(_ZTVN3ccc7CC9x2y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x2y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x2y9E[];
static VTBL_ENTRY alt_thunk_names1666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x2y93pqrEv,_ZTv0_n16_N3ccc7CC9x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y93pqrEv,_ZThn4_N3ccc7CC9x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x2y93efgEv,_ZTv0_n12_N3ccc7CC9x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x2y93efgEv,_ZThn4_N3ccc7CC9x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x2y9E = {  "_ZN3ccc7CC9x2y9E", // class name
  bases__ZN3ccc7CC9x2y9E, 2,
  &(vtc__ZN3ccc7CC9x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x2y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x2y9E),2, //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  DD9x2y9  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc7DD9x2y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x2y93pqrEv
  ~DD9x2y9(); // tgen
  DD9x2y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x2y9E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x2y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x2y93efgEv");}
void  ccc::DD9x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x2y93pqrEv");}
ccc::DD9x2y9 ::~DD9x2y9(){ note_dtor("_ZN3ccc7DD9x2y9E", this);} // tgen
ccc::DD9x2y9 ::DD9x2y9(){ note_ctor("_ZN3ccc7DD9x2y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x2y9E, buf);
    ::ccc::DD9x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x2y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc7DD9x2y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x2y9E);
    dp->::ccc::DD9x2y9::~DD9x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x2y9E(Test__ZN3ccc7DD9x2y9E, "_ZN3ccc7DD9x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x2y9C1Ev();
extern void _ZN3ccc7DD9x2y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x2y9E[] = {
  NSPAIR(_ZN3ccc7DD9x2y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc7DD9x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y9E[];
extern void _ZN3ccc7DD9x2y93efgEv();
extern void _ZN3ccc7DD9x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x2y93efgEv,_ZTv0_n12_N3ccc7DD9x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y93efgEv,_ZThn4_N3ccc7DD9x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x2y93pqrEv,_ZTv0_n20_N3ccc7DD9x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x2y93pqrEv,_ZThn4_N3ccc7DD9x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x2y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x2y93efgEv,_ZTv0_n12_N3ccc7DD9x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x2y93pqrEv,_ZTv0_n20_N3ccc7DD9x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x2y9E[] = {
  {&(_ZTVN3ccc7DD9x2y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x2y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x2y9E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x2y9E[];
static VTBL_ENTRY alt_thunk_names1667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x2y93pqrEv,_ZTv0_n20_N3ccc7DD9x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y93pqrEv,_ZThn4_N3ccc7DD9x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x2y93efgEv,_ZTv0_n12_N3ccc7DD9x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x2y93efgEv,_ZThn4_N3ccc7DD9x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x2y9E = {  "_ZN3ccc7DD9x2y9E", // class name
  bases__ZN3ccc7DD9x2y9E, 2,
  &(vtc__ZN3ccc7DD9x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x2y9E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x2y9E),3, //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  CC9x2y10  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC9x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x2y103abcEv
  ~CC9x2y10(); // tgen
  CC9x2y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y10E) C1{ VBC2{ v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x2y103pqrEv");}
void  ccc::CC9x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x2y103abcEv");}
ccc::CC9x2y10 ::~CC9x2y10(){ note_dtor("_ZN3ccc8CC9x2y10E", this);} // tgen
ccc::CC9x2y10 ::CC9x2y10(){ note_ctor("_ZN3ccc8CC9x2y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x2y10E, buf);
    ::ccc::CC9x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x2y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC9x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x2y10E);
    dp->::ccc::CC9x2y10::~CC9x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x2y10E(Test__ZN3ccc8CC9x2y10E, "_ZN3ccc8CC9x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x2y10C1Ev();
extern void _ZN3ccc8CC9x2y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x2y10E[] = {
  NSPAIR(_ZN3ccc8CC9x2y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC9x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC9x2y103abcEv();
extern void _ZN3ccc8CC9x2y103pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x2y103pqrEv,_ZTv0_n16_N3ccc8CC9x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y103pqrEv,_ZThn4_N3ccc8CC9x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x2y103pqrEv,_ZTv0_n16_N3ccc8CC9x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x2y10E[] = {
  {&(_ZTVN3ccc8CC9x2y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x2y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x2y10E[];
static VTBL_ENTRY alt_thunk_names1668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x2y103pqrEv,_ZTv0_n16_N3ccc8CC9x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x2y103pqrEv,_ZThn4_N3ccc8CC9x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x2y10E = {  "_ZN3ccc8CC9x2y10E", // class name
  bases__ZN3ccc8CC9x2y10E, 2,
  &(vtc__ZN3ccc8CC9x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x2y10E),2, //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  DD9x2y10  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD9x2y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x2y103abcEv
  ~DD9x2y10(); // tgen
  DD9x2y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x2y10E) C1{ VBC2{ v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x2y103pqrEv");}
void  ccc::DD9x2y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x2y103abcEv");}
ccc::DD9x2y10 ::~DD9x2y10(){ note_dtor("_ZN3ccc8DD9x2y10E", this);} // tgen
ccc::DD9x2y10 ::DD9x2y10(){ note_ctor("_ZN3ccc8DD9x2y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x2y10E, buf);
    ::ccc::DD9x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x2y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD9x2y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x2y10E);
    dp->::ccc::DD9x2y10::~DD9x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x2y10E(Test__ZN3ccc8DD9x2y10E, "_ZN3ccc8DD9x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x2y10C1Ev();
extern void _ZN3ccc8DD9x2y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x2y10E[] = {
  NSPAIR(_ZN3ccc8DD9x2y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD9x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x2y103pqrEv();
extern void _ZN3ccc8DD9x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x2y103abcEv,_ZTv0_n16_N3ccc8DD9x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y103abcEv,_ZThn4_N3ccc8DD9x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x2y103pqrEv,_ZTv0_n20_N3ccc8DD9x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y103pqrEv,_ZThn4_N3ccc8DD9x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x2y103abcEv,_ZTv0_n16_N3ccc8DD9x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x2y103pqrEv,_ZTv0_n20_N3ccc8DD9x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x2y10E[] = {
  {&(_ZTVN3ccc8DD9x2y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x2y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x2y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x2y10E[];
static VTBL_ENTRY alt_thunk_names1669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x2y103pqrEv,_ZTv0_n20_N3ccc8DD9x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y103pqrEv,_ZThn4_N3ccc8DD9x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x2y103abcEv,_ZTv0_n16_N3ccc8DD9x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y103abcEv,_ZThn4_N3ccc8DD9x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x2y10E = {  "_ZN3ccc8DD9x2y10E", // class name
  bases__ZN3ccc8DD9x2y10E, 2,
  &(vtc__ZN3ccc8DD9x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x2y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x2y10E),3, //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  CC9x2y11  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC9x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x2y113efgEv
  ~CC9x2y11(); // tgen
  CC9x2y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y11E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x2y113pqrEv");}
void  ccc::CC9x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x2y113efgEv");}
ccc::CC9x2y11 ::~CC9x2y11(){ note_dtor("_ZN3ccc8CC9x2y11E", this);} // tgen
ccc::CC9x2y11 ::CC9x2y11(){ note_ctor("_ZN3ccc8CC9x2y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x2y11E, buf);
    ::ccc::CC9x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x2y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC9x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x2y11E);
    dp->::ccc::CC9x2y11::~CC9x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x2y11E(Test__ZN3ccc8CC9x2y11E, "_ZN3ccc8CC9x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x2y11C1Ev();
extern void _ZN3ccc8CC9x2y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x2y11E[] = {
  NSPAIR(_ZN3ccc8CC9x2y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC9x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x2y11E[];
extern void _ZN3ccc8CC9x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC9x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x2y113efgEv,_ZTv0_n12_N3ccc8CC9x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y113efgEv,_ZThn4_N3ccc8CC9x2y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x2y113pqrEv,_ZTv0_n16_N3ccc8CC9x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y113pqrEv,_ZThn4_N3ccc8CC9x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x2y113efgEv,_ZTv0_n12_N3ccc8CC9x2y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x2y113pqrEv,_ZTv0_n16_N3ccc8CC9x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x2y11E[] = {
  {&(_ZTVN3ccc8CC9x2y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x2y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x2y11E[];
static VTBL_ENTRY alt_thunk_names1670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x2y113pqrEv,_ZTv0_n16_N3ccc8CC9x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x2y113pqrEv,_ZThn4_N3ccc8CC9x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x2y113efgEv,_ZTv0_n12_N3ccc8CC9x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x2y113efgEv,_ZThn4_N3ccc8CC9x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x2y11E = {  "_ZN3ccc8CC9x2y11E", // class name
  bases__ZN3ccc8CC9x2y11E, 2,
  &(vtc__ZN3ccc8CC9x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x2y11E),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  DD9x2y11  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD9x2y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x2y113efgEv
  ~DD9x2y11(); // tgen
  DD9x2y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x2y11E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x2y113pqrEv");}
void  ccc::DD9x2y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x2y113efgEv");}
ccc::DD9x2y11 ::~DD9x2y11(){ note_dtor("_ZN3ccc8DD9x2y11E", this);} // tgen
ccc::DD9x2y11 ::DD9x2y11(){ note_ctor("_ZN3ccc8DD9x2y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x2y11E, buf);
    ::ccc::DD9x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x2y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD9x2y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x2y11E);
    dp->::ccc::DD9x2y11::~DD9x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x2y11E(Test__ZN3ccc8DD9x2y11E, "_ZN3ccc8DD9x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x2y11C1Ev();
extern void _ZN3ccc8DD9x2y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x2y11E[] = {
  NSPAIR(_ZN3ccc8DD9x2y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD9x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y11E[];
extern void _ZN3ccc8DD9x2y113efgEv();
extern void _ZN3ccc8DD9x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x2y113efgEv,_ZTv0_n12_N3ccc8DD9x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y113efgEv,_ZThn4_N3ccc8DD9x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x2y113pqrEv,_ZTv0_n20_N3ccc8DD9x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y113pqrEv,_ZThn4_N3ccc8DD9x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x2y113efgEv,_ZTv0_n12_N3ccc8DD9x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x2y113pqrEv,_ZTv0_n20_N3ccc8DD9x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x2y11E[] = {
  {&(_ZTVN3ccc8DD9x2y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y11E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x2y11E[];
static VTBL_ENTRY alt_thunk_names1671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x2y113pqrEv,_ZTv0_n20_N3ccc8DD9x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y113pqrEv,_ZThn4_N3ccc8DD9x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x2y113efgEv,_ZTv0_n12_N3ccc8DD9x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y113efgEv,_ZThn4_N3ccc8DD9x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x2y11E = {  "_ZN3ccc8DD9x2y11E", // class name
  bases__ZN3ccc8DD9x2y11E, 2,
  &(vtc__ZN3ccc8DD9x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x2y11E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x2y11E),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  CC9x2y12  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC9x2y123abcEv
  ~CC9x2y12(); // tgen
  CC9x2y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y12E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC9x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x2y123abcEv");}
ccc::CC9x2y12 ::~CC9x2y12(){ note_dtor("_ZN3ccc8CC9x2y12E", this);} // tgen
ccc::CC9x2y12 ::CC9x2y12(){ note_ctor("_ZN3ccc8CC9x2y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x2y12E, buf);
    ::ccc::CC9x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x2y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC9x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x2y12E);
    dp->::ccc::CC9x2y12::~CC9x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x2y12E(Test__ZN3ccc8CC9x2y12E, "_ZN3ccc8CC9x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x2y12C1Ev();
extern void _ZN3ccc8CC9x2y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x2y12E[] = {
  NSPAIR(_ZN3ccc8CC9x2y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC9x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC9x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x2y12E[] = {
  {&(_ZTVN3ccc8CC9x2y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x2y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x2y12E[];
Class_Descriptor cd__ZN3ccc8CC9x2y12E = {  "_ZN3ccc8CC9x2y12E", // class name
  bases__ZN3ccc8CC9x2y12E, 2,
  &(vtc__ZN3ccc8CC9x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x2y12E),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  DD9x2y12  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD9x2y123abcEv
  ~DD9x2y12(); // tgen
  DD9x2y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x2y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD9x2y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x2y123abcEv");}
ccc::DD9x2y12 ::~DD9x2y12(){ note_dtor("_ZN3ccc8DD9x2y12E", this);} // tgen
ccc::DD9x2y12 ::DD9x2y12(){ note_ctor("_ZN3ccc8DD9x2y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x2y12E, buf);
    ::ccc::DD9x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x2y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD9x2y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x2y12E);
    dp->::ccc::DD9x2y12::~DD9x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x2y12E(Test__ZN3ccc8DD9x2y12E, "_ZN3ccc8DD9x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x2y12C1Ev();
extern void _ZN3ccc8DD9x2y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x2y12E[] = {
  NSPAIR(_ZN3ccc8DD9x2y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD9x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x2y123abcEv,_ZTv0_n16_N3ccc8DD9x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y123abcEv,_ZThn4_N3ccc8DD9x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x2y123abcEv,_ZTv0_n16_N3ccc8DD9x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x2y12E[] = {
  {&(_ZTVN3ccc8DD9x2y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x2y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x2y12E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x2y12E[];
static VTBL_ENTRY alt_thunk_names1672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x2y123abcEv,_ZTv0_n16_N3ccc8DD9x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y123abcEv,_ZThn4_N3ccc8DD9x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x2y12E = {  "_ZN3ccc8DD9x2y12E", // class name
  bases__ZN3ccc8DD9x2y12E, 2,
  &(vtc__ZN3ccc8DD9x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x2y12E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x2y12E),3, //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  CC9x2y13  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC9x2y133efgEv
  ~CC9x2y13(); // tgen
  CC9x2y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x2y133efgEv");}
ccc::CC9x2y13 ::~CC9x2y13(){ note_dtor("_ZN3ccc8CC9x2y13E", this);} // tgen
ccc::CC9x2y13 ::CC9x2y13(){ note_ctor("_ZN3ccc8CC9x2y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x2y13E, buf);
    ::ccc::CC9x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x2y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC9x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x2y13E);
    dp->::ccc::CC9x2y13::~CC9x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x2y13E(Test__ZN3ccc8CC9x2y13E, "_ZN3ccc8CC9x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x2y13C1Ev();
extern void _ZN3ccc8CC9x2y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x2y13E[] = {
  NSPAIR(_ZN3ccc8CC9x2y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC9x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x2y13E[];
extern void _ZN3ccc8CC9x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x2y133efgEv,_ZTv0_n12_N3ccc8CC9x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y133efgEv,_ZThn4_N3ccc8CC9x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x2y133efgEv,_ZTv0_n12_N3ccc8CC9x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x2y13E[] = {
  {&(_ZTVN3ccc8CC9x2y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x2y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x2y13E[];
static VTBL_ENTRY alt_thunk_names1673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x2y133efgEv,_ZTv0_n12_N3ccc8CC9x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x2y133efgEv,_ZThn4_N3ccc8CC9x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x2y13E = {  "_ZN3ccc8CC9x2y13E", // class name
  bases__ZN3ccc8CC9x2y13E, 2,
  &(vtc__ZN3ccc8CC9x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x2y13E),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  DD9x2y13  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD9x2y133efgEv
  ~DD9x2y13(); // tgen
  DD9x2y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x2y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x2y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x2y133efgEv");}
ccc::DD9x2y13 ::~DD9x2y13(){ note_dtor("_ZN3ccc8DD9x2y13E", this);} // tgen
ccc::DD9x2y13 ::DD9x2y13(){ note_ctor("_ZN3ccc8DD9x2y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x2y13E, buf);
    ::ccc::DD9x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x2y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD9x2y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x2y13E);
    dp->::ccc::DD9x2y13::~DD9x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x2y13E(Test__ZN3ccc8DD9x2y13E, "_ZN3ccc8DD9x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x2y13C1Ev();
extern void _ZN3ccc8DD9x2y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x2y13E[] = {
  NSPAIR(_ZN3ccc8DD9x2y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD9x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y13E[];
extern void _ZN3ccc8DD9x2y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x2y133efgEv,_ZTv0_n12_N3ccc8DD9x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y133efgEv,_ZThn4_N3ccc8DD9x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x2y133efgEv,_ZTv0_n12_N3ccc8DD9x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x2y13E[] = {
  {&(_ZTVN3ccc8DD9x2y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x2y13E[];
static VTBL_ENTRY alt_thunk_names1674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x2y133efgEv,_ZTv0_n12_N3ccc8DD9x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y133efgEv,_ZThn4_N3ccc8DD9x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x2y13E = {  "_ZN3ccc8DD9x2y13E", // class name
  bases__ZN3ccc8DD9x2y13E, 2,
  &(vtc__ZN3ccc8DD9x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x2y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x2y13E),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  CC9x2y14  : virtual ::ccc::AA9 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC9x2y143pqrEv
  ~CC9x2y14(); // tgen
  CC9x2y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC9x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x2y143pqrEv");}
ccc::CC9x2y14 ::~CC9x2y14(){ note_dtor("_ZN3ccc8CC9x2y14E", this);} // tgen
ccc::CC9x2y14 ::CC9x2y14(){ note_ctor("_ZN3ccc8CC9x2y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x2y14E, buf);
    ::ccc::CC9x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x2y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC9x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x2y14E);
    dp->::ccc::CC9x2y14::~CC9x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x2y14E(Test__ZN3ccc8CC9x2y14E, "_ZN3ccc8CC9x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x2y14C1Ev();
extern void _ZN3ccc8CC9x2y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x2y14E[] = {
  NSPAIR(_ZN3ccc8CC9x2y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC9x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC9x2y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x2y143pqrEv,_ZTv0_n16_N3ccc8CC9x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x2y143pqrEv,_ZThn4_N3ccc8CC9x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x2y143pqrEv,_ZTv0_n16_N3ccc8CC9x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x2y14E[] = {
  {&(_ZTVN3ccc8CC9x2y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x2y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x2y14E[];
static VTBL_ENTRY alt_thunk_names1675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x2y143pqrEv,_ZTv0_n16_N3ccc8CC9x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x2y143pqrEv,_ZThn4_N3ccc8CC9x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x2y14E = {  "_ZN3ccc8CC9x2y14E", // class name
  bases__ZN3ccc8CC9x2y14E, 2,
  &(vtc__ZN3ccc8CC9x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x2y14E),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  DD9x2y14  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD9x2y143pqrEv
  ~DD9x2y14(); // tgen
  DD9x2y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x2y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD9x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x2y143pqrEv");}
ccc::DD9x2y14 ::~DD9x2y14(){ note_dtor("_ZN3ccc8DD9x2y14E", this);} // tgen
ccc::DD9x2y14 ::DD9x2y14(){ note_ctor("_ZN3ccc8DD9x2y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x2y14E, buf);
    ::ccc::DD9x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x2y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD9x2y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x2y14E);
    dp->::ccc::DD9x2y14::~DD9x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x2y14E(Test__ZN3ccc8DD9x2y14E, "_ZN3ccc8DD9x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x2y14C1Ev();
extern void _ZN3ccc8DD9x2y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x2y14E[] = {
  NSPAIR(_ZN3ccc8DD9x2y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD9x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x2y143pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x2y143pqrEv,_ZTv0_n20_N3ccc8DD9x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x2y143pqrEv,_ZThn4_N3ccc8DD9x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x2y143pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x2y143pqrEv,_ZTv0_n20_N3ccc8DD9x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x2y14E[] = {
  {&(_ZTVN3ccc8DD9x2y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x2y14E[];
static VTBL_ENTRY alt_thunk_names1676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x2y143pqrEv,_ZTv0_n20_N3ccc8DD9x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x2y143pqrEv,_ZThn4_N3ccc8DD9x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x2y14E = {  "_ZN3ccc8DD9x2y14E", // class name
  bases__ZN3ccc8DD9x2y14E, 2,
  &(vtc__ZN3ccc8DD9x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x2y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x2y14E),3, //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  CC9x2y15  : virtual ::ccc::AA9 , ::ccc::BB2 {
  ~CC9x2y15(); // tgen
  CC9x2y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x2y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC9x2y15 ::~CC9x2y15(){ note_dtor("_ZN3ccc8CC9x2y15E", this);} // tgen
ccc::CC9x2y15 ::CC9x2y15(){ note_ctor("_ZN3ccc8CC9x2y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x2y15E, buf);
    ::ccc::CC9x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x2y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC9x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x2y15E);
    dp->::ccc::CC9x2y15::~CC9x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x2y15E(Test__ZN3ccc8CC9x2y15E, "_ZN3ccc8CC9x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x2y15C1Ev();
extern void _ZN3ccc8CC9x2y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x2y15E[] = {
  NSPAIR(_ZN3ccc8CC9x2y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC9x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x2y15E[] = {
  {&(_ZTVN3ccc8CC9x2y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x2y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x2y15E[];
Class_Descriptor cd__ZN3ccc8CC9x2y15E = {  "_ZN3ccc8CC9x2y15E", // class name
  bases__ZN3ccc8CC9x2y15E, 2,
  &(vtc__ZN3ccc8CC9x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x2y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x2y15E),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  DD9x2y15  : virtual ::ccc::AA9 , virtual ::ccc::BB2 {
  ~DD9x2y15(); // tgen
  DD9x2y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x2y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD9x2y15 ::~DD9x2y15(){ note_dtor("_ZN3ccc8DD9x2y15E", this);} // tgen
ccc::DD9x2y15 ::DD9x2y15(){ note_ctor("_ZN3ccc8DD9x2y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x2y15E, buf);
    ::ccc::DD9x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x2y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD9x2y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x2y15E);
    dp->::ccc::DD9x2y15::~DD9x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x2y15E(Test__ZN3ccc8DD9x2y15E, "_ZN3ccc8DD9x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x2y15C1Ev();
extern void _ZN3ccc8DD9x2y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x2y15E[] = {
  NSPAIR(_ZN3ccc8DD9x2y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD9x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x2y15E[] = {
  {&(_ZTVN3ccc8DD9x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x2y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x2y15E[];
Class_Descriptor cd__ZN3ccc8DD9x2y15E = {  "_ZN3ccc8DD9x2y15E", // class name
  bases__ZN3ccc8DD9x2y15E, 2,
  &(vtc__ZN3ccc8DD9x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x2y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x2y15E),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  CC9x3y0  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y03pqrEv
  ~CC9x3y0(); // tgen
  CC9x3y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y0E) C1{ VBC2{ v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y03abcEv");}
void  ccc::CC9x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y03efgEv");}
void  ccc::CC9x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y03pqrEv");}
ccc::CC9x3y0 ::~CC9x3y0(){ note_dtor("_ZN3ccc7CC9x3y0E", this);} // tgen
ccc::CC9x3y0 ::CC9x3y0(){ note_ctor("_ZN3ccc7CC9x3y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y0E, buf);
    ::ccc::CC9x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y0E);
    dp->::ccc::CC9x3y0::~CC9x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y0E(Test__ZN3ccc7CC9x3y0E, "_ZN3ccc7CC9x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y0C1Ev();
extern void _ZN3ccc7CC9x3y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y0E[] = {
  NSPAIR(_ZN3ccc7CC9x3y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y0E[];
extern void _ZN3ccc7CC9x3y03efgEv();
extern void _ZN3ccc7CC9x3y03pqrEv();
extern void _ZN3ccc7CC9x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y03efgEv,_ZTv0_n12_N3ccc7CC9x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y03efgEv,_ZThn4_N3ccc7CC9x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y03pqrEv,_ZTv0_n16_N3ccc7CC9x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y03pqrEv,_ZThn4_N3ccc7CC9x3y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y03efgEv,_ZTv0_n12_N3ccc7CC9x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y03pqrEv,_ZTv0_n16_N3ccc7CC9x3y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y0E[] = {
  {&(_ZTVN3ccc7CC9x3y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y0E[];
static VTBL_ENTRY alt_thunk_names1677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y03pqrEv,_ZTv0_n16_N3ccc7CC9x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y03pqrEv,_ZThn4_N3ccc7CC9x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y03efgEv,_ZTv0_n12_N3ccc7CC9x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y03efgEv,_ZThn4_N3ccc7CC9x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y0E = {  "_ZN3ccc7CC9x3y0E", // class name
  bases__ZN3ccc7CC9x3y0E, 2,
  &(vtc__ZN3ccc7CC9x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y0E),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  DD9x3y0  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD9x3y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x3y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x3y03pqrEv
  ~DD9x3y0(); // tgen
  DD9x3y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y0E) C1{ VBC2{ v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x3y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y03abcEv");}
void  ccc::DD9x3y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y03efgEv");}
void  ccc::DD9x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y03pqrEv");}
ccc::DD9x3y0 ::~DD9x3y0(){ note_dtor("_ZN3ccc7DD9x3y0E", this);} // tgen
ccc::DD9x3y0 ::DD9x3y0(){ note_ctor("_ZN3ccc7DD9x3y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y0E, buf);
    ::ccc::DD9x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y0E);
    dp->::ccc::DD9x3y0::~DD9x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y0E(Test__ZN3ccc7DD9x3y0E, "_ZN3ccc7DD9x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y0C1Ev();
extern void _ZN3ccc7DD9x3y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y0E[] = {
  NSPAIR(_ZN3ccc7DD9x3y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y0E[];
extern void _ZN3ccc7DD9x3y03efgEv();
extern void _ZN3ccc7DD9x3y03pqrEv();
extern void _ZN3ccc7DD9x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y03efgEv,_ZTv0_n12_N3ccc7DD9x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y03efgEv,_ZThn4_N3ccc7DD9x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y03pqrEv,_ZTv0_n16_N3ccc7DD9x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y03pqrEv,_ZThn4_N3ccc7DD9x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y03abcEv,_ZTv0_n20_N3ccc7DD9x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y03abcEv,_ZThn4_N3ccc7DD9x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y03efgEv,_ZTv0_n12_N3ccc7DD9x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y03pqrEv,_ZTv0_n16_N3ccc7DD9x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y03abcEv,_ZTv0_n20_N3ccc7DD9x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y0E[] = {
  {&(_ZTVN3ccc7DD9x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y0E[];
static VTBL_ENTRY alt_thunk_names1678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y03abcEv,_ZTv0_n20_N3ccc7DD9x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y03abcEv,_ZThn4_N3ccc7DD9x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y03pqrEv,_ZTv0_n16_N3ccc7DD9x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y03pqrEv,_ZThn4_N3ccc7DD9x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y03efgEv,_ZTv0_n12_N3ccc7DD9x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y03efgEv,_ZThn4_N3ccc7DD9x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y0E = {  "_ZN3ccc7DD9x3y0E", // class name
  bases__ZN3ccc7DD9x3y0E, 2,
  &(vtc__ZN3ccc7DD9x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y0E),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  CC9x3y1  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x3y13efgEv
  ~CC9x3y1(); // tgen
  CC9x3y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y1E) C1{ VBC2{ v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y13abcEv");}
void  ccc::CC9x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y13pqrEv");}
void  ccc::CC9x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y13efgEv");}
ccc::CC9x3y1 ::~CC9x3y1(){ note_dtor("_ZN3ccc7CC9x3y1E", this);} // tgen
ccc::CC9x3y1 ::CC9x3y1(){ note_ctor("_ZN3ccc7CC9x3y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y1E, buf);
    ::ccc::CC9x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y1E);
    dp->::ccc::CC9x3y1::~CC9x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y1E(Test__ZN3ccc7CC9x3y1E, "_ZN3ccc7CC9x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y1C1Ev();
extern void _ZN3ccc7CC9x3y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y1E[] = {
  NSPAIR(_ZN3ccc7CC9x3y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y1E[];
extern void _ZN3ccc7CC9x3y13efgEv();
extern void _ZN3ccc7CC9x3y13pqrEv();
extern void _ZN3ccc7CC9x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y13efgEv,_ZTv0_n12_N3ccc7CC9x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y13efgEv,_ZThn4_N3ccc7CC9x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y13pqrEv,_ZTv0_n16_N3ccc7CC9x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y13pqrEv,_ZThn4_N3ccc7CC9x3y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y13efgEv,_ZTv0_n12_N3ccc7CC9x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y13pqrEv,_ZTv0_n16_N3ccc7CC9x3y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y1E[] = {
  {&(_ZTVN3ccc7CC9x3y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y1E[];
static VTBL_ENTRY alt_thunk_names1679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y13pqrEv,_ZTv0_n16_N3ccc7CC9x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y13pqrEv,_ZThn4_N3ccc7CC9x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y13efgEv,_ZTv0_n12_N3ccc7CC9x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y13efgEv,_ZThn4_N3ccc7CC9x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y1E = {  "_ZN3ccc7CC9x3y1E", // class name
  bases__ZN3ccc7CC9x3y1E, 2,
  &(vtc__ZN3ccc7CC9x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y1E),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  DD9x3y1  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD9x3y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x3y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x3y13efgEv
  ~DD9x3y1(); // tgen
  DD9x3y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y1E) C1{ VBC2{ v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x3y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y13abcEv");}
void  ccc::DD9x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y13pqrEv");}
void  ccc::DD9x3y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y13efgEv");}
ccc::DD9x3y1 ::~DD9x3y1(){ note_dtor("_ZN3ccc7DD9x3y1E", this);} // tgen
ccc::DD9x3y1 ::DD9x3y1(){ note_ctor("_ZN3ccc7DD9x3y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y1E, buf);
    ::ccc::DD9x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y1E);
    dp->::ccc::DD9x3y1::~DD9x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y1E(Test__ZN3ccc7DD9x3y1E, "_ZN3ccc7DD9x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y1C1Ev();
extern void _ZN3ccc7DD9x3y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y1E[] = {
  NSPAIR(_ZN3ccc7DD9x3y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y1E[];
extern void _ZN3ccc7DD9x3y13efgEv();
extern void _ZN3ccc7DD9x3y13pqrEv();
extern void _ZN3ccc7DD9x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y13efgEv,_ZTv0_n12_N3ccc7DD9x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y13efgEv,_ZThn4_N3ccc7DD9x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y13pqrEv,_ZTv0_n16_N3ccc7DD9x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y13pqrEv,_ZThn4_N3ccc7DD9x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y13abcEv,_ZTv0_n20_N3ccc7DD9x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y13abcEv,_ZThn4_N3ccc7DD9x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y13efgEv,_ZTv0_n12_N3ccc7DD9x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y13pqrEv,_ZTv0_n16_N3ccc7DD9x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y13abcEv,_ZTv0_n20_N3ccc7DD9x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y1E[] = {
  {&(_ZTVN3ccc7DD9x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y1E[];
static VTBL_ENTRY alt_thunk_names1680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y13abcEv,_ZTv0_n20_N3ccc7DD9x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y13abcEv,_ZThn4_N3ccc7DD9x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y13pqrEv,_ZTv0_n16_N3ccc7DD9x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y13pqrEv,_ZThn4_N3ccc7DD9x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y13efgEv,_ZTv0_n12_N3ccc7DD9x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y13efgEv,_ZThn4_N3ccc7DD9x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y1E = {  "_ZN3ccc7DD9x3y1E", // class name
  bases__ZN3ccc7DD9x3y1E, 2,
  &(vtc__ZN3ccc7DD9x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y1E),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  CC9x3y2  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y23pqrEv
  ~CC9x3y2(); // tgen
  CC9x3y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y2E) C1{ VBC2{ v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y23efgEv");}
void  ccc::CC9x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y23abcEv");}
void  ccc::CC9x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y23pqrEv");}
ccc::CC9x3y2 ::~CC9x3y2(){ note_dtor("_ZN3ccc7CC9x3y2E", this);} // tgen
ccc::CC9x3y2 ::CC9x3y2(){ note_ctor("_ZN3ccc7CC9x3y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y2E, buf);
    ::ccc::CC9x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y2E);
    dp->::ccc::CC9x3y2::~CC9x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y2E(Test__ZN3ccc7CC9x3y2E, "_ZN3ccc7CC9x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y2C1Ev();
extern void _ZN3ccc7CC9x3y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y2E[] = {
  NSPAIR(_ZN3ccc7CC9x3y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y2E[];
extern void _ZN3ccc7CC9x3y23efgEv();
extern void _ZN3ccc7CC9x3y23pqrEv();
extern void _ZN3ccc7CC9x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y23efgEv,_ZTv0_n12_N3ccc7CC9x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y23efgEv,_ZThn4_N3ccc7CC9x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y23pqrEv,_ZTv0_n16_N3ccc7CC9x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y23pqrEv,_ZThn4_N3ccc7CC9x3y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y23efgEv,_ZTv0_n12_N3ccc7CC9x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y23pqrEv,_ZTv0_n16_N3ccc7CC9x3y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y2E[] = {
  {&(_ZTVN3ccc7CC9x3y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y2E[];
static VTBL_ENTRY alt_thunk_names1681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y23pqrEv,_ZTv0_n16_N3ccc7CC9x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y23pqrEv,_ZThn4_N3ccc7CC9x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y23efgEv,_ZTv0_n12_N3ccc7CC9x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y23efgEv,_ZThn4_N3ccc7CC9x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y2E = {  "_ZN3ccc7CC9x3y2E", // class name
  bases__ZN3ccc7CC9x3y2E, 2,
  &(vtc__ZN3ccc7CC9x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y2E),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  DD9x3y2  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD9x3y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x3y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x3y23pqrEv
  ~DD9x3y2(); // tgen
  DD9x3y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y2E) C1{ VBC2{ v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x3y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y23efgEv");}
void  ccc::DD9x3y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y23abcEv");}
void  ccc::DD9x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y23pqrEv");}
ccc::DD9x3y2 ::~DD9x3y2(){ note_dtor("_ZN3ccc7DD9x3y2E", this);} // tgen
ccc::DD9x3y2 ::DD9x3y2(){ note_ctor("_ZN3ccc7DD9x3y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y2E, buf);
    ::ccc::DD9x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y2E);
    dp->::ccc::DD9x3y2::~DD9x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y2E(Test__ZN3ccc7DD9x3y2E, "_ZN3ccc7DD9x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y2C1Ev();
extern void _ZN3ccc7DD9x3y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y2E[] = {
  NSPAIR(_ZN3ccc7DD9x3y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y2E[];
extern void _ZN3ccc7DD9x3y23efgEv();
extern void _ZN3ccc7DD9x3y23pqrEv();
extern void _ZN3ccc7DD9x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y23efgEv,_ZTv0_n12_N3ccc7DD9x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y23efgEv,_ZThn4_N3ccc7DD9x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y23pqrEv,_ZTv0_n16_N3ccc7DD9x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y23pqrEv,_ZThn4_N3ccc7DD9x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y23abcEv,_ZTv0_n20_N3ccc7DD9x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y23abcEv,_ZThn4_N3ccc7DD9x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y23efgEv,_ZTv0_n12_N3ccc7DD9x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y23pqrEv,_ZTv0_n16_N3ccc7DD9x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y23abcEv,_ZTv0_n20_N3ccc7DD9x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y2E[] = {
  {&(_ZTVN3ccc7DD9x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y2E[];
static VTBL_ENTRY alt_thunk_names1682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y23abcEv,_ZTv0_n20_N3ccc7DD9x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y23abcEv,_ZThn4_N3ccc7DD9x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y23pqrEv,_ZTv0_n16_N3ccc7DD9x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y23pqrEv,_ZThn4_N3ccc7DD9x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y23efgEv,_ZTv0_n12_N3ccc7DD9x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y23efgEv,_ZThn4_N3ccc7DD9x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y2E = {  "_ZN3ccc7DD9x3y2E", // class name
  bases__ZN3ccc7DD9x3y2E, 2,
  &(vtc__ZN3ccc7DD9x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y2E),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  CC9x3y3  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x3y33abcEv
  ~CC9x3y3(); // tgen
  CC9x3y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y3E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y33efgEv");}
void  ccc::CC9x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y33pqrEv");}
void  ccc::CC9x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y33abcEv");}
ccc::CC9x3y3 ::~CC9x3y3(){ note_dtor("_ZN3ccc7CC9x3y3E", this);} // tgen
ccc::CC9x3y3 ::CC9x3y3(){ note_ctor("_ZN3ccc7CC9x3y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y3E, buf);
    ::ccc::CC9x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y3E);
    dp->::ccc::CC9x3y3::~CC9x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y3E(Test__ZN3ccc7CC9x3y3E, "_ZN3ccc7CC9x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y3C1Ev();
extern void _ZN3ccc7CC9x3y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y3E[] = {
  NSPAIR(_ZN3ccc7CC9x3y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y3E[];
extern void _ZN3ccc7CC9x3y33efgEv();
extern void _ZN3ccc7CC9x3y33pqrEv();
extern void _ZN3ccc7CC9x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y33efgEv,_ZTv0_n12_N3ccc7CC9x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y33efgEv,_ZThn4_N3ccc7CC9x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y33pqrEv,_ZTv0_n16_N3ccc7CC9x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y33pqrEv,_ZThn4_N3ccc7CC9x3y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y33efgEv,_ZTv0_n12_N3ccc7CC9x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y33pqrEv,_ZTv0_n16_N3ccc7CC9x3y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y3E[] = {
  {&(_ZTVN3ccc7CC9x3y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y3E[];
static VTBL_ENTRY alt_thunk_names1683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y33pqrEv,_ZTv0_n16_N3ccc7CC9x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y33pqrEv,_ZThn4_N3ccc7CC9x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y33efgEv,_ZTv0_n12_N3ccc7CC9x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y33efgEv,_ZThn4_N3ccc7CC9x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y3E = {  "_ZN3ccc7CC9x3y3E", // class name
  bases__ZN3ccc7CC9x3y3E, 2,
  &(vtc__ZN3ccc7CC9x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y3E),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  DD9x3y3  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD9x3y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x3y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x3y33abcEv
  ~DD9x3y3(); // tgen
  DD9x3y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y3E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x3y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y33efgEv");}
void  ccc::DD9x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y33pqrEv");}
void  ccc::DD9x3y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y33abcEv");}
ccc::DD9x3y3 ::~DD9x3y3(){ note_dtor("_ZN3ccc7DD9x3y3E", this);} // tgen
ccc::DD9x3y3 ::DD9x3y3(){ note_ctor("_ZN3ccc7DD9x3y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y3E, buf);
    ::ccc::DD9x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y3E);
    dp->::ccc::DD9x3y3::~DD9x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y3E(Test__ZN3ccc7DD9x3y3E, "_ZN3ccc7DD9x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y3C1Ev();
extern void _ZN3ccc7DD9x3y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y3E[] = {
  NSPAIR(_ZN3ccc7DD9x3y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y3E[];
extern void _ZN3ccc7DD9x3y33efgEv();
extern void _ZN3ccc7DD9x3y33pqrEv();
extern void _ZN3ccc7DD9x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y33efgEv,_ZTv0_n12_N3ccc7DD9x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y33efgEv,_ZThn4_N3ccc7DD9x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y33pqrEv,_ZTv0_n16_N3ccc7DD9x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y33pqrEv,_ZThn4_N3ccc7DD9x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y33abcEv,_ZTv0_n20_N3ccc7DD9x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y33abcEv,_ZThn4_N3ccc7DD9x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y33efgEv,_ZTv0_n12_N3ccc7DD9x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y33pqrEv,_ZTv0_n16_N3ccc7DD9x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y33abcEv,_ZTv0_n20_N3ccc7DD9x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y3E[] = {
  {&(_ZTVN3ccc7DD9x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y3E[];
static VTBL_ENTRY alt_thunk_names1684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y33abcEv,_ZTv0_n20_N3ccc7DD9x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y33abcEv,_ZThn4_N3ccc7DD9x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y33pqrEv,_ZTv0_n16_N3ccc7DD9x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y33pqrEv,_ZThn4_N3ccc7DD9x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y33efgEv,_ZTv0_n12_N3ccc7DD9x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y33efgEv,_ZThn4_N3ccc7DD9x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y3E = {  "_ZN3ccc7DD9x3y3E", // class name
  bases__ZN3ccc7DD9x3y3E, 2,
  &(vtc__ZN3ccc7DD9x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y3E),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  CC9x3y4  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC9x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x3y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x3y43efgEv
  ~CC9x3y4(); // tgen
  CC9x3y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y4E) C1{ VBC2{ v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y43pqrEv");}
void  ccc::CC9x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y43abcEv");}
void  ccc::CC9x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y43efgEv");}
ccc::CC9x3y4 ::~CC9x3y4(){ note_dtor("_ZN3ccc7CC9x3y4E", this);} // tgen
ccc::CC9x3y4 ::CC9x3y4(){ note_ctor("_ZN3ccc7CC9x3y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y4E, buf);
    ::ccc::CC9x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y4E);
    dp->::ccc::CC9x3y4::~CC9x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y4E(Test__ZN3ccc7CC9x3y4E, "_ZN3ccc7CC9x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y4C1Ev();
extern void _ZN3ccc7CC9x3y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y4E[] = {
  NSPAIR(_ZN3ccc7CC9x3y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y4E[];
extern void _ZN3ccc7CC9x3y43efgEv();
extern void _ZN3ccc7CC9x3y43pqrEv();
extern void _ZN3ccc7CC9x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y43efgEv,_ZTv0_n12_N3ccc7CC9x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y43efgEv,_ZThn4_N3ccc7CC9x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y43pqrEv,_ZTv0_n16_N3ccc7CC9x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y43pqrEv,_ZThn4_N3ccc7CC9x3y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y43efgEv,_ZTv0_n12_N3ccc7CC9x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y43pqrEv,_ZTv0_n16_N3ccc7CC9x3y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y4E[] = {
  {&(_ZTVN3ccc7CC9x3y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y4E[];
static VTBL_ENTRY alt_thunk_names1685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y43pqrEv,_ZTv0_n16_N3ccc7CC9x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y43pqrEv,_ZThn4_N3ccc7CC9x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y43efgEv,_ZTv0_n12_N3ccc7CC9x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y43efgEv,_ZThn4_N3ccc7CC9x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y4E = {  "_ZN3ccc7CC9x3y4E", // class name
  bases__ZN3ccc7CC9x3y4E, 2,
  &(vtc__ZN3ccc7CC9x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y4E),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  DD9x3y4  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD9x3y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x3y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x3y43efgEv
  ~DD9x3y4(); // tgen
  DD9x3y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y4E) C1{ VBC2{ v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y43pqrEv");}
void  ccc::DD9x3y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y43abcEv");}
void  ccc::DD9x3y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y43efgEv");}
ccc::DD9x3y4 ::~DD9x3y4(){ note_dtor("_ZN3ccc7DD9x3y4E", this);} // tgen
ccc::DD9x3y4 ::DD9x3y4(){ note_ctor("_ZN3ccc7DD9x3y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y4E, buf);
    ::ccc::DD9x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y4E);
    dp->::ccc::DD9x3y4::~DD9x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y4E(Test__ZN3ccc7DD9x3y4E, "_ZN3ccc7DD9x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y4C1Ev();
extern void _ZN3ccc7DD9x3y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y4E[] = {
  NSPAIR(_ZN3ccc7DD9x3y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y4E[];
extern void _ZN3ccc7DD9x3y43efgEv();
extern void _ZN3ccc7DD9x3y43pqrEv();
extern void _ZN3ccc7DD9x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y43efgEv,_ZTv0_n12_N3ccc7DD9x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y43efgEv,_ZThn4_N3ccc7DD9x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y43pqrEv,_ZTv0_n16_N3ccc7DD9x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y43pqrEv,_ZThn4_N3ccc7DD9x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y43abcEv,_ZTv0_n20_N3ccc7DD9x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y43abcEv,_ZThn4_N3ccc7DD9x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y43efgEv,_ZTv0_n12_N3ccc7DD9x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y43pqrEv,_ZTv0_n16_N3ccc7DD9x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y43abcEv,_ZTv0_n20_N3ccc7DD9x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y4E[] = {
  {&(_ZTVN3ccc7DD9x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y4E[];
static VTBL_ENTRY alt_thunk_names1686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y43abcEv,_ZTv0_n20_N3ccc7DD9x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y43abcEv,_ZThn4_N3ccc7DD9x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y43pqrEv,_ZTv0_n16_N3ccc7DD9x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y43pqrEv,_ZThn4_N3ccc7DD9x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y43efgEv,_ZTv0_n12_N3ccc7DD9x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y43efgEv,_ZThn4_N3ccc7DD9x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y4E = {  "_ZN3ccc7DD9x3y4E", // class name
  bases__ZN3ccc7DD9x3y4E, 2,
  &(vtc__ZN3ccc7DD9x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y4E),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  CC9x3y5  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7CC9x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x3y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x3y53abcEv
  ~CC9x3y5(); // tgen
  CC9x3y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y5E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y53pqrEv");}
void  ccc::CC9x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y53efgEv");}
void  ccc::CC9x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y53abcEv");}
ccc::CC9x3y5 ::~CC9x3y5(){ note_dtor("_ZN3ccc7CC9x3y5E", this);} // tgen
ccc::CC9x3y5 ::CC9x3y5(){ note_ctor("_ZN3ccc7CC9x3y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y5E, buf);
    ::ccc::CC9x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y5E);
    dp->::ccc::CC9x3y5::~CC9x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y5E(Test__ZN3ccc7CC9x3y5E, "_ZN3ccc7CC9x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y5C1Ev();
extern void _ZN3ccc7CC9x3y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y5E[] = {
  NSPAIR(_ZN3ccc7CC9x3y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y5E[];
extern void _ZN3ccc7CC9x3y53efgEv();
extern void _ZN3ccc7CC9x3y53pqrEv();
extern void _ZN3ccc7CC9x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y53efgEv,_ZTv0_n12_N3ccc7CC9x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y53efgEv,_ZThn4_N3ccc7CC9x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y53pqrEv,_ZTv0_n16_N3ccc7CC9x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y53pqrEv,_ZThn4_N3ccc7CC9x3y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y53efgEv,_ZTv0_n12_N3ccc7CC9x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y53pqrEv,_ZTv0_n16_N3ccc7CC9x3y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y5E[] = {
  {&(_ZTVN3ccc7CC9x3y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y5E[];
static VTBL_ENTRY alt_thunk_names1687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y53pqrEv,_ZTv0_n16_N3ccc7CC9x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y53pqrEv,_ZThn4_N3ccc7CC9x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y53efgEv,_ZTv0_n12_N3ccc7CC9x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y53efgEv,_ZThn4_N3ccc7CC9x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y5E = {  "_ZN3ccc7CC9x3y5E", // class name
  bases__ZN3ccc7CC9x3y5E, 2,
  &(vtc__ZN3ccc7CC9x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y5E),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  DD9x3y5  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc7DD9x3y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x3y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x3y53abcEv
  ~DD9x3y5(); // tgen
  DD9x3y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y5E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y53pqrEv");}
void  ccc::DD9x3y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y53efgEv");}
void  ccc::DD9x3y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y53abcEv");}
ccc::DD9x3y5 ::~DD9x3y5(){ note_dtor("_ZN3ccc7DD9x3y5E", this);} // tgen
ccc::DD9x3y5 ::DD9x3y5(){ note_ctor("_ZN3ccc7DD9x3y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y5E, buf);
    ::ccc::DD9x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y5E);
    dp->::ccc::DD9x3y5::~DD9x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y5E(Test__ZN3ccc7DD9x3y5E, "_ZN3ccc7DD9x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y5C1Ev();
extern void _ZN3ccc7DD9x3y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y5E[] = {
  NSPAIR(_ZN3ccc7DD9x3y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y5E[];
extern void _ZN3ccc7DD9x3y53efgEv();
extern void _ZN3ccc7DD9x3y53pqrEv();
extern void _ZN3ccc7DD9x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y53efgEv,_ZTv0_n12_N3ccc7DD9x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y53efgEv,_ZThn4_N3ccc7DD9x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y53pqrEv,_ZTv0_n16_N3ccc7DD9x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y53pqrEv,_ZThn4_N3ccc7DD9x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y53abcEv,_ZTv0_n20_N3ccc7DD9x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y53abcEv,_ZThn4_N3ccc7DD9x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y53efgEv,_ZTv0_n12_N3ccc7DD9x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y53pqrEv,_ZTv0_n16_N3ccc7DD9x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y53abcEv,_ZTv0_n20_N3ccc7DD9x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y5E[] = {
  {&(_ZTVN3ccc7DD9x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y5E[];
static VTBL_ENTRY alt_thunk_names1688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y53abcEv,_ZTv0_n20_N3ccc7DD9x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y53abcEv,_ZThn4_N3ccc7DD9x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y53pqrEv,_ZTv0_n16_N3ccc7DD9x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y53pqrEv,_ZThn4_N3ccc7DD9x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y53efgEv,_ZTv0_n12_N3ccc7DD9x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y53efgEv,_ZThn4_N3ccc7DD9x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y5E = {  "_ZN3ccc7DD9x3y5E", // class name
  bases__ZN3ccc7DD9x3y5E, 2,
  &(vtc__ZN3ccc7DD9x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y5E),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  CC9x3y6  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x3y63efgEv
  ~CC9x3y6(); // tgen
  CC9x3y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y6E) C1{ VBC2{ v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y63abcEv");}
void  ccc::CC9x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y63efgEv");}
ccc::CC9x3y6 ::~CC9x3y6(){ note_dtor("_ZN3ccc7CC9x3y6E", this);} // tgen
ccc::CC9x3y6 ::CC9x3y6(){ note_ctor("_ZN3ccc7CC9x3y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y6E, buf);
    ::ccc::CC9x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y6E);
    dp->::ccc::CC9x3y6::~CC9x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y6E(Test__ZN3ccc7CC9x3y6E, "_ZN3ccc7CC9x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y6C1Ev();
extern void _ZN3ccc7CC9x3y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y6E[] = {
  NSPAIR(_ZN3ccc7CC9x3y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y6E[];
extern void _ZN3ccc7CC9x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC9x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y63efgEv,_ZTv0_n12_N3ccc7CC9x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y63efgEv,_ZThn4_N3ccc7CC9x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y63efgEv,_ZTv0_n12_N3ccc7CC9x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y6E[] = {
  {&(_ZTVN3ccc7CC9x3y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y6E[];
static VTBL_ENTRY alt_thunk_names1689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y63efgEv,_ZTv0_n12_N3ccc7CC9x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y63efgEv,_ZThn4_N3ccc7CC9x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y6E = {  "_ZN3ccc7CC9x3y6E", // class name
  bases__ZN3ccc7CC9x3y6E, 2,
  &(vtc__ZN3ccc7CC9x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y6E),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  DD9x3y6  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD9x3y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x3y63efgEv
  ~DD9x3y6(); // tgen
  DD9x3y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y6E) C1{ VBC2{ v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x3y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y63abcEv");}
void  ccc::DD9x3y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y63efgEv");}
ccc::DD9x3y6 ::~DD9x3y6(){ note_dtor("_ZN3ccc7DD9x3y6E", this);} // tgen
ccc::DD9x3y6 ::DD9x3y6(){ note_ctor("_ZN3ccc7DD9x3y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y6E, buf);
    ::ccc::DD9x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y6E);
    dp->::ccc::DD9x3y6::~DD9x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y6E(Test__ZN3ccc7DD9x3y6E, "_ZN3ccc7DD9x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y6C1Ev();
extern void _ZN3ccc7DD9x3y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y6E[] = {
  NSPAIR(_ZN3ccc7DD9x3y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y6E[];
extern void _ZN3ccc7DD9x3y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x3y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y63efgEv,_ZTv0_n12_N3ccc7DD9x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y63efgEv,_ZThn4_N3ccc7DD9x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y63abcEv,_ZTv0_n20_N3ccc7DD9x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y63abcEv,_ZThn4_N3ccc7DD9x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y63efgEv,_ZTv0_n12_N3ccc7DD9x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y63abcEv,_ZTv0_n20_N3ccc7DD9x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y6E[] = {
  {&(_ZTVN3ccc7DD9x3y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y6E[];
static VTBL_ENTRY alt_thunk_names1690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y63abcEv,_ZTv0_n20_N3ccc7DD9x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y63abcEv,_ZThn4_N3ccc7DD9x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y63efgEv,_ZTv0_n12_N3ccc7DD9x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y63efgEv,_ZThn4_N3ccc7DD9x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y6E = {  "_ZN3ccc7DD9x3y6E", // class name
  bases__ZN3ccc7DD9x3y6E, 2,
  &(vtc__ZN3ccc7DD9x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y6E),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  CC9x3y7  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7CC9x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y73pqrEv
  ~CC9x3y7(); // tgen
  CC9x3y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y7E) C1{ VBC2{ v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y73abcEv");}
void  ccc::CC9x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y73pqrEv");}
ccc::CC9x3y7 ::~CC9x3y7(){ note_dtor("_ZN3ccc7CC9x3y7E", this);} // tgen
ccc::CC9x3y7 ::CC9x3y7(){ note_ctor("_ZN3ccc7CC9x3y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y7E, buf);
    ::ccc::CC9x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y7E);
    dp->::ccc::CC9x3y7::~CC9x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y7E(Test__ZN3ccc7CC9x3y7E, "_ZN3ccc7CC9x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y7C1Ev();
extern void _ZN3ccc7CC9x3y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y7E[] = {
  NSPAIR(_ZN3ccc7CC9x3y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc7CC9x3y73pqrEv();
extern void _ZN3ccc7CC9x3y73abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y73pqrEv,_ZTv0_n16_N3ccc7CC9x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y73pqrEv,_ZThn4_N3ccc7CC9x3y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y73pqrEv,_ZTv0_n16_N3ccc7CC9x3y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y7E[] = {
  {&(_ZTVN3ccc7CC9x3y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y7E[];
static VTBL_ENTRY alt_thunk_names1691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y73pqrEv,_ZTv0_n16_N3ccc7CC9x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y73pqrEv,_ZThn4_N3ccc7CC9x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y7E = {  "_ZN3ccc7CC9x3y7E", // class name
  bases__ZN3ccc7CC9x3y7E, 2,
  &(vtc__ZN3ccc7CC9x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y7E),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  DD9x3y7  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc7DD9x3y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x3y73pqrEv
  ~DD9x3y7(); // tgen
  DD9x3y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y7E) C1{ VBC2{ v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x3y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y73abcEv");}
void  ccc::DD9x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y73pqrEv");}
ccc::DD9x3y7 ::~DD9x3y7(){ note_dtor("_ZN3ccc7DD9x3y7E", this);} // tgen
ccc::DD9x3y7 ::DD9x3y7(){ note_ctor("_ZN3ccc7DD9x3y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y7E, buf);
    ::ccc::DD9x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y7E);
    dp->::ccc::DD9x3y7::~DD9x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y7E(Test__ZN3ccc7DD9x3y7E, "_ZN3ccc7DD9x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y7C1Ev();
extern void _ZN3ccc7DD9x3y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y7E[] = {
  NSPAIR(_ZN3ccc7DD9x3y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x3y73pqrEv();
extern void _ZN3ccc7DD9x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y73pqrEv,_ZTv0_n16_N3ccc7DD9x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y73pqrEv,_ZThn4_N3ccc7DD9x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y73abcEv,_ZTv0_n20_N3ccc7DD9x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y73abcEv,_ZThn4_N3ccc7DD9x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y73pqrEv,_ZTv0_n16_N3ccc7DD9x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y73abcEv,_ZTv0_n20_N3ccc7DD9x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y7E[] = {
  {&(_ZTVN3ccc7DD9x3y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y7E[];
static VTBL_ENTRY alt_thunk_names1692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y73abcEv,_ZTv0_n20_N3ccc7DD9x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y73abcEv,_ZThn4_N3ccc7DD9x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y73pqrEv,_ZTv0_n16_N3ccc7DD9x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y73pqrEv,_ZThn4_N3ccc7DD9x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y7E = {  "_ZN3ccc7DD9x3y7E", // class name
  bases__ZN3ccc7DD9x3y7E, 2,
  &(vtc__ZN3ccc7DD9x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y7E),3, //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  CC9x3y8  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x3y83abcEv
  ~CC9x3y8(); // tgen
  CC9x3y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y8E) C1{ VBC2{ v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y83efgEv");}
void  ccc::CC9x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x3y83abcEv");}
ccc::CC9x3y8 ::~CC9x3y8(){ note_dtor("_ZN3ccc7CC9x3y8E", this);} // tgen
ccc::CC9x3y8 ::CC9x3y8(){ note_ctor("_ZN3ccc7CC9x3y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y8E, buf);
    ::ccc::CC9x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y8E);
    dp->::ccc::CC9x3y8::~CC9x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y8E(Test__ZN3ccc7CC9x3y8E, "_ZN3ccc7CC9x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y8C1Ev();
extern void _ZN3ccc7CC9x3y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y8E[] = {
  NSPAIR(_ZN3ccc7CC9x3y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y8E[];
extern void _ZN3ccc7CC9x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc7CC9x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y83efgEv,_ZTv0_n12_N3ccc7CC9x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y83efgEv,_ZThn4_N3ccc7CC9x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y83efgEv,_ZTv0_n12_N3ccc7CC9x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y8E[] = {
  {&(_ZTVN3ccc7CC9x3y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y8E[];
static VTBL_ENTRY alt_thunk_names1693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y83efgEv,_ZTv0_n12_N3ccc7CC9x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y83efgEv,_ZThn4_N3ccc7CC9x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y8E = {  "_ZN3ccc7CC9x3y8E", // class name
  bases__ZN3ccc7CC9x3y8E, 2,
  &(vtc__ZN3ccc7CC9x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y8E),2, //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  DD9x3y8  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD9x3y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x3y83abcEv
  ~DD9x3y8(); // tgen
  DD9x3y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y8E) C1{ VBC2{ v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x3y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y83efgEv");}
void  ccc::DD9x3y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x3y83abcEv");}
ccc::DD9x3y8 ::~DD9x3y8(){ note_dtor("_ZN3ccc7DD9x3y8E", this);} // tgen
ccc::DD9x3y8 ::DD9x3y8(){ note_ctor("_ZN3ccc7DD9x3y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y8E, buf);
    ::ccc::DD9x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y8E);
    dp->::ccc::DD9x3y8::~DD9x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y8E(Test__ZN3ccc7DD9x3y8E, "_ZN3ccc7DD9x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y8C1Ev();
extern void _ZN3ccc7DD9x3y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y8E[] = {
  NSPAIR(_ZN3ccc7DD9x3y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y8E[];
extern void _ZN3ccc7DD9x3y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x3y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y83efgEv,_ZTv0_n12_N3ccc7DD9x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y83efgEv,_ZThn4_N3ccc7DD9x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x3y83abcEv,_ZTv0_n20_N3ccc7DD9x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y83abcEv,_ZThn4_N3ccc7DD9x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y83efgEv,_ZTv0_n12_N3ccc7DD9x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x3y83abcEv,_ZTv0_n20_N3ccc7DD9x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y8E[] = {
  {&(_ZTVN3ccc7DD9x3y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x3y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y8E[];
static VTBL_ENTRY alt_thunk_names1694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x3y83abcEv,_ZTv0_n20_N3ccc7DD9x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y83abcEv,_ZThn4_N3ccc7DD9x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y83efgEv,_ZTv0_n12_N3ccc7DD9x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y83efgEv,_ZThn4_N3ccc7DD9x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y8E = {  "_ZN3ccc7DD9x3y8E", // class name
  bases__ZN3ccc7DD9x3y8E, 2,
  &(vtc__ZN3ccc7DD9x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y8E),3, //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  CC9x3y9  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7CC9x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x3y93pqrEv
  ~CC9x3y9(); // tgen
  CC9x3y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x3y9E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x3y93efgEv");}
void  ccc::CC9x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x3y93pqrEv");}
ccc::CC9x3y9 ::~CC9x3y9(){ note_dtor("_ZN3ccc7CC9x3y9E", this);} // tgen
ccc::CC9x3y9 ::CC9x3y9(){ note_ctor("_ZN3ccc7CC9x3y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x3y9E, buf);
    ::ccc::CC9x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x3y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc7CC9x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x3y9E);
    dp->::ccc::CC9x3y9::~CC9x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x3y9E(Test__ZN3ccc7CC9x3y9E, "_ZN3ccc7CC9x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x3y9C1Ev();
extern void _ZN3ccc7CC9x3y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x3y9E[] = {
  NSPAIR(_ZN3ccc7CC9x3y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7CC9x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x3y9E[];
extern void _ZN3ccc7CC9x3y93efgEv();
extern void _ZN3ccc7CC9x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x3y93efgEv,_ZTv0_n12_N3ccc7CC9x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y93efgEv,_ZThn4_N3ccc7CC9x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x3y93pqrEv,_ZTv0_n16_N3ccc7CC9x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x3y93pqrEv,_ZThn4_N3ccc7CC9x3y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x3y93efgEv,_ZTv0_n12_N3ccc7CC9x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x3y93pqrEv,_ZTv0_n16_N3ccc7CC9x3y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x3y9E[] = {
  {&(_ZTVN3ccc7CC9x3y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x3y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x3y9E[];
static VTBL_ENTRY alt_thunk_names1695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x3y93pqrEv,_ZTv0_n16_N3ccc7CC9x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y93pqrEv,_ZThn4_N3ccc7CC9x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x3y93efgEv,_ZTv0_n12_N3ccc7CC9x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x3y93efgEv,_ZThn4_N3ccc7CC9x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x3y9E = {  "_ZN3ccc7CC9x3y9E", // class name
  bases__ZN3ccc7CC9x3y9E, 2,
  &(vtc__ZN3ccc7CC9x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x3y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x3y9E),2, //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  DD9x3y9  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc7DD9x3y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x3y93pqrEv
  ~DD9x3y9(); // tgen
  DD9x3y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x3y9E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x3y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x3y93efgEv");}
void  ccc::DD9x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x3y93pqrEv");}
ccc::DD9x3y9 ::~DD9x3y9(){ note_dtor("_ZN3ccc7DD9x3y9E", this);} // tgen
ccc::DD9x3y9 ::DD9x3y9(){ note_ctor("_ZN3ccc7DD9x3y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x3y9E, buf);
    ::ccc::DD9x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x3y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc7DD9x3y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x3y9E);
    dp->::ccc::DD9x3y9::~DD9x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x3y9E(Test__ZN3ccc7DD9x3y9E, "_ZN3ccc7DD9x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x3y9C1Ev();
extern void _ZN3ccc7DD9x3y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x3y9E[] = {
  NSPAIR(_ZN3ccc7DD9x3y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc7DD9x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y9E[];
extern void _ZN3ccc7DD9x3y93efgEv();
extern void _ZN3ccc7DD9x3y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x3y93efgEv,_ZTv0_n12_N3ccc7DD9x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y93efgEv,_ZThn4_N3ccc7DD9x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x3y93pqrEv,_ZTv0_n16_N3ccc7DD9x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x3y93pqrEv,_ZThn4_N3ccc7DD9x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x3y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x3y93efgEv,_ZTv0_n12_N3ccc7DD9x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x3y93pqrEv,_ZTv0_n16_N3ccc7DD9x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x3y9E[] = {
  {&(_ZTVN3ccc7DD9x3y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x3y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x3y9E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x3y9E[];
static VTBL_ENTRY alt_thunk_names1696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x3y93pqrEv,_ZTv0_n16_N3ccc7DD9x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y93pqrEv,_ZThn4_N3ccc7DD9x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x3y93efgEv,_ZTv0_n12_N3ccc7DD9x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x3y93efgEv,_ZThn4_N3ccc7DD9x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x3y9E = {  "_ZN3ccc7DD9x3y9E", // class name
  bases__ZN3ccc7DD9x3y9E, 2,
  &(vtc__ZN3ccc7DD9x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x3y9E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x3y9E),3, //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  CC9x3y10  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC9x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x3y103abcEv
  ~CC9x3y10(); // tgen
  CC9x3y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y10E) C1{ VBC2{ v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x3y103pqrEv");}
void  ccc::CC9x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x3y103abcEv");}
ccc::CC9x3y10 ::~CC9x3y10(){ note_dtor("_ZN3ccc8CC9x3y10E", this);} // tgen
ccc::CC9x3y10 ::CC9x3y10(){ note_ctor("_ZN3ccc8CC9x3y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x3y10E, buf);
    ::ccc::CC9x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x3y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC9x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x3y10E);
    dp->::ccc::CC9x3y10::~CC9x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x3y10E(Test__ZN3ccc8CC9x3y10E, "_ZN3ccc8CC9x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x3y10C1Ev();
extern void _ZN3ccc8CC9x3y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x3y10E[] = {
  NSPAIR(_ZN3ccc8CC9x3y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC9x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC9x3y103pqrEv();
extern void _ZN3ccc8CC9x3y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x3y103pqrEv,_ZTv0_n16_N3ccc8CC9x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y103pqrEv,_ZThn4_N3ccc8CC9x3y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x3y103pqrEv,_ZTv0_n16_N3ccc8CC9x3y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x3y10E[] = {
  {&(_ZTVN3ccc8CC9x3y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x3y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x3y10E[];
static VTBL_ENTRY alt_thunk_names1697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x3y103pqrEv,_ZTv0_n16_N3ccc8CC9x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x3y103pqrEv,_ZThn4_N3ccc8CC9x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x3y10E = {  "_ZN3ccc8CC9x3y10E", // class name
  bases__ZN3ccc8CC9x3y10E, 2,
  &(vtc__ZN3ccc8CC9x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x3y10E),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  DD9x3y10  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD9x3y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x3y103abcEv
  ~DD9x3y10(); // tgen
  DD9x3y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x3y10E) C1{ VBC2{ v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x3y103pqrEv");}
void  ccc::DD9x3y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x3y103abcEv");}
ccc::DD9x3y10 ::~DD9x3y10(){ note_dtor("_ZN3ccc8DD9x3y10E", this);} // tgen
ccc::DD9x3y10 ::DD9x3y10(){ note_ctor("_ZN3ccc8DD9x3y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x3y10E, buf);
    ::ccc::DD9x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x3y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD9x3y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x3y10E);
    dp->::ccc::DD9x3y10::~DD9x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x3y10E(Test__ZN3ccc8DD9x3y10E, "_ZN3ccc8DD9x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x3y10C1Ev();
extern void _ZN3ccc8DD9x3y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x3y10E[] = {
  NSPAIR(_ZN3ccc8DD9x3y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD9x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x3y103pqrEv();
extern void _ZN3ccc8DD9x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x3y103pqrEv,_ZTv0_n16_N3ccc8DD9x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y103pqrEv,_ZThn4_N3ccc8DD9x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x3y103abcEv,_ZTv0_n20_N3ccc8DD9x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y103abcEv,_ZThn4_N3ccc8DD9x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x3y103pqrEv,_ZTv0_n16_N3ccc8DD9x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x3y103abcEv,_ZTv0_n20_N3ccc8DD9x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x3y10E[] = {
  {&(_ZTVN3ccc8DD9x3y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x3y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x3y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x3y10E[];
static VTBL_ENTRY alt_thunk_names1698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x3y103abcEv,_ZTv0_n20_N3ccc8DD9x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y103abcEv,_ZThn4_N3ccc8DD9x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x3y103pqrEv,_ZTv0_n16_N3ccc8DD9x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y103pqrEv,_ZThn4_N3ccc8DD9x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x3y10E = {  "_ZN3ccc8DD9x3y10E", // class name
  bases__ZN3ccc8DD9x3y10E, 2,
  &(vtc__ZN3ccc8DD9x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x3y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x3y10E),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  CC9x3y11  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC9x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x3y113efgEv
  ~CC9x3y11(); // tgen
  CC9x3y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y11E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x3y113pqrEv");}
void  ccc::CC9x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x3y113efgEv");}
ccc::CC9x3y11 ::~CC9x3y11(){ note_dtor("_ZN3ccc8CC9x3y11E", this);} // tgen
ccc::CC9x3y11 ::CC9x3y11(){ note_ctor("_ZN3ccc8CC9x3y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x3y11E, buf);
    ::ccc::CC9x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x3y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC9x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x3y11E);
    dp->::ccc::CC9x3y11::~CC9x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x3y11E(Test__ZN3ccc8CC9x3y11E, "_ZN3ccc8CC9x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x3y11C1Ev();
extern void _ZN3ccc8CC9x3y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x3y11E[] = {
  NSPAIR(_ZN3ccc8CC9x3y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC9x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x3y11E[];
extern void _ZN3ccc8CC9x3y113efgEv();
extern void _ZN3ccc8CC9x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x3y113efgEv,_ZTv0_n12_N3ccc8CC9x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y113efgEv,_ZThn4_N3ccc8CC9x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x3y113pqrEv,_ZTv0_n16_N3ccc8CC9x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y113pqrEv,_ZThn4_N3ccc8CC9x3y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x3y113efgEv,_ZTv0_n12_N3ccc8CC9x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x3y113pqrEv,_ZTv0_n16_N3ccc8CC9x3y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x3y11E[] = {
  {&(_ZTVN3ccc8CC9x3y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x3y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x3y11E[];
static VTBL_ENTRY alt_thunk_names1699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x3y113pqrEv,_ZTv0_n16_N3ccc8CC9x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x3y113pqrEv,_ZThn4_N3ccc8CC9x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x3y113efgEv,_ZTv0_n12_N3ccc8CC9x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x3y113efgEv,_ZThn4_N3ccc8CC9x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x3y11E = {  "_ZN3ccc8CC9x3y11E", // class name
  bases__ZN3ccc8CC9x3y11E, 2,
  &(vtc__ZN3ccc8CC9x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x3y11E),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  DD9x3y11  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD9x3y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x3y113efgEv
  ~DD9x3y11(); // tgen
  DD9x3y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x3y11E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x3y113pqrEv");}
void  ccc::DD9x3y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x3y113efgEv");}
ccc::DD9x3y11 ::~DD9x3y11(){ note_dtor("_ZN3ccc8DD9x3y11E", this);} // tgen
ccc::DD9x3y11 ::DD9x3y11(){ note_ctor("_ZN3ccc8DD9x3y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x3y11E, buf);
    ::ccc::DD9x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x3y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD9x3y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x3y11E);
    dp->::ccc::DD9x3y11::~DD9x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x3y11E(Test__ZN3ccc8DD9x3y11E, "_ZN3ccc8DD9x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x3y11C1Ev();
extern void _ZN3ccc8DD9x3y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x3y11E[] = {
  NSPAIR(_ZN3ccc8DD9x3y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD9x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y11E[];
extern void _ZN3ccc8DD9x3y113efgEv();
extern void _ZN3ccc8DD9x3y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x3y113efgEv,_ZTv0_n12_N3ccc8DD9x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y113efgEv,_ZThn4_N3ccc8DD9x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x3y113pqrEv,_ZTv0_n16_N3ccc8DD9x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y113pqrEv,_ZThn4_N3ccc8DD9x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x3y113efgEv,_ZTv0_n12_N3ccc8DD9x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x3y113pqrEv,_ZTv0_n16_N3ccc8DD9x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x3y11E[] = {
  {&(_ZTVN3ccc8DD9x3y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y11E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x3y11E[];
static VTBL_ENTRY alt_thunk_names1700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x3y113pqrEv,_ZTv0_n16_N3ccc8DD9x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y113pqrEv,_ZThn4_N3ccc8DD9x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x3y113efgEv,_ZTv0_n12_N3ccc8DD9x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y113efgEv,_ZThn4_N3ccc8DD9x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x3y11E = {  "_ZN3ccc8DD9x3y11E", // class name
  bases__ZN3ccc8DD9x3y11E, 2,
  &(vtc__ZN3ccc8DD9x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x3y11E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x3y11E),3, //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  CC9x3y12  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC9x3y123abcEv
  ~CC9x3y12(); // tgen
  CC9x3y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y12E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC9x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x3y123abcEv");}
ccc::CC9x3y12 ::~CC9x3y12(){ note_dtor("_ZN3ccc8CC9x3y12E", this);} // tgen
ccc::CC9x3y12 ::CC9x3y12(){ note_ctor("_ZN3ccc8CC9x3y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x3y12E, buf);
    ::ccc::CC9x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x3y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC9x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x3y12E);
    dp->::ccc::CC9x3y12::~CC9x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x3y12E(Test__ZN3ccc8CC9x3y12E, "_ZN3ccc8CC9x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x3y12C1Ev();
extern void _ZN3ccc8CC9x3y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x3y12E[] = {
  NSPAIR(_ZN3ccc8CC9x3y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC9x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC9x3y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x3y12E[] = {
  {&(_ZTVN3ccc8CC9x3y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x3y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x3y12E[];
Class_Descriptor cd__ZN3ccc8CC9x3y12E = {  "_ZN3ccc8CC9x3y12E", // class name
  bases__ZN3ccc8CC9x3y12E, 2,
  &(vtc__ZN3ccc8CC9x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x3y12E),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  DD9x3y12  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD9x3y123abcEv
  ~DD9x3y12(); // tgen
  DD9x3y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x3y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD9x3y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x3y123abcEv");}
ccc::DD9x3y12 ::~DD9x3y12(){ note_dtor("_ZN3ccc8DD9x3y12E", this);} // tgen
ccc::DD9x3y12 ::DD9x3y12(){ note_ctor("_ZN3ccc8DD9x3y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x3y12E, buf);
    ::ccc::DD9x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x3y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD9x3y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x3y12E);
    dp->::ccc::DD9x3y12::~DD9x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x3y12E(Test__ZN3ccc8DD9x3y12E, "_ZN3ccc8DD9x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x3y12C1Ev();
extern void _ZN3ccc8DD9x3y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x3y12E[] = {
  NSPAIR(_ZN3ccc8DD9x3y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD9x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x3y123abcEv,_ZTv0_n20_N3ccc8DD9x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y123abcEv,_ZThn4_N3ccc8DD9x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x3y123abcEv,_ZTv0_n20_N3ccc8DD9x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x3y12E[] = {
  {&(_ZTVN3ccc8DD9x3y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x3y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x3y12E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x3y12E[];
static VTBL_ENTRY alt_thunk_names1701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x3y123abcEv,_ZTv0_n20_N3ccc8DD9x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y123abcEv,_ZThn4_N3ccc8DD9x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x3y12E = {  "_ZN3ccc8DD9x3y12E", // class name
  bases__ZN3ccc8DD9x3y12E, 2,
  &(vtc__ZN3ccc8DD9x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x3y12E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x3y12E),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  CC9x3y13  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC9x3y133efgEv
  ~CC9x3y13(); // tgen
  CC9x3y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x3y133efgEv");}
ccc::CC9x3y13 ::~CC9x3y13(){ note_dtor("_ZN3ccc8CC9x3y13E", this);} // tgen
ccc::CC9x3y13 ::CC9x3y13(){ note_ctor("_ZN3ccc8CC9x3y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x3y13E, buf);
    ::ccc::CC9x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x3y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC9x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x3y13E);
    dp->::ccc::CC9x3y13::~CC9x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x3y13E(Test__ZN3ccc8CC9x3y13E, "_ZN3ccc8CC9x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x3y13C1Ev();
extern void _ZN3ccc8CC9x3y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x3y13E[] = {
  NSPAIR(_ZN3ccc8CC9x3y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC9x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x3y13E[];
extern void _ZN3ccc8CC9x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x3y133efgEv,_ZTv0_n12_N3ccc8CC9x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y133efgEv,_ZThn4_N3ccc8CC9x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x3y133efgEv,_ZTv0_n12_N3ccc8CC9x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x3y13E[] = {
  {&(_ZTVN3ccc8CC9x3y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x3y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x3y13E[];
static VTBL_ENTRY alt_thunk_names1702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x3y133efgEv,_ZTv0_n12_N3ccc8CC9x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x3y133efgEv,_ZThn4_N3ccc8CC9x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x3y13E = {  "_ZN3ccc8CC9x3y13E", // class name
  bases__ZN3ccc8CC9x3y13E, 2,
  &(vtc__ZN3ccc8CC9x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x3y13E),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  DD9x3y13  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD9x3y133efgEv
  ~DD9x3y13(); // tgen
  DD9x3y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x3y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x3y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x3y133efgEv");}
ccc::DD9x3y13 ::~DD9x3y13(){ note_dtor("_ZN3ccc8DD9x3y13E", this);} // tgen
ccc::DD9x3y13 ::DD9x3y13(){ note_ctor("_ZN3ccc8DD9x3y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x3y13E, buf);
    ::ccc::DD9x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x3y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD9x3y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x3y13E);
    dp->::ccc::DD9x3y13::~DD9x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x3y13E(Test__ZN3ccc8DD9x3y13E, "_ZN3ccc8DD9x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x3y13C1Ev();
extern void _ZN3ccc8DD9x3y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x3y13E[] = {
  NSPAIR(_ZN3ccc8DD9x3y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD9x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y13E[];
extern void _ZN3ccc8DD9x3y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x3y133efgEv,_ZTv0_n12_N3ccc8DD9x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y133efgEv,_ZThn4_N3ccc8DD9x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x3y133efgEv,_ZTv0_n12_N3ccc8DD9x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x3y13E[] = {
  {&(_ZTVN3ccc8DD9x3y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x3y13E[];
static VTBL_ENTRY alt_thunk_names1703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x3y133efgEv,_ZTv0_n12_N3ccc8DD9x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y133efgEv,_ZThn4_N3ccc8DD9x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x3y13E = {  "_ZN3ccc8DD9x3y13E", // class name
  bases__ZN3ccc8DD9x3y13E, 2,
  &(vtc__ZN3ccc8DD9x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x3y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x3y13E),3, //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  CC9x3y14  : virtual ::ccc::AA9 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC9x3y143pqrEv
  ~CC9x3y14(); // tgen
  CC9x3y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC9x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x3y143pqrEv");}
ccc::CC9x3y14 ::~CC9x3y14(){ note_dtor("_ZN3ccc8CC9x3y14E", this);} // tgen
ccc::CC9x3y14 ::CC9x3y14(){ note_ctor("_ZN3ccc8CC9x3y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x3y14E, buf);
    ::ccc::CC9x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x3y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC9x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x3y14E);
    dp->::ccc::CC9x3y14::~CC9x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x3y14E(Test__ZN3ccc8CC9x3y14E, "_ZN3ccc8CC9x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x3y14C1Ev();
extern void _ZN3ccc8CC9x3y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x3y14E[] = {
  NSPAIR(_ZN3ccc8CC9x3y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC9x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC9x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x3y143pqrEv,_ZTv0_n16_N3ccc8CC9x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x3y143pqrEv,_ZThn4_N3ccc8CC9x3y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x3y143pqrEv,_ZTv0_n16_N3ccc8CC9x3y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x3y14E[] = {
  {&(_ZTVN3ccc8CC9x3y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x3y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x3y14E[];
static VTBL_ENTRY alt_thunk_names1704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x3y143pqrEv,_ZTv0_n16_N3ccc8CC9x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x3y143pqrEv,_ZThn4_N3ccc8CC9x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x3y14E = {  "_ZN3ccc8CC9x3y14E", // class name
  bases__ZN3ccc8CC9x3y14E, 2,
  &(vtc__ZN3ccc8CC9x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x3y14E),2, //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  DD9x3y14  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD9x3y143pqrEv
  ~DD9x3y14(); // tgen
  DD9x3y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x3y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD9x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x3y143pqrEv");}
ccc::DD9x3y14 ::~DD9x3y14(){ note_dtor("_ZN3ccc8DD9x3y14E", this);} // tgen
ccc::DD9x3y14 ::DD9x3y14(){ note_ctor("_ZN3ccc8DD9x3y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x3y14E, buf);
    ::ccc::DD9x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x3y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD9x3y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x3y14E);
    dp->::ccc::DD9x3y14::~DD9x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x3y14E(Test__ZN3ccc8DD9x3y14E, "_ZN3ccc8DD9x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x3y14C1Ev();
extern void _ZN3ccc8DD9x3y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x3y14E[] = {
  NSPAIR(_ZN3ccc8DD9x3y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD9x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x3y143pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x3y143pqrEv,_ZTv0_n16_N3ccc8DD9x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x3y143pqrEv,_ZThn4_N3ccc8DD9x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x3y143pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x3y143pqrEv,_ZTv0_n16_N3ccc8DD9x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x3y14E[] = {
  {&(_ZTVN3ccc8DD9x3y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x3y14E[];
static VTBL_ENTRY alt_thunk_names1705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x3y143pqrEv,_ZTv0_n16_N3ccc8DD9x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x3y143pqrEv,_ZThn4_N3ccc8DD9x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x3y14E = {  "_ZN3ccc8DD9x3y14E", // class name
  bases__ZN3ccc8DD9x3y14E, 2,
  &(vtc__ZN3ccc8DD9x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x3y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x3y14E),3, //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  CC9x3y15  : virtual ::ccc::AA9 , ::ccc::BB3 {
  ~CC9x3y15(); // tgen
  CC9x3y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x3y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC9x3y15 ::~CC9x3y15(){ note_dtor("_ZN3ccc8CC9x3y15E", this);} // tgen
ccc::CC9x3y15 ::CC9x3y15(){ note_ctor("_ZN3ccc8CC9x3y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x3y15E, buf);
    ::ccc::CC9x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x3y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC9x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x3y15E);
    dp->::ccc::CC9x3y15::~CC9x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x3y15E(Test__ZN3ccc8CC9x3y15E, "_ZN3ccc8CC9x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x3y15C1Ev();
extern void _ZN3ccc8CC9x3y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x3y15E[] = {
  NSPAIR(_ZN3ccc8CC9x3y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC9x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x3y15E[] = {
  {&(_ZTVN3ccc8CC9x3y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x3y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x3y15E[];
Class_Descriptor cd__ZN3ccc8CC9x3y15E = {  "_ZN3ccc8CC9x3y15E", // class name
  bases__ZN3ccc8CC9x3y15E, 2,
  &(vtc__ZN3ccc8CC9x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x3y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x3y15E),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  DD9x3y15  : virtual ::ccc::AA9 , virtual ::ccc::BB3 {
  ~DD9x3y15(); // tgen
  DD9x3y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x3y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD9x3y15 ::~DD9x3y15(){ note_dtor("_ZN3ccc8DD9x3y15E", this);} // tgen
ccc::DD9x3y15 ::DD9x3y15(){ note_ctor("_ZN3ccc8DD9x3y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x3y15E, buf);
    ::ccc::DD9x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x3y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD9x3y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x3y15E);
    dp->::ccc::DD9x3y15::~DD9x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x3y15E(Test__ZN3ccc8DD9x3y15E, "_ZN3ccc8DD9x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x3y15C1Ev();
extern void _ZN3ccc8DD9x3y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x3y15E[] = {
  NSPAIR(_ZN3ccc8DD9x3y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD9x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x3y15E[] = {
  {&(_ZTVN3ccc8DD9x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x3y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x3y15E[];
Class_Descriptor cd__ZN3ccc8DD9x3y15E = {  "_ZN3ccc8DD9x3y15E", // class name
  bases__ZN3ccc8DD9x3y15E, 2,
  &(vtc__ZN3ccc8DD9x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x3y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x3y15E),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  CC9x4y0  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y03pqrEv
  ~CC9x4y0(); // tgen
  CC9x4y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y0E) C1{ VBC2{ v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y03abcEv");}
void  ccc::CC9x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y03efgEv");}
void  ccc::CC9x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y03pqrEv");}
ccc::CC9x4y0 ::~CC9x4y0(){ note_dtor("_ZN3ccc7CC9x4y0E", this);} // tgen
ccc::CC9x4y0 ::CC9x4y0(){ note_ctor("_ZN3ccc7CC9x4y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y0E, buf);
    ::ccc::CC9x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y0E);
    dp->::ccc::CC9x4y0::~CC9x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y0E(Test__ZN3ccc7CC9x4y0E, "_ZN3ccc7CC9x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y0C1Ev();
extern void _ZN3ccc7CC9x4y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y0E[] = {
  NSPAIR(_ZN3ccc7CC9x4y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y0E[];
extern void _ZN3ccc7CC9x4y03pqrEv();
extern void _ZN3ccc7CC9x4y03abcEv();
extern void _ZN3ccc7CC9x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y03efgEv,_ZTv0_n12_N3ccc7CC9x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y03efgEv,_ZThn4_N3ccc7CC9x4y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y03pqrEv,_ZTv0_n16_N3ccc7CC9x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y03pqrEv,_ZThn4_N3ccc7CC9x4y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y03efgEv,_ZTv0_n12_N3ccc7CC9x4y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y03pqrEv,_ZTv0_n16_N3ccc7CC9x4y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y0E[] = {
  {&(_ZTVN3ccc7CC9x4y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y0E[];
static VTBL_ENTRY alt_thunk_names1706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y03pqrEv,_ZTv0_n16_N3ccc7CC9x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y03pqrEv,_ZThn4_N3ccc7CC9x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y03efgEv,_ZTv0_n12_N3ccc7CC9x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y03efgEv,_ZThn4_N3ccc7CC9x4y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y0E = {  "_ZN3ccc7CC9x4y0E", // class name
  bases__ZN3ccc7CC9x4y0E, 2,
  &(vtc__ZN3ccc7CC9x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y0E),2, //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  DD9x4y0  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD9x4y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x4y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x4y03pqrEv
  ~DD9x4y0(); // tgen
  DD9x4y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y0E) C1{ VBC2{ v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x4y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y03abcEv");}
void  ccc::DD9x4y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y03efgEv");}
void  ccc::DD9x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y03pqrEv");}
ccc::DD9x4y0 ::~DD9x4y0(){ note_dtor("_ZN3ccc7DD9x4y0E", this);} // tgen
ccc::DD9x4y0 ::DD9x4y0(){ note_ctor("_ZN3ccc7DD9x4y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y0E, buf);
    ::ccc::DD9x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y0E);
    dp->::ccc::DD9x4y0::~DD9x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y0E(Test__ZN3ccc7DD9x4y0E, "_ZN3ccc7DD9x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y0C1Ev();
extern void _ZN3ccc7DD9x4y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y0E[] = {
  NSPAIR(_ZN3ccc7DD9x4y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y0E[];
extern void _ZN3ccc7DD9x4y03efgEv();
extern void _ZN3ccc7DD9x4y03pqrEv();
extern void _ZN3ccc7DD9x4y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y03pqrEv,_ZTv0_n12_N3ccc7DD9x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y03pqrEv,_ZThn4_N3ccc7DD9x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y03abcEv,_ZTv0_n16_N3ccc7DD9x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y03abcEv,_ZThn4_N3ccc7DD9x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y03efgEv,_ZTv0_n20_N3ccc7DD9x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y03efgEv,_ZThn4_N3ccc7DD9x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y03pqrEv,_ZTv0_n12_N3ccc7DD9x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y03abcEv,_ZTv0_n16_N3ccc7DD9x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y03efgEv,_ZTv0_n20_N3ccc7DD9x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y0E[] = {
  {&(_ZTVN3ccc7DD9x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y0E[];
static VTBL_ENTRY alt_thunk_names1707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y03efgEv,_ZTv0_n20_N3ccc7DD9x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y03efgEv,_ZThn4_N3ccc7DD9x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y03abcEv,_ZTv0_n16_N3ccc7DD9x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y03abcEv,_ZThn4_N3ccc7DD9x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y03pqrEv,_ZTv0_n12_N3ccc7DD9x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y03pqrEv,_ZThn4_N3ccc7DD9x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y0E = {  "_ZN3ccc7DD9x4y0E", // class name
  bases__ZN3ccc7DD9x4y0E, 2,
  &(vtc__ZN3ccc7DD9x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y0E),3, //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  CC9x4y1  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x4y13efgEv
  ~CC9x4y1(); // tgen
  CC9x4y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y1E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y13abcEv");}
void  ccc::CC9x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y13pqrEv");}
void  ccc::CC9x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y13efgEv");}
ccc::CC9x4y1 ::~CC9x4y1(){ note_dtor("_ZN3ccc7CC9x4y1E", this);} // tgen
ccc::CC9x4y1 ::CC9x4y1(){ note_ctor("_ZN3ccc7CC9x4y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y1E, buf);
    ::ccc::CC9x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y1E);
    dp->::ccc::CC9x4y1::~CC9x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y1E(Test__ZN3ccc7CC9x4y1E, "_ZN3ccc7CC9x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y1C1Ev();
extern void _ZN3ccc7CC9x4y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y1E[] = {
  NSPAIR(_ZN3ccc7CC9x4y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y1E[];
extern void _ZN3ccc7CC9x4y13pqrEv();
extern void _ZN3ccc7CC9x4y13abcEv();
extern void _ZN3ccc7CC9x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y13efgEv,_ZTv0_n12_N3ccc7CC9x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y13efgEv,_ZThn4_N3ccc7CC9x4y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y13pqrEv,_ZTv0_n16_N3ccc7CC9x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y13pqrEv,_ZThn4_N3ccc7CC9x4y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y13efgEv,_ZTv0_n12_N3ccc7CC9x4y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y13pqrEv,_ZTv0_n16_N3ccc7CC9x4y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y1E[] = {
  {&(_ZTVN3ccc7CC9x4y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y1E[];
static VTBL_ENTRY alt_thunk_names1708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y13pqrEv,_ZTv0_n16_N3ccc7CC9x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y13pqrEv,_ZThn4_N3ccc7CC9x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y13efgEv,_ZTv0_n12_N3ccc7CC9x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y13efgEv,_ZThn4_N3ccc7CC9x4y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y1E = {  "_ZN3ccc7CC9x4y1E", // class name
  bases__ZN3ccc7CC9x4y1E, 2,
  &(vtc__ZN3ccc7CC9x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y1E),2, //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  DD9x4y1  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD9x4y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x4y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x4y13efgEv
  ~DD9x4y1(); // tgen
  DD9x4y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y1E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x4y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y13abcEv");}
void  ccc::DD9x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y13pqrEv");}
void  ccc::DD9x4y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y13efgEv");}
ccc::DD9x4y1 ::~DD9x4y1(){ note_dtor("_ZN3ccc7DD9x4y1E", this);} // tgen
ccc::DD9x4y1 ::DD9x4y1(){ note_ctor("_ZN3ccc7DD9x4y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y1E, buf);
    ::ccc::DD9x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y1E);
    dp->::ccc::DD9x4y1::~DD9x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y1E(Test__ZN3ccc7DD9x4y1E, "_ZN3ccc7DD9x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y1C1Ev();
extern void _ZN3ccc7DD9x4y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y1E[] = {
  NSPAIR(_ZN3ccc7DD9x4y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y1E[];
extern void _ZN3ccc7DD9x4y13efgEv();
extern void _ZN3ccc7DD9x4y13pqrEv();
extern void _ZN3ccc7DD9x4y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y13pqrEv,_ZTv0_n12_N3ccc7DD9x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y13pqrEv,_ZThn4_N3ccc7DD9x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y13abcEv,_ZTv0_n16_N3ccc7DD9x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y13abcEv,_ZThn4_N3ccc7DD9x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y13efgEv,_ZTv0_n20_N3ccc7DD9x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y13efgEv,_ZThn4_N3ccc7DD9x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y13pqrEv,_ZTv0_n12_N3ccc7DD9x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y13abcEv,_ZTv0_n16_N3ccc7DD9x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y13efgEv,_ZTv0_n20_N3ccc7DD9x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y1E[] = {
  {&(_ZTVN3ccc7DD9x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y1E[];
static VTBL_ENTRY alt_thunk_names1709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y13efgEv,_ZTv0_n20_N3ccc7DD9x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y13efgEv,_ZThn4_N3ccc7DD9x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y13abcEv,_ZTv0_n16_N3ccc7DD9x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y13abcEv,_ZThn4_N3ccc7DD9x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y13pqrEv,_ZTv0_n12_N3ccc7DD9x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y13pqrEv,_ZThn4_N3ccc7DD9x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y1E = {  "_ZN3ccc7DD9x4y1E", // class name
  bases__ZN3ccc7DD9x4y1E, 2,
  &(vtc__ZN3ccc7DD9x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y1E),3, //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  CC9x4y2  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y23pqrEv
  ~CC9x4y2(); // tgen
  CC9x4y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y2E) C1{ VBC2{ v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y23efgEv");}
void  ccc::CC9x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y23abcEv");}
void  ccc::CC9x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y23pqrEv");}
ccc::CC9x4y2 ::~CC9x4y2(){ note_dtor("_ZN3ccc7CC9x4y2E", this);} // tgen
ccc::CC9x4y2 ::CC9x4y2(){ note_ctor("_ZN3ccc7CC9x4y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y2E, buf);
    ::ccc::CC9x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y2E);
    dp->::ccc::CC9x4y2::~CC9x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y2E(Test__ZN3ccc7CC9x4y2E, "_ZN3ccc7CC9x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y2C1Ev();
extern void _ZN3ccc7CC9x4y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y2E[] = {
  NSPAIR(_ZN3ccc7CC9x4y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y2E[];
extern void _ZN3ccc7CC9x4y23pqrEv();
extern void _ZN3ccc7CC9x4y23abcEv();
extern void _ZN3ccc7CC9x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y23efgEv,_ZTv0_n12_N3ccc7CC9x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y23efgEv,_ZThn4_N3ccc7CC9x4y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y23pqrEv,_ZTv0_n16_N3ccc7CC9x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y23pqrEv,_ZThn4_N3ccc7CC9x4y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y23efgEv,_ZTv0_n12_N3ccc7CC9x4y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y23pqrEv,_ZTv0_n16_N3ccc7CC9x4y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y2E[] = {
  {&(_ZTVN3ccc7CC9x4y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y2E[];
static VTBL_ENTRY alt_thunk_names1710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y23pqrEv,_ZTv0_n16_N3ccc7CC9x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y23pqrEv,_ZThn4_N3ccc7CC9x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y23efgEv,_ZTv0_n12_N3ccc7CC9x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y23efgEv,_ZThn4_N3ccc7CC9x4y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y2E = {  "_ZN3ccc7CC9x4y2E", // class name
  bases__ZN3ccc7CC9x4y2E, 2,
  &(vtc__ZN3ccc7CC9x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y2E),2, //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  DD9x4y2  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD9x4y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x4y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x4y23pqrEv
  ~DD9x4y2(); // tgen
  DD9x4y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y2E) C1{ VBC2{ v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x4y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y23efgEv");}
void  ccc::DD9x4y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y23abcEv");}
void  ccc::DD9x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y23pqrEv");}
ccc::DD9x4y2 ::~DD9x4y2(){ note_dtor("_ZN3ccc7DD9x4y2E", this);} // tgen
ccc::DD9x4y2 ::DD9x4y2(){ note_ctor("_ZN3ccc7DD9x4y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y2E, buf);
    ::ccc::DD9x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y2E);
    dp->::ccc::DD9x4y2::~DD9x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y2E(Test__ZN3ccc7DD9x4y2E, "_ZN3ccc7DD9x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y2C1Ev();
extern void _ZN3ccc7DD9x4y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y2E[] = {
  NSPAIR(_ZN3ccc7DD9x4y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y2E[];
extern void _ZN3ccc7DD9x4y23efgEv();
extern void _ZN3ccc7DD9x4y23pqrEv();
extern void _ZN3ccc7DD9x4y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y23pqrEv,_ZTv0_n12_N3ccc7DD9x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y23pqrEv,_ZThn4_N3ccc7DD9x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y23abcEv,_ZTv0_n16_N3ccc7DD9x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y23abcEv,_ZThn4_N3ccc7DD9x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y23efgEv,_ZTv0_n20_N3ccc7DD9x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y23efgEv,_ZThn4_N3ccc7DD9x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y23pqrEv,_ZTv0_n12_N3ccc7DD9x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y23abcEv,_ZTv0_n16_N3ccc7DD9x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y23efgEv,_ZTv0_n20_N3ccc7DD9x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y2E[] = {
  {&(_ZTVN3ccc7DD9x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y2E[];
static VTBL_ENTRY alt_thunk_names1711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y23efgEv,_ZTv0_n20_N3ccc7DD9x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y23efgEv,_ZThn4_N3ccc7DD9x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y23abcEv,_ZTv0_n16_N3ccc7DD9x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y23abcEv,_ZThn4_N3ccc7DD9x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y23pqrEv,_ZTv0_n12_N3ccc7DD9x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y23pqrEv,_ZThn4_N3ccc7DD9x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y2E = {  "_ZN3ccc7DD9x4y2E", // class name
  bases__ZN3ccc7DD9x4y2E, 2,
  &(vtc__ZN3ccc7DD9x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y2E),3, //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  CC9x4y3  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x4y33abcEv
  ~CC9x4y3(); // tgen
  CC9x4y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y3E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y33efgEv");}
void  ccc::CC9x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y33pqrEv");}
void  ccc::CC9x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y33abcEv");}
ccc::CC9x4y3 ::~CC9x4y3(){ note_dtor("_ZN3ccc7CC9x4y3E", this);} // tgen
ccc::CC9x4y3 ::CC9x4y3(){ note_ctor("_ZN3ccc7CC9x4y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y3E, buf);
    ::ccc::CC9x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y3E);
    dp->::ccc::CC9x4y3::~CC9x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y3E(Test__ZN3ccc7CC9x4y3E, "_ZN3ccc7CC9x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y3C1Ev();
extern void _ZN3ccc7CC9x4y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y3E[] = {
  NSPAIR(_ZN3ccc7CC9x4y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y3E[];
extern void _ZN3ccc7CC9x4y33pqrEv();
extern void _ZN3ccc7CC9x4y33abcEv();
extern void _ZN3ccc7CC9x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y33efgEv,_ZTv0_n12_N3ccc7CC9x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y33efgEv,_ZThn4_N3ccc7CC9x4y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y33pqrEv,_ZTv0_n16_N3ccc7CC9x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y33pqrEv,_ZThn4_N3ccc7CC9x4y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y33efgEv,_ZTv0_n12_N3ccc7CC9x4y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y33pqrEv,_ZTv0_n16_N3ccc7CC9x4y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y3E[] = {
  {&(_ZTVN3ccc7CC9x4y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y3E[];
static VTBL_ENTRY alt_thunk_names1712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y33pqrEv,_ZTv0_n16_N3ccc7CC9x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y33pqrEv,_ZThn4_N3ccc7CC9x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y33efgEv,_ZTv0_n12_N3ccc7CC9x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y33efgEv,_ZThn4_N3ccc7CC9x4y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y3E = {  "_ZN3ccc7CC9x4y3E", // class name
  bases__ZN3ccc7CC9x4y3E, 2,
  &(vtc__ZN3ccc7CC9x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y3E),2, //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  DD9x4y3  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD9x4y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x4y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x4y33abcEv
  ~DD9x4y3(); // tgen
  DD9x4y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y3E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x4y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y33efgEv");}
void  ccc::DD9x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y33pqrEv");}
void  ccc::DD9x4y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y33abcEv");}
ccc::DD9x4y3 ::~DD9x4y3(){ note_dtor("_ZN3ccc7DD9x4y3E", this);} // tgen
ccc::DD9x4y3 ::DD9x4y3(){ note_ctor("_ZN3ccc7DD9x4y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y3E, buf);
    ::ccc::DD9x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y3E);
    dp->::ccc::DD9x4y3::~DD9x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y3E(Test__ZN3ccc7DD9x4y3E, "_ZN3ccc7DD9x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y3C1Ev();
extern void _ZN3ccc7DD9x4y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y3E[] = {
  NSPAIR(_ZN3ccc7DD9x4y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y3E[];
extern void _ZN3ccc7DD9x4y33efgEv();
extern void _ZN3ccc7DD9x4y33pqrEv();
extern void _ZN3ccc7DD9x4y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y33pqrEv,_ZTv0_n12_N3ccc7DD9x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y33pqrEv,_ZThn4_N3ccc7DD9x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y33abcEv,_ZTv0_n16_N3ccc7DD9x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y33abcEv,_ZThn4_N3ccc7DD9x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y33efgEv,_ZTv0_n20_N3ccc7DD9x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y33efgEv,_ZThn4_N3ccc7DD9x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y33pqrEv,_ZTv0_n12_N3ccc7DD9x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y33abcEv,_ZTv0_n16_N3ccc7DD9x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y33efgEv,_ZTv0_n20_N3ccc7DD9x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y3E[] = {
  {&(_ZTVN3ccc7DD9x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y3E[];
static VTBL_ENTRY alt_thunk_names1713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y33efgEv,_ZTv0_n20_N3ccc7DD9x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y33efgEv,_ZThn4_N3ccc7DD9x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y33abcEv,_ZTv0_n16_N3ccc7DD9x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y33abcEv,_ZThn4_N3ccc7DD9x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y33pqrEv,_ZTv0_n12_N3ccc7DD9x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y33pqrEv,_ZThn4_N3ccc7DD9x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y3E = {  "_ZN3ccc7DD9x4y3E", // class name
  bases__ZN3ccc7DD9x4y3E, 2,
  &(vtc__ZN3ccc7DD9x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y3E),3, //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  CC9x4y4  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC9x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x4y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x4y43efgEv
  ~CC9x4y4(); // tgen
  CC9x4y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y4E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y43pqrEv");}
void  ccc::CC9x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y43abcEv");}
void  ccc::CC9x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y43efgEv");}
ccc::CC9x4y4 ::~CC9x4y4(){ note_dtor("_ZN3ccc7CC9x4y4E", this);} // tgen
ccc::CC9x4y4 ::CC9x4y4(){ note_ctor("_ZN3ccc7CC9x4y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y4E, buf);
    ::ccc::CC9x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y4E);
    dp->::ccc::CC9x4y4::~CC9x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y4E(Test__ZN3ccc7CC9x4y4E, "_ZN3ccc7CC9x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y4C1Ev();
extern void _ZN3ccc7CC9x4y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y4E[] = {
  NSPAIR(_ZN3ccc7CC9x4y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y4E[];
extern void _ZN3ccc7CC9x4y43pqrEv();
extern void _ZN3ccc7CC9x4y43abcEv();
extern void _ZN3ccc7CC9x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y43efgEv,_ZTv0_n12_N3ccc7CC9x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y43efgEv,_ZThn4_N3ccc7CC9x4y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y43pqrEv,_ZTv0_n16_N3ccc7CC9x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y43pqrEv,_ZThn4_N3ccc7CC9x4y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y43efgEv,_ZTv0_n12_N3ccc7CC9x4y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y43pqrEv,_ZTv0_n16_N3ccc7CC9x4y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y4E[] = {
  {&(_ZTVN3ccc7CC9x4y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y4E[];
static VTBL_ENTRY alt_thunk_names1714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y43pqrEv,_ZTv0_n16_N3ccc7CC9x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y43pqrEv,_ZThn4_N3ccc7CC9x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y43efgEv,_ZTv0_n12_N3ccc7CC9x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y43efgEv,_ZThn4_N3ccc7CC9x4y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y4E = {  "_ZN3ccc7CC9x4y4E", // class name
  bases__ZN3ccc7CC9x4y4E, 2,
  &(vtc__ZN3ccc7CC9x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y4E),2, //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  DD9x4y4  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD9x4y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x4y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x4y43efgEv
  ~DD9x4y4(); // tgen
  DD9x4y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y4E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y43pqrEv");}
void  ccc::DD9x4y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y43abcEv");}
void  ccc::DD9x4y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y43efgEv");}
ccc::DD9x4y4 ::~DD9x4y4(){ note_dtor("_ZN3ccc7DD9x4y4E", this);} // tgen
ccc::DD9x4y4 ::DD9x4y4(){ note_ctor("_ZN3ccc7DD9x4y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y4E, buf);
    ::ccc::DD9x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y4E);
    dp->::ccc::DD9x4y4::~DD9x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y4E(Test__ZN3ccc7DD9x4y4E, "_ZN3ccc7DD9x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y4C1Ev();
extern void _ZN3ccc7DD9x4y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y4E[] = {
  NSPAIR(_ZN3ccc7DD9x4y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y4E[];
extern void _ZN3ccc7DD9x4y43efgEv();
extern void _ZN3ccc7DD9x4y43pqrEv();
extern void _ZN3ccc7DD9x4y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y43pqrEv,_ZTv0_n12_N3ccc7DD9x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y43pqrEv,_ZThn4_N3ccc7DD9x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y43abcEv,_ZTv0_n16_N3ccc7DD9x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y43abcEv,_ZThn4_N3ccc7DD9x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y43efgEv,_ZTv0_n20_N3ccc7DD9x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y43efgEv,_ZThn4_N3ccc7DD9x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y43pqrEv,_ZTv0_n12_N3ccc7DD9x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y43abcEv,_ZTv0_n16_N3ccc7DD9x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y43efgEv,_ZTv0_n20_N3ccc7DD9x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y4E[] = {
  {&(_ZTVN3ccc7DD9x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y4E[];
static VTBL_ENTRY alt_thunk_names1715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y43efgEv,_ZTv0_n20_N3ccc7DD9x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y43efgEv,_ZThn4_N3ccc7DD9x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y43abcEv,_ZTv0_n16_N3ccc7DD9x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y43abcEv,_ZThn4_N3ccc7DD9x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y43pqrEv,_ZTv0_n12_N3ccc7DD9x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y43pqrEv,_ZThn4_N3ccc7DD9x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y4E = {  "_ZN3ccc7DD9x4y4E", // class name
  bases__ZN3ccc7DD9x4y4E, 2,
  &(vtc__ZN3ccc7DD9x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y4E),3, //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  CC9x4y5  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7CC9x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x4y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x4y53abcEv
  ~CC9x4y5(); // tgen
  CC9x4y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y5E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y53pqrEv");}
void  ccc::CC9x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y53efgEv");}
void  ccc::CC9x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y53abcEv");}
ccc::CC9x4y5 ::~CC9x4y5(){ note_dtor("_ZN3ccc7CC9x4y5E", this);} // tgen
ccc::CC9x4y5 ::CC9x4y5(){ note_ctor("_ZN3ccc7CC9x4y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y5E, buf);
    ::ccc::CC9x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y5E);
    dp->::ccc::CC9x4y5::~CC9x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y5E(Test__ZN3ccc7CC9x4y5E, "_ZN3ccc7CC9x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y5C1Ev();
extern void _ZN3ccc7CC9x4y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y5E[] = {
  NSPAIR(_ZN3ccc7CC9x4y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y5E[];
extern void _ZN3ccc7CC9x4y53pqrEv();
extern void _ZN3ccc7CC9x4y53abcEv();
extern void _ZN3ccc7CC9x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y53efgEv,_ZTv0_n12_N3ccc7CC9x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y53efgEv,_ZThn4_N3ccc7CC9x4y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y53pqrEv,_ZTv0_n16_N3ccc7CC9x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y53pqrEv,_ZThn4_N3ccc7CC9x4y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y53efgEv,_ZTv0_n12_N3ccc7CC9x4y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y53pqrEv,_ZTv0_n16_N3ccc7CC9x4y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y5E[] = {
  {&(_ZTVN3ccc7CC9x4y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y5E[];
static VTBL_ENTRY alt_thunk_names1716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y53pqrEv,_ZTv0_n16_N3ccc7CC9x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y53pqrEv,_ZThn4_N3ccc7CC9x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y53efgEv,_ZTv0_n12_N3ccc7CC9x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y53efgEv,_ZThn4_N3ccc7CC9x4y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y5E = {  "_ZN3ccc7CC9x4y5E", // class name
  bases__ZN3ccc7CC9x4y5E, 2,
  &(vtc__ZN3ccc7CC9x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y5E),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  DD9x4y5  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc7DD9x4y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x4y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x4y53abcEv
  ~DD9x4y5(); // tgen
  DD9x4y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y5E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y53pqrEv");}
void  ccc::DD9x4y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y53efgEv");}
void  ccc::DD9x4y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y53abcEv");}
ccc::DD9x4y5 ::~DD9x4y5(){ note_dtor("_ZN3ccc7DD9x4y5E", this);} // tgen
ccc::DD9x4y5 ::DD9x4y5(){ note_ctor("_ZN3ccc7DD9x4y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y5E, buf);
    ::ccc::DD9x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y5E);
    dp->::ccc::DD9x4y5::~DD9x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y5E(Test__ZN3ccc7DD9x4y5E, "_ZN3ccc7DD9x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y5C1Ev();
extern void _ZN3ccc7DD9x4y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y5E[] = {
  NSPAIR(_ZN3ccc7DD9x4y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y5E[];
extern void _ZN3ccc7DD9x4y53efgEv();
extern void _ZN3ccc7DD9x4y53pqrEv();
extern void _ZN3ccc7DD9x4y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y53pqrEv,_ZTv0_n12_N3ccc7DD9x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y53pqrEv,_ZThn4_N3ccc7DD9x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y53abcEv,_ZTv0_n16_N3ccc7DD9x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y53abcEv,_ZThn4_N3ccc7DD9x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y53efgEv,_ZTv0_n20_N3ccc7DD9x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y53efgEv,_ZThn4_N3ccc7DD9x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y53pqrEv,_ZTv0_n12_N3ccc7DD9x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y53abcEv,_ZTv0_n16_N3ccc7DD9x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y53efgEv,_ZTv0_n20_N3ccc7DD9x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y5E[] = {
  {&(_ZTVN3ccc7DD9x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y5E[];
static VTBL_ENTRY alt_thunk_names1717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y53efgEv,_ZTv0_n20_N3ccc7DD9x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y53efgEv,_ZThn4_N3ccc7DD9x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y53abcEv,_ZTv0_n16_N3ccc7DD9x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y53abcEv,_ZThn4_N3ccc7DD9x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y53pqrEv,_ZTv0_n12_N3ccc7DD9x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y53pqrEv,_ZThn4_N3ccc7DD9x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y5E = {  "_ZN3ccc7DD9x4y5E", // class name
  bases__ZN3ccc7DD9x4y5E, 2,
  &(vtc__ZN3ccc7DD9x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y5E),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  CC9x4y6  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x4y63efgEv
  ~CC9x4y6(); // tgen
  CC9x4y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y6E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y63abcEv");}
void  ccc::CC9x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y63efgEv");}
ccc::CC9x4y6 ::~CC9x4y6(){ note_dtor("_ZN3ccc7CC9x4y6E", this);} // tgen
ccc::CC9x4y6 ::CC9x4y6(){ note_ctor("_ZN3ccc7CC9x4y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y6E, buf);
    ::ccc::CC9x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y6E);
    dp->::ccc::CC9x4y6::~CC9x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y6E(Test__ZN3ccc7CC9x4y6E, "_ZN3ccc7CC9x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y6C1Ev();
extern void _ZN3ccc7CC9x4y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y6E[] = {
  NSPAIR(_ZN3ccc7CC9x4y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC9x4y63abcEv();
extern void _ZN3ccc7CC9x4y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y63efgEv,_ZTv0_n12_N3ccc7CC9x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y63efgEv,_ZThn4_N3ccc7CC9x4y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y63efgEv,_ZTv0_n12_N3ccc7CC9x4y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y6E[] = {
  {&(_ZTVN3ccc7CC9x4y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y6E[];
static VTBL_ENTRY alt_thunk_names1718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y63efgEv,_ZTv0_n12_N3ccc7CC9x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y63efgEv,_ZThn4_N3ccc7CC9x4y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y6E = {  "_ZN3ccc7CC9x4y6E", // class name
  bases__ZN3ccc7CC9x4y6E, 2,
  &(vtc__ZN3ccc7CC9x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y6E),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  DD9x4y6  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD9x4y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x4y63efgEv
  ~DD9x4y6(); // tgen
  DD9x4y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y6E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x4y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y63abcEv");}
void  ccc::DD9x4y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y63efgEv");}
ccc::DD9x4y6 ::~DD9x4y6(){ note_dtor("_ZN3ccc7DD9x4y6E", this);} // tgen
ccc::DD9x4y6 ::DD9x4y6(){ note_ctor("_ZN3ccc7DD9x4y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y6E, buf);
    ::ccc::DD9x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y6E);
    dp->::ccc::DD9x4y6::~DD9x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y6E(Test__ZN3ccc7DD9x4y6E, "_ZN3ccc7DD9x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y6C1Ev();
extern void _ZN3ccc7DD9x4y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y6E[] = {
  NSPAIR(_ZN3ccc7DD9x4y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y6E[];
extern void _ZN3ccc7DD9x4y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x4y63abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y63abcEv,_ZTv0_n16_N3ccc7DD9x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y63abcEv,_ZThn4_N3ccc7DD9x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y63efgEv,_ZTv0_n20_N3ccc7DD9x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y63efgEv,_ZThn4_N3ccc7DD9x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y63abcEv,_ZTv0_n16_N3ccc7DD9x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y63efgEv,_ZTv0_n20_N3ccc7DD9x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y6E[] = {
  {&(_ZTVN3ccc7DD9x4y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y6E[];
static VTBL_ENTRY alt_thunk_names1719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y63efgEv,_ZTv0_n20_N3ccc7DD9x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y63efgEv,_ZThn4_N3ccc7DD9x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y63abcEv,_ZTv0_n16_N3ccc7DD9x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y63abcEv,_ZThn4_N3ccc7DD9x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y6E = {  "_ZN3ccc7DD9x4y6E", // class name
  bases__ZN3ccc7DD9x4y6E, 2,
  &(vtc__ZN3ccc7DD9x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y6E),3, //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  CC9x4y7  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7CC9x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y73pqrEv
  ~CC9x4y7(); // tgen
  CC9x4y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y7E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y73abcEv");}
void  ccc::CC9x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y73pqrEv");}
ccc::CC9x4y7 ::~CC9x4y7(){ note_dtor("_ZN3ccc7CC9x4y7E", this);} // tgen
ccc::CC9x4y7 ::CC9x4y7(){ note_ctor("_ZN3ccc7CC9x4y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y7E, buf);
    ::ccc::CC9x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y7E);
    dp->::ccc::CC9x4y7::~CC9x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y7E(Test__ZN3ccc7CC9x4y7E, "_ZN3ccc7CC9x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y7C1Ev();
extern void _ZN3ccc7CC9x4y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y7E[] = {
  NSPAIR(_ZN3ccc7CC9x4y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y7E[];
extern void _ZN3ccc7CC9x4y73pqrEv();
extern void _ZN3ccc7CC9x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y73pqrEv,_ZTv0_n16_N3ccc7CC9x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y73pqrEv,_ZThn4_N3ccc7CC9x4y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y73pqrEv,_ZTv0_n16_N3ccc7CC9x4y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y7E[] = {
  {&(_ZTVN3ccc7CC9x4y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y7E[];
static VTBL_ENTRY alt_thunk_names1720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y73pqrEv,_ZTv0_n16_N3ccc7CC9x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y73pqrEv,_ZThn4_N3ccc7CC9x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y7E = {  "_ZN3ccc7CC9x4y7E", // class name
  bases__ZN3ccc7CC9x4y7E, 2,
  &(vtc__ZN3ccc7CC9x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y7E),2, //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  DD9x4y7  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc7DD9x4y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x4y73pqrEv
  ~DD9x4y7(); // tgen
  DD9x4y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y7E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x4y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y73abcEv");}
void  ccc::DD9x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y73pqrEv");}
ccc::DD9x4y7 ::~DD9x4y7(){ note_dtor("_ZN3ccc7DD9x4y7E", this);} // tgen
ccc::DD9x4y7 ::DD9x4y7(){ note_ctor("_ZN3ccc7DD9x4y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y7E, buf);
    ::ccc::DD9x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y7E);
    dp->::ccc::DD9x4y7::~DD9x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y7E(Test__ZN3ccc7DD9x4y7E, "_ZN3ccc7DD9x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y7C1Ev();
extern void _ZN3ccc7DD9x4y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y7E[] = {
  NSPAIR(_ZN3ccc7DD9x4y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x4y73pqrEv();
extern void _ZN3ccc7DD9x4y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y73pqrEv,_ZTv0_n12_N3ccc7DD9x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y73pqrEv,_ZThn4_N3ccc7DD9x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y73abcEv,_ZTv0_n16_N3ccc7DD9x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y73abcEv,_ZThn4_N3ccc7DD9x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y73pqrEv,_ZTv0_n12_N3ccc7DD9x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y73abcEv,_ZTv0_n16_N3ccc7DD9x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y7E[] = {
  {&(_ZTVN3ccc7DD9x4y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y7E[];
static VTBL_ENTRY alt_thunk_names1721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y73abcEv,_ZTv0_n16_N3ccc7DD9x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y73abcEv,_ZThn4_N3ccc7DD9x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y73pqrEv,_ZTv0_n12_N3ccc7DD9x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y73pqrEv,_ZThn4_N3ccc7DD9x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y7E = {  "_ZN3ccc7DD9x4y7E", // class name
  bases__ZN3ccc7DD9x4y7E, 2,
  &(vtc__ZN3ccc7DD9x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y7E),3, //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  CC9x4y8  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x4y83abcEv
  ~CC9x4y8(); // tgen
  CC9x4y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y8E) C1{ VBC2{ v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y83efgEv");}
void  ccc::CC9x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x4y83abcEv");}
ccc::CC9x4y8 ::~CC9x4y8(){ note_dtor("_ZN3ccc7CC9x4y8E", this);} // tgen
ccc::CC9x4y8 ::CC9x4y8(){ note_ctor("_ZN3ccc7CC9x4y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y8E, buf);
    ::ccc::CC9x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y8E);
    dp->::ccc::CC9x4y8::~CC9x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y8E(Test__ZN3ccc7CC9x4y8E, "_ZN3ccc7CC9x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y8C1Ev();
extern void _ZN3ccc7CC9x4y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y8E[] = {
  NSPAIR(_ZN3ccc7CC9x4y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc7CC9x4y83abcEv();
extern void _ZN3ccc7CC9x4y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y83efgEv,_ZTv0_n12_N3ccc7CC9x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y83efgEv,_ZThn4_N3ccc7CC9x4y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y83efgEv,_ZTv0_n12_N3ccc7CC9x4y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y8E[] = {
  {&(_ZTVN3ccc7CC9x4y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y8E[];
static VTBL_ENTRY alt_thunk_names1722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y83efgEv,_ZTv0_n12_N3ccc7CC9x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y83efgEv,_ZThn4_N3ccc7CC9x4y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y8E = {  "_ZN3ccc7CC9x4y8E", // class name
  bases__ZN3ccc7CC9x4y8E, 2,
  &(vtc__ZN3ccc7CC9x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y8E),2, //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  DD9x4y8  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD9x4y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x4y83abcEv
  ~DD9x4y8(); // tgen
  DD9x4y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y8E) C1{ VBC2{ v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x4y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y83efgEv");}
void  ccc::DD9x4y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x4y83abcEv");}
ccc::DD9x4y8 ::~DD9x4y8(){ note_dtor("_ZN3ccc7DD9x4y8E", this);} // tgen
ccc::DD9x4y8 ::DD9x4y8(){ note_ctor("_ZN3ccc7DD9x4y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y8E, buf);
    ::ccc::DD9x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y8E);
    dp->::ccc::DD9x4y8::~DD9x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y8E(Test__ZN3ccc7DD9x4y8E, "_ZN3ccc7DD9x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y8C1Ev();
extern void _ZN3ccc7DD9x4y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y8E[] = {
  NSPAIR(_ZN3ccc7DD9x4y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y8E[];
extern void _ZN3ccc7DD9x4y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x4y83abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x4y83abcEv,_ZTv0_n16_N3ccc7DD9x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y83abcEv,_ZThn4_N3ccc7DD9x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y83efgEv,_ZTv0_n20_N3ccc7DD9x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y83efgEv,_ZThn4_N3ccc7DD9x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x4y83abcEv,_ZTv0_n16_N3ccc7DD9x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y83efgEv,_ZTv0_n20_N3ccc7DD9x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y8E[] = {
  {&(_ZTVN3ccc7DD9x4y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x4y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y8E[];
static VTBL_ENTRY alt_thunk_names1723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y83efgEv,_ZTv0_n20_N3ccc7DD9x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y83efgEv,_ZThn4_N3ccc7DD9x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x4y83abcEv,_ZTv0_n16_N3ccc7DD9x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y83abcEv,_ZThn4_N3ccc7DD9x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y8E = {  "_ZN3ccc7DD9x4y8E", // class name
  bases__ZN3ccc7DD9x4y8E, 2,
  &(vtc__ZN3ccc7DD9x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y8E),3, //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  CC9x4y9  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7CC9x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x4y93pqrEv
  ~CC9x4y9(); // tgen
  CC9x4y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x4y9E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x4y93efgEv");}
void  ccc::CC9x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x4y93pqrEv");}
ccc::CC9x4y9 ::~CC9x4y9(){ note_dtor("_ZN3ccc7CC9x4y9E", this);} // tgen
ccc::CC9x4y9 ::CC9x4y9(){ note_ctor("_ZN3ccc7CC9x4y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x4y9E, buf);
    ::ccc::CC9x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x4y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc7CC9x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x4y9E);
    dp->::ccc::CC9x4y9::~CC9x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x4y9E(Test__ZN3ccc7CC9x4y9E, "_ZN3ccc7CC9x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x4y9C1Ev();
extern void _ZN3ccc7CC9x4y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x4y9E[] = {
  NSPAIR(_ZN3ccc7CC9x4y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7CC9x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x4y9E[];
extern void _ZN3ccc7CC9x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc7CC9x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x4y93efgEv,_ZTv0_n12_N3ccc7CC9x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y93efgEv,_ZThn4_N3ccc7CC9x4y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x4y93pqrEv,_ZTv0_n16_N3ccc7CC9x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x4y93pqrEv,_ZThn4_N3ccc7CC9x4y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x4y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x4y93efgEv,_ZTv0_n12_N3ccc7CC9x4y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x4y93pqrEv,_ZTv0_n16_N3ccc7CC9x4y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x4y9E[] = {
  {&(_ZTVN3ccc7CC9x4y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x4y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x4y9E[];
static VTBL_ENTRY alt_thunk_names1724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x4y93pqrEv,_ZTv0_n16_N3ccc7CC9x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y93pqrEv,_ZThn4_N3ccc7CC9x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x4y93efgEv,_ZTv0_n12_N3ccc7CC9x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x4y93efgEv,_ZThn4_N3ccc7CC9x4y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x4y9E = {  "_ZN3ccc7CC9x4y9E", // class name
  bases__ZN3ccc7CC9x4y9E, 2,
  &(vtc__ZN3ccc7CC9x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x4y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x4y9E),2, //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  DD9x4y9  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc7DD9x4y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x4y93pqrEv
  ~DD9x4y9(); // tgen
  DD9x4y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x4y9E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x4y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x4y93efgEv");}
void  ccc::DD9x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x4y93pqrEv");}
ccc::DD9x4y9 ::~DD9x4y9(){ note_dtor("_ZN3ccc7DD9x4y9E", this);} // tgen
ccc::DD9x4y9 ::DD9x4y9(){ note_ctor("_ZN3ccc7DD9x4y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x4y9E, buf);
    ::ccc::DD9x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x4y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc7DD9x4y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x4y9E);
    dp->::ccc::DD9x4y9::~DD9x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x4y9E(Test__ZN3ccc7DD9x4y9E, "_ZN3ccc7DD9x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x4y9C1Ev();
extern void _ZN3ccc7DD9x4y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x4y9E[] = {
  NSPAIR(_ZN3ccc7DD9x4y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc7DD9x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y9E[];
extern void _ZN3ccc7DD9x4y93efgEv();
extern void _ZN3ccc7DD9x4y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x4y93pqrEv,_ZTv0_n12_N3ccc7DD9x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y93pqrEv,_ZThn4_N3ccc7DD9x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x4y93efgEv,_ZTv0_n20_N3ccc7DD9x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x4y93efgEv,_ZThn4_N3ccc7DD9x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x4y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x4y93pqrEv,_ZTv0_n12_N3ccc7DD9x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x4y93efgEv,_ZTv0_n20_N3ccc7DD9x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x4y9E[] = {
  {&(_ZTVN3ccc7DD9x4y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x4y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x4y9E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x4y9E[];
static VTBL_ENTRY alt_thunk_names1725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x4y93efgEv,_ZTv0_n20_N3ccc7DD9x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y93efgEv,_ZThn4_N3ccc7DD9x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x4y93pqrEv,_ZTv0_n12_N3ccc7DD9x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x4y93pqrEv,_ZThn4_N3ccc7DD9x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x4y9E = {  "_ZN3ccc7DD9x4y9E", // class name
  bases__ZN3ccc7DD9x4y9E, 2,
  &(vtc__ZN3ccc7DD9x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x4y9E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x4y9E),3, //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  CC9x4y10  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC9x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x4y103abcEv
  ~CC9x4y10(); // tgen
  CC9x4y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y10E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x4y103pqrEv");}
void  ccc::CC9x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x4y103abcEv");}
ccc::CC9x4y10 ::~CC9x4y10(){ note_dtor("_ZN3ccc8CC9x4y10E", this);} // tgen
ccc::CC9x4y10 ::CC9x4y10(){ note_ctor("_ZN3ccc8CC9x4y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x4y10E, buf);
    ::ccc::CC9x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x4y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC9x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x4y10E);
    dp->::ccc::CC9x4y10::~CC9x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x4y10E(Test__ZN3ccc8CC9x4y10E, "_ZN3ccc8CC9x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x4y10C1Ev();
extern void _ZN3ccc8CC9x4y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x4y10E[] = {
  NSPAIR(_ZN3ccc8CC9x4y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC9x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x4y10E[];
extern void _ZN3ccc8CC9x4y103pqrEv();
extern void _ZN3ccc8CC9x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x4y103pqrEv,_ZTv0_n16_N3ccc8CC9x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y103pqrEv,_ZThn4_N3ccc8CC9x4y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x4y103pqrEv,_ZTv0_n16_N3ccc8CC9x4y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x4y10E[] = {
  {&(_ZTVN3ccc8CC9x4y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x4y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x4y10E[];
static VTBL_ENTRY alt_thunk_names1726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x4y103pqrEv,_ZTv0_n16_N3ccc8CC9x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x4y103pqrEv,_ZThn4_N3ccc8CC9x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x4y10E = {  "_ZN3ccc8CC9x4y10E", // class name
  bases__ZN3ccc8CC9x4y10E, 2,
  &(vtc__ZN3ccc8CC9x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x4y10E),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  DD9x4y10  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD9x4y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x4y103abcEv
  ~DD9x4y10(); // tgen
  DD9x4y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x4y10E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x4y103pqrEv");}
void  ccc::DD9x4y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x4y103abcEv");}
ccc::DD9x4y10 ::~DD9x4y10(){ note_dtor("_ZN3ccc8DD9x4y10E", this);} // tgen
ccc::DD9x4y10 ::DD9x4y10(){ note_ctor("_ZN3ccc8DD9x4y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x4y10E, buf);
    ::ccc::DD9x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x4y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD9x4y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x4y10E);
    dp->::ccc::DD9x4y10::~DD9x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x4y10E(Test__ZN3ccc8DD9x4y10E, "_ZN3ccc8DD9x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x4y10C1Ev();
extern void _ZN3ccc8DD9x4y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x4y10E[] = {
  NSPAIR(_ZN3ccc8DD9x4y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD9x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x4y103pqrEv();
extern void _ZN3ccc8DD9x4y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x4y103pqrEv,_ZTv0_n12_N3ccc8DD9x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y103pqrEv,_ZThn4_N3ccc8DD9x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x4y103abcEv,_ZTv0_n16_N3ccc8DD9x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y103abcEv,_ZThn4_N3ccc8DD9x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x4y103pqrEv,_ZTv0_n12_N3ccc8DD9x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x4y103abcEv,_ZTv0_n16_N3ccc8DD9x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x4y10E[] = {
  {&(_ZTVN3ccc8DD9x4y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x4y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x4y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x4y10E[];
static VTBL_ENTRY alt_thunk_names1727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x4y103abcEv,_ZTv0_n16_N3ccc8DD9x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y103abcEv,_ZThn4_N3ccc8DD9x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x4y103pqrEv,_ZTv0_n12_N3ccc8DD9x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y103pqrEv,_ZThn4_N3ccc8DD9x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x4y10E = {  "_ZN3ccc8DD9x4y10E", // class name
  bases__ZN3ccc8DD9x4y10E, 2,
  &(vtc__ZN3ccc8DD9x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x4y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x4y10E),3, //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  CC9x4y11  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC9x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x4y113efgEv
  ~CC9x4y11(); // tgen
  CC9x4y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y11E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x4y113pqrEv");}
void  ccc::CC9x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x4y113efgEv");}
ccc::CC9x4y11 ::~CC9x4y11(){ note_dtor("_ZN3ccc8CC9x4y11E", this);} // tgen
ccc::CC9x4y11 ::CC9x4y11(){ note_ctor("_ZN3ccc8CC9x4y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x4y11E, buf);
    ::ccc::CC9x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x4y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC9x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x4y11E);
    dp->::ccc::CC9x4y11::~CC9x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x4y11E(Test__ZN3ccc8CC9x4y11E, "_ZN3ccc8CC9x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x4y11C1Ev();
extern void _ZN3ccc8CC9x4y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x4y11E[] = {
  NSPAIR(_ZN3ccc8CC9x4y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC9x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x4y11E[];
extern void _ZN3ccc8CC9x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC9x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x4y113efgEv,_ZTv0_n12_N3ccc8CC9x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y113efgEv,_ZThn4_N3ccc8CC9x4y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x4y113pqrEv,_ZTv0_n16_N3ccc8CC9x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y113pqrEv,_ZThn4_N3ccc8CC9x4y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x4y113efgEv,_ZTv0_n12_N3ccc8CC9x4y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x4y113pqrEv,_ZTv0_n16_N3ccc8CC9x4y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x4y11E[] = {
  {&(_ZTVN3ccc8CC9x4y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x4y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x4y11E[];
static VTBL_ENTRY alt_thunk_names1728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x4y113pqrEv,_ZTv0_n16_N3ccc8CC9x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x4y113pqrEv,_ZThn4_N3ccc8CC9x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x4y113efgEv,_ZTv0_n12_N3ccc8CC9x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x4y113efgEv,_ZThn4_N3ccc8CC9x4y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x4y11E = {  "_ZN3ccc8CC9x4y11E", // class name
  bases__ZN3ccc8CC9x4y11E, 2,
  &(vtc__ZN3ccc8CC9x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x4y11E),2, //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  DD9x4y11  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD9x4y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x4y113efgEv
  ~DD9x4y11(); // tgen
  DD9x4y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x4y11E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x4y113pqrEv");}
void  ccc::DD9x4y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x4y113efgEv");}
ccc::DD9x4y11 ::~DD9x4y11(){ note_dtor("_ZN3ccc8DD9x4y11E", this);} // tgen
ccc::DD9x4y11 ::DD9x4y11(){ note_ctor("_ZN3ccc8DD9x4y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x4y11E, buf);
    ::ccc::DD9x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x4y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD9x4y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x4y11E);
    dp->::ccc::DD9x4y11::~DD9x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x4y11E(Test__ZN3ccc8DD9x4y11E, "_ZN3ccc8DD9x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x4y11C1Ev();
extern void _ZN3ccc8DD9x4y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x4y11E[] = {
  NSPAIR(_ZN3ccc8DD9x4y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD9x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y11E[];
extern void _ZN3ccc8DD9x4y113efgEv();
extern void _ZN3ccc8DD9x4y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x4y113pqrEv,_ZTv0_n12_N3ccc8DD9x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y113pqrEv,_ZThn4_N3ccc8DD9x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x4y113efgEv,_ZTv0_n20_N3ccc8DD9x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y113efgEv,_ZThn4_N3ccc8DD9x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x4y113pqrEv,_ZTv0_n12_N3ccc8DD9x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x4y113efgEv,_ZTv0_n20_N3ccc8DD9x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x4y11E[] = {
  {&(_ZTVN3ccc8DD9x4y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y11E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x4y11E[];
static VTBL_ENTRY alt_thunk_names1729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x4y113efgEv,_ZTv0_n20_N3ccc8DD9x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y113efgEv,_ZThn4_N3ccc8DD9x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x4y113pqrEv,_ZTv0_n12_N3ccc8DD9x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y113pqrEv,_ZThn4_N3ccc8DD9x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x4y11E = {  "_ZN3ccc8DD9x4y11E", // class name
  bases__ZN3ccc8DD9x4y11E, 2,
  &(vtc__ZN3ccc8DD9x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x4y11E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x4y11E),3, //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  CC9x4y12  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC9x4y123abcEv
  ~CC9x4y12(); // tgen
  CC9x4y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y12E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC9x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x4y123abcEv");}
ccc::CC9x4y12 ::~CC9x4y12(){ note_dtor("_ZN3ccc8CC9x4y12E", this);} // tgen
ccc::CC9x4y12 ::CC9x4y12(){ note_ctor("_ZN3ccc8CC9x4y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x4y12E, buf);
    ::ccc::CC9x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x4y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC9x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x4y12E);
    dp->::ccc::CC9x4y12::~CC9x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x4y12E(Test__ZN3ccc8CC9x4y12E, "_ZN3ccc8CC9x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x4y12C1Ev();
extern void _ZN3ccc8CC9x4y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x4y12E[] = {
  NSPAIR(_ZN3ccc8CC9x4y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC9x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC9x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x4y12E[] = {
  {&(_ZTVN3ccc8CC9x4y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x4y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x4y12E[];
Class_Descriptor cd__ZN3ccc8CC9x4y12E = {  "_ZN3ccc8CC9x4y12E", // class name
  bases__ZN3ccc8CC9x4y12E, 2,
  &(vtc__ZN3ccc8CC9x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x4y12E),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  DD9x4y12  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD9x4y123abcEv
  ~DD9x4y12(); // tgen
  DD9x4y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x4y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD9x4y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x4y123abcEv");}
ccc::DD9x4y12 ::~DD9x4y12(){ note_dtor("_ZN3ccc8DD9x4y12E", this);} // tgen
ccc::DD9x4y12 ::DD9x4y12(){ note_ctor("_ZN3ccc8DD9x4y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x4y12E, buf);
    ::ccc::DD9x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x4y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD9x4y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x4y12E);
    dp->::ccc::DD9x4y12::~DD9x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x4y12E(Test__ZN3ccc8DD9x4y12E, "_ZN3ccc8DD9x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x4y12C1Ev();
extern void _ZN3ccc8DD9x4y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x4y12E[] = {
  NSPAIR(_ZN3ccc8DD9x4y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD9x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x4y123abcEv,_ZTv0_n16_N3ccc8DD9x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y123abcEv,_ZThn4_N3ccc8DD9x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x4y123abcEv,_ZTv0_n16_N3ccc8DD9x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x4y12E[] = {
  {&(_ZTVN3ccc8DD9x4y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x4y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x4y12E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x4y12E[];
static VTBL_ENTRY alt_thunk_names1730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x4y123abcEv,_ZTv0_n16_N3ccc8DD9x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y123abcEv,_ZThn4_N3ccc8DD9x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x4y12E = {  "_ZN3ccc8DD9x4y12E", // class name
  bases__ZN3ccc8DD9x4y12E, 2,
  &(vtc__ZN3ccc8DD9x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x4y12E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x4y12E),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  CC9x4y13  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC9x4y133efgEv
  ~CC9x4y13(); // tgen
  CC9x4y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC9x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x4y133efgEv");}
ccc::CC9x4y13 ::~CC9x4y13(){ note_dtor("_ZN3ccc8CC9x4y13E", this);} // tgen
ccc::CC9x4y13 ::CC9x4y13(){ note_ctor("_ZN3ccc8CC9x4y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x4y13E, buf);
    ::ccc::CC9x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x4y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC9x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x4y13E);
    dp->::ccc::CC9x4y13::~CC9x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x4y13E(Test__ZN3ccc8CC9x4y13E, "_ZN3ccc8CC9x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x4y13C1Ev();
extern void _ZN3ccc8CC9x4y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x4y13E[] = {
  NSPAIR(_ZN3ccc8CC9x4y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC9x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC9x4y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x4y133efgEv,_ZTv0_n12_N3ccc8CC9x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y133efgEv,_ZThn4_N3ccc8CC9x4y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x4y133efgEv,_ZTv0_n12_N3ccc8CC9x4y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x4y13E[] = {
  {&(_ZTVN3ccc8CC9x4y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x4y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x4y13E[];
static VTBL_ENTRY alt_thunk_names1731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x4y133efgEv,_ZTv0_n12_N3ccc8CC9x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x4y133efgEv,_ZThn4_N3ccc8CC9x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x4y13E = {  "_ZN3ccc8CC9x4y13E", // class name
  bases__ZN3ccc8CC9x4y13E, 2,
  &(vtc__ZN3ccc8CC9x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x4y13E),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  DD9x4y13  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD9x4y133efgEv
  ~DD9x4y13(); // tgen
  DD9x4y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x4y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD9x4y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x4y133efgEv");}
ccc::DD9x4y13 ::~DD9x4y13(){ note_dtor("_ZN3ccc8DD9x4y13E", this);} // tgen
ccc::DD9x4y13 ::DD9x4y13(){ note_ctor("_ZN3ccc8DD9x4y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x4y13E, buf);
    ::ccc::DD9x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x4y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD9x4y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x4y13E);
    dp->::ccc::DD9x4y13::~DD9x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x4y13E(Test__ZN3ccc8DD9x4y13E, "_ZN3ccc8DD9x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x4y13C1Ev();
extern void _ZN3ccc8DD9x4y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x4y13E[] = {
  NSPAIR(_ZN3ccc8DD9x4y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD9x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y13E[];
extern void _ZN3ccc8DD9x4y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x4y133efgEv,_ZTv0_n20_N3ccc8DD9x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y133efgEv,_ZThn4_N3ccc8DD9x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x4y133efgEv,_ZTv0_n20_N3ccc8DD9x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x4y13E[] = {
  {&(_ZTVN3ccc8DD9x4y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x4y13E[];
static VTBL_ENTRY alt_thunk_names1732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x4y133efgEv,_ZTv0_n20_N3ccc8DD9x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y133efgEv,_ZThn4_N3ccc8DD9x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x4y13E = {  "_ZN3ccc8DD9x4y13E", // class name
  bases__ZN3ccc8DD9x4y13E, 2,
  &(vtc__ZN3ccc8DD9x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x4y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x4y13E),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  CC9x4y14  : virtual ::ccc::AA9 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC9x4y143pqrEv
  ~CC9x4y14(); // tgen
  CC9x4y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x4y143pqrEv");}
ccc::CC9x4y14 ::~CC9x4y14(){ note_dtor("_ZN3ccc8CC9x4y14E", this);} // tgen
ccc::CC9x4y14 ::CC9x4y14(){ note_ctor("_ZN3ccc8CC9x4y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x4y14E, buf);
    ::ccc::CC9x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x4y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC9x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x4y14E);
    dp->::ccc::CC9x4y14::~CC9x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x4y14E(Test__ZN3ccc8CC9x4y14E, "_ZN3ccc8CC9x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x4y14C1Ev();
extern void _ZN3ccc8CC9x4y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x4y14E[] = {
  NSPAIR(_ZN3ccc8CC9x4y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC9x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x4y14E[];
extern void _ZN3ccc8CC9x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x4y143pqrEv,_ZTv0_n16_N3ccc8CC9x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x4y143pqrEv,_ZThn4_N3ccc8CC9x4y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x4y143pqrEv,_ZTv0_n16_N3ccc8CC9x4y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x4y14E[] = {
  {&(_ZTVN3ccc8CC9x4y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x4y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x4y14E[];
static VTBL_ENTRY alt_thunk_names1733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x4y143pqrEv,_ZTv0_n16_N3ccc8CC9x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x4y143pqrEv,_ZThn4_N3ccc8CC9x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x4y14E = {  "_ZN3ccc8CC9x4y14E", // class name
  bases__ZN3ccc8CC9x4y14E, 2,
  &(vtc__ZN3ccc8CC9x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x4y14E),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  DD9x4y14  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD9x4y143pqrEv
  ~DD9x4y14(); // tgen
  DD9x4y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x4y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x4y143pqrEv");}
ccc::DD9x4y14 ::~DD9x4y14(){ note_dtor("_ZN3ccc8DD9x4y14E", this);} // tgen
ccc::DD9x4y14 ::DD9x4y14(){ note_ctor("_ZN3ccc8DD9x4y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x4y14E, buf);
    ::ccc::DD9x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x4y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD9x4y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x4y14E);
    dp->::ccc::DD9x4y14::~DD9x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x4y14E(Test__ZN3ccc8DD9x4y14E, "_ZN3ccc8DD9x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x4y14C1Ev();
extern void _ZN3ccc8DD9x4y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x4y14E[] = {
  NSPAIR(_ZN3ccc8DD9x4y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD9x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x4y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x4y143pqrEv,_ZTv0_n12_N3ccc8DD9x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x4y143pqrEv,_ZThn4_N3ccc8DD9x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x4y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x4y143pqrEv,_ZTv0_n12_N3ccc8DD9x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x4y14E[] = {
  {&(_ZTVN3ccc8DD9x4y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x4y14E[];
static VTBL_ENTRY alt_thunk_names1734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x4y143pqrEv,_ZTv0_n12_N3ccc8DD9x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x4y143pqrEv,_ZThn4_N3ccc8DD9x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x4y14E = {  "_ZN3ccc8DD9x4y14E", // class name
  bases__ZN3ccc8DD9x4y14E, 2,
  &(vtc__ZN3ccc8DD9x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x4y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x4y14E),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  CC9x4y15  : virtual ::ccc::AA9 , ::ccc::BB4 {
  ~CC9x4y15(); // tgen
  CC9x4y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x4y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC9x4y15 ::~CC9x4y15(){ note_dtor("_ZN3ccc8CC9x4y15E", this);} // tgen
ccc::CC9x4y15 ::CC9x4y15(){ note_ctor("_ZN3ccc8CC9x4y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x4y15E, buf);
    ::ccc::CC9x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x4y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC9x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x4y15E);
    dp->::ccc::CC9x4y15::~CC9x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x4y15E(Test__ZN3ccc8CC9x4y15E, "_ZN3ccc8CC9x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x4y15C1Ev();
extern void _ZN3ccc8CC9x4y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x4y15E[] = {
  NSPAIR(_ZN3ccc8CC9x4y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC9x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x4y15E[] = {
  {&(_ZTVN3ccc8CC9x4y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x4y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x4y15E[];
Class_Descriptor cd__ZN3ccc8CC9x4y15E = {  "_ZN3ccc8CC9x4y15E", // class name
  bases__ZN3ccc8CC9x4y15E, 2,
  &(vtc__ZN3ccc8CC9x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x4y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x4y15E),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  DD9x4y15  : virtual ::ccc::AA9 , virtual ::ccc::BB4 {
  ~DD9x4y15(); // tgen
  DD9x4y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x4y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD9x4y15 ::~DD9x4y15(){ note_dtor("_ZN3ccc8DD9x4y15E", this);} // tgen
ccc::DD9x4y15 ::DD9x4y15(){ note_ctor("_ZN3ccc8DD9x4y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x4y15E, buf);
    ::ccc::DD9x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x4y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD9x4y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x4y15E);
    dp->::ccc::DD9x4y15::~DD9x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x4y15E(Test__ZN3ccc8DD9x4y15E, "_ZN3ccc8DD9x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x4y15C1Ev();
extern void _ZN3ccc8DD9x4y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x4y15E[] = {
  NSPAIR(_ZN3ccc8DD9x4y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD9x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x4y15E[] = {
  {&(_ZTVN3ccc8DD9x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x4y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x4y15E[];
Class_Descriptor cd__ZN3ccc8DD9x4y15E = {  "_ZN3ccc8DD9x4y15E", // class name
  bases__ZN3ccc8DD9x4y15E, 2,
  &(vtc__ZN3ccc8DD9x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x4y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x4y15E),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  CC9x5y0  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y03pqrEv
  ~CC9x5y0(); // tgen
  CC9x5y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y0E) C1{ VBC2{ v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y03abcEv");}
void  ccc::CC9x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y03efgEv");}
void  ccc::CC9x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y03pqrEv");}
ccc::CC9x5y0 ::~CC9x5y0(){ note_dtor("_ZN3ccc7CC9x5y0E", this);} // tgen
ccc::CC9x5y0 ::CC9x5y0(){ note_ctor("_ZN3ccc7CC9x5y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y0E, buf);
    ::ccc::CC9x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y0E);
    dp->::ccc::CC9x5y0::~CC9x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y0E(Test__ZN3ccc7CC9x5y0E, "_ZN3ccc7CC9x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y0C1Ev();
extern void _ZN3ccc7CC9x5y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y0E[] = {
  NSPAIR(_ZN3ccc7CC9x5y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y0E[];
extern void _ZN3ccc7CC9x5y03pqrEv();
extern void _ZN3ccc7CC9x5y03efgEv();
extern void _ZN3ccc7CC9x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y03efgEv,_ZTv0_n12_N3ccc7CC9x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y03efgEv,_ZThn4_N3ccc7CC9x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y03pqrEv,_ZTv0_n16_N3ccc7CC9x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y03pqrEv,_ZThn4_N3ccc7CC9x5y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y03efgEv,_ZTv0_n12_N3ccc7CC9x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y03pqrEv,_ZTv0_n16_N3ccc7CC9x5y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y0E[] = {
  {&(_ZTVN3ccc7CC9x5y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y0E[];
static VTBL_ENTRY alt_thunk_names1735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y03pqrEv,_ZTv0_n16_N3ccc7CC9x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y03pqrEv,_ZThn4_N3ccc7CC9x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y03efgEv,_ZTv0_n12_N3ccc7CC9x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y03efgEv,_ZThn4_N3ccc7CC9x5y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y0E = {  "_ZN3ccc7CC9x5y0E", // class name
  bases__ZN3ccc7CC9x5y0E, 2,
  &(vtc__ZN3ccc7CC9x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y0E),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  DD9x5y0  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD9x5y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x5y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x5y03pqrEv
  ~DD9x5y0(); // tgen
  DD9x5y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y0E) C1{ VBC2{ v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x5y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y03abcEv");}
void  ccc::DD9x5y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y03efgEv");}
void  ccc::DD9x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y03pqrEv");}
ccc::DD9x5y0 ::~DD9x5y0(){ note_dtor("_ZN3ccc7DD9x5y0E", this);} // tgen
ccc::DD9x5y0 ::DD9x5y0(){ note_ctor("_ZN3ccc7DD9x5y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y0E, buf);
    ::ccc::DD9x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y0E);
    dp->::ccc::DD9x5y0::~DD9x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y0E(Test__ZN3ccc7DD9x5y0E, "_ZN3ccc7DD9x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y0C1Ev();
extern void _ZN3ccc7DD9x5y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y0E[] = {
  NSPAIR(_ZN3ccc7DD9x5y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y0E[];
extern void _ZN3ccc7DD9x5y03efgEv();
extern void _ZN3ccc7DD9x5y03pqrEv();
extern void _ZN3ccc7DD9x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y03pqrEv,_ZTv0_n12_N3ccc7DD9x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y03pqrEv,_ZThn4_N3ccc7DD9x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y03efgEv,_ZTv0_n16_N3ccc7DD9x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y03efgEv,_ZThn4_N3ccc7DD9x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y03abcEv,_ZTv0_n20_N3ccc7DD9x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y03abcEv,_ZThn4_N3ccc7DD9x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y03pqrEv,_ZTv0_n12_N3ccc7DD9x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y03efgEv,_ZTv0_n16_N3ccc7DD9x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y03abcEv,_ZTv0_n20_N3ccc7DD9x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y0E[] = {
  {&(_ZTVN3ccc7DD9x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y0E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y0E[];
static VTBL_ENTRY alt_thunk_names1736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y03abcEv,_ZTv0_n20_N3ccc7DD9x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y03abcEv,_ZThn4_N3ccc7DD9x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y03efgEv,_ZTv0_n16_N3ccc7DD9x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y03efgEv,_ZThn4_N3ccc7DD9x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y03pqrEv,_ZTv0_n12_N3ccc7DD9x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y03pqrEv,_ZThn4_N3ccc7DD9x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y0E = {  "_ZN3ccc7DD9x5y0E", // class name
  bases__ZN3ccc7DD9x5y0E, 2,
  &(vtc__ZN3ccc7DD9x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y0E),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  CC9x5y1  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x5y13efgEv
  ~CC9x5y1(); // tgen
  CC9x5y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y1E) C1{ VBC2{ v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y13abcEv");}
void  ccc::CC9x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y13pqrEv");}
void  ccc::CC9x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y13efgEv");}
ccc::CC9x5y1 ::~CC9x5y1(){ note_dtor("_ZN3ccc7CC9x5y1E", this);} // tgen
ccc::CC9x5y1 ::CC9x5y1(){ note_ctor("_ZN3ccc7CC9x5y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y1E, buf);
    ::ccc::CC9x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y1E);
    dp->::ccc::CC9x5y1::~CC9x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y1E(Test__ZN3ccc7CC9x5y1E, "_ZN3ccc7CC9x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y1C1Ev();
extern void _ZN3ccc7CC9x5y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y1E[] = {
  NSPAIR(_ZN3ccc7CC9x5y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y1E[];
extern void _ZN3ccc7CC9x5y13pqrEv();
extern void _ZN3ccc7CC9x5y13efgEv();
extern void _ZN3ccc7CC9x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y13efgEv,_ZTv0_n12_N3ccc7CC9x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y13efgEv,_ZThn4_N3ccc7CC9x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y13pqrEv,_ZTv0_n16_N3ccc7CC9x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y13pqrEv,_ZThn4_N3ccc7CC9x5y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y13efgEv,_ZTv0_n12_N3ccc7CC9x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y13pqrEv,_ZTv0_n16_N3ccc7CC9x5y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y1E[] = {
  {&(_ZTVN3ccc7CC9x5y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y1E[];
static VTBL_ENTRY alt_thunk_names1737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y13pqrEv,_ZTv0_n16_N3ccc7CC9x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y13pqrEv,_ZThn4_N3ccc7CC9x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y13efgEv,_ZTv0_n12_N3ccc7CC9x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y13efgEv,_ZThn4_N3ccc7CC9x5y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y1E = {  "_ZN3ccc7CC9x5y1E", // class name
  bases__ZN3ccc7CC9x5y1E, 2,
  &(vtc__ZN3ccc7CC9x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y1E),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  DD9x5y1  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD9x5y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x5y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x5y13efgEv
  ~DD9x5y1(); // tgen
  DD9x5y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y1E) C1{ VBC2{ v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x5y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y13abcEv");}
void  ccc::DD9x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y13pqrEv");}
void  ccc::DD9x5y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y13efgEv");}
ccc::DD9x5y1 ::~DD9x5y1(){ note_dtor("_ZN3ccc7DD9x5y1E", this);} // tgen
ccc::DD9x5y1 ::DD9x5y1(){ note_ctor("_ZN3ccc7DD9x5y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y1E, buf);
    ::ccc::DD9x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y1E);
    dp->::ccc::DD9x5y1::~DD9x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y1E(Test__ZN3ccc7DD9x5y1E, "_ZN3ccc7DD9x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y1C1Ev();
extern void _ZN3ccc7DD9x5y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y1E[] = {
  NSPAIR(_ZN3ccc7DD9x5y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y1E[];
extern void _ZN3ccc7DD9x5y13efgEv();
extern void _ZN3ccc7DD9x5y13pqrEv();
extern void _ZN3ccc7DD9x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y13pqrEv,_ZTv0_n12_N3ccc7DD9x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y13pqrEv,_ZThn4_N3ccc7DD9x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y13efgEv,_ZTv0_n16_N3ccc7DD9x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y13efgEv,_ZThn4_N3ccc7DD9x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y13abcEv,_ZTv0_n20_N3ccc7DD9x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y13abcEv,_ZThn4_N3ccc7DD9x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y13pqrEv,_ZTv0_n12_N3ccc7DD9x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y13efgEv,_ZTv0_n16_N3ccc7DD9x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y13abcEv,_ZTv0_n20_N3ccc7DD9x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y1E[] = {
  {&(_ZTVN3ccc7DD9x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y1E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y1E[];
static VTBL_ENTRY alt_thunk_names1738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y13abcEv,_ZTv0_n20_N3ccc7DD9x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y13abcEv,_ZThn4_N3ccc7DD9x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y13efgEv,_ZTv0_n16_N3ccc7DD9x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y13efgEv,_ZThn4_N3ccc7DD9x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y13pqrEv,_ZTv0_n12_N3ccc7DD9x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y13pqrEv,_ZThn4_N3ccc7DD9x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y1E = {  "_ZN3ccc7DD9x5y1E", // class name
  bases__ZN3ccc7DD9x5y1E, 2,
  &(vtc__ZN3ccc7DD9x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y1E),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  CC9x5y2  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y23pqrEv
  ~CC9x5y2(); // tgen
  CC9x5y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y2E) C1{ VBC2{ v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y23efgEv");}
void  ccc::CC9x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y23abcEv");}
void  ccc::CC9x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y23pqrEv");}
ccc::CC9x5y2 ::~CC9x5y2(){ note_dtor("_ZN3ccc7CC9x5y2E", this);} // tgen
ccc::CC9x5y2 ::CC9x5y2(){ note_ctor("_ZN3ccc7CC9x5y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y2E, buf);
    ::ccc::CC9x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y2E);
    dp->::ccc::CC9x5y2::~CC9x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y2E(Test__ZN3ccc7CC9x5y2E, "_ZN3ccc7CC9x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y2C1Ev();
extern void _ZN3ccc7CC9x5y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y2E[] = {
  NSPAIR(_ZN3ccc7CC9x5y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y2E[];
extern void _ZN3ccc7CC9x5y23pqrEv();
extern void _ZN3ccc7CC9x5y23efgEv();
extern void _ZN3ccc7CC9x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y23efgEv,_ZTv0_n12_N3ccc7CC9x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y23efgEv,_ZThn4_N3ccc7CC9x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y23pqrEv,_ZTv0_n16_N3ccc7CC9x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y23pqrEv,_ZThn4_N3ccc7CC9x5y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y23efgEv,_ZTv0_n12_N3ccc7CC9x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y23pqrEv,_ZTv0_n16_N3ccc7CC9x5y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y2E[] = {
  {&(_ZTVN3ccc7CC9x5y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y2E[];
static VTBL_ENTRY alt_thunk_names1739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y23pqrEv,_ZTv0_n16_N3ccc7CC9x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y23pqrEv,_ZThn4_N3ccc7CC9x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y23efgEv,_ZTv0_n12_N3ccc7CC9x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y23efgEv,_ZThn4_N3ccc7CC9x5y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y2E = {  "_ZN3ccc7CC9x5y2E", // class name
  bases__ZN3ccc7CC9x5y2E, 2,
  &(vtc__ZN3ccc7CC9x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y2E),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  DD9x5y2  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD9x5y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x5y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x5y23pqrEv
  ~DD9x5y2(); // tgen
  DD9x5y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y2E) C1{ VBC2{ v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x5y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y23efgEv");}
void  ccc::DD9x5y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y23abcEv");}
void  ccc::DD9x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y23pqrEv");}
ccc::DD9x5y2 ::~DD9x5y2(){ note_dtor("_ZN3ccc7DD9x5y2E", this);} // tgen
ccc::DD9x5y2 ::DD9x5y2(){ note_ctor("_ZN3ccc7DD9x5y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y2E, buf);
    ::ccc::DD9x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y2E);
    dp->::ccc::DD9x5y2::~DD9x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y2E(Test__ZN3ccc7DD9x5y2E, "_ZN3ccc7DD9x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y2C1Ev();
extern void _ZN3ccc7DD9x5y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y2E[] = {
  NSPAIR(_ZN3ccc7DD9x5y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y2E[];
extern void _ZN3ccc7DD9x5y23efgEv();
extern void _ZN3ccc7DD9x5y23pqrEv();
extern void _ZN3ccc7DD9x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y23pqrEv,_ZTv0_n12_N3ccc7DD9x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y23pqrEv,_ZThn4_N3ccc7DD9x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y23efgEv,_ZTv0_n16_N3ccc7DD9x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y23efgEv,_ZThn4_N3ccc7DD9x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y23abcEv,_ZTv0_n20_N3ccc7DD9x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y23abcEv,_ZThn4_N3ccc7DD9x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y23pqrEv,_ZTv0_n12_N3ccc7DD9x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y23efgEv,_ZTv0_n16_N3ccc7DD9x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y23abcEv,_ZTv0_n20_N3ccc7DD9x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y2E[] = {
  {&(_ZTVN3ccc7DD9x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y2E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y2E[];
static VTBL_ENTRY alt_thunk_names1740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y23abcEv,_ZTv0_n20_N3ccc7DD9x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y23abcEv,_ZThn4_N3ccc7DD9x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y23efgEv,_ZTv0_n16_N3ccc7DD9x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y23efgEv,_ZThn4_N3ccc7DD9x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y23pqrEv,_ZTv0_n12_N3ccc7DD9x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y23pqrEv,_ZThn4_N3ccc7DD9x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y2E = {  "_ZN3ccc7DD9x5y2E", // class name
  bases__ZN3ccc7DD9x5y2E, 2,
  &(vtc__ZN3ccc7DD9x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y2E),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  CC9x5y3  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x5y33abcEv
  ~CC9x5y3(); // tgen
  CC9x5y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y3E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y33efgEv");}
void  ccc::CC9x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y33pqrEv");}
void  ccc::CC9x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y33abcEv");}
ccc::CC9x5y3 ::~CC9x5y3(){ note_dtor("_ZN3ccc7CC9x5y3E", this);} // tgen
ccc::CC9x5y3 ::CC9x5y3(){ note_ctor("_ZN3ccc7CC9x5y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y3E, buf);
    ::ccc::CC9x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y3E);
    dp->::ccc::CC9x5y3::~CC9x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y3E(Test__ZN3ccc7CC9x5y3E, "_ZN3ccc7CC9x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y3C1Ev();
extern void _ZN3ccc7CC9x5y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y3E[] = {
  NSPAIR(_ZN3ccc7CC9x5y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y3E[];
extern void _ZN3ccc7CC9x5y33pqrEv();
extern void _ZN3ccc7CC9x5y33efgEv();
extern void _ZN3ccc7CC9x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y33efgEv,_ZTv0_n12_N3ccc7CC9x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y33efgEv,_ZThn4_N3ccc7CC9x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y33pqrEv,_ZTv0_n16_N3ccc7CC9x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y33pqrEv,_ZThn4_N3ccc7CC9x5y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y33efgEv,_ZTv0_n12_N3ccc7CC9x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y33pqrEv,_ZTv0_n16_N3ccc7CC9x5y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y3E[] = {
  {&(_ZTVN3ccc7CC9x5y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y3E[];
static VTBL_ENTRY alt_thunk_names1741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y33pqrEv,_ZTv0_n16_N3ccc7CC9x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y33pqrEv,_ZThn4_N3ccc7CC9x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y33efgEv,_ZTv0_n12_N3ccc7CC9x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y33efgEv,_ZThn4_N3ccc7CC9x5y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y3E = {  "_ZN3ccc7CC9x5y3E", // class name
  bases__ZN3ccc7CC9x5y3E, 2,
  &(vtc__ZN3ccc7CC9x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y3E),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  DD9x5y3  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD9x5y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x5y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x5y33abcEv
  ~DD9x5y3(); // tgen
  DD9x5y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y3E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x5y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y33efgEv");}
void  ccc::DD9x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y33pqrEv");}
void  ccc::DD9x5y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y33abcEv");}
ccc::DD9x5y3 ::~DD9x5y3(){ note_dtor("_ZN3ccc7DD9x5y3E", this);} // tgen
ccc::DD9x5y3 ::DD9x5y3(){ note_ctor("_ZN3ccc7DD9x5y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y3E, buf);
    ::ccc::DD9x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y3E);
    dp->::ccc::DD9x5y3::~DD9x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y3E(Test__ZN3ccc7DD9x5y3E, "_ZN3ccc7DD9x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y3C1Ev();
extern void _ZN3ccc7DD9x5y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y3E[] = {
  NSPAIR(_ZN3ccc7DD9x5y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y3E[];
extern void _ZN3ccc7DD9x5y33efgEv();
extern void _ZN3ccc7DD9x5y33pqrEv();
extern void _ZN3ccc7DD9x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y33pqrEv,_ZTv0_n12_N3ccc7DD9x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y33pqrEv,_ZThn4_N3ccc7DD9x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y33efgEv,_ZTv0_n16_N3ccc7DD9x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y33efgEv,_ZThn4_N3ccc7DD9x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y33abcEv,_ZTv0_n20_N3ccc7DD9x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y33abcEv,_ZThn4_N3ccc7DD9x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y33pqrEv,_ZTv0_n12_N3ccc7DD9x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y33efgEv,_ZTv0_n16_N3ccc7DD9x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y33abcEv,_ZTv0_n20_N3ccc7DD9x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y3E[] = {
  {&(_ZTVN3ccc7DD9x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y3E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y3E[];
static VTBL_ENTRY alt_thunk_names1742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y33abcEv,_ZTv0_n20_N3ccc7DD9x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y33abcEv,_ZThn4_N3ccc7DD9x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y33efgEv,_ZTv0_n16_N3ccc7DD9x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y33efgEv,_ZThn4_N3ccc7DD9x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y33pqrEv,_ZTv0_n12_N3ccc7DD9x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y33pqrEv,_ZThn4_N3ccc7DD9x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y3E = {  "_ZN3ccc7DD9x5y3E", // class name
  bases__ZN3ccc7DD9x5y3E, 2,
  &(vtc__ZN3ccc7DD9x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y3E),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  CC9x5y4  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC9x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x5y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x5y43efgEv
  ~CC9x5y4(); // tgen
  CC9x5y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y4E) C1{ VBC2{ v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y43pqrEv");}
void  ccc::CC9x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y43abcEv");}
void  ccc::CC9x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y43efgEv");}
ccc::CC9x5y4 ::~CC9x5y4(){ note_dtor("_ZN3ccc7CC9x5y4E", this);} // tgen
ccc::CC9x5y4 ::CC9x5y4(){ note_ctor("_ZN3ccc7CC9x5y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y4E, buf);
    ::ccc::CC9x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y4E);
    dp->::ccc::CC9x5y4::~CC9x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y4E(Test__ZN3ccc7CC9x5y4E, "_ZN3ccc7CC9x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y4C1Ev();
extern void _ZN3ccc7CC9x5y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y4E[] = {
  NSPAIR(_ZN3ccc7CC9x5y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y4E[];
extern void _ZN3ccc7CC9x5y43pqrEv();
extern void _ZN3ccc7CC9x5y43efgEv();
extern void _ZN3ccc7CC9x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y43efgEv,_ZTv0_n12_N3ccc7CC9x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y43efgEv,_ZThn4_N3ccc7CC9x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y43pqrEv,_ZTv0_n16_N3ccc7CC9x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y43pqrEv,_ZThn4_N3ccc7CC9x5y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y43efgEv,_ZTv0_n12_N3ccc7CC9x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y43pqrEv,_ZTv0_n16_N3ccc7CC9x5y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y4E[] = {
  {&(_ZTVN3ccc7CC9x5y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y4E[];
static VTBL_ENTRY alt_thunk_names1743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y43pqrEv,_ZTv0_n16_N3ccc7CC9x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y43pqrEv,_ZThn4_N3ccc7CC9x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y43efgEv,_ZTv0_n12_N3ccc7CC9x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y43efgEv,_ZThn4_N3ccc7CC9x5y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y4E = {  "_ZN3ccc7CC9x5y4E", // class name
  bases__ZN3ccc7CC9x5y4E, 2,
  &(vtc__ZN3ccc7CC9x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y4E),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  DD9x5y4  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD9x5y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x5y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x5y43efgEv
  ~DD9x5y4(); // tgen
  DD9x5y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y4E) C1{ VBC2{ v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y43pqrEv");}
void  ccc::DD9x5y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y43abcEv");}
void  ccc::DD9x5y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y43efgEv");}
ccc::DD9x5y4 ::~DD9x5y4(){ note_dtor("_ZN3ccc7DD9x5y4E", this);} // tgen
ccc::DD9x5y4 ::DD9x5y4(){ note_ctor("_ZN3ccc7DD9x5y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y4E, buf);
    ::ccc::DD9x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y4E);
    dp->::ccc::DD9x5y4::~DD9x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y4E(Test__ZN3ccc7DD9x5y4E, "_ZN3ccc7DD9x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y4C1Ev();
extern void _ZN3ccc7DD9x5y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y4E[] = {
  NSPAIR(_ZN3ccc7DD9x5y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y4E[];
extern void _ZN3ccc7DD9x5y43efgEv();
extern void _ZN3ccc7DD9x5y43pqrEv();
extern void _ZN3ccc7DD9x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y43pqrEv,_ZTv0_n12_N3ccc7DD9x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y43pqrEv,_ZThn4_N3ccc7DD9x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y43efgEv,_ZTv0_n16_N3ccc7DD9x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y43efgEv,_ZThn4_N3ccc7DD9x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y43abcEv,_ZTv0_n20_N3ccc7DD9x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y43abcEv,_ZThn4_N3ccc7DD9x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y43pqrEv,_ZTv0_n12_N3ccc7DD9x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y43efgEv,_ZTv0_n16_N3ccc7DD9x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y43abcEv,_ZTv0_n20_N3ccc7DD9x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y4E[] = {
  {&(_ZTVN3ccc7DD9x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y4E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y4E[];
static VTBL_ENTRY alt_thunk_names1744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y43abcEv,_ZTv0_n20_N3ccc7DD9x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y43abcEv,_ZThn4_N3ccc7DD9x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y43efgEv,_ZTv0_n16_N3ccc7DD9x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y43efgEv,_ZThn4_N3ccc7DD9x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y43pqrEv,_ZTv0_n12_N3ccc7DD9x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y43pqrEv,_ZThn4_N3ccc7DD9x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y4E = {  "_ZN3ccc7DD9x5y4E", // class name
  bases__ZN3ccc7DD9x5y4E, 2,
  &(vtc__ZN3ccc7DD9x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y4E),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  CC9x5y5  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7CC9x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x5y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x5y53abcEv
  ~CC9x5y5(); // tgen
  CC9x5y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y5E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y53pqrEv");}
void  ccc::CC9x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y53efgEv");}
void  ccc::CC9x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y53abcEv");}
ccc::CC9x5y5 ::~CC9x5y5(){ note_dtor("_ZN3ccc7CC9x5y5E", this);} // tgen
ccc::CC9x5y5 ::CC9x5y5(){ note_ctor("_ZN3ccc7CC9x5y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y5E, buf);
    ::ccc::CC9x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y5E);
    dp->::ccc::CC9x5y5::~CC9x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y5E(Test__ZN3ccc7CC9x5y5E, "_ZN3ccc7CC9x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y5C1Ev();
extern void _ZN3ccc7CC9x5y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y5E[] = {
  NSPAIR(_ZN3ccc7CC9x5y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y5E[];
extern void _ZN3ccc7CC9x5y53pqrEv();
extern void _ZN3ccc7CC9x5y53efgEv();
extern void _ZN3ccc7CC9x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y53efgEv,_ZTv0_n12_N3ccc7CC9x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y53efgEv,_ZThn4_N3ccc7CC9x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y53pqrEv,_ZTv0_n16_N3ccc7CC9x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y53pqrEv,_ZThn4_N3ccc7CC9x5y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y53efgEv,_ZTv0_n12_N3ccc7CC9x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y53pqrEv,_ZTv0_n16_N3ccc7CC9x5y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y5E[] = {
  {&(_ZTVN3ccc7CC9x5y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y5E[];
static VTBL_ENTRY alt_thunk_names1745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y53pqrEv,_ZTv0_n16_N3ccc7CC9x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y53pqrEv,_ZThn4_N3ccc7CC9x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y53efgEv,_ZTv0_n12_N3ccc7CC9x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y53efgEv,_ZThn4_N3ccc7CC9x5y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y5E = {  "_ZN3ccc7CC9x5y5E", // class name
  bases__ZN3ccc7CC9x5y5E, 2,
  &(vtc__ZN3ccc7CC9x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y5E),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  DD9x5y5  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc7DD9x5y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x5y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x5y53abcEv
  ~DD9x5y5(); // tgen
  DD9x5y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y5E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y53pqrEv");}
void  ccc::DD9x5y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y53efgEv");}
void  ccc::DD9x5y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y53abcEv");}
ccc::DD9x5y5 ::~DD9x5y5(){ note_dtor("_ZN3ccc7DD9x5y5E", this);} // tgen
ccc::DD9x5y5 ::DD9x5y5(){ note_ctor("_ZN3ccc7DD9x5y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y5E, buf);
    ::ccc::DD9x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y5E);
    dp->::ccc::DD9x5y5::~DD9x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y5E(Test__ZN3ccc7DD9x5y5E, "_ZN3ccc7DD9x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y5C1Ev();
extern void _ZN3ccc7DD9x5y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y5E[] = {
  NSPAIR(_ZN3ccc7DD9x5y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y5E[];
extern void _ZN3ccc7DD9x5y53efgEv();
extern void _ZN3ccc7DD9x5y53pqrEv();
extern void _ZN3ccc7DD9x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y53pqrEv,_ZTv0_n12_N3ccc7DD9x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y53pqrEv,_ZThn4_N3ccc7DD9x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y53efgEv,_ZTv0_n16_N3ccc7DD9x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y53efgEv,_ZThn4_N3ccc7DD9x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y53abcEv,_ZTv0_n20_N3ccc7DD9x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y53abcEv,_ZThn4_N3ccc7DD9x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y53pqrEv,_ZTv0_n12_N3ccc7DD9x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y53efgEv,_ZTv0_n16_N3ccc7DD9x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y53abcEv,_ZTv0_n20_N3ccc7DD9x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y5E[] = {
  {&(_ZTVN3ccc7DD9x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y5E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y5E[];
static VTBL_ENTRY alt_thunk_names1746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y53abcEv,_ZTv0_n20_N3ccc7DD9x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y53abcEv,_ZThn4_N3ccc7DD9x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y53efgEv,_ZTv0_n16_N3ccc7DD9x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y53efgEv,_ZThn4_N3ccc7DD9x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y53pqrEv,_ZTv0_n12_N3ccc7DD9x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y53pqrEv,_ZThn4_N3ccc7DD9x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y5E = {  "_ZN3ccc7DD9x5y5E", // class name
  bases__ZN3ccc7DD9x5y5E, 2,
  &(vtc__ZN3ccc7DD9x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y5E),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  CC9x5y6  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x5y63efgEv
  ~CC9x5y6(); // tgen
  CC9x5y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y6E) C1{ VBC2{ v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y63abcEv");}
void  ccc::CC9x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y63efgEv");}
ccc::CC9x5y6 ::~CC9x5y6(){ note_dtor("_ZN3ccc7CC9x5y6E", this);} // tgen
ccc::CC9x5y6 ::CC9x5y6(){ note_ctor("_ZN3ccc7CC9x5y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y6E, buf);
    ::ccc::CC9x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y6E);
    dp->::ccc::CC9x5y6::~CC9x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y6E(Test__ZN3ccc7CC9x5y6E, "_ZN3ccc7CC9x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y6C1Ev();
extern void _ZN3ccc7CC9x5y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y6E[] = {
  NSPAIR(_ZN3ccc7CC9x5y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC9x5y63efgEv();
extern void _ZN3ccc7CC9x5y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y63efgEv,_ZTv0_n12_N3ccc7CC9x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y63efgEv,_ZThn4_N3ccc7CC9x5y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y63efgEv,_ZTv0_n12_N3ccc7CC9x5y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y6E[] = {
  {&(_ZTVN3ccc7CC9x5y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y6E[];
static VTBL_ENTRY alt_thunk_names1747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y63efgEv,_ZTv0_n12_N3ccc7CC9x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y63efgEv,_ZThn4_N3ccc7CC9x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y6E = {  "_ZN3ccc7CC9x5y6E", // class name
  bases__ZN3ccc7CC9x5y6E, 2,
  &(vtc__ZN3ccc7CC9x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y6E),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  DD9x5y6  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD9x5y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x5y63efgEv
  ~DD9x5y6(); // tgen
  DD9x5y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y6E) C1{ VBC2{ v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x5y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y63abcEv");}
void  ccc::DD9x5y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y63efgEv");}
ccc::DD9x5y6 ::~DD9x5y6(){ note_dtor("_ZN3ccc7DD9x5y6E", this);} // tgen
ccc::DD9x5y6 ::DD9x5y6(){ note_ctor("_ZN3ccc7DD9x5y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y6E, buf);
    ::ccc::DD9x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y6E);
    dp->::ccc::DD9x5y6::~DD9x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y6E(Test__ZN3ccc7DD9x5y6E, "_ZN3ccc7DD9x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y6C1Ev();
extern void _ZN3ccc7DD9x5y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y6E[] = {
  NSPAIR(_ZN3ccc7DD9x5y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y6E[];
extern void _ZN3ccc7DD9x5y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x5y63abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y63efgEv,_ZTv0_n16_N3ccc7DD9x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y63efgEv,_ZThn4_N3ccc7DD9x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y63abcEv,_ZTv0_n20_N3ccc7DD9x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y63abcEv,_ZThn4_N3ccc7DD9x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y63efgEv,_ZTv0_n16_N3ccc7DD9x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y63abcEv,_ZTv0_n20_N3ccc7DD9x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y6E[] = {
  {&(_ZTVN3ccc7DD9x5y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y6E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y6E[];
static VTBL_ENTRY alt_thunk_names1748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y63abcEv,_ZTv0_n20_N3ccc7DD9x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y63abcEv,_ZThn4_N3ccc7DD9x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y63efgEv,_ZTv0_n16_N3ccc7DD9x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y63efgEv,_ZThn4_N3ccc7DD9x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y6E = {  "_ZN3ccc7DD9x5y6E", // class name
  bases__ZN3ccc7DD9x5y6E, 2,
  &(vtc__ZN3ccc7DD9x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y6E),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  CC9x5y7  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7CC9x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y73pqrEv
  ~CC9x5y7(); // tgen
  CC9x5y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y7E) C1{ VBC2{ v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y73abcEv");}
void  ccc::CC9x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y73pqrEv");}
ccc::CC9x5y7 ::~CC9x5y7(){ note_dtor("_ZN3ccc7CC9x5y7E", this);} // tgen
ccc::CC9x5y7 ::CC9x5y7(){ note_ctor("_ZN3ccc7CC9x5y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y7E, buf);
    ::ccc::CC9x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y7E);
    dp->::ccc::CC9x5y7::~CC9x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y7E(Test__ZN3ccc7CC9x5y7E, "_ZN3ccc7CC9x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y7C1Ev();
extern void _ZN3ccc7CC9x5y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y7E[] = {
  NSPAIR(_ZN3ccc7CC9x5y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y7E[];
extern void _ZN3ccc7CC9x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc7CC9x5y73abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y73pqrEv,_ZTv0_n16_N3ccc7CC9x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y73pqrEv,_ZThn4_N3ccc7CC9x5y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y73pqrEv,_ZTv0_n16_N3ccc7CC9x5y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y7E[] = {
  {&(_ZTVN3ccc7CC9x5y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y7E[];
static VTBL_ENTRY alt_thunk_names1749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y73pqrEv,_ZTv0_n16_N3ccc7CC9x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y73pqrEv,_ZThn4_N3ccc7CC9x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y7E = {  "_ZN3ccc7CC9x5y7E", // class name
  bases__ZN3ccc7CC9x5y7E, 2,
  &(vtc__ZN3ccc7CC9x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y7E),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  DD9x5y7  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc7DD9x5y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x5y73pqrEv
  ~DD9x5y7(); // tgen
  DD9x5y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y7E) C1{ VBC2{ v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x5y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y73abcEv");}
void  ccc::DD9x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y73pqrEv");}
ccc::DD9x5y7 ::~DD9x5y7(){ note_dtor("_ZN3ccc7DD9x5y7E", this);} // tgen
ccc::DD9x5y7 ::DD9x5y7(){ note_ctor("_ZN3ccc7DD9x5y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y7E, buf);
    ::ccc::DD9x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y7E);
    dp->::ccc::DD9x5y7::~DD9x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y7E(Test__ZN3ccc7DD9x5y7E, "_ZN3ccc7DD9x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y7C1Ev();
extern void _ZN3ccc7DD9x5y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y7E[] = {
  NSPAIR(_ZN3ccc7DD9x5y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x5y73pqrEv();
extern void _ZN3ccc7DD9x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y73pqrEv,_ZTv0_n12_N3ccc7DD9x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y73pqrEv,_ZThn4_N3ccc7DD9x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y73abcEv,_ZTv0_n20_N3ccc7DD9x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y73abcEv,_ZThn4_N3ccc7DD9x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y73pqrEv,_ZTv0_n12_N3ccc7DD9x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y73abcEv,_ZTv0_n20_N3ccc7DD9x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y7E[] = {
  {&(_ZTVN3ccc7DD9x5y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y7E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y7E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y7E[];
static VTBL_ENTRY alt_thunk_names1750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y73abcEv,_ZTv0_n20_N3ccc7DD9x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y73abcEv,_ZThn4_N3ccc7DD9x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y73pqrEv,_ZTv0_n12_N3ccc7DD9x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y73pqrEv,_ZThn4_N3ccc7DD9x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y7E = {  "_ZN3ccc7DD9x5y7E", // class name
  bases__ZN3ccc7DD9x5y7E, 2,
  &(vtc__ZN3ccc7DD9x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y7E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y7E),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  CC9x5y8  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x5y83abcEv
  ~CC9x5y8(); // tgen
  CC9x5y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y8E) C1{ VBC2{ v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y83efgEv");}
void  ccc::CC9x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x5y83abcEv");}
ccc::CC9x5y8 ::~CC9x5y8(){ note_dtor("_ZN3ccc7CC9x5y8E", this);} // tgen
ccc::CC9x5y8 ::CC9x5y8(){ note_ctor("_ZN3ccc7CC9x5y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y8E, buf);
    ::ccc::CC9x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y8E);
    dp->::ccc::CC9x5y8::~CC9x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y8E(Test__ZN3ccc7CC9x5y8E, "_ZN3ccc7CC9x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y8C1Ev();
extern void _ZN3ccc7CC9x5y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y8E[] = {
  NSPAIR(_ZN3ccc7CC9x5y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc7CC9x5y83efgEv();
extern void _ZN3ccc7CC9x5y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y83efgEv,_ZTv0_n12_N3ccc7CC9x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y83efgEv,_ZThn4_N3ccc7CC9x5y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y83efgEv,_ZTv0_n12_N3ccc7CC9x5y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y8E[] = {
  {&(_ZTVN3ccc7CC9x5y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y8E[];
static VTBL_ENTRY alt_thunk_names1751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y83efgEv,_ZTv0_n12_N3ccc7CC9x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y83efgEv,_ZThn4_N3ccc7CC9x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y8E = {  "_ZN3ccc7CC9x5y8E", // class name
  bases__ZN3ccc7CC9x5y8E, 2,
  &(vtc__ZN3ccc7CC9x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y8E),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  DD9x5y8  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD9x5y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x5y83abcEv
  ~DD9x5y8(); // tgen
  DD9x5y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y8E) C1{ VBC2{ v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x5y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y83efgEv");}
void  ccc::DD9x5y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x5y83abcEv");}
ccc::DD9x5y8 ::~DD9x5y8(){ note_dtor("_ZN3ccc7DD9x5y8E", this);} // tgen
ccc::DD9x5y8 ::DD9x5y8(){ note_ctor("_ZN3ccc7DD9x5y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y8E, buf);
    ::ccc::DD9x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y8E);
    dp->::ccc::DD9x5y8::~DD9x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y8E(Test__ZN3ccc7DD9x5y8E, "_ZN3ccc7DD9x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y8C1Ev();
extern void _ZN3ccc7DD9x5y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y8E[] = {
  NSPAIR(_ZN3ccc7DD9x5y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y8E[];
extern void _ZN3ccc7DD9x5y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x5y83abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y83efgEv,_ZTv0_n16_N3ccc7DD9x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y83efgEv,_ZThn4_N3ccc7DD9x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc7DD9x5y83abcEv,_ZTv0_n20_N3ccc7DD9x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y83abcEv,_ZThn4_N3ccc7DD9x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y83efgEv,_ZTv0_n16_N3ccc7DD9x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc7DD9x5y83abcEv,_ZTv0_n20_N3ccc7DD9x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y8E[] = {
  {&(_ZTVN3ccc7DD9x5y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y8E[6]),  6,17},
  {&(_ZTVN3ccc7DD9x5y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y8E[];
static VTBL_ENTRY alt_thunk_names1752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc7DD9x5y83abcEv,_ZTv0_n20_N3ccc7DD9x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y83abcEv,_ZThn4_N3ccc7DD9x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y83efgEv,_ZTv0_n16_N3ccc7DD9x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y83efgEv,_ZThn4_N3ccc7DD9x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y8E = {  "_ZN3ccc7DD9x5y8E", // class name
  bases__ZN3ccc7DD9x5y8E, 2,
  &(vtc__ZN3ccc7DD9x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y8E),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  CC9x5y9  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7CC9x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x5y93pqrEv
  ~CC9x5y9(); // tgen
  CC9x5y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x5y9E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x5y93efgEv");}
void  ccc::CC9x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x5y93pqrEv");}
ccc::CC9x5y9 ::~CC9x5y9(){ note_dtor("_ZN3ccc7CC9x5y9E", this);} // tgen
ccc::CC9x5y9 ::CC9x5y9(){ note_ctor("_ZN3ccc7CC9x5y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x5y9E, buf);
    ::ccc::CC9x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x5y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc7CC9x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x5y9E);
    dp->::ccc::CC9x5y9::~CC9x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x5y9E(Test__ZN3ccc7CC9x5y9E, "_ZN3ccc7CC9x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x5y9C1Ev();
extern void _ZN3ccc7CC9x5y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x5y9E[] = {
  NSPAIR(_ZN3ccc7CC9x5y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7CC9x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x5y9E[];
extern void _ZN3ccc7CC9x5y93pqrEv();
extern void _ZN3ccc7CC9x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x5y93efgEv,_ZTv0_n12_N3ccc7CC9x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y93efgEv,_ZThn4_N3ccc7CC9x5y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x5y93pqrEv,_ZTv0_n16_N3ccc7CC9x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x5y93pqrEv,_ZThn4_N3ccc7CC9x5y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x5y93efgEv,_ZTv0_n12_N3ccc7CC9x5y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x5y93pqrEv,_ZTv0_n16_N3ccc7CC9x5y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x5y9E[] = {
  {&(_ZTVN3ccc7CC9x5y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x5y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x5y9E[];
static VTBL_ENTRY alt_thunk_names1753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x5y93pqrEv,_ZTv0_n16_N3ccc7CC9x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y93pqrEv,_ZThn4_N3ccc7CC9x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x5y93efgEv,_ZTv0_n12_N3ccc7CC9x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x5y93efgEv,_ZThn4_N3ccc7CC9x5y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x5y9E = {  "_ZN3ccc7CC9x5y9E", // class name
  bases__ZN3ccc7CC9x5y9E, 2,
  &(vtc__ZN3ccc7CC9x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x5y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x5y9E),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  DD9x5y9  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc7DD9x5y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x5y93pqrEv
  ~DD9x5y9(); // tgen
  DD9x5y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x5y9E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x5y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x5y93efgEv");}
void  ccc::DD9x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x5y93pqrEv");}
ccc::DD9x5y9 ::~DD9x5y9(){ note_dtor("_ZN3ccc7DD9x5y9E", this);} // tgen
ccc::DD9x5y9 ::DD9x5y9(){ note_ctor("_ZN3ccc7DD9x5y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x5y9E, buf);
    ::ccc::DD9x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x5y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc7DD9x5y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x5y9E);
    dp->::ccc::DD9x5y9::~DD9x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x5y9E(Test__ZN3ccc7DD9x5y9E, "_ZN3ccc7DD9x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x5y9C1Ev();
extern void _ZN3ccc7DD9x5y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x5y9E[] = {
  NSPAIR(_ZN3ccc7DD9x5y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc7DD9x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y9E[];
extern void _ZN3ccc7DD9x5y93efgEv();
extern void _ZN3ccc7DD9x5y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x5y93pqrEv,_ZTv0_n12_N3ccc7DD9x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y93pqrEv,_ZThn4_N3ccc7DD9x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x5y93efgEv,_ZTv0_n16_N3ccc7DD9x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x5y93efgEv,_ZThn4_N3ccc7DD9x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x5y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x5y93pqrEv,_ZTv0_n12_N3ccc7DD9x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x5y93efgEv,_ZTv0_n16_N3ccc7DD9x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x5y9E[] = {
  {&(_ZTVN3ccc7DD9x5y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x5y9E[6]),  6,16},
  {&(_ZTVN3ccc7DD9x5y9E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x5y9E[];
static VTBL_ENTRY alt_thunk_names1754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x5y93efgEv,_ZTv0_n16_N3ccc7DD9x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y93efgEv,_ZThn4_N3ccc7DD9x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x5y93pqrEv,_ZTv0_n12_N3ccc7DD9x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x5y93pqrEv,_ZThn4_N3ccc7DD9x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x5y9E = {  "_ZN3ccc7DD9x5y9E", // class name
  bases__ZN3ccc7DD9x5y9E, 2,
  &(vtc__ZN3ccc7DD9x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x5y9E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x5y9E),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  CC9x5y10  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC9x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x5y103abcEv
  ~CC9x5y10(); // tgen
  CC9x5y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y10E) C1{ VBC2{ v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x5y103pqrEv");}
void  ccc::CC9x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x5y103abcEv");}
ccc::CC9x5y10 ::~CC9x5y10(){ note_dtor("_ZN3ccc8CC9x5y10E", this);} // tgen
ccc::CC9x5y10 ::CC9x5y10(){ note_ctor("_ZN3ccc8CC9x5y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x5y10E, buf);
    ::ccc::CC9x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x5y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC9x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x5y10E);
    dp->::ccc::CC9x5y10::~CC9x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x5y10E(Test__ZN3ccc8CC9x5y10E, "_ZN3ccc8CC9x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x5y10C1Ev();
extern void _ZN3ccc8CC9x5y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x5y10E[] = {
  NSPAIR(_ZN3ccc8CC9x5y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC9x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x5y10E[];
extern void _ZN3ccc8CC9x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC9x5y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x5y103pqrEv,_ZTv0_n16_N3ccc8CC9x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y103pqrEv,_ZThn4_N3ccc8CC9x5y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x5y103pqrEv,_ZTv0_n16_N3ccc8CC9x5y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x5y10E[] = {
  {&(_ZTVN3ccc8CC9x5y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x5y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x5y10E[];
static VTBL_ENTRY alt_thunk_names1755[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x5y103pqrEv,_ZTv0_n16_N3ccc8CC9x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x5y103pqrEv,_ZThn4_N3ccc8CC9x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x5y10E = {  "_ZN3ccc8CC9x5y10E", // class name
  bases__ZN3ccc8CC9x5y10E, 2,
  &(vtc__ZN3ccc8CC9x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x5y10E),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  DD9x5y10  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD9x5y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x5y103abcEv
  ~DD9x5y10(); // tgen
  DD9x5y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x5y10E) C1{ VBC2{ v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x5y103pqrEv");}
void  ccc::DD9x5y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x5y103abcEv");}
ccc::DD9x5y10 ::~DD9x5y10(){ note_dtor("_ZN3ccc8DD9x5y10E", this);} // tgen
ccc::DD9x5y10 ::DD9x5y10(){ note_ctor("_ZN3ccc8DD9x5y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x5y10E, buf);
    ::ccc::DD9x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x5y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD9x5y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x5y10E);
    dp->::ccc::DD9x5y10::~DD9x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x5y10E(Test__ZN3ccc8DD9x5y10E, "_ZN3ccc8DD9x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x5y10C1Ev();
extern void _ZN3ccc8DD9x5y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x5y10E[] = {
  NSPAIR(_ZN3ccc8DD9x5y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD9x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x5y103pqrEv();
extern void _ZN3ccc8DD9x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x5y103pqrEv,_ZTv0_n12_N3ccc8DD9x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y103pqrEv,_ZThn4_N3ccc8DD9x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x5y103abcEv,_ZTv0_n20_N3ccc8DD9x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y103abcEv,_ZThn4_N3ccc8DD9x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x5y103pqrEv,_ZTv0_n12_N3ccc8DD9x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x5y103abcEv,_ZTv0_n20_N3ccc8DD9x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x5y10E[] = {
  {&(_ZTVN3ccc8DD9x5y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x5y10E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x5y10E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x5y10E[];
static VTBL_ENTRY alt_thunk_names1756[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x5y103abcEv,_ZTv0_n20_N3ccc8DD9x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y103abcEv,_ZThn4_N3ccc8DD9x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x5y103pqrEv,_ZTv0_n12_N3ccc8DD9x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y103pqrEv,_ZThn4_N3ccc8DD9x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x5y10E = {  "_ZN3ccc8DD9x5y10E", // class name
  bases__ZN3ccc8DD9x5y10E, 2,
  &(vtc__ZN3ccc8DD9x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x5y10E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x5y10E),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  CC9x5y11  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC9x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x5y113efgEv
  ~CC9x5y11(); // tgen
  CC9x5y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y11E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x5y113pqrEv");}
void  ccc::CC9x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x5y113efgEv");}
ccc::CC9x5y11 ::~CC9x5y11(){ note_dtor("_ZN3ccc8CC9x5y11E", this);} // tgen
ccc::CC9x5y11 ::CC9x5y11(){ note_ctor("_ZN3ccc8CC9x5y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x5y11E, buf);
    ::ccc::CC9x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x5y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC9x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x5y11E);
    dp->::ccc::CC9x5y11::~CC9x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x5y11E(Test__ZN3ccc8CC9x5y11E, "_ZN3ccc8CC9x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x5y11C1Ev();
extern void _ZN3ccc8CC9x5y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x5y11E[] = {
  NSPAIR(_ZN3ccc8CC9x5y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC9x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x5y11E[];
extern void _ZN3ccc8CC9x5y113pqrEv();
extern void _ZN3ccc8CC9x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x5y113efgEv,_ZTv0_n12_N3ccc8CC9x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y113efgEv,_ZThn4_N3ccc8CC9x5y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x5y113pqrEv,_ZTv0_n16_N3ccc8CC9x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y113pqrEv,_ZThn4_N3ccc8CC9x5y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x5y113efgEv,_ZTv0_n12_N3ccc8CC9x5y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x5y113pqrEv,_ZTv0_n16_N3ccc8CC9x5y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x5y11E[] = {
  {&(_ZTVN3ccc8CC9x5y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x5y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x5y11E[];
static VTBL_ENTRY alt_thunk_names1757[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x5y113pqrEv,_ZTv0_n16_N3ccc8CC9x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x5y113pqrEv,_ZThn4_N3ccc8CC9x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x5y113efgEv,_ZTv0_n12_N3ccc8CC9x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x5y113efgEv,_ZThn4_N3ccc8CC9x5y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x5y11E = {  "_ZN3ccc8CC9x5y11E", // class name
  bases__ZN3ccc8CC9x5y11E, 2,
  &(vtc__ZN3ccc8CC9x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x5y11E),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  DD9x5y11  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD9x5y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x5y113efgEv
  ~DD9x5y11(); // tgen
  DD9x5y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x5y11E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x5y113pqrEv");}
void  ccc::DD9x5y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x5y113efgEv");}
ccc::DD9x5y11 ::~DD9x5y11(){ note_dtor("_ZN3ccc8DD9x5y11E", this);} // tgen
ccc::DD9x5y11 ::DD9x5y11(){ note_ctor("_ZN3ccc8DD9x5y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x5y11E, buf);
    ::ccc::DD9x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x5y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD9x5y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x5y11E);
    dp->::ccc::DD9x5y11::~DD9x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x5y11E(Test__ZN3ccc8DD9x5y11E, "_ZN3ccc8DD9x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x5y11C1Ev();
extern void _ZN3ccc8DD9x5y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x5y11E[] = {
  NSPAIR(_ZN3ccc8DD9x5y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD9x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y11E[];
extern void _ZN3ccc8DD9x5y113efgEv();
extern void _ZN3ccc8DD9x5y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x5y113pqrEv,_ZTv0_n12_N3ccc8DD9x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y113pqrEv,_ZThn4_N3ccc8DD9x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x5y113efgEv,_ZTv0_n16_N3ccc8DD9x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y113efgEv,_ZThn4_N3ccc8DD9x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x5y113pqrEv,_ZTv0_n12_N3ccc8DD9x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x5y113efgEv,_ZTv0_n16_N3ccc8DD9x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x5y11E[] = {
  {&(_ZTVN3ccc8DD9x5y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y11E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y11E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x5y11E[];
static VTBL_ENTRY alt_thunk_names1758[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x5y113efgEv,_ZTv0_n16_N3ccc8DD9x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y113efgEv,_ZThn4_N3ccc8DD9x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x5y113pqrEv,_ZTv0_n12_N3ccc8DD9x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y113pqrEv,_ZThn4_N3ccc8DD9x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x5y11E = {  "_ZN3ccc8DD9x5y11E", // class name
  bases__ZN3ccc8DD9x5y11E, 2,
  &(vtc__ZN3ccc8DD9x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x5y11E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x5y11E),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  CC9x5y12  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC9x5y123abcEv
  ~CC9x5y12(); // tgen
  CC9x5y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y12E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC9x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x5y123abcEv");}
ccc::CC9x5y12 ::~CC9x5y12(){ note_dtor("_ZN3ccc8CC9x5y12E", this);} // tgen
ccc::CC9x5y12 ::CC9x5y12(){ note_ctor("_ZN3ccc8CC9x5y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x5y12E, buf);
    ::ccc::CC9x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x5y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC9x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x5y12E);
    dp->::ccc::CC9x5y12::~CC9x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x5y12E(Test__ZN3ccc8CC9x5y12E, "_ZN3ccc8CC9x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x5y12C1Ev();
extern void _ZN3ccc8CC9x5y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x5y12E[] = {
  NSPAIR(_ZN3ccc8CC9x5y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC9x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC9x5y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x5y12E[] = {
  {&(_ZTVN3ccc8CC9x5y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x5y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x5y12E[];
Class_Descriptor cd__ZN3ccc8CC9x5y12E = {  "_ZN3ccc8CC9x5y12E", // class name
  bases__ZN3ccc8CC9x5y12E, 2,
  &(vtc__ZN3ccc8CC9x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x5y12E),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  DD9x5y12  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD9x5y123abcEv
  ~DD9x5y12(); // tgen
  DD9x5y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x5y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD9x5y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x5y123abcEv");}
ccc::DD9x5y12 ::~DD9x5y12(){ note_dtor("_ZN3ccc8DD9x5y12E", this);} // tgen
ccc::DD9x5y12 ::DD9x5y12(){ note_ctor("_ZN3ccc8DD9x5y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x5y12E, buf);
    ::ccc::DD9x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x5y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD9x5y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x5y12E);
    dp->::ccc::DD9x5y12::~DD9x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x5y12E(Test__ZN3ccc8DD9x5y12E, "_ZN3ccc8DD9x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x5y12C1Ev();
extern void _ZN3ccc8DD9x5y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x5y12E[] = {
  NSPAIR(_ZN3ccc8DD9x5y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD9x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD9x5y123abcEv,_ZTv0_n20_N3ccc8DD9x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y123abcEv,_ZThn4_N3ccc8DD9x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD9x5y123abcEv,_ZTv0_n20_N3ccc8DD9x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x5y12E[] = {
  {&(_ZTVN3ccc8DD9x5y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x5y12E[6]),  6,17},
  {&(_ZTVN3ccc8DD9x5y12E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x5y12E[];
static VTBL_ENTRY alt_thunk_names1759[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD9x5y123abcEv,_ZTv0_n20_N3ccc8DD9x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y123abcEv,_ZThn4_N3ccc8DD9x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x5y12E = {  "_ZN3ccc8DD9x5y12E", // class name
  bases__ZN3ccc8DD9x5y12E, 2,
  &(vtc__ZN3ccc8DD9x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x5y12E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x5y12E),3, //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  CC9x5y13  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC9x5y133efgEv
  ~CC9x5y13(); // tgen
  CC9x5y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC9x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x5y133efgEv");}
ccc::CC9x5y13 ::~CC9x5y13(){ note_dtor("_ZN3ccc8CC9x5y13E", this);} // tgen
ccc::CC9x5y13 ::CC9x5y13(){ note_ctor("_ZN3ccc8CC9x5y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x5y13E, buf);
    ::ccc::CC9x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x5y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC9x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x5y13E);
    dp->::ccc::CC9x5y13::~CC9x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x5y13E(Test__ZN3ccc8CC9x5y13E, "_ZN3ccc8CC9x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x5y13C1Ev();
extern void _ZN3ccc8CC9x5y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x5y13E[] = {
  NSPAIR(_ZN3ccc8CC9x5y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC9x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC9x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x5y133efgEv,_ZTv0_n12_N3ccc8CC9x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y133efgEv,_ZThn4_N3ccc8CC9x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x5y133efgEv,_ZTv0_n12_N3ccc8CC9x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x5y13E[] = {
  {&(_ZTVN3ccc8CC9x5y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x5y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x5y13E[];
static VTBL_ENTRY alt_thunk_names1760[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x5y133efgEv,_ZTv0_n12_N3ccc8CC9x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x5y133efgEv,_ZThn4_N3ccc8CC9x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x5y13E = {  "_ZN3ccc8CC9x5y13E", // class name
  bases__ZN3ccc8CC9x5y13E, 2,
  &(vtc__ZN3ccc8CC9x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x5y13E),2, //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  DD9x5y13  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD9x5y133efgEv
  ~DD9x5y13(); // tgen
  DD9x5y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x5y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD9x5y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x5y133efgEv");}
ccc::DD9x5y13 ::~DD9x5y13(){ note_dtor("_ZN3ccc8DD9x5y13E", this);} // tgen
ccc::DD9x5y13 ::DD9x5y13(){ note_ctor("_ZN3ccc8DD9x5y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x5y13E, buf);
    ::ccc::DD9x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x5y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD9x5y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x5y13E);
    dp->::ccc::DD9x5y13::~DD9x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x5y13E(Test__ZN3ccc8DD9x5y13E, "_ZN3ccc8DD9x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x5y13C1Ev();
extern void _ZN3ccc8DD9x5y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x5y13E[] = {
  NSPAIR(_ZN3ccc8DD9x5y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD9x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y13E[];
extern void _ZN3ccc8DD9x5y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x5y133efgEv,_ZTv0_n16_N3ccc8DD9x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y133efgEv,_ZThn4_N3ccc8DD9x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x5y133efgEv,_ZTv0_n16_N3ccc8DD9x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x5y13E[] = {
  {&(_ZTVN3ccc8DD9x5y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y13E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y13E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x5y13E[];
static VTBL_ENTRY alt_thunk_names1761[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x5y133efgEv,_ZTv0_n16_N3ccc8DD9x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y133efgEv,_ZThn4_N3ccc8DD9x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x5y13E = {  "_ZN3ccc8DD9x5y13E", // class name
  bases__ZN3ccc8DD9x5y13E, 2,
  &(vtc__ZN3ccc8DD9x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x5y13E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x5y13E),3, //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  CC9x5y14  : virtual ::ccc::AA9 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC9x5y143pqrEv
  ~CC9x5y14(); // tgen
  CC9x5y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x5y143pqrEv");}
ccc::CC9x5y14 ::~CC9x5y14(){ note_dtor("_ZN3ccc8CC9x5y14E", this);} // tgen
ccc::CC9x5y14 ::CC9x5y14(){ note_ctor("_ZN3ccc8CC9x5y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x5y14E, buf);
    ::ccc::CC9x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x5y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC9x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x5y14E);
    dp->::ccc::CC9x5y14::~CC9x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x5y14E(Test__ZN3ccc8CC9x5y14E, "_ZN3ccc8CC9x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x5y14C1Ev();
extern void _ZN3ccc8CC9x5y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x5y14E[] = {
  NSPAIR(_ZN3ccc8CC9x5y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC9x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x5y14E[];
extern void _ZN3ccc8CC9x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x5y143pqrEv,_ZTv0_n16_N3ccc8CC9x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x5y143pqrEv,_ZThn4_N3ccc8CC9x5y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x5y143pqrEv,_ZTv0_n16_N3ccc8CC9x5y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x5y14E[] = {
  {&(_ZTVN3ccc8CC9x5y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x5y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x5y14E[];
static VTBL_ENTRY alt_thunk_names1762[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x5y143pqrEv,_ZTv0_n16_N3ccc8CC9x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x5y143pqrEv,_ZThn4_N3ccc8CC9x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x5y14E = {  "_ZN3ccc8CC9x5y14E", // class name
  bases__ZN3ccc8CC9x5y14E, 2,
  &(vtc__ZN3ccc8CC9x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x5y14E),2, //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  DD9x5y14  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD9x5y143pqrEv
  ~DD9x5y14(); // tgen
  DD9x5y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x5y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x5y143pqrEv");}
ccc::DD9x5y14 ::~DD9x5y14(){ note_dtor("_ZN3ccc8DD9x5y14E", this);} // tgen
ccc::DD9x5y14 ::DD9x5y14(){ note_ctor("_ZN3ccc8DD9x5y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x5y14E, buf);
    ::ccc::DD9x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x5y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD9x5y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x5y14E);
    dp->::ccc::DD9x5y14::~DD9x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x5y14E(Test__ZN3ccc8DD9x5y14E, "_ZN3ccc8DD9x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x5y14C1Ev();
extern void _ZN3ccc8DD9x5y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x5y14E[] = {
  NSPAIR(_ZN3ccc8DD9x5y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD9x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x5y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x5y143pqrEv,_ZTv0_n12_N3ccc8DD9x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x5y143pqrEv,_ZThn4_N3ccc8DD9x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x5y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x5y143pqrEv,_ZTv0_n12_N3ccc8DD9x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x5y14E[] = {
  {&(_ZTVN3ccc8DD9x5y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y14E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x5y14E[];
static VTBL_ENTRY alt_thunk_names1763[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x5y143pqrEv,_ZTv0_n12_N3ccc8DD9x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x5y143pqrEv,_ZThn4_N3ccc8DD9x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x5y14E = {  "_ZN3ccc8DD9x5y14E", // class name
  bases__ZN3ccc8DD9x5y14E, 2,
  &(vtc__ZN3ccc8DD9x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x5y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x5y14E),3, //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  CC9x5y15  : virtual ::ccc::AA9 , ::ccc::BB5 {
  ~CC9x5y15(); // tgen
  CC9x5y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x5y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC9x5y15 ::~CC9x5y15(){ note_dtor("_ZN3ccc8CC9x5y15E", this);} // tgen
ccc::CC9x5y15 ::CC9x5y15(){ note_ctor("_ZN3ccc8CC9x5y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x5y15E, buf);
    ::ccc::CC9x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x5y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC9x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x5y15E);
    dp->::ccc::CC9x5y15::~CC9x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x5y15E(Test__ZN3ccc8CC9x5y15E, "_ZN3ccc8CC9x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x5y15C1Ev();
extern void _ZN3ccc8CC9x5y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x5y15E[] = {
  NSPAIR(_ZN3ccc8CC9x5y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC9x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x5y15E[] = {
  {&(_ZTVN3ccc8CC9x5y15E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x5y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x5y15E[];
Class_Descriptor cd__ZN3ccc8CC9x5y15E = {  "_ZN3ccc8CC9x5y15E", // class name
  bases__ZN3ccc8CC9x5y15E, 2,
  &(vtc__ZN3ccc8CC9x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x5y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x5y15E),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  DD9x5y15  : virtual ::ccc::AA9 , virtual ::ccc::BB5 {
  ~DD9x5y15(); // tgen
  DD9x5y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x5y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD9x5y15 ::~DD9x5y15(){ note_dtor("_ZN3ccc8DD9x5y15E", this);} // tgen
ccc::DD9x5y15 ::DD9x5y15(){ note_ctor("_ZN3ccc8DD9x5y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x5y15E, buf);
    ::ccc::DD9x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x5y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD9x5y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x5y15E);
    dp->::ccc::DD9x5y15::~DD9x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x5y15E(Test__ZN3ccc8DD9x5y15E, "_ZN3ccc8DD9x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x5y15C1Ev();
extern void _ZN3ccc8DD9x5y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x5y15E[] = {
  NSPAIR(_ZN3ccc8DD9x5y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD9x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x5y15E[] = {
  {&(_ZTVN3ccc8DD9x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y15E[6]),  6,16},
  {&(_ZTVN3ccc8DD9x5y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x5y15E[];
Class_Descriptor cd__ZN3ccc8DD9x5y15E = {  "_ZN3ccc8DD9x5y15E", // class name
  bases__ZN3ccc8DD9x5y15E, 2,
  &(vtc__ZN3ccc8DD9x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x5y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x5y15E),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  CC9x6y0  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y03pqrEv
  ~CC9x6y0(); // tgen
  CC9x6y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y0E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y03abcEv");}
void  ccc::CC9x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y03efgEv");}
void  ccc::CC9x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y03pqrEv");}
ccc::CC9x6y0 ::~CC9x6y0(){ note_dtor("_ZN3ccc7CC9x6y0E", this);} // tgen
ccc::CC9x6y0 ::CC9x6y0(){ note_ctor("_ZN3ccc7CC9x6y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y0E, buf);
    ::ccc::CC9x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y0E);
    dp->::ccc::CC9x6y0::~CC9x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y0E(Test__ZN3ccc7CC9x6y0E, "_ZN3ccc7CC9x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y0C1Ev();
extern void _ZN3ccc7CC9x6y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y0E[] = {
  NSPAIR(_ZN3ccc7CC9x6y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y0E[];
extern void _ZN3ccc7CC9x6y03abcEv();
extern void _ZN3ccc7CC9x6y03efgEv();
extern void _ZN3ccc7CC9x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y03efgEv,_ZTv0_n12_N3ccc7CC9x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y03efgEv,_ZThn4_N3ccc7CC9x6y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y03pqrEv,_ZTv0_n16_N3ccc7CC9x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y03pqrEv,_ZThn4_N3ccc7CC9x6y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y03efgEv,_ZTv0_n12_N3ccc7CC9x6y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y03pqrEv,_ZTv0_n16_N3ccc7CC9x6y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y0E[] = {
  {&(_ZTVN3ccc7CC9x6y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y0E[];
static VTBL_ENTRY alt_thunk_names1764[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y03pqrEv,_ZTv0_n16_N3ccc7CC9x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y03pqrEv,_ZThn4_N3ccc7CC9x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y03efgEv,_ZTv0_n12_N3ccc7CC9x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y03efgEv,_ZThn4_N3ccc7CC9x6y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y0E = {  "_ZN3ccc7CC9x6y0E", // class name
  bases__ZN3ccc7CC9x6y0E, 2,
  &(vtc__ZN3ccc7CC9x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y0E),2, //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  DD9x6y0  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD9x6y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x6y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x6y03pqrEv
  ~DD9x6y0(); // tgen
  DD9x6y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y0E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x6y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y03abcEv");}
void  ccc::DD9x6y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y03efgEv");}
void  ccc::DD9x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y03pqrEv");}
ccc::DD9x6y0 ::~DD9x6y0(){ note_dtor("_ZN3ccc7DD9x6y0E", this);} // tgen
ccc::DD9x6y0 ::DD9x6y0(){ note_ctor("_ZN3ccc7DD9x6y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y0E, buf);
    ::ccc::DD9x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y0E);
    dp->::ccc::DD9x6y0::~DD9x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y0E(Test__ZN3ccc7DD9x6y0E, "_ZN3ccc7DD9x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y0C1Ev();
extern void _ZN3ccc7DD9x6y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y0E[] = {
  NSPAIR(_ZN3ccc7DD9x6y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y0E[];
extern void _ZN3ccc7DD9x6y03efgEv();
extern void _ZN3ccc7DD9x6y03pqrEv();
extern void _ZN3ccc7DD9x6y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y03abcEv,_ZTv0_n12_N3ccc7DD9x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y03abcEv,_ZThn4_N3ccc7DD9x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y03efgEv,_ZTv0_n16_N3ccc7DD9x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y03efgEv,_ZThn4_N3ccc7DD9x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y03abcEv,_ZTv0_n12_N3ccc7DD9x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y03efgEv,_ZTv0_n16_N3ccc7DD9x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y0E[] = {
  {&(_ZTVN3ccc7DD9x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y0E[];
static VTBL_ENTRY alt_thunk_names1765[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y03efgEv,_ZTv0_n16_N3ccc7DD9x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y03efgEv,_ZThn4_N3ccc7DD9x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y03abcEv,_ZTv0_n12_N3ccc7DD9x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y03abcEv,_ZThn4_N3ccc7DD9x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y0E = {  "_ZN3ccc7DD9x6y0E", // class name
  bases__ZN3ccc7DD9x6y0E, 2,
  &(vtc__ZN3ccc7DD9x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y0E),3, //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  CC9x6y1  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x6y13efgEv
  ~CC9x6y1(); // tgen
  CC9x6y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y1E) C1{ VBC2{ v3 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y13abcEv");}
void  ccc::CC9x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y13pqrEv");}
void  ccc::CC9x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y13efgEv");}
ccc::CC9x6y1 ::~CC9x6y1(){ note_dtor("_ZN3ccc7CC9x6y1E", this);} // tgen
ccc::CC9x6y1 ::CC9x6y1(){ note_ctor("_ZN3ccc7CC9x6y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y1E, buf);
    ::ccc::CC9x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y1E);
    dp->::ccc::CC9x6y1::~CC9x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y1E(Test__ZN3ccc7CC9x6y1E, "_ZN3ccc7CC9x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y1C1Ev();
extern void _ZN3ccc7CC9x6y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y1E[] = {
  NSPAIR(_ZN3ccc7CC9x6y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y1E[];
extern void _ZN3ccc7CC9x6y13abcEv();
extern void _ZN3ccc7CC9x6y13efgEv();
extern void _ZN3ccc7CC9x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y13efgEv,_ZTv0_n12_N3ccc7CC9x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y13efgEv,_ZThn4_N3ccc7CC9x6y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y13pqrEv,_ZTv0_n16_N3ccc7CC9x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y13pqrEv,_ZThn4_N3ccc7CC9x6y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y13efgEv,_ZTv0_n12_N3ccc7CC9x6y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y13pqrEv,_ZTv0_n16_N3ccc7CC9x6y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y1E[] = {
  {&(_ZTVN3ccc7CC9x6y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y1E[];
static VTBL_ENTRY alt_thunk_names1766[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y13pqrEv,_ZTv0_n16_N3ccc7CC9x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y13pqrEv,_ZThn4_N3ccc7CC9x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y13efgEv,_ZTv0_n12_N3ccc7CC9x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y13efgEv,_ZThn4_N3ccc7CC9x6y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y1E = {  "_ZN3ccc7CC9x6y1E", // class name
  bases__ZN3ccc7CC9x6y1E, 2,
  &(vtc__ZN3ccc7CC9x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y1E),2, //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  DD9x6y1  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD9x6y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x6y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x6y13efgEv
  ~DD9x6y1(); // tgen
  DD9x6y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y1E) C1{ VBC2{ v3 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x6y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y13abcEv");}
void  ccc::DD9x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y13pqrEv");}
void  ccc::DD9x6y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y13efgEv");}
ccc::DD9x6y1 ::~DD9x6y1(){ note_dtor("_ZN3ccc7DD9x6y1E", this);} // tgen
ccc::DD9x6y1 ::DD9x6y1(){ note_ctor("_ZN3ccc7DD9x6y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y1E, buf);
    ::ccc::DD9x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y1E);
    dp->::ccc::DD9x6y1::~DD9x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y1E(Test__ZN3ccc7DD9x6y1E, "_ZN3ccc7DD9x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y1C1Ev();
extern void _ZN3ccc7DD9x6y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y1E[] = {
  NSPAIR(_ZN3ccc7DD9x6y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y1E[];
extern void _ZN3ccc7DD9x6y13efgEv();
extern void _ZN3ccc7DD9x6y13pqrEv();
extern void _ZN3ccc7DD9x6y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y13abcEv,_ZTv0_n12_N3ccc7DD9x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y13abcEv,_ZThn4_N3ccc7DD9x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y13efgEv,_ZTv0_n16_N3ccc7DD9x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y13efgEv,_ZThn4_N3ccc7DD9x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y13abcEv,_ZTv0_n12_N3ccc7DD9x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y13efgEv,_ZTv0_n16_N3ccc7DD9x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y1E[] = {
  {&(_ZTVN3ccc7DD9x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y1E[];
static VTBL_ENTRY alt_thunk_names1767[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y13efgEv,_ZTv0_n16_N3ccc7DD9x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y13efgEv,_ZThn4_N3ccc7DD9x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y13abcEv,_ZTv0_n12_N3ccc7DD9x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y13abcEv,_ZThn4_N3ccc7DD9x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y1E = {  "_ZN3ccc7DD9x6y1E", // class name
  bases__ZN3ccc7DD9x6y1E, 2,
  &(vtc__ZN3ccc7DD9x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y1E),3, //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  CC9x6y2  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y23pqrEv
  ~CC9x6y2(); // tgen
  CC9x6y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y2E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y23efgEv");}
void  ccc::CC9x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y23abcEv");}
void  ccc::CC9x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y23pqrEv");}
ccc::CC9x6y2 ::~CC9x6y2(){ note_dtor("_ZN3ccc7CC9x6y2E", this);} // tgen
ccc::CC9x6y2 ::CC9x6y2(){ note_ctor("_ZN3ccc7CC9x6y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y2E, buf);
    ::ccc::CC9x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y2E);
    dp->::ccc::CC9x6y2::~CC9x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y2E(Test__ZN3ccc7CC9x6y2E, "_ZN3ccc7CC9x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y2C1Ev();
extern void _ZN3ccc7CC9x6y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y2E[] = {
  NSPAIR(_ZN3ccc7CC9x6y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y2E[];
extern void _ZN3ccc7CC9x6y23abcEv();
extern void _ZN3ccc7CC9x6y23efgEv();
extern void _ZN3ccc7CC9x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y23efgEv,_ZTv0_n12_N3ccc7CC9x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y23efgEv,_ZThn4_N3ccc7CC9x6y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y23pqrEv,_ZTv0_n16_N3ccc7CC9x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y23pqrEv,_ZThn4_N3ccc7CC9x6y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y23efgEv,_ZTv0_n12_N3ccc7CC9x6y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y23pqrEv,_ZTv0_n16_N3ccc7CC9x6y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y2E[] = {
  {&(_ZTVN3ccc7CC9x6y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y2E[];
static VTBL_ENTRY alt_thunk_names1768[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y23pqrEv,_ZTv0_n16_N3ccc7CC9x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y23pqrEv,_ZThn4_N3ccc7CC9x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y23efgEv,_ZTv0_n12_N3ccc7CC9x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y23efgEv,_ZThn4_N3ccc7CC9x6y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y2E = {  "_ZN3ccc7CC9x6y2E", // class name
  bases__ZN3ccc7CC9x6y2E, 2,
  &(vtc__ZN3ccc7CC9x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y2E),2, //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  DD9x6y2  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD9x6y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x6y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x6y23pqrEv
  ~DD9x6y2(); // tgen
  DD9x6y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y2E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x6y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y23efgEv");}
void  ccc::DD9x6y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y23abcEv");}
void  ccc::DD9x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y23pqrEv");}
ccc::DD9x6y2 ::~DD9x6y2(){ note_dtor("_ZN3ccc7DD9x6y2E", this);} // tgen
ccc::DD9x6y2 ::DD9x6y2(){ note_ctor("_ZN3ccc7DD9x6y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y2E, buf);
    ::ccc::DD9x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y2E);
    dp->::ccc::DD9x6y2::~DD9x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y2E(Test__ZN3ccc7DD9x6y2E, "_ZN3ccc7DD9x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y2C1Ev();
extern void _ZN3ccc7DD9x6y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y2E[] = {
  NSPAIR(_ZN3ccc7DD9x6y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y2E[];
extern void _ZN3ccc7DD9x6y23efgEv();
extern void _ZN3ccc7DD9x6y23pqrEv();
extern void _ZN3ccc7DD9x6y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y23abcEv,_ZTv0_n12_N3ccc7DD9x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y23abcEv,_ZThn4_N3ccc7DD9x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y23efgEv,_ZTv0_n16_N3ccc7DD9x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y23efgEv,_ZThn4_N3ccc7DD9x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y23abcEv,_ZTv0_n12_N3ccc7DD9x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y23efgEv,_ZTv0_n16_N3ccc7DD9x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y2E[] = {
  {&(_ZTVN3ccc7DD9x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y2E[];
static VTBL_ENTRY alt_thunk_names1769[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y23efgEv,_ZTv0_n16_N3ccc7DD9x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y23efgEv,_ZThn4_N3ccc7DD9x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y23abcEv,_ZTv0_n12_N3ccc7DD9x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y23abcEv,_ZThn4_N3ccc7DD9x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y2E = {  "_ZN3ccc7DD9x6y2E", // class name
  bases__ZN3ccc7DD9x6y2E, 2,
  &(vtc__ZN3ccc7DD9x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y2E),3, //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  CC9x6y3  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x6y33abcEv
  ~CC9x6y3(); // tgen
  CC9x6y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y3E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y33efgEv");}
void  ccc::CC9x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y33pqrEv");}
void  ccc::CC9x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y33abcEv");}
ccc::CC9x6y3 ::~CC9x6y3(){ note_dtor("_ZN3ccc7CC9x6y3E", this);} // tgen
ccc::CC9x6y3 ::CC9x6y3(){ note_ctor("_ZN3ccc7CC9x6y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y3E, buf);
    ::ccc::CC9x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y3E);
    dp->::ccc::CC9x6y3::~CC9x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y3E(Test__ZN3ccc7CC9x6y3E, "_ZN3ccc7CC9x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y3C1Ev();
extern void _ZN3ccc7CC9x6y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y3E[] = {
  NSPAIR(_ZN3ccc7CC9x6y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y3E[];
extern void _ZN3ccc7CC9x6y33abcEv();
extern void _ZN3ccc7CC9x6y33efgEv();
extern void _ZN3ccc7CC9x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y33efgEv,_ZTv0_n12_N3ccc7CC9x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y33efgEv,_ZThn4_N3ccc7CC9x6y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y33pqrEv,_ZTv0_n16_N3ccc7CC9x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y33pqrEv,_ZThn4_N3ccc7CC9x6y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y33efgEv,_ZTv0_n12_N3ccc7CC9x6y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y33pqrEv,_ZTv0_n16_N3ccc7CC9x6y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y3E[] = {
  {&(_ZTVN3ccc7CC9x6y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y3E[];
static VTBL_ENTRY alt_thunk_names1770[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y33pqrEv,_ZTv0_n16_N3ccc7CC9x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y33pqrEv,_ZThn4_N3ccc7CC9x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y33efgEv,_ZTv0_n12_N3ccc7CC9x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y33efgEv,_ZThn4_N3ccc7CC9x6y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y3E = {  "_ZN3ccc7CC9x6y3E", // class name
  bases__ZN3ccc7CC9x6y3E, 2,
  &(vtc__ZN3ccc7CC9x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y3E),2, //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  DD9x6y3  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD9x6y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x6y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x6y33abcEv
  ~DD9x6y3(); // tgen
  DD9x6y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y3E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x6y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y33efgEv");}
void  ccc::DD9x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y33pqrEv");}
void  ccc::DD9x6y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y33abcEv");}
ccc::DD9x6y3 ::~DD9x6y3(){ note_dtor("_ZN3ccc7DD9x6y3E", this);} // tgen
ccc::DD9x6y3 ::DD9x6y3(){ note_ctor("_ZN3ccc7DD9x6y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y3E, buf);
    ::ccc::DD9x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y3E);
    dp->::ccc::DD9x6y3::~DD9x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y3E(Test__ZN3ccc7DD9x6y3E, "_ZN3ccc7DD9x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y3C1Ev();
extern void _ZN3ccc7DD9x6y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y3E[] = {
  NSPAIR(_ZN3ccc7DD9x6y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y3E[];
extern void _ZN3ccc7DD9x6y33efgEv();
extern void _ZN3ccc7DD9x6y33pqrEv();
extern void _ZN3ccc7DD9x6y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y33abcEv,_ZTv0_n12_N3ccc7DD9x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y33abcEv,_ZThn4_N3ccc7DD9x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y33efgEv,_ZTv0_n16_N3ccc7DD9x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y33efgEv,_ZThn4_N3ccc7DD9x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y33abcEv,_ZTv0_n12_N3ccc7DD9x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y33efgEv,_ZTv0_n16_N3ccc7DD9x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y3E[] = {
  {&(_ZTVN3ccc7DD9x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y3E[];
static VTBL_ENTRY alt_thunk_names1771[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y33efgEv,_ZTv0_n16_N3ccc7DD9x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y33efgEv,_ZThn4_N3ccc7DD9x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y33abcEv,_ZTv0_n12_N3ccc7DD9x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y33abcEv,_ZThn4_N3ccc7DD9x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y3E = {  "_ZN3ccc7DD9x6y3E", // class name
  bases__ZN3ccc7DD9x6y3E, 2,
  &(vtc__ZN3ccc7DD9x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y3E),3, //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  CC9x6y4  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC9x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x6y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x6y43efgEv
  ~CC9x6y4(); // tgen
  CC9x6y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y4E) C1{ VBC2{ v3 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y43pqrEv");}
void  ccc::CC9x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y43abcEv");}
void  ccc::CC9x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y43efgEv");}
ccc::CC9x6y4 ::~CC9x6y4(){ note_dtor("_ZN3ccc7CC9x6y4E", this);} // tgen
ccc::CC9x6y4 ::CC9x6y4(){ note_ctor("_ZN3ccc7CC9x6y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y4E, buf);
    ::ccc::CC9x6y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y4E);
    dp->::ccc::CC9x6y4::~CC9x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y4E(Test__ZN3ccc7CC9x6y4E, "_ZN3ccc7CC9x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y4C1Ev();
extern void _ZN3ccc7CC9x6y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y4E[] = {
  NSPAIR(_ZN3ccc7CC9x6y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y4E[];
extern void _ZN3ccc7CC9x6y43abcEv();
extern void _ZN3ccc7CC9x6y43efgEv();
extern void _ZN3ccc7CC9x6y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y43efgEv,_ZTv0_n12_N3ccc7CC9x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y43efgEv,_ZThn4_N3ccc7CC9x6y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y43pqrEv,_ZTv0_n16_N3ccc7CC9x6y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y43pqrEv,_ZThn4_N3ccc7CC9x6y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y43efgEv,_ZTv0_n12_N3ccc7CC9x6y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y43pqrEv,_ZTv0_n16_N3ccc7CC9x6y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y4E[] = {
  {&(_ZTVN3ccc7CC9x6y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y4E[];
static VTBL_ENTRY alt_thunk_names1772[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y43pqrEv,_ZTv0_n16_N3ccc7CC9x6y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y43pqrEv,_ZThn4_N3ccc7CC9x6y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y43efgEv,_ZTv0_n12_N3ccc7CC9x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y43efgEv,_ZThn4_N3ccc7CC9x6y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y4E = {  "_ZN3ccc7CC9x6y4E", // class name
  bases__ZN3ccc7CC9x6y4E, 2,
  &(vtc__ZN3ccc7CC9x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y4E),2, //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  DD9x6y4  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD9x6y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x6y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x6y43efgEv
  ~DD9x6y4(); // tgen
  DD9x6y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y4E) C1{ VBC2{ v3 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x6y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y43pqrEv");}
void  ccc::DD9x6y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y43abcEv");}
void  ccc::DD9x6y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y43efgEv");}
ccc::DD9x6y4 ::~DD9x6y4(){ note_dtor("_ZN3ccc7DD9x6y4E", this);} // tgen
ccc::DD9x6y4 ::DD9x6y4(){ note_ctor("_ZN3ccc7DD9x6y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y4E, buf);
    ::ccc::DD9x6y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y4E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y4E);
    dp->::ccc::DD9x6y4::~DD9x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y4E(Test__ZN3ccc7DD9x6y4E, "_ZN3ccc7DD9x6y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y4C1Ev();
extern void _ZN3ccc7DD9x6y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y4E[] = {
  NSPAIR(_ZN3ccc7DD9x6y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y4E[];
extern void _ZN3ccc7DD9x6y43efgEv();
extern void _ZN3ccc7DD9x6y43pqrEv();
extern void _ZN3ccc7DD9x6y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y43abcEv,_ZTv0_n12_N3ccc7DD9x6y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y43abcEv,_ZThn4_N3ccc7DD9x6y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y43efgEv,_ZTv0_n16_N3ccc7DD9x6y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y43efgEv,_ZThn4_N3ccc7DD9x6y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y43abcEv,_ZTv0_n12_N3ccc7DD9x6y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y43efgEv,_ZTv0_n16_N3ccc7DD9x6y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y4E[] = {
  {&(_ZTVN3ccc7DD9x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y4E[];
static VTBL_ENTRY alt_thunk_names1773[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y43efgEv,_ZTv0_n16_N3ccc7DD9x6y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y43efgEv,_ZThn4_N3ccc7DD9x6y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y43abcEv,_ZTv0_n12_N3ccc7DD9x6y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y43abcEv,_ZThn4_N3ccc7DD9x6y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y4E = {  "_ZN3ccc7DD9x6y4E", // class name
  bases__ZN3ccc7DD9x6y4E, 2,
  &(vtc__ZN3ccc7DD9x6y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y4E),3, //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  CC9x6y5  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7CC9x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x6y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x6y53abcEv
  ~CC9x6y5(); // tgen
  CC9x6y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y5E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y53pqrEv");}
void  ccc::CC9x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y53efgEv");}
void  ccc::CC9x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y53abcEv");}
ccc::CC9x6y5 ::~CC9x6y5(){ note_dtor("_ZN3ccc7CC9x6y5E", this);} // tgen
ccc::CC9x6y5 ::CC9x6y5(){ note_ctor("_ZN3ccc7CC9x6y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y5E, buf);
    ::ccc::CC9x6y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y5E);
    dp->::ccc::CC9x6y5::~CC9x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y5E(Test__ZN3ccc7CC9x6y5E, "_ZN3ccc7CC9x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y5C1Ev();
extern void _ZN3ccc7CC9x6y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y5E[] = {
  NSPAIR(_ZN3ccc7CC9x6y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y5E[];
extern void _ZN3ccc7CC9x6y53abcEv();
extern void _ZN3ccc7CC9x6y53efgEv();
extern void _ZN3ccc7CC9x6y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y53efgEv,_ZTv0_n12_N3ccc7CC9x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y53efgEv,_ZThn4_N3ccc7CC9x6y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y53pqrEv,_ZTv0_n16_N3ccc7CC9x6y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y53pqrEv,_ZThn4_N3ccc7CC9x6y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y53efgEv,_ZTv0_n12_N3ccc7CC9x6y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y53pqrEv,_ZTv0_n16_N3ccc7CC9x6y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y5E[] = {
  {&(_ZTVN3ccc7CC9x6y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y5E[];
static VTBL_ENTRY alt_thunk_names1774[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y53pqrEv,_ZTv0_n16_N3ccc7CC9x6y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y53pqrEv,_ZThn4_N3ccc7CC9x6y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y53efgEv,_ZTv0_n12_N3ccc7CC9x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y53efgEv,_ZThn4_N3ccc7CC9x6y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y5E = {  "_ZN3ccc7CC9x6y5E", // class name
  bases__ZN3ccc7CC9x6y5E, 2,
  &(vtc__ZN3ccc7CC9x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y5E),2, //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  DD9x6y5  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc7DD9x6y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x6y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x6y53abcEv
  ~DD9x6y5(); // tgen
  DD9x6y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y5E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x6y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y53pqrEv");}
void  ccc::DD9x6y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y53efgEv");}
void  ccc::DD9x6y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y53abcEv");}
ccc::DD9x6y5 ::~DD9x6y5(){ note_dtor("_ZN3ccc7DD9x6y5E", this);} // tgen
ccc::DD9x6y5 ::DD9x6y5(){ note_ctor("_ZN3ccc7DD9x6y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y5E, buf);
    ::ccc::DD9x6y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y5E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y5E);
    dp->::ccc::DD9x6y5::~DD9x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y5E(Test__ZN3ccc7DD9x6y5E, "_ZN3ccc7DD9x6y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y5C1Ev();
extern void _ZN3ccc7DD9x6y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y5E[] = {
  NSPAIR(_ZN3ccc7DD9x6y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y5E[];
extern void _ZN3ccc7DD9x6y53efgEv();
extern void _ZN3ccc7DD9x6y53pqrEv();
extern void _ZN3ccc7DD9x6y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y53abcEv,_ZTv0_n12_N3ccc7DD9x6y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y53abcEv,_ZThn4_N3ccc7DD9x6y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y53efgEv,_ZTv0_n16_N3ccc7DD9x6y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y53efgEv,_ZThn4_N3ccc7DD9x6y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y53abcEv,_ZTv0_n12_N3ccc7DD9x6y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y53efgEv,_ZTv0_n16_N3ccc7DD9x6y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y5E[] = {
  {&(_ZTVN3ccc7DD9x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y5E[];
static VTBL_ENTRY alt_thunk_names1775[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y53efgEv,_ZTv0_n16_N3ccc7DD9x6y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y53efgEv,_ZThn4_N3ccc7DD9x6y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y53abcEv,_ZTv0_n12_N3ccc7DD9x6y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y53abcEv,_ZThn4_N3ccc7DD9x6y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y5E = {  "_ZN3ccc7DD9x6y5E", // class name
  bases__ZN3ccc7DD9x6y5E, 2,
  &(vtc__ZN3ccc7DD9x6y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y5E),3, //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  CC9x6y6  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x6y63efgEv
  ~CC9x6y6(); // tgen
  CC9x6y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y6E) C1{ VBC2{ v2 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y63abcEv");}
void  ccc::CC9x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y63efgEv");}
ccc::CC9x6y6 ::~CC9x6y6(){ note_dtor("_ZN3ccc7CC9x6y6E", this);} // tgen
ccc::CC9x6y6 ::CC9x6y6(){ note_ctor("_ZN3ccc7CC9x6y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y6E, buf);
    ::ccc::CC9x6y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y6E);
    dp->::ccc::CC9x6y6::~CC9x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y6E(Test__ZN3ccc7CC9x6y6E, "_ZN3ccc7CC9x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y6C1Ev();
extern void _ZN3ccc7CC9x6y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y6E[] = {
  NSPAIR(_ZN3ccc7CC9x6y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y6E[];
extern void _ZN3ccc7CC9x6y63abcEv();
extern void _ZN3ccc7CC9x6y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y63efgEv,_ZTv0_n12_N3ccc7CC9x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y63efgEv,_ZThn4_N3ccc7CC9x6y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y63efgEv,_ZTv0_n12_N3ccc7CC9x6y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y6E[] = {
  {&(_ZTVN3ccc7CC9x6y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC9x6y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y6E[];
static VTBL_ENTRY alt_thunk_names1776[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y63efgEv,_ZTv0_n12_N3ccc7CC9x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y63efgEv,_ZThn4_N3ccc7CC9x6y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y6E = {  "_ZN3ccc7CC9x6y6E", // class name
  bases__ZN3ccc7CC9x6y6E, 2,
  &(vtc__ZN3ccc7CC9x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y6E),2, //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  DD9x6y6  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD9x6y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x6y63efgEv
  ~DD9x6y6(); // tgen
  DD9x6y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y6E) C1{ VBC2{ v2 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x6y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y63abcEv");}
void  ccc::DD9x6y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y63efgEv");}
ccc::DD9x6y6 ::~DD9x6y6(){ note_dtor("_ZN3ccc7DD9x6y6E", this);} // tgen
ccc::DD9x6y6 ::DD9x6y6(){ note_ctor("_ZN3ccc7DD9x6y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y6E, buf);
    ::ccc::DD9x6y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y6E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y6E);
    dp->::ccc::DD9x6y6::~DD9x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y6E(Test__ZN3ccc7DD9x6y6E, "_ZN3ccc7DD9x6y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y6C1Ev();
extern void _ZN3ccc7DD9x6y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y6E[] = {
  NSPAIR(_ZN3ccc7DD9x6y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y6E[];
extern void _ZN3ccc7DD9x6y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x6y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y63abcEv,_ZTv0_n12_N3ccc7DD9x6y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y63abcEv,_ZThn4_N3ccc7DD9x6y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y63efgEv,_ZTv0_n16_N3ccc7DD9x6y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y63efgEv,_ZThn4_N3ccc7DD9x6y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y63abcEv,_ZTv0_n12_N3ccc7DD9x6y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y63efgEv,_ZTv0_n16_N3ccc7DD9x6y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y6E[] = {
  {&(_ZTVN3ccc7DD9x6y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y6E[];
static VTBL_ENTRY alt_thunk_names1777[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y63efgEv,_ZTv0_n16_N3ccc7DD9x6y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y63efgEv,_ZThn4_N3ccc7DD9x6y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y63abcEv,_ZTv0_n12_N3ccc7DD9x6y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y63abcEv,_ZThn4_N3ccc7DD9x6y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y6E = {  "_ZN3ccc7DD9x6y6E", // class name
  bases__ZN3ccc7DD9x6y6E, 2,
  &(vtc__ZN3ccc7DD9x6y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y6E),3, //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  CC9x6y7  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7CC9x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y73pqrEv
  ~CC9x6y7(); // tgen
  CC9x6y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y7E) C1{ VBC2{ v3 v2} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y73abcEv");}
void  ccc::CC9x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y73pqrEv");}
ccc::CC9x6y7 ::~CC9x6y7(){ note_dtor("_ZN3ccc7CC9x6y7E", this);} // tgen
ccc::CC9x6y7 ::CC9x6y7(){ note_ctor("_ZN3ccc7CC9x6y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y7E, buf);
    ::ccc::CC9x6y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y7E);
    dp->::ccc::CC9x6y7::~CC9x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y7E(Test__ZN3ccc7CC9x6y7E, "_ZN3ccc7CC9x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y7C1Ev();
extern void _ZN3ccc7CC9x6y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y7E[] = {
  NSPAIR(_ZN3ccc7CC9x6y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y7E[];
extern void _ZN3ccc7CC9x6y73abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc7CC9x6y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y73pqrEv,_ZTv0_n16_N3ccc7CC9x6y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y73pqrEv,_ZThn4_N3ccc7CC9x6y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y73pqrEv,_ZTv0_n16_N3ccc7CC9x6y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y7E[] = {
  {&(_ZTVN3ccc7CC9x6y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y7E[];
static VTBL_ENTRY alt_thunk_names1778[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y73pqrEv,_ZTv0_n16_N3ccc7CC9x6y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y73pqrEv,_ZThn4_N3ccc7CC9x6y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y7E = {  "_ZN3ccc7CC9x6y7E", // class name
  bases__ZN3ccc7CC9x6y7E, 2,
  &(vtc__ZN3ccc7CC9x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y7E),2, //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  DD9x6y7  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc7DD9x6y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x6y73pqrEv
  ~DD9x6y7(); // tgen
  DD9x6y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y7E) C1{ VBC2{ v3 v2} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x6y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y73abcEv");}
void  ccc::DD9x6y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y73pqrEv");}
ccc::DD9x6y7 ::~DD9x6y7(){ note_dtor("_ZN3ccc7DD9x6y7E", this);} // tgen
ccc::DD9x6y7 ::DD9x6y7(){ note_ctor("_ZN3ccc7DD9x6y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y7E, buf);
    ::ccc::DD9x6y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y7E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y7E);
    dp->::ccc::DD9x6y7::~DD9x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y7E(Test__ZN3ccc7DD9x6y7E, "_ZN3ccc7DD9x6y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y7C1Ev();
extern void _ZN3ccc7DD9x6y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y7E[] = {
  NSPAIR(_ZN3ccc7DD9x6y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x6y73pqrEv();
extern void _ZN3ccc7DD9x6y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y73abcEv,_ZTv0_n12_N3ccc7DD9x6y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y73abcEv,_ZThn4_N3ccc7DD9x6y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y73abcEv,_ZTv0_n12_N3ccc7DD9x6y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y7E[] = {
  {&(_ZTVN3ccc7DD9x6y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y7E[];
static VTBL_ENTRY alt_thunk_names1779[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y73abcEv,_ZTv0_n12_N3ccc7DD9x6y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y73abcEv,_ZThn4_N3ccc7DD9x6y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y7E = {  "_ZN3ccc7DD9x6y7E", // class name
  bases__ZN3ccc7DD9x6y7E, 2,
  &(vtc__ZN3ccc7DD9x6y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y7E),3, //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  CC9x6y8  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x6y83abcEv
  ~CC9x6y8(); // tgen
  CC9x6y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y8E) C1{ VBC2{ v1 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y83efgEv");}
void  ccc::CC9x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x6y83abcEv");}
ccc::CC9x6y8 ::~CC9x6y8(){ note_dtor("_ZN3ccc7CC9x6y8E", this);} // tgen
ccc::CC9x6y8 ::CC9x6y8(){ note_ctor("_ZN3ccc7CC9x6y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y8E, buf);
    ::ccc::CC9x6y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y8E);
    dp->::ccc::CC9x6y8::~CC9x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y8E(Test__ZN3ccc7CC9x6y8E, "_ZN3ccc7CC9x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y8C1Ev();
extern void _ZN3ccc7CC9x6y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y8E[] = {
  NSPAIR(_ZN3ccc7CC9x6y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y8E[];
extern void _ZN3ccc7CC9x6y83abcEv();
extern void _ZN3ccc7CC9x6y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y83efgEv,_ZTv0_n12_N3ccc7CC9x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y83efgEv,_ZThn4_N3ccc7CC9x6y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y83efgEv,_ZTv0_n12_N3ccc7CC9x6y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y8E[] = {
  {&(_ZTVN3ccc7CC9x6y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC9x6y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y8E[];
static VTBL_ENTRY alt_thunk_names1780[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y83efgEv,_ZTv0_n12_N3ccc7CC9x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y83efgEv,_ZThn4_N3ccc7CC9x6y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y8E = {  "_ZN3ccc7CC9x6y8E", // class name
  bases__ZN3ccc7CC9x6y8E, 2,
  &(vtc__ZN3ccc7CC9x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y8E),2, //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  DD9x6y8  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD9x6y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x6y83abcEv
  ~DD9x6y8(); // tgen
  DD9x6y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y8E) C1{ VBC2{ v1 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x6y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y83efgEv");}
void  ccc::DD9x6y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x6y83abcEv");}
ccc::DD9x6y8 ::~DD9x6y8(){ note_dtor("_ZN3ccc7DD9x6y8E", this);} // tgen
ccc::DD9x6y8 ::DD9x6y8(){ note_ctor("_ZN3ccc7DD9x6y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y8E, buf);
    ::ccc::DD9x6y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y8E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y8E);
    dp->::ccc::DD9x6y8::~DD9x6y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y8E(Test__ZN3ccc7DD9x6y8E, "_ZN3ccc7DD9x6y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y8C1Ev();
extern void _ZN3ccc7DD9x6y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y8E[] = {
  NSPAIR(_ZN3ccc7DD9x6y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y8E[];
extern void _ZN3ccc7DD9x6y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x6y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x6y83abcEv,_ZTv0_n12_N3ccc7DD9x6y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y83abcEv,_ZThn4_N3ccc7DD9x6y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y83efgEv,_ZTv0_n16_N3ccc7DD9x6y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y83efgEv,_ZThn4_N3ccc7DD9x6y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x6y83abcEv,_ZTv0_n12_N3ccc7DD9x6y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y83efgEv,_ZTv0_n16_N3ccc7DD9x6y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y8E[] = {
  {&(_ZTVN3ccc7DD9x6y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x6y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y8E[];
static VTBL_ENTRY alt_thunk_names1781[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y83efgEv,_ZTv0_n16_N3ccc7DD9x6y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y83efgEv,_ZThn4_N3ccc7DD9x6y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x6y83abcEv,_ZTv0_n12_N3ccc7DD9x6y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y83abcEv,_ZThn4_N3ccc7DD9x6y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y8E = {  "_ZN3ccc7DD9x6y8E", // class name
  bases__ZN3ccc7DD9x6y8E, 2,
  &(vtc__ZN3ccc7DD9x6y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y8E),3, //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  CC9x6y9  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7CC9x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x6y93pqrEv
  ~CC9x6y9(); // tgen
  CC9x6y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x6y9E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x6y93efgEv");}
void  ccc::CC9x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x6y93pqrEv");}
ccc::CC9x6y9 ::~CC9x6y9(){ note_dtor("_ZN3ccc7CC9x6y9E", this);} // tgen
ccc::CC9x6y9 ::CC9x6y9(){ note_ctor("_ZN3ccc7CC9x6y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x6y9E, buf);
    ::ccc::CC9x6y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x6y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc7CC9x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x6y9E);
    dp->::ccc::CC9x6y9::~CC9x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x6y9E(Test__ZN3ccc7CC9x6y9E, "_ZN3ccc7CC9x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x6y9C1Ev();
extern void _ZN3ccc7CC9x6y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x6y9E[] = {
  NSPAIR(_ZN3ccc7CC9x6y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7CC9x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x6y9E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc7CC9x6y93efgEv();
extern void _ZN3ccc7CC9x6y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x6y93efgEv,_ZTv0_n12_N3ccc7CC9x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y93efgEv,_ZThn4_N3ccc7CC9x6y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x6y93pqrEv,_ZTv0_n16_N3ccc7CC9x6y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x6y93pqrEv,_ZThn4_N3ccc7CC9x6y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x6y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x6y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x6y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x6y93efgEv,_ZTv0_n12_N3ccc7CC9x6y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x6y93pqrEv,_ZTv0_n16_N3ccc7CC9x6y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x6y9E[] = {
  {&(_ZTVN3ccc7CC9x6y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x6y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x6y9E[];
static VTBL_ENTRY alt_thunk_names1782[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x6y93pqrEv,_ZTv0_n16_N3ccc7CC9x6y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y93pqrEv,_ZThn4_N3ccc7CC9x6y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x6y93efgEv,_ZTv0_n12_N3ccc7CC9x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x6y93efgEv,_ZThn4_N3ccc7CC9x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x6y9E = {  "_ZN3ccc7CC9x6y9E", // class name
  bases__ZN3ccc7CC9x6y9E, 2,
  &(vtc__ZN3ccc7CC9x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x6y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x6y9E),2, //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  DD9x6y9  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc7DD9x6y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x6y93pqrEv
  ~DD9x6y9(); // tgen
  DD9x6y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x6y9E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x6y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x6y93efgEv");}
void  ccc::DD9x6y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x6y93pqrEv");}
ccc::DD9x6y9 ::~DD9x6y9(){ note_dtor("_ZN3ccc7DD9x6y9E", this);} // tgen
ccc::DD9x6y9 ::DD9x6y9(){ note_ctor("_ZN3ccc7DD9x6y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x6y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x6y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x6y9E, buf);
    ::ccc::DD9x6y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x6y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x6y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x6y9E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc7DD9x6y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x6y9E);
    dp->::ccc::DD9x6y9::~DD9x6y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x6y9E(Test__ZN3ccc7DD9x6y9E, "_ZN3ccc7DD9x6y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x6y9C1Ev();
extern void _ZN3ccc7DD9x6y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x6y9E[] = {
  NSPAIR(_ZN3ccc7DD9x6y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x6y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc7DD9x6y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y9E[];
extern void _ZN3ccc7DD9x6y93efgEv();
extern void _ZN3ccc7DD9x6y93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x6y93efgEv,_ZTv0_n16_N3ccc7DD9x6y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x6y93efgEv,_ZThn4_N3ccc7DD9x6y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x6y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x6y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x6y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x6y93efgEv,_ZTv0_n16_N3ccc7DD9x6y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x6y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x6y9E[] = {
  {&(_ZTVN3ccc7DD9x6y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x6y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x6y9E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x6y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x6y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x6y9E[];
static VTBL_ENTRY alt_thunk_names1783[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x6y93efgEv,_ZTv0_n16_N3ccc7DD9x6y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x6y93efgEv,_ZThn4_N3ccc7DD9x6y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x6y9E = {  "_ZN3ccc7DD9x6y9E", // class name
  bases__ZN3ccc7DD9x6y9E, 2,
  &(vtc__ZN3ccc7DD9x6y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x6y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x6y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x6y9E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x6y9E),3, //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  CC9x6y10  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC9x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x6y103abcEv
  ~CC9x6y10(); // tgen
  CC9x6y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y10E) C1{ VBC2{ v3 v1} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x6y103pqrEv");}
void  ccc::CC9x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x6y103abcEv");}
ccc::CC9x6y10 ::~CC9x6y10(){ note_dtor("_ZN3ccc8CC9x6y10E", this);} // tgen
ccc::CC9x6y10 ::CC9x6y10(){ note_ctor("_ZN3ccc8CC9x6y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x6y10E, buf);
    ::ccc::CC9x6y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x6y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC9x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x6y10E);
    dp->::ccc::CC9x6y10::~CC9x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x6y10E(Test__ZN3ccc8CC9x6y10E, "_ZN3ccc8CC9x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x6y10C1Ev();
extern void _ZN3ccc8CC9x6y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x6y10E[] = {
  NSPAIR(_ZN3ccc8CC9x6y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC9x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x6y10E[];
extern void _ZN3ccc8CC9x6y103abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC9x6y103pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x6y103pqrEv,_ZTv0_n16_N3ccc8CC9x6y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y103pqrEv,_ZThn4_N3ccc8CC9x6y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x6y103pqrEv,_ZTv0_n16_N3ccc8CC9x6y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x6y10E[] = {
  {&(_ZTVN3ccc8CC9x6y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x6y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x6y10E[];
static VTBL_ENTRY alt_thunk_names1784[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x6y103pqrEv,_ZTv0_n16_N3ccc8CC9x6y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x6y103pqrEv,_ZThn4_N3ccc8CC9x6y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x6y10E = {  "_ZN3ccc8CC9x6y10E", // class name
  bases__ZN3ccc8CC9x6y10E, 2,
  &(vtc__ZN3ccc8CC9x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x6y10E),2, //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  DD9x6y10  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD9x6y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x6y103abcEv
  ~DD9x6y10(); // tgen
  DD9x6y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x6y10E) C1{ VBC2{ v3 v1} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x6y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x6y103pqrEv");}
void  ccc::DD9x6y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x6y103abcEv");}
ccc::DD9x6y10 ::~DD9x6y10(){ note_dtor("_ZN3ccc8DD9x6y10E", this);} // tgen
ccc::DD9x6y10 ::DD9x6y10(){ note_ctor("_ZN3ccc8DD9x6y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x6y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x6y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x6y10E, buf);
    ::ccc::DD9x6y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x6y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x6y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x6y10E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD9x6y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x6y10E);
    dp->::ccc::DD9x6y10::~DD9x6y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x6y10E(Test__ZN3ccc8DD9x6y10E, "_ZN3ccc8DD9x6y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x6y10C1Ev();
extern void _ZN3ccc8DD9x6y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x6y10E[] = {
  NSPAIR(_ZN3ccc8DD9x6y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x6y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD9x6y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x6y103pqrEv();
extern void _ZN3ccc8DD9x6y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x6y103abcEv,_ZTv0_n12_N3ccc8DD9x6y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x6y103abcEv,_ZThn4_N3ccc8DD9x6y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x6y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x6y103abcEv,_ZTv0_n12_N3ccc8DD9x6y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x6y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x6y10E[] = {
  {&(_ZTVN3ccc8DD9x6y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x6y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x6y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x6y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x6y10E[];
static VTBL_ENTRY alt_thunk_names1785[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x6y103abcEv,_ZTv0_n12_N3ccc8DD9x6y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x6y103abcEv,_ZThn4_N3ccc8DD9x6y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x6y10E = {  "_ZN3ccc8DD9x6y10E", // class name
  bases__ZN3ccc8DD9x6y10E, 2,
  &(vtc__ZN3ccc8DD9x6y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x6y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x6y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x6y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x6y10E),3, //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  CC9x6y11  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC9x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x6y113efgEv
  ~CC9x6y11(); // tgen
  CC9x6y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y11E) C1{ VBC2{ v2 v1} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x6y113pqrEv");}
void  ccc::CC9x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x6y113efgEv");}
ccc::CC9x6y11 ::~CC9x6y11(){ note_dtor("_ZN3ccc8CC9x6y11E", this);} // tgen
ccc::CC9x6y11 ::CC9x6y11(){ note_ctor("_ZN3ccc8CC9x6y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x6y11E, buf);
    ::ccc::CC9x6y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x6y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC9x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x6y11E);
    dp->::ccc::CC9x6y11::~CC9x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x6y11E(Test__ZN3ccc8CC9x6y11E, "_ZN3ccc8CC9x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x6y11C1Ev();
extern void _ZN3ccc8CC9x6y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x6y11E[] = {
  NSPAIR(_ZN3ccc8CC9x6y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC9x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x6y11E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC9x6y113efgEv();
extern void _ZN3ccc8CC9x6y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x6y113efgEv,_ZTv0_n12_N3ccc8CC9x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y113efgEv,_ZThn4_N3ccc8CC9x6y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x6y113pqrEv,_ZTv0_n16_N3ccc8CC9x6y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y113pqrEv,_ZThn4_N3ccc8CC9x6y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x6y113efgEv,_ZTv0_n12_N3ccc8CC9x6y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x6y113pqrEv,_ZTv0_n16_N3ccc8CC9x6y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x6y11E[] = {
  {&(_ZTVN3ccc8CC9x6y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x6y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x6y11E[];
static VTBL_ENTRY alt_thunk_names1786[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x6y113pqrEv,_ZTv0_n16_N3ccc8CC9x6y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x6y113pqrEv,_ZThn4_N3ccc8CC9x6y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x6y113efgEv,_ZTv0_n12_N3ccc8CC9x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x6y113efgEv,_ZThn4_N3ccc8CC9x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x6y11E = {  "_ZN3ccc8CC9x6y11E", // class name
  bases__ZN3ccc8CC9x6y11E, 2,
  &(vtc__ZN3ccc8CC9x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x6y11E),2, //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  DD9x6y11  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD9x6y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x6y113efgEv
  ~DD9x6y11(); // tgen
  DD9x6y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x6y11E) C1{ VBC2{ v2 v1} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x6y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x6y113pqrEv");}
void  ccc::DD9x6y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x6y113efgEv");}
ccc::DD9x6y11 ::~DD9x6y11(){ note_dtor("_ZN3ccc8DD9x6y11E", this);} // tgen
ccc::DD9x6y11 ::DD9x6y11(){ note_ctor("_ZN3ccc8DD9x6y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x6y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x6y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x6y11E, buf);
    ::ccc::DD9x6y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x6y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x6y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x6y11E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD9x6y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x6y11E);
    dp->::ccc::DD9x6y11::~DD9x6y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x6y11E(Test__ZN3ccc8DD9x6y11E, "_ZN3ccc8DD9x6y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x6y11C1Ev();
extern void _ZN3ccc8DD9x6y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x6y11E[] = {
  NSPAIR(_ZN3ccc8DD9x6y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x6y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD9x6y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y11E[];
extern void _ZN3ccc8DD9x6y113efgEv();
extern void _ZN3ccc8DD9x6y113pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x6y113efgEv,_ZTv0_n16_N3ccc8DD9x6y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x6y113efgEv,_ZThn4_N3ccc8DD9x6y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x6y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x6y113efgEv,_ZTv0_n16_N3ccc8DD9x6y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x6y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x6y11E[] = {
  {&(_ZTVN3ccc8DD9x6y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y11E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x6y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x6y11E[];
static VTBL_ENTRY alt_thunk_names1787[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x6y113efgEv,_ZTv0_n16_N3ccc8DD9x6y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x6y113efgEv,_ZThn4_N3ccc8DD9x6y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x6y11E = {  "_ZN3ccc8DD9x6y11E", // class name
  bases__ZN3ccc8DD9x6y11E, 2,
  &(vtc__ZN3ccc8DD9x6y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x6y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x6y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x6y11E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x6y11E),3, //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  CC9x6y12  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC9x6y123abcEv
  ~CC9x6y12(); // tgen
  CC9x6y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y12E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC9x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x6y123abcEv");}
ccc::CC9x6y12 ::~CC9x6y12(){ note_dtor("_ZN3ccc8CC9x6y12E", this);} // tgen
ccc::CC9x6y12 ::CC9x6y12(){ note_ctor("_ZN3ccc8CC9x6y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x6y12E, buf);
    ::ccc::CC9x6y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x6y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC9x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x6y12E);
    dp->::ccc::CC9x6y12::~CC9x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x6y12E(Test__ZN3ccc8CC9x6y12E, "_ZN3ccc8CC9x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x6y12C1Ev();
extern void _ZN3ccc8CC9x6y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x6y12E[] = {
  NSPAIR(_ZN3ccc8CC9x6y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC9x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x6y12E[];
extern void _ZN3ccc8CC9x6y123abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x6y12E[] = {
  {&(_ZTVN3ccc8CC9x6y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x6y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x6y12E[];
Class_Descriptor cd__ZN3ccc8CC9x6y12E = {  "_ZN3ccc8CC9x6y12E", // class name
  bases__ZN3ccc8CC9x6y12E, 2,
  &(vtc__ZN3ccc8CC9x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x6y12E),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  DD9x6y12  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD9x6y123abcEv
  ~DD9x6y12(); // tgen
  DD9x6y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x6y12E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD9x6y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x6y123abcEv");}
ccc::DD9x6y12 ::~DD9x6y12(){ note_dtor("_ZN3ccc8DD9x6y12E", this);} // tgen
ccc::DD9x6y12 ::DD9x6y12(){ note_ctor("_ZN3ccc8DD9x6y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x6y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x6y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x6y12E, buf);
    ::ccc::DD9x6y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x6y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x6y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x6y12E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD9x6y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x6y12E);
    dp->::ccc::DD9x6y12::~DD9x6y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x6y12E(Test__ZN3ccc8DD9x6y12E, "_ZN3ccc8DD9x6y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x6y12C1Ev();
extern void _ZN3ccc8DD9x6y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x6y12E[] = {
  NSPAIR(_ZN3ccc8DD9x6y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x6y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD9x6y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x6y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x6y123abcEv,_ZTv0_n12_N3ccc8DD9x6y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x6y123abcEv,_ZThn4_N3ccc8DD9x6y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x6y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x6y123abcEv,_ZTv0_n12_N3ccc8DD9x6y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x6y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x6y12E[] = {
  {&(_ZTVN3ccc8DD9x6y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x6y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x6y12E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x6y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x6y12E[];
static VTBL_ENTRY alt_thunk_names1788[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x6y123abcEv,_ZTv0_n12_N3ccc8DD9x6y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x6y123abcEv,_ZThn4_N3ccc8DD9x6y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x6y12E = {  "_ZN3ccc8DD9x6y12E", // class name
  bases__ZN3ccc8DD9x6y12E, 2,
  &(vtc__ZN3ccc8DD9x6y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x6y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x6y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x6y12E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x6y12E),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  CC9x6y13  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC9x6y133efgEv
  ~CC9x6y13(); // tgen
  CC9x6y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC9x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x6y133efgEv");}
ccc::CC9x6y13 ::~CC9x6y13(){ note_dtor("_ZN3ccc8CC9x6y13E", this);} // tgen
ccc::CC9x6y13 ::CC9x6y13(){ note_ctor("_ZN3ccc8CC9x6y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x6y13E, buf);
    ::ccc::CC9x6y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x6y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC9x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x6y13E);
    dp->::ccc::CC9x6y13::~CC9x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x6y13E(Test__ZN3ccc8CC9x6y13E, "_ZN3ccc8CC9x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x6y13C1Ev();
extern void _ZN3ccc8CC9x6y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x6y13E[] = {
  NSPAIR(_ZN3ccc8CC9x6y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC9x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x6y13E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc8CC9x6y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x6y133efgEv,_ZTv0_n12_N3ccc8CC9x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y133efgEv,_ZThn4_N3ccc8CC9x6y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x6y133efgEv,_ZTv0_n12_N3ccc8CC9x6y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x6y13E[] = {
  {&(_ZTVN3ccc8CC9x6y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x6y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x6y13E[];
static VTBL_ENTRY alt_thunk_names1789[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x6y133efgEv,_ZTv0_n12_N3ccc8CC9x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x6y133efgEv,_ZThn4_N3ccc8CC9x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x6y13E = {  "_ZN3ccc8CC9x6y13E", // class name
  bases__ZN3ccc8CC9x6y13E, 2,
  &(vtc__ZN3ccc8CC9x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x6y13E),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  DD9x6y13  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD9x6y133efgEv
  ~DD9x6y13(); // tgen
  DD9x6y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x6y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD9x6y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x6y133efgEv");}
ccc::DD9x6y13 ::~DD9x6y13(){ note_dtor("_ZN3ccc8DD9x6y13E", this);} // tgen
ccc::DD9x6y13 ::DD9x6y13(){ note_ctor("_ZN3ccc8DD9x6y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x6y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x6y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x6y13E, buf);
    ::ccc::DD9x6y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x6y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x6y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x6y13E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD9x6y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x6y13E);
    dp->::ccc::DD9x6y13::~DD9x6y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x6y13E(Test__ZN3ccc8DD9x6y13E, "_ZN3ccc8DD9x6y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x6y13C1Ev();
extern void _ZN3ccc8DD9x6y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x6y13E[] = {
  NSPAIR(_ZN3ccc8DD9x6y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x6y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD9x6y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y13E[];
extern void _ZN3ccc8DD9x6y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x6y133efgEv,_ZTv0_n16_N3ccc8DD9x6y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x6y133efgEv,_ZThn4_N3ccc8DD9x6y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x6y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x6y133efgEv,_ZTv0_n16_N3ccc8DD9x6y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x6y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x6y13E[] = {
  {&(_ZTVN3ccc8DD9x6y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x6y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x6y13E[];
static VTBL_ENTRY alt_thunk_names1790[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x6y133efgEv,_ZTv0_n16_N3ccc8DD9x6y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x6y133efgEv,_ZThn4_N3ccc8DD9x6y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x6y13E = {  "_ZN3ccc8DD9x6y13E", // class name
  bases__ZN3ccc8DD9x6y13E, 2,
  &(vtc__ZN3ccc8DD9x6y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x6y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x6y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x6y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x6y13E),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  CC9x6y14  : virtual ::ccc::AA9 , ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8CC9x6y143pqrEv
  ~CC9x6y14(); // tgen
  CC9x6y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x6y143pqrEv");}
ccc::CC9x6y14 ::~CC9x6y14(){ note_dtor("_ZN3ccc8CC9x6y14E", this);} // tgen
ccc::CC9x6y14 ::CC9x6y14(){ note_ctor("_ZN3ccc8CC9x6y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x6y14E, buf);
    ::ccc::CC9x6y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x6y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC9x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x6y14E);
    dp->::ccc::CC9x6y14::~CC9x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x6y14E(Test__ZN3ccc8CC9x6y14E, "_ZN3ccc8CC9x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x6y14C1Ev();
extern void _ZN3ccc8CC9x6y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x6y14E[] = {
  NSPAIR(_ZN3ccc8CC9x6y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC9x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x6y14E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc8CC9x6y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x6y143pqrEv,_ZTv0_n16_N3ccc8CC9x6y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x6y143pqrEv,_ZThn4_N3ccc8CC9x6y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x6y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x6y143pqrEv,_ZTv0_n16_N3ccc8CC9x6y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x6y14E[] = {
  {&(_ZTVN3ccc8CC9x6y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x6y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x6y14E[];
static VTBL_ENTRY alt_thunk_names1791[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x6y143pqrEv,_ZTv0_n16_N3ccc8CC9x6y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x6y143pqrEv,_ZThn4_N3ccc8CC9x6y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x6y14E = {  "_ZN3ccc8CC9x6y14E", // class name
  bases__ZN3ccc8CC9x6y14E, 2,
  &(vtc__ZN3ccc8CC9x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x6y14E),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  DD9x6y14  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  virtual void  pqr(); // _ZN3ccc8DD9x6y143pqrEv
  ~DD9x6y14(); // tgen
  DD9x6y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x6y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x6y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x6y143pqrEv");}
ccc::DD9x6y14 ::~DD9x6y14(){ note_dtor("_ZN3ccc8DD9x6y14E", this);} // tgen
ccc::DD9x6y14 ::DD9x6y14(){ note_ctor("_ZN3ccc8DD9x6y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x6y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x6y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x6y14E, buf);
    ::ccc::DD9x6y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x6y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x6y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x6y14E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD9x6y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x6y14E);
    dp->::ccc::DD9x6y14::~DD9x6y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x6y14E(Test__ZN3ccc8DD9x6y14E, "_ZN3ccc8DD9x6y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x6y14C1Ev();
extern void _ZN3ccc8DD9x6y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x6y14E[] = {
  NSPAIR(_ZN3ccc8DD9x6y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x6y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD9x6y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x6y143pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x6y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x6y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x6y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x6y14E[] = {
  {&(_ZTVN3ccc8DD9x6y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x6y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x6y14E[];
Class_Descriptor cd__ZN3ccc8DD9x6y14E = {  "_ZN3ccc8DD9x6y14E", // class name
  bases__ZN3ccc8DD9x6y14E, 2,
  &(vtc__ZN3ccc8DD9x6y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x6y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x6y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x6y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x6y14E),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  CC9x6y15  : virtual ::ccc::AA9 , ::ccc::BB6 {
  ~CC9x6y15(); // tgen
  CC9x6y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x6y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC9x6y15 ::~CC9x6y15(){ note_dtor("_ZN3ccc8CC9x6y15E", this);} // tgen
ccc::CC9x6y15 ::CC9x6y15(){ note_ctor("_ZN3ccc8CC9x6y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x6y15E, buf);
    ::ccc::CC9x6y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x6y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC9x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x6y15E);
    dp->::ccc::CC9x6y15::~CC9x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x6y15E(Test__ZN3ccc8CC9x6y15E, "_ZN3ccc8CC9x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x6y15C1Ev();
extern void _ZN3ccc8CC9x6y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x6y15E[] = {
  NSPAIR(_ZN3ccc8CC9x6y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC9x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x6y15E[];
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x6y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x6y15E[] = {
  {&(_ZTVN3ccc8CC9x6y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x6y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x6y15E[];
Class_Descriptor cd__ZN3ccc8CC9x6y15E = {  "_ZN3ccc8CC9x6y15E", // class name
  bases__ZN3ccc8CC9x6y15E, 2,
  &(vtc__ZN3ccc8CC9x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x6y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x6y15E),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  DD9x6y15  : virtual ::ccc::AA9 , virtual ::ccc::BB6 {
  ~DD9x6y15(); // tgen
  DD9x6y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x6y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD9x6y15 ::~DD9x6y15(){ note_dtor("_ZN3ccc8DD9x6y15E", this);} // tgen
ccc::DD9x6y15 ::DD9x6y15(){ note_ctor("_ZN3ccc8DD9x6y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x6y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x6y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x6y15E, buf);
    ::ccc::DD9x6y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x6y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x6y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x6y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x6y15E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD9x6y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x6y15E);
    dp->::ccc::DD9x6y15::~DD9x6y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x6y15E(Test__ZN3ccc8DD9x6y15E, "_ZN3ccc8DD9x6y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x6y15C1Ev();
extern void _ZN3ccc8DD9x6y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x6y15E[] = {
  NSPAIR(_ZN3ccc8DD9x6y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x6y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD9x6y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB63abcEv();
extern void _ZN3ccc3BB63efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x6y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x6y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB63efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x6y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x6y15E[] = {
  {&(_ZTVN3ccc8DD9x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x6y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x6y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x6y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x6y15E[];
Class_Descriptor cd__ZN3ccc8DD9x6y15E = {  "_ZN3ccc8DD9x6y15E", // class name
  bases__ZN3ccc8DD9x6y15E, 2,
  &(vtc__ZN3ccc8DD9x6y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x6y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x6y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x6y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x6y15E),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  CC9x7y0  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y03pqrEv
  ~CC9x7y0(); // tgen
  CC9x7y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y0E) C1{ VBC2{ v2 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y03abcEv");}
void  ccc::CC9x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y03efgEv");}
void  ccc::CC9x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y03pqrEv");}
ccc::CC9x7y0 ::~CC9x7y0(){ note_dtor("_ZN3ccc7CC9x7y0E", this);} // tgen
ccc::CC9x7y0 ::CC9x7y0(){ note_ctor("_ZN3ccc7CC9x7y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y0E, buf);
    ::ccc::CC9x7y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y0E);
    dp->::ccc::CC9x7y0::~CC9x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y0E(Test__ZN3ccc7CC9x7y0E, "_ZN3ccc7CC9x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y0C1Ev();
extern void _ZN3ccc7CC9x7y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y0E[] = {
  NSPAIR(_ZN3ccc7CC9x7y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y0E[];
extern void _ZN3ccc7CC9x7y03abcEv();
extern void _ZN3ccc7CC9x7y03pqrEv();
extern void _ZN3ccc7CC9x7y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y03efgEv,_ZTv0_n12_N3ccc7CC9x7y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y03efgEv,_ZThn4_N3ccc7CC9x7y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y03pqrEv,_ZTv0_n16_N3ccc7CC9x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y03pqrEv,_ZThn4_N3ccc7CC9x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y03efgEv,_ZTv0_n12_N3ccc7CC9x7y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y03pqrEv,_ZTv0_n16_N3ccc7CC9x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y0E[] = {
  {&(_ZTVN3ccc7CC9x7y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y0E[];
static VTBL_ENTRY alt_thunk_names1792[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y03pqrEv,_ZTv0_n16_N3ccc7CC9x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y03pqrEv,_ZThn4_N3ccc7CC9x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y03efgEv,_ZTv0_n12_N3ccc7CC9x7y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y03efgEv,_ZThn4_N3ccc7CC9x7y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y0E = {  "_ZN3ccc7CC9x7y0E", // class name
  bases__ZN3ccc7CC9x7y0E, 2,
  &(vtc__ZN3ccc7CC9x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y0E),2, //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  DD9x7y0  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD9x7y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x7y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x7y03pqrEv
  ~DD9x7y0(); // tgen
  DD9x7y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y0E) C1{ VBC2{ v2 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x7y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y03abcEv");}
void  ccc::DD9x7y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y03efgEv");}
void  ccc::DD9x7y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y03pqrEv");}
ccc::DD9x7y0 ::~DD9x7y0(){ note_dtor("_ZN3ccc7DD9x7y0E", this);} // tgen
ccc::DD9x7y0 ::DD9x7y0(){ note_ctor("_ZN3ccc7DD9x7y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y0E, buf);
    ::ccc::DD9x7y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y0E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y0E);
    dp->::ccc::DD9x7y0::~DD9x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y0E(Test__ZN3ccc7DD9x7y0E, "_ZN3ccc7DD9x7y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y0C1Ev();
extern void _ZN3ccc7DD9x7y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y0E[] = {
  NSPAIR(_ZN3ccc7DD9x7y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y0E[];
extern void _ZN3ccc7DD9x7y03efgEv();
extern void _ZN3ccc7DD9x7y03pqrEv();
extern void _ZN3ccc7DD9x7y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y03abcEv,_ZTv0_n12_N3ccc7DD9x7y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y03abcEv,_ZThn4_N3ccc7DD9x7y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y03pqrEv,_ZTv0_n16_N3ccc7DD9x7y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y03pqrEv,_ZThn4_N3ccc7DD9x7y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y03abcEv,_ZTv0_n12_N3ccc7DD9x7y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y03pqrEv,_ZTv0_n16_N3ccc7DD9x7y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y0E[] = {
  {&(_ZTVN3ccc7DD9x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y0E[];
static VTBL_ENTRY alt_thunk_names1793[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y03pqrEv,_ZTv0_n16_N3ccc7DD9x7y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y03pqrEv,_ZThn4_N3ccc7DD9x7y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y03abcEv,_ZTv0_n12_N3ccc7DD9x7y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y03abcEv,_ZThn4_N3ccc7DD9x7y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y0E = {  "_ZN3ccc7DD9x7y0E", // class name
  bases__ZN3ccc7DD9x7y0E, 2,
  &(vtc__ZN3ccc7DD9x7y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y0E),3, //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  CC9x7y1  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x7y13efgEv
  ~CC9x7y1(); // tgen
  CC9x7y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y1E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y13abcEv");}
void  ccc::CC9x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y13pqrEv");}
void  ccc::CC9x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y13efgEv");}
ccc::CC9x7y1 ::~CC9x7y1(){ note_dtor("_ZN3ccc7CC9x7y1E", this);} // tgen
ccc::CC9x7y1 ::CC9x7y1(){ note_ctor("_ZN3ccc7CC9x7y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y1E, buf);
    ::ccc::CC9x7y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y1E);
    dp->::ccc::CC9x7y1::~CC9x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y1E(Test__ZN3ccc7CC9x7y1E, "_ZN3ccc7CC9x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y1C1Ev();
extern void _ZN3ccc7CC9x7y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y1E[] = {
  NSPAIR(_ZN3ccc7CC9x7y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y1E[];
extern void _ZN3ccc7CC9x7y13abcEv();
extern void _ZN3ccc7CC9x7y13pqrEv();
extern void _ZN3ccc7CC9x7y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y13efgEv,_ZTv0_n12_N3ccc7CC9x7y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y13efgEv,_ZThn4_N3ccc7CC9x7y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y13pqrEv,_ZTv0_n16_N3ccc7CC9x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y13pqrEv,_ZThn4_N3ccc7CC9x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y13efgEv,_ZTv0_n12_N3ccc7CC9x7y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y13pqrEv,_ZTv0_n16_N3ccc7CC9x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y1E[] = {
  {&(_ZTVN3ccc7CC9x7y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y1E[];
static VTBL_ENTRY alt_thunk_names1794[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y13pqrEv,_ZTv0_n16_N3ccc7CC9x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y13pqrEv,_ZThn4_N3ccc7CC9x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y13efgEv,_ZTv0_n12_N3ccc7CC9x7y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y13efgEv,_ZThn4_N3ccc7CC9x7y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y1E = {  "_ZN3ccc7CC9x7y1E", // class name
  bases__ZN3ccc7CC9x7y1E, 2,
  &(vtc__ZN3ccc7CC9x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y1E),2, //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  DD9x7y1  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD9x7y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x7y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x7y13efgEv
  ~DD9x7y1(); // tgen
  DD9x7y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y1E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x7y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y13abcEv");}
void  ccc::DD9x7y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y13pqrEv");}
void  ccc::DD9x7y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y13efgEv");}
ccc::DD9x7y1 ::~DD9x7y1(){ note_dtor("_ZN3ccc7DD9x7y1E", this);} // tgen
ccc::DD9x7y1 ::DD9x7y1(){ note_ctor("_ZN3ccc7DD9x7y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y1E, buf);
    ::ccc::DD9x7y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y1E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y1E);
    dp->::ccc::DD9x7y1::~DD9x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y1E(Test__ZN3ccc7DD9x7y1E, "_ZN3ccc7DD9x7y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y1C1Ev();
extern void _ZN3ccc7DD9x7y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y1E[] = {
  NSPAIR(_ZN3ccc7DD9x7y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y1E[];
extern void _ZN3ccc7DD9x7y13efgEv();
extern void _ZN3ccc7DD9x7y13pqrEv();
extern void _ZN3ccc7DD9x7y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y13abcEv,_ZTv0_n12_N3ccc7DD9x7y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y13abcEv,_ZThn4_N3ccc7DD9x7y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y13pqrEv,_ZTv0_n16_N3ccc7DD9x7y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y13pqrEv,_ZThn4_N3ccc7DD9x7y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y13abcEv,_ZTv0_n12_N3ccc7DD9x7y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y13pqrEv,_ZTv0_n16_N3ccc7DD9x7y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y1E[] = {
  {&(_ZTVN3ccc7DD9x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y1E[];
static VTBL_ENTRY alt_thunk_names1795[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y13pqrEv,_ZTv0_n16_N3ccc7DD9x7y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y13pqrEv,_ZThn4_N3ccc7DD9x7y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y13abcEv,_ZTv0_n12_N3ccc7DD9x7y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y13abcEv,_ZThn4_N3ccc7DD9x7y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y1E = {  "_ZN3ccc7DD9x7y1E", // class name
  bases__ZN3ccc7DD9x7y1E, 2,
  &(vtc__ZN3ccc7DD9x7y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y1E),3, //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  CC9x7y2  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y23pqrEv
  ~CC9x7y2(); // tgen
  CC9x7y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y2E) C1{ VBC2{ v1 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y23efgEv");}
void  ccc::CC9x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y23abcEv");}
void  ccc::CC9x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y23pqrEv");}
ccc::CC9x7y2 ::~CC9x7y2(){ note_dtor("_ZN3ccc7CC9x7y2E", this);} // tgen
ccc::CC9x7y2 ::CC9x7y2(){ note_ctor("_ZN3ccc7CC9x7y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y2E, buf);
    ::ccc::CC9x7y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y2E);
    dp->::ccc::CC9x7y2::~CC9x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y2E(Test__ZN3ccc7CC9x7y2E, "_ZN3ccc7CC9x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y2C1Ev();
extern void _ZN3ccc7CC9x7y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y2E[] = {
  NSPAIR(_ZN3ccc7CC9x7y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y2E[];
extern void _ZN3ccc7CC9x7y23abcEv();
extern void _ZN3ccc7CC9x7y23pqrEv();
extern void _ZN3ccc7CC9x7y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y23efgEv,_ZTv0_n12_N3ccc7CC9x7y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y23efgEv,_ZThn4_N3ccc7CC9x7y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y23pqrEv,_ZTv0_n16_N3ccc7CC9x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y23pqrEv,_ZThn4_N3ccc7CC9x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y23efgEv,_ZTv0_n12_N3ccc7CC9x7y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y23pqrEv,_ZTv0_n16_N3ccc7CC9x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y2E[] = {
  {&(_ZTVN3ccc7CC9x7y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y2E[];
static VTBL_ENTRY alt_thunk_names1796[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y23pqrEv,_ZTv0_n16_N3ccc7CC9x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y23pqrEv,_ZThn4_N3ccc7CC9x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y23efgEv,_ZTv0_n12_N3ccc7CC9x7y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y23efgEv,_ZThn4_N3ccc7CC9x7y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y2E = {  "_ZN3ccc7CC9x7y2E", // class name
  bases__ZN3ccc7CC9x7y2E, 2,
  &(vtc__ZN3ccc7CC9x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y2E),2, //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  DD9x7y2  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD9x7y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x7y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x7y23pqrEv
  ~DD9x7y2(); // tgen
  DD9x7y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y2E) C1{ VBC2{ v1 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x7y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y23efgEv");}
void  ccc::DD9x7y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y23abcEv");}
void  ccc::DD9x7y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y23pqrEv");}
ccc::DD9x7y2 ::~DD9x7y2(){ note_dtor("_ZN3ccc7DD9x7y2E", this);} // tgen
ccc::DD9x7y2 ::DD9x7y2(){ note_ctor("_ZN3ccc7DD9x7y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y2E, buf);
    ::ccc::DD9x7y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y2E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y2E);
    dp->::ccc::DD9x7y2::~DD9x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y2E(Test__ZN3ccc7DD9x7y2E, "_ZN3ccc7DD9x7y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y2C1Ev();
extern void _ZN3ccc7DD9x7y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y2E[] = {
  NSPAIR(_ZN3ccc7DD9x7y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y2E[];
extern void _ZN3ccc7DD9x7y23efgEv();
extern void _ZN3ccc7DD9x7y23pqrEv();
extern void _ZN3ccc7DD9x7y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y23abcEv,_ZTv0_n12_N3ccc7DD9x7y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y23abcEv,_ZThn4_N3ccc7DD9x7y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y23pqrEv,_ZTv0_n16_N3ccc7DD9x7y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y23pqrEv,_ZThn4_N3ccc7DD9x7y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y23abcEv,_ZTv0_n12_N3ccc7DD9x7y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y23pqrEv,_ZTv0_n16_N3ccc7DD9x7y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y2E[] = {
  {&(_ZTVN3ccc7DD9x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y2E[];
static VTBL_ENTRY alt_thunk_names1797[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y23pqrEv,_ZTv0_n16_N3ccc7DD9x7y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y23pqrEv,_ZThn4_N3ccc7DD9x7y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y23abcEv,_ZTv0_n12_N3ccc7DD9x7y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y23abcEv,_ZThn4_N3ccc7DD9x7y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y2E = {  "_ZN3ccc7DD9x7y2E", // class name
  bases__ZN3ccc7DD9x7y2E, 2,
  &(vtc__ZN3ccc7DD9x7y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y2E),3, //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  CC9x7y3  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x7y33abcEv
  ~CC9x7y3(); // tgen
  CC9x7y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y3E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y33efgEv");}
void  ccc::CC9x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y33pqrEv");}
void  ccc::CC9x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y33abcEv");}
ccc::CC9x7y3 ::~CC9x7y3(){ note_dtor("_ZN3ccc7CC9x7y3E", this);} // tgen
ccc::CC9x7y3 ::CC9x7y3(){ note_ctor("_ZN3ccc7CC9x7y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y3E, buf);
    ::ccc::CC9x7y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y3E);
    dp->::ccc::CC9x7y3::~CC9x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y3E(Test__ZN3ccc7CC9x7y3E, "_ZN3ccc7CC9x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y3C1Ev();
extern void _ZN3ccc7CC9x7y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y3E[] = {
  NSPAIR(_ZN3ccc7CC9x7y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y3E[];
extern void _ZN3ccc7CC9x7y33abcEv();
extern void _ZN3ccc7CC9x7y33pqrEv();
extern void _ZN3ccc7CC9x7y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y33efgEv,_ZTv0_n12_N3ccc7CC9x7y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y33efgEv,_ZThn4_N3ccc7CC9x7y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y33pqrEv,_ZTv0_n16_N3ccc7CC9x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y33pqrEv,_ZThn4_N3ccc7CC9x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y33efgEv,_ZTv0_n12_N3ccc7CC9x7y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y33pqrEv,_ZTv0_n16_N3ccc7CC9x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y3E[] = {
  {&(_ZTVN3ccc7CC9x7y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y3E[];
static VTBL_ENTRY alt_thunk_names1798[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y33pqrEv,_ZTv0_n16_N3ccc7CC9x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y33pqrEv,_ZThn4_N3ccc7CC9x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y33efgEv,_ZTv0_n12_N3ccc7CC9x7y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y33efgEv,_ZThn4_N3ccc7CC9x7y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y3E = {  "_ZN3ccc7CC9x7y3E", // class name
  bases__ZN3ccc7CC9x7y3E, 2,
  &(vtc__ZN3ccc7CC9x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y3E),2, //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  DD9x7y3  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD9x7y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x7y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x7y33abcEv
  ~DD9x7y3(); // tgen
  DD9x7y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y3E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x7y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y33efgEv");}
void  ccc::DD9x7y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y33pqrEv");}
void  ccc::DD9x7y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y33abcEv");}
ccc::DD9x7y3 ::~DD9x7y3(){ note_dtor("_ZN3ccc7DD9x7y3E", this);} // tgen
ccc::DD9x7y3 ::DD9x7y3(){ note_ctor("_ZN3ccc7DD9x7y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y3E, buf);
    ::ccc::DD9x7y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y3E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y3E);
    dp->::ccc::DD9x7y3::~DD9x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y3E(Test__ZN3ccc7DD9x7y3E, "_ZN3ccc7DD9x7y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y3C1Ev();
extern void _ZN3ccc7DD9x7y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y3E[] = {
  NSPAIR(_ZN3ccc7DD9x7y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y3E[];
extern void _ZN3ccc7DD9x7y33efgEv();
extern void _ZN3ccc7DD9x7y33pqrEv();
extern void _ZN3ccc7DD9x7y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y33abcEv,_ZTv0_n12_N3ccc7DD9x7y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y33abcEv,_ZThn4_N3ccc7DD9x7y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y33pqrEv,_ZTv0_n16_N3ccc7DD9x7y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y33pqrEv,_ZThn4_N3ccc7DD9x7y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y33abcEv,_ZTv0_n12_N3ccc7DD9x7y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y33pqrEv,_ZTv0_n16_N3ccc7DD9x7y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y3E[] = {
  {&(_ZTVN3ccc7DD9x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y3E[];
static VTBL_ENTRY alt_thunk_names1799[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y33pqrEv,_ZTv0_n16_N3ccc7DD9x7y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y33pqrEv,_ZThn4_N3ccc7DD9x7y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y33abcEv,_ZTv0_n12_N3ccc7DD9x7y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y33abcEv,_ZThn4_N3ccc7DD9x7y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y3E = {  "_ZN3ccc7DD9x7y3E", // class name
  bases__ZN3ccc7DD9x7y3E, 2,
  &(vtc__ZN3ccc7DD9x7y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y3E),3, //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  CC9x7y4  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC9x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x7y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x7y43efgEv
  ~CC9x7y4(); // tgen
  CC9x7y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y4E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y43pqrEv");}
void  ccc::CC9x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y43abcEv");}
void  ccc::CC9x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y43efgEv");}
ccc::CC9x7y4 ::~CC9x7y4(){ note_dtor("_ZN3ccc7CC9x7y4E", this);} // tgen
ccc::CC9x7y4 ::CC9x7y4(){ note_ctor("_ZN3ccc7CC9x7y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y4E, buf);
    ::ccc::CC9x7y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y4E);
    dp->::ccc::CC9x7y4::~CC9x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y4E(Test__ZN3ccc7CC9x7y4E, "_ZN3ccc7CC9x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y4C1Ev();
extern void _ZN3ccc7CC9x7y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y4E[] = {
  NSPAIR(_ZN3ccc7CC9x7y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y4E[];
extern void _ZN3ccc7CC9x7y43abcEv();
extern void _ZN3ccc7CC9x7y43pqrEv();
extern void _ZN3ccc7CC9x7y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y43efgEv,_ZTv0_n12_N3ccc7CC9x7y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y43efgEv,_ZThn4_N3ccc7CC9x7y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y43pqrEv,_ZTv0_n16_N3ccc7CC9x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y43pqrEv,_ZThn4_N3ccc7CC9x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y43efgEv,_ZTv0_n12_N3ccc7CC9x7y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y43pqrEv,_ZTv0_n16_N3ccc7CC9x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y4E[] = {
  {&(_ZTVN3ccc7CC9x7y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y4E[];
static VTBL_ENTRY alt_thunk_names1800[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y43pqrEv,_ZTv0_n16_N3ccc7CC9x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y43pqrEv,_ZThn4_N3ccc7CC9x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y43efgEv,_ZTv0_n12_N3ccc7CC9x7y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y43efgEv,_ZThn4_N3ccc7CC9x7y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y4E = {  "_ZN3ccc7CC9x7y4E", // class name
  bases__ZN3ccc7CC9x7y4E, 2,
  &(vtc__ZN3ccc7CC9x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y4E),2, //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  DD9x7y4  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD9x7y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x7y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x7y43efgEv
  ~DD9x7y4(); // tgen
  DD9x7y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y4E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x7y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y43pqrEv");}
void  ccc::DD9x7y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y43abcEv");}
void  ccc::DD9x7y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y43efgEv");}
ccc::DD9x7y4 ::~DD9x7y4(){ note_dtor("_ZN3ccc7DD9x7y4E", this);} // tgen
ccc::DD9x7y4 ::DD9x7y4(){ note_ctor("_ZN3ccc7DD9x7y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y4E, buf);
    ::ccc::DD9x7y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y4E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y4E);
    dp->::ccc::DD9x7y4::~DD9x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y4E(Test__ZN3ccc7DD9x7y4E, "_ZN3ccc7DD9x7y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y4C1Ev();
extern void _ZN3ccc7DD9x7y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y4E[] = {
  NSPAIR(_ZN3ccc7DD9x7y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y4E[];
extern void _ZN3ccc7DD9x7y43efgEv();
extern void _ZN3ccc7DD9x7y43pqrEv();
extern void _ZN3ccc7DD9x7y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y43abcEv,_ZTv0_n12_N3ccc7DD9x7y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y43abcEv,_ZThn4_N3ccc7DD9x7y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y43pqrEv,_ZTv0_n16_N3ccc7DD9x7y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y43pqrEv,_ZThn4_N3ccc7DD9x7y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y43abcEv,_ZTv0_n12_N3ccc7DD9x7y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y43pqrEv,_ZTv0_n16_N3ccc7DD9x7y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y4E[] = {
  {&(_ZTVN3ccc7DD9x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y4E[];
static VTBL_ENTRY alt_thunk_names1801[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y43pqrEv,_ZTv0_n16_N3ccc7DD9x7y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y43pqrEv,_ZThn4_N3ccc7DD9x7y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y43abcEv,_ZTv0_n12_N3ccc7DD9x7y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y43abcEv,_ZThn4_N3ccc7DD9x7y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y4E = {  "_ZN3ccc7DD9x7y4E", // class name
  bases__ZN3ccc7DD9x7y4E, 2,
  &(vtc__ZN3ccc7DD9x7y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y4E),3, //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  CC9x7y5  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7CC9x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x7y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x7y53abcEv
  ~CC9x7y5(); // tgen
  CC9x7y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y5E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y53pqrEv");}
void  ccc::CC9x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y53efgEv");}
void  ccc::CC9x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y53abcEv");}
ccc::CC9x7y5 ::~CC9x7y5(){ note_dtor("_ZN3ccc7CC9x7y5E", this);} // tgen
ccc::CC9x7y5 ::CC9x7y5(){ note_ctor("_ZN3ccc7CC9x7y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y5E, buf);
    ::ccc::CC9x7y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y5E);
    dp->::ccc::CC9x7y5::~CC9x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y5E(Test__ZN3ccc7CC9x7y5E, "_ZN3ccc7CC9x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y5C1Ev();
extern void _ZN3ccc7CC9x7y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y5E[] = {
  NSPAIR(_ZN3ccc7CC9x7y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y5E[];
extern void _ZN3ccc7CC9x7y53abcEv();
extern void _ZN3ccc7CC9x7y53pqrEv();
extern void _ZN3ccc7CC9x7y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y53efgEv,_ZTv0_n12_N3ccc7CC9x7y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y53efgEv,_ZThn4_N3ccc7CC9x7y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y53pqrEv,_ZTv0_n16_N3ccc7CC9x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y53pqrEv,_ZThn4_N3ccc7CC9x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y53efgEv,_ZTv0_n12_N3ccc7CC9x7y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y53pqrEv,_ZTv0_n16_N3ccc7CC9x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y5E[] = {
  {&(_ZTVN3ccc7CC9x7y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y5E[];
static VTBL_ENTRY alt_thunk_names1802[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y53pqrEv,_ZTv0_n16_N3ccc7CC9x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y53pqrEv,_ZThn4_N3ccc7CC9x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y53efgEv,_ZTv0_n12_N3ccc7CC9x7y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y53efgEv,_ZThn4_N3ccc7CC9x7y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y5E = {  "_ZN3ccc7CC9x7y5E", // class name
  bases__ZN3ccc7CC9x7y5E, 2,
  &(vtc__ZN3ccc7CC9x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y5E),2, //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  DD9x7y5  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc7DD9x7y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x7y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x7y53abcEv
  ~DD9x7y5(); // tgen
  DD9x7y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y5E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x7y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y53pqrEv");}
void  ccc::DD9x7y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y53efgEv");}
void  ccc::DD9x7y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y53abcEv");}
ccc::DD9x7y5 ::~DD9x7y5(){ note_dtor("_ZN3ccc7DD9x7y5E", this);} // tgen
ccc::DD9x7y5 ::DD9x7y5(){ note_ctor("_ZN3ccc7DD9x7y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y5E, buf);
    ::ccc::DD9x7y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y5E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y5E);
    dp->::ccc::DD9x7y5::~DD9x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y5E(Test__ZN3ccc7DD9x7y5E, "_ZN3ccc7DD9x7y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y5C1Ev();
extern void _ZN3ccc7DD9x7y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y5E[] = {
  NSPAIR(_ZN3ccc7DD9x7y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y5E[];
extern void _ZN3ccc7DD9x7y53efgEv();
extern void _ZN3ccc7DD9x7y53pqrEv();
extern void _ZN3ccc7DD9x7y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y53abcEv,_ZTv0_n12_N3ccc7DD9x7y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y53abcEv,_ZThn4_N3ccc7DD9x7y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y53pqrEv,_ZTv0_n16_N3ccc7DD9x7y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y53pqrEv,_ZThn4_N3ccc7DD9x7y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y53abcEv,_ZTv0_n12_N3ccc7DD9x7y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y53pqrEv,_ZTv0_n16_N3ccc7DD9x7y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y5E[] = {
  {&(_ZTVN3ccc7DD9x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y5E[];
static VTBL_ENTRY alt_thunk_names1803[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y53pqrEv,_ZTv0_n16_N3ccc7DD9x7y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y53pqrEv,_ZThn4_N3ccc7DD9x7y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y53abcEv,_ZTv0_n12_N3ccc7DD9x7y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y53abcEv,_ZThn4_N3ccc7DD9x7y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y5E = {  "_ZN3ccc7DD9x7y5E", // class name
  bases__ZN3ccc7DD9x7y5E, 2,
  &(vtc__ZN3ccc7DD9x7y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y5E),3, //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  CC9x7y6  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x7y63efgEv
  ~CC9x7y6(); // tgen
  CC9x7y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y6E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y63abcEv");}
void  ccc::CC9x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y63efgEv");}
ccc::CC9x7y6 ::~CC9x7y6(){ note_dtor("_ZN3ccc7CC9x7y6E", this);} // tgen
ccc::CC9x7y6 ::CC9x7y6(){ note_ctor("_ZN3ccc7CC9x7y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y6E, buf);
    ::ccc::CC9x7y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y6E);
    dp->::ccc::CC9x7y6::~CC9x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y6E(Test__ZN3ccc7CC9x7y6E, "_ZN3ccc7CC9x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y6C1Ev();
extern void _ZN3ccc7CC9x7y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y6E[] = {
  NSPAIR(_ZN3ccc7CC9x7y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y6E[];
extern void _ZN3ccc7CC9x7y63abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC9x7y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y63efgEv,_ZTv0_n12_N3ccc7CC9x7y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y63efgEv,_ZThn4_N3ccc7CC9x7y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y63efgEv,_ZTv0_n12_N3ccc7CC9x7y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y6E[] = {
  {&(_ZTVN3ccc7CC9x7y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y6E[];
static VTBL_ENTRY alt_thunk_names1804[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y63efgEv,_ZTv0_n12_N3ccc7CC9x7y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y63efgEv,_ZThn4_N3ccc7CC9x7y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y6E = {  "_ZN3ccc7CC9x7y6E", // class name
  bases__ZN3ccc7CC9x7y6E, 2,
  &(vtc__ZN3ccc7CC9x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y6E),2, //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  DD9x7y6  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD9x7y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x7y63efgEv
  ~DD9x7y6(); // tgen
  DD9x7y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y6E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x7y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y63abcEv");}
void  ccc::DD9x7y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y63efgEv");}
ccc::DD9x7y6 ::~DD9x7y6(){ note_dtor("_ZN3ccc7DD9x7y6E", this);} // tgen
ccc::DD9x7y6 ::DD9x7y6(){ note_ctor("_ZN3ccc7DD9x7y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y6E, buf);
    ::ccc::DD9x7y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y6E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y6E);
    dp->::ccc::DD9x7y6::~DD9x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y6E(Test__ZN3ccc7DD9x7y6E, "_ZN3ccc7DD9x7y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y6C1Ev();
extern void _ZN3ccc7DD9x7y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y6E[] = {
  NSPAIR(_ZN3ccc7DD9x7y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y6E[];
extern void _ZN3ccc7DD9x7y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x7y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y63abcEv,_ZTv0_n12_N3ccc7DD9x7y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y63abcEv,_ZThn4_N3ccc7DD9x7y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y63abcEv,_ZTv0_n12_N3ccc7DD9x7y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y6E[] = {
  {&(_ZTVN3ccc7DD9x7y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y6E[];
static VTBL_ENTRY alt_thunk_names1805[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y63abcEv,_ZTv0_n12_N3ccc7DD9x7y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y63abcEv,_ZThn4_N3ccc7DD9x7y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y6E = {  "_ZN3ccc7DD9x7y6E", // class name
  bases__ZN3ccc7DD9x7y6E, 2,
  &(vtc__ZN3ccc7DD9x7y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y6E),3, //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  CC9x7y7  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7CC9x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y73pqrEv
  ~CC9x7y7(); // tgen
  CC9x7y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y7E) C1{ VBC2{ v3 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y73abcEv");}
void  ccc::CC9x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y73pqrEv");}
ccc::CC9x7y7 ::~CC9x7y7(){ note_dtor("_ZN3ccc7CC9x7y7E", this);} // tgen
ccc::CC9x7y7 ::CC9x7y7(){ note_ctor("_ZN3ccc7CC9x7y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y7E, buf);
    ::ccc::CC9x7y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y7E);
    dp->::ccc::CC9x7y7::~CC9x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y7E(Test__ZN3ccc7CC9x7y7E, "_ZN3ccc7CC9x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y7C1Ev();
extern void _ZN3ccc7CC9x7y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y7E[] = {
  NSPAIR(_ZN3ccc7CC9x7y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y7E[];
extern void _ZN3ccc7CC9x7y73abcEv();
extern void _ZN3ccc7CC9x7y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y73pqrEv,_ZTv0_n16_N3ccc7CC9x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y73pqrEv,_ZThn4_N3ccc7CC9x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y73pqrEv,_ZTv0_n16_N3ccc7CC9x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y7E[] = {
  {&(_ZTVN3ccc7CC9x7y7E[3]),  3,11},
  {&(_ZTVN3ccc7CC9x7y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y7E[];
static VTBL_ENTRY alt_thunk_names1806[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y73pqrEv,_ZTv0_n16_N3ccc7CC9x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y73pqrEv,_ZThn4_N3ccc7CC9x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y7E = {  "_ZN3ccc7CC9x7y7E", // class name
  bases__ZN3ccc7CC9x7y7E, 2,
  &(vtc__ZN3ccc7CC9x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y7E),2, //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  DD9x7y7  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc7DD9x7y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x7y73pqrEv
  ~DD9x7y7(); // tgen
  DD9x7y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y7E) C1{ VBC2{ v3 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x7y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y73abcEv");}
void  ccc::DD9x7y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y73pqrEv");}
ccc::DD9x7y7 ::~DD9x7y7(){ note_dtor("_ZN3ccc7DD9x7y7E", this);} // tgen
ccc::DD9x7y7 ::DD9x7y7(){ note_ctor("_ZN3ccc7DD9x7y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y7E, buf);
    ::ccc::DD9x7y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y7E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y7E);
    dp->::ccc::DD9x7y7::~DD9x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y7E(Test__ZN3ccc7DD9x7y7E, "_ZN3ccc7DD9x7y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y7C1Ev();
extern void _ZN3ccc7DD9x7y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y7E[] = {
  NSPAIR(_ZN3ccc7DD9x7y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x7y73pqrEv();
extern void _ZN3ccc7DD9x7y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y73abcEv,_ZTv0_n12_N3ccc7DD9x7y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y73abcEv,_ZThn4_N3ccc7DD9x7y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y73pqrEv,_ZTv0_n16_N3ccc7DD9x7y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y73pqrEv,_ZThn4_N3ccc7DD9x7y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y73abcEv,_ZTv0_n12_N3ccc7DD9x7y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y73pqrEv,_ZTv0_n16_N3ccc7DD9x7y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y7E[] = {
  {&(_ZTVN3ccc7DD9x7y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y7E[];
static VTBL_ENTRY alt_thunk_names1807[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y73pqrEv,_ZTv0_n16_N3ccc7DD9x7y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y73pqrEv,_ZThn4_N3ccc7DD9x7y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y73abcEv,_ZTv0_n12_N3ccc7DD9x7y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y73abcEv,_ZThn4_N3ccc7DD9x7y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y7E = {  "_ZN3ccc7DD9x7y7E", // class name
  bases__ZN3ccc7DD9x7y7E, 2,
  &(vtc__ZN3ccc7DD9x7y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y7E),3, //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  CC9x7y8  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x7y83abcEv
  ~CC9x7y8(); // tgen
  CC9x7y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y8E) C1{ VBC2{ v1 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y83efgEv");}
void  ccc::CC9x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x7y83abcEv");}
ccc::CC9x7y8 ::~CC9x7y8(){ note_dtor("_ZN3ccc7CC9x7y8E", this);} // tgen
ccc::CC9x7y8 ::CC9x7y8(){ note_ctor("_ZN3ccc7CC9x7y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y8E, buf);
    ::ccc::CC9x7y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y8E);
    dp->::ccc::CC9x7y8::~CC9x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y8E(Test__ZN3ccc7CC9x7y8E, "_ZN3ccc7CC9x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y8C1Ev();
extern void _ZN3ccc7CC9x7y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y8E[] = {
  NSPAIR(_ZN3ccc7CC9x7y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y8E[];
extern void _ZN3ccc7CC9x7y83abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc7CC9x7y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y83efgEv,_ZTv0_n12_N3ccc7CC9x7y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y83efgEv,_ZThn4_N3ccc7CC9x7y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y83efgEv,_ZTv0_n12_N3ccc7CC9x7y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y8E[] = {
  {&(_ZTVN3ccc7CC9x7y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y8E[];
static VTBL_ENTRY alt_thunk_names1808[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y83efgEv,_ZTv0_n12_N3ccc7CC9x7y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y83efgEv,_ZThn4_N3ccc7CC9x7y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y8E = {  "_ZN3ccc7CC9x7y8E", // class name
  bases__ZN3ccc7CC9x7y8E, 2,
  &(vtc__ZN3ccc7CC9x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y8E),2, //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  DD9x7y8  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD9x7y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x7y83abcEv
  ~DD9x7y8(); // tgen
  DD9x7y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y8E) C1{ VBC2{ v1 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x7y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y83efgEv");}
void  ccc::DD9x7y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x7y83abcEv");}
ccc::DD9x7y8 ::~DD9x7y8(){ note_dtor("_ZN3ccc7DD9x7y8E", this);} // tgen
ccc::DD9x7y8 ::DD9x7y8(){ note_ctor("_ZN3ccc7DD9x7y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y8E, buf);
    ::ccc::DD9x7y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y8E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y8E);
    dp->::ccc::DD9x7y8::~DD9x7y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y8E(Test__ZN3ccc7DD9x7y8E, "_ZN3ccc7DD9x7y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y8C1Ev();
extern void _ZN3ccc7DD9x7y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y8E[] = {
  NSPAIR(_ZN3ccc7DD9x7y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y8E[];
extern void _ZN3ccc7DD9x7y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x7y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x7y83abcEv,_ZTv0_n12_N3ccc7DD9x7y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y83abcEv,_ZThn4_N3ccc7DD9x7y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x7y83abcEv,_ZTv0_n12_N3ccc7DD9x7y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y8E[] = {
  {&(_ZTVN3ccc7DD9x7y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x7y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y8E[];
static VTBL_ENTRY alt_thunk_names1809[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x7y83abcEv,_ZTv0_n12_N3ccc7DD9x7y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y83abcEv,_ZThn4_N3ccc7DD9x7y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y8E = {  "_ZN3ccc7DD9x7y8E", // class name
  bases__ZN3ccc7DD9x7y8E, 2,
  &(vtc__ZN3ccc7DD9x7y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y8E),3, //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  CC9x7y9  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7CC9x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x7y93pqrEv
  ~CC9x7y9(); // tgen
  CC9x7y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x7y9E) C1{ VBC2{ v1 v2} BC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x7y93efgEv");}
void  ccc::CC9x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x7y93pqrEv");}
ccc::CC9x7y9 ::~CC9x7y9(){ note_dtor("_ZN3ccc7CC9x7y9E", this);} // tgen
ccc::CC9x7y9 ::CC9x7y9(){ note_ctor("_ZN3ccc7CC9x7y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x7y9E, buf);
    ::ccc::CC9x7y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x7y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc7CC9x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x7y9E);
    dp->::ccc::CC9x7y9::~CC9x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x7y9E(Test__ZN3ccc7CC9x7y9E, "_ZN3ccc7CC9x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x7y9C1Ev();
extern void _ZN3ccc7CC9x7y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x7y9E[] = {
  NSPAIR(_ZN3ccc7CC9x7y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7CC9x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x7y9E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc7CC9x7y93pqrEv();
extern void _ZN3ccc7CC9x7y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x7y93efgEv,_ZTv0_n12_N3ccc7CC9x7y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y93efgEv,_ZThn4_N3ccc7CC9x7y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x7y93pqrEv,_ZTv0_n16_N3ccc7CC9x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x7y93pqrEv,_ZThn4_N3ccc7CC9x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x7y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x7y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x7y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x7y93efgEv,_ZTv0_n12_N3ccc7CC9x7y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x7y93pqrEv,_ZTv0_n16_N3ccc7CC9x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x7y9E[] = {
  {&(_ZTVN3ccc7CC9x7y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x7y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x7y9E[];
static VTBL_ENTRY alt_thunk_names1810[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x7y93pqrEv,_ZTv0_n16_N3ccc7CC9x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y93pqrEv,_ZThn4_N3ccc7CC9x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x7y93efgEv,_ZTv0_n12_N3ccc7CC9x7y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x7y93efgEv,_ZThn4_N3ccc7CC9x7y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x7y9E = {  "_ZN3ccc7CC9x7y9E", // class name
  bases__ZN3ccc7CC9x7y9E, 2,
  &(vtc__ZN3ccc7CC9x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x7y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x7y9E),2, //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  DD9x7y9  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc7DD9x7y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x7y93pqrEv
  ~DD9x7y9(); // tgen
  DD9x7y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x7y9E) C1{ VBC2{ v1 v2} VBC3{ v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x7y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x7y93efgEv");}
void  ccc::DD9x7y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x7y93pqrEv");}
ccc::DD9x7y9 ::~DD9x7y9(){ note_dtor("_ZN3ccc7DD9x7y9E", this);} // tgen
ccc::DD9x7y9 ::DD9x7y9(){ note_ctor("_ZN3ccc7DD9x7y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x7y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x7y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x7y9E, buf);
    ::ccc::DD9x7y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x7y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x7y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x7y9E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc7DD9x7y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x7y9E);
    dp->::ccc::DD9x7y9::~DD9x7y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x7y9E(Test__ZN3ccc7DD9x7y9E, "_ZN3ccc7DD9x7y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x7y9C1Ev();
extern void _ZN3ccc7DD9x7y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x7y9E[] = {
  NSPAIR(_ZN3ccc7DD9x7y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x7y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc7DD9x7y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y9E[];
extern void _ZN3ccc7DD9x7y93efgEv();
extern void _ZN3ccc7DD9x7y93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x7y93pqrEv,_ZTv0_n16_N3ccc7DD9x7y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x7y93pqrEv,_ZThn4_N3ccc7DD9x7y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x7y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x7y93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x7y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x7y93pqrEv,_ZTv0_n16_N3ccc7DD9x7y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x7y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x7y9E[] = {
  {&(_ZTVN3ccc7DD9x7y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x7y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x7y9E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x7y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x7y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x7y9E[];
static VTBL_ENTRY alt_thunk_names1811[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x7y93pqrEv,_ZTv0_n16_N3ccc7DD9x7y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x7y93pqrEv,_ZThn4_N3ccc7DD9x7y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x7y9E = {  "_ZN3ccc7DD9x7y9E", // class name
  bases__ZN3ccc7DD9x7y9E, 2,
  &(vtc__ZN3ccc7DD9x7y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x7y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x7y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x7y9E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x7y9E),3, //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  CC9x7y10  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC9x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x7y103abcEv
  ~CC9x7y10(); // tgen
  CC9x7y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y10E) C1{ VBC2{ v3 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x7y103pqrEv");}
void  ccc::CC9x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x7y103abcEv");}
ccc::CC9x7y10 ::~CC9x7y10(){ note_dtor("_ZN3ccc8CC9x7y10E", this);} // tgen
ccc::CC9x7y10 ::CC9x7y10(){ note_ctor("_ZN3ccc8CC9x7y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x7y10E, buf);
    ::ccc::CC9x7y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x7y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC9x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x7y10E);
    dp->::ccc::CC9x7y10::~CC9x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x7y10E(Test__ZN3ccc8CC9x7y10E, "_ZN3ccc8CC9x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x7y10C1Ev();
extern void _ZN3ccc8CC9x7y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x7y10E[] = {
  NSPAIR(_ZN3ccc8CC9x7y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC9x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x7y10E[];
extern void _ZN3ccc8CC9x7y103abcEv();
extern void _ZN3ccc8CC9x7y103pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x7y103pqrEv,_ZTv0_n16_N3ccc8CC9x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y103pqrEv,_ZThn4_N3ccc8CC9x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x7y103pqrEv,_ZTv0_n16_N3ccc8CC9x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x7y10E[] = {
  {&(_ZTVN3ccc8CC9x7y10E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x7y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x7y10E[];
static VTBL_ENTRY alt_thunk_names1812[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x7y103pqrEv,_ZTv0_n16_N3ccc8CC9x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x7y103pqrEv,_ZThn4_N3ccc8CC9x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x7y10E = {  "_ZN3ccc8CC9x7y10E", // class name
  bases__ZN3ccc8CC9x7y10E, 2,
  &(vtc__ZN3ccc8CC9x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x7y10E),2, //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  DD9x7y10  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD9x7y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x7y103abcEv
  ~DD9x7y10(); // tgen
  DD9x7y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x7y10E) C1{ VBC2{ v3 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x7y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x7y103pqrEv");}
void  ccc::DD9x7y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x7y103abcEv");}
ccc::DD9x7y10 ::~DD9x7y10(){ note_dtor("_ZN3ccc8DD9x7y10E", this);} // tgen
ccc::DD9x7y10 ::DD9x7y10(){ note_ctor("_ZN3ccc8DD9x7y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x7y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x7y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x7y10E, buf);
    ::ccc::DD9x7y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x7y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x7y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x7y10E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD9x7y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x7y10E);
    dp->::ccc::DD9x7y10::~DD9x7y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x7y10E(Test__ZN3ccc8DD9x7y10E, "_ZN3ccc8DD9x7y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x7y10C1Ev();
extern void _ZN3ccc8DD9x7y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x7y10E[] = {
  NSPAIR(_ZN3ccc8DD9x7y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x7y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD9x7y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x7y103pqrEv();
extern void _ZN3ccc8DD9x7y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x7y103abcEv,_ZTv0_n12_N3ccc8DD9x7y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x7y103abcEv,_ZThn4_N3ccc8DD9x7y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x7y103pqrEv,_ZTv0_n16_N3ccc8DD9x7y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x7y103pqrEv,_ZThn4_N3ccc8DD9x7y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x7y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x7y103abcEv,_ZTv0_n12_N3ccc8DD9x7y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x7y103pqrEv,_ZTv0_n16_N3ccc8DD9x7y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x7y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x7y10E[] = {
  {&(_ZTVN3ccc8DD9x7y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x7y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x7y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x7y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x7y10E[];
static VTBL_ENTRY alt_thunk_names1813[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x7y103pqrEv,_ZTv0_n16_N3ccc8DD9x7y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x7y103pqrEv,_ZThn4_N3ccc8DD9x7y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x7y103abcEv,_ZTv0_n12_N3ccc8DD9x7y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x7y103abcEv,_ZThn4_N3ccc8DD9x7y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x7y10E = {  "_ZN3ccc8DD9x7y10E", // class name
  bases__ZN3ccc8DD9x7y10E, 2,
  &(vtc__ZN3ccc8DD9x7y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x7y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x7y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x7y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x7y10E),3, //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  CC9x7y11  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC9x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x7y113efgEv
  ~CC9x7y11(); // tgen
  CC9x7y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y11E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x7y113pqrEv");}
void  ccc::CC9x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x7y113efgEv");}
ccc::CC9x7y11 ::~CC9x7y11(){ note_dtor("_ZN3ccc8CC9x7y11E", this);} // tgen
ccc::CC9x7y11 ::CC9x7y11(){ note_ctor("_ZN3ccc8CC9x7y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x7y11E, buf);
    ::ccc::CC9x7y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x7y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC9x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x7y11E);
    dp->::ccc::CC9x7y11::~CC9x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x7y11E(Test__ZN3ccc8CC9x7y11E, "_ZN3ccc8CC9x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x7y11C1Ev();
extern void _ZN3ccc8CC9x7y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x7y11E[] = {
  NSPAIR(_ZN3ccc8CC9x7y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC9x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x7y11E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC9x7y113pqrEv();
extern void _ZN3ccc8CC9x7y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x7y113efgEv,_ZTv0_n12_N3ccc8CC9x7y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y113efgEv,_ZThn4_N3ccc8CC9x7y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x7y113pqrEv,_ZTv0_n16_N3ccc8CC9x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y113pqrEv,_ZThn4_N3ccc8CC9x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x7y113efgEv,_ZTv0_n12_N3ccc8CC9x7y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x7y113pqrEv,_ZTv0_n16_N3ccc8CC9x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x7y11E[] = {
  {&(_ZTVN3ccc8CC9x7y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x7y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x7y11E[];
static VTBL_ENTRY alt_thunk_names1814[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x7y113pqrEv,_ZTv0_n16_N3ccc8CC9x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x7y113pqrEv,_ZThn4_N3ccc8CC9x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x7y113efgEv,_ZTv0_n12_N3ccc8CC9x7y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x7y113efgEv,_ZThn4_N3ccc8CC9x7y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x7y11E = {  "_ZN3ccc8CC9x7y11E", // class name
  bases__ZN3ccc8CC9x7y11E, 2,
  &(vtc__ZN3ccc8CC9x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x7y11E),2, //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  DD9x7y11  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD9x7y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x7y113efgEv
  ~DD9x7y11(); // tgen
  DD9x7y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x7y11E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x7y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x7y113pqrEv");}
void  ccc::DD9x7y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x7y113efgEv");}
ccc::DD9x7y11 ::~DD9x7y11(){ note_dtor("_ZN3ccc8DD9x7y11E", this);} // tgen
ccc::DD9x7y11 ::DD9x7y11(){ note_ctor("_ZN3ccc8DD9x7y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x7y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x7y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x7y11E, buf);
    ::ccc::DD9x7y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x7y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x7y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x7y11E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD9x7y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x7y11E);
    dp->::ccc::DD9x7y11::~DD9x7y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x7y11E(Test__ZN3ccc8DD9x7y11E, "_ZN3ccc8DD9x7y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x7y11C1Ev();
extern void _ZN3ccc8DD9x7y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x7y11E[] = {
  NSPAIR(_ZN3ccc8DD9x7y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x7y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD9x7y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y11E[];
extern void _ZN3ccc8DD9x7y113efgEv();
extern void _ZN3ccc8DD9x7y113pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x7y113pqrEv,_ZTv0_n16_N3ccc8DD9x7y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x7y113pqrEv,_ZThn4_N3ccc8DD9x7y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x7y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y113pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x7y113pqrEv,_ZTv0_n16_N3ccc8DD9x7y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x7y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x7y11E[] = {
  {&(_ZTVN3ccc8DD9x7y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y11E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x7y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x7y11E[];
static VTBL_ENTRY alt_thunk_names1815[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x7y113pqrEv,_ZTv0_n16_N3ccc8DD9x7y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x7y113pqrEv,_ZThn4_N3ccc8DD9x7y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x7y11E = {  "_ZN3ccc8DD9x7y11E", // class name
  bases__ZN3ccc8DD9x7y11E, 2,
  &(vtc__ZN3ccc8DD9x7y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x7y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x7y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x7y11E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x7y11E),3, //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  CC9x7y12  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8CC9x7y123abcEv
  ~CC9x7y12(); // tgen
  CC9x7y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y12E) C1{ VBC2{ v2 v3} BC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::CC9x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x7y123abcEv");}
ccc::CC9x7y12 ::~CC9x7y12(){ note_dtor("_ZN3ccc8CC9x7y12E", this);} // tgen
ccc::CC9x7y12 ::CC9x7y12(){ note_ctor("_ZN3ccc8CC9x7y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x7y12E, buf);
    ::ccc::CC9x7y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x7y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC9x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x7y12E);
    dp->::ccc::CC9x7y12::~CC9x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x7y12E(Test__ZN3ccc8CC9x7y12E, "_ZN3ccc8CC9x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x7y12C1Ev();
extern void _ZN3ccc8CC9x7y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x7y12E[] = {
  NSPAIR(_ZN3ccc8CC9x7y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC9x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x7y12E[];
extern void _ZN3ccc8CC9x7y123abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x7y12E[] = {
  {&(_ZTVN3ccc8CC9x7y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x7y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x7y12E[];
Class_Descriptor cd__ZN3ccc8CC9x7y12E = {  "_ZN3ccc8CC9x7y12E", // class name
  bases__ZN3ccc8CC9x7y12E, 2,
  &(vtc__ZN3ccc8CC9x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x7y12E),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  DD9x7y12  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  abc(); // _ZN3ccc8DD9x7y123abcEv
  ~DD9x7y12(); // tgen
  DD9x7y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x7y12E) C1{ VBC2{ v2 v3} VBC3{ v1 v4} v1}
}
namespace ccc { 
void  ccc::DD9x7y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x7y123abcEv");}
ccc::DD9x7y12 ::~DD9x7y12(){ note_dtor("_ZN3ccc8DD9x7y12E", this);} // tgen
ccc::DD9x7y12 ::DD9x7y12(){ note_ctor("_ZN3ccc8DD9x7y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x7y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x7y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x7y12E, buf);
    ::ccc::DD9x7y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x7y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x7y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x7y12E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD9x7y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x7y12E);
    dp->::ccc::DD9x7y12::~DD9x7y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x7y12E(Test__ZN3ccc8DD9x7y12E, "_ZN3ccc8DD9x7y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x7y12C1Ev();
extern void _ZN3ccc8DD9x7y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x7y12E[] = {
  NSPAIR(_ZN3ccc8DD9x7y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x7y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD9x7y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x7y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x7y123abcEv,_ZTv0_n12_N3ccc8DD9x7y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x7y123abcEv,_ZThn4_N3ccc8DD9x7y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x7y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y123abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x7y123abcEv,_ZTv0_n12_N3ccc8DD9x7y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x7y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x7y12E[] = {
  {&(_ZTVN3ccc8DD9x7y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x7y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x7y12E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x7y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x7y12E[];
static VTBL_ENTRY alt_thunk_names1816[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x7y123abcEv,_ZTv0_n12_N3ccc8DD9x7y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x7y123abcEv,_ZThn4_N3ccc8DD9x7y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x7y12E = {  "_ZN3ccc8DD9x7y12E", // class name
  bases__ZN3ccc8DD9x7y12E, 2,
  &(vtc__ZN3ccc8DD9x7y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x7y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x7y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x7y12E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x7y12E),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  CC9x7y13  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8CC9x7y133efgEv
  ~CC9x7y13(); // tgen
  CC9x7y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x7y133efgEv");}
ccc::CC9x7y13 ::~CC9x7y13(){ note_dtor("_ZN3ccc8CC9x7y13E", this);} // tgen
ccc::CC9x7y13 ::CC9x7y13(){ note_ctor("_ZN3ccc8CC9x7y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x7y13E, buf);
    ::ccc::CC9x7y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x7y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC9x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x7y13E);
    dp->::ccc::CC9x7y13::~CC9x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x7y13E(Test__ZN3ccc8CC9x7y13E, "_ZN3ccc8CC9x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x7y13C1Ev();
extern void _ZN3ccc8CC9x7y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x7y13E[] = {
  NSPAIR(_ZN3ccc8CC9x7y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC9x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x7y13E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc8CC9x7y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x7y133efgEv,_ZTv0_n12_N3ccc8CC9x7y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y133efgEv,_ZThn4_N3ccc8CC9x7y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x7y133efgEv,_ZTv0_n12_N3ccc8CC9x7y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x7y13E[] = {
  {&(_ZTVN3ccc8CC9x7y13E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x7y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x7y13E[];
static VTBL_ENTRY alt_thunk_names1817[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x7y133efgEv,_ZTv0_n12_N3ccc8CC9x7y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x7y133efgEv,_ZThn4_N3ccc8CC9x7y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x7y13E = {  "_ZN3ccc8CC9x7y13E", // class name
  bases__ZN3ccc8CC9x7y13E, 2,
  &(vtc__ZN3ccc8CC9x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x7y13E),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  DD9x7y13  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  efg(); // _ZN3ccc8DD9x7y133efgEv
  ~DD9x7y13(); // tgen
  DD9x7y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x7y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x7y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x7y133efgEv");}
ccc::DD9x7y13 ::~DD9x7y13(){ note_dtor("_ZN3ccc8DD9x7y13E", this);} // tgen
ccc::DD9x7y13 ::DD9x7y13(){ note_ctor("_ZN3ccc8DD9x7y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x7y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x7y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x7y13E, buf);
    ::ccc::DD9x7y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x7y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x7y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x7y13E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD9x7y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x7y13E);
    dp->::ccc::DD9x7y13::~DD9x7y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x7y13E(Test__ZN3ccc8DD9x7y13E, "_ZN3ccc8DD9x7y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x7y13C1Ev();
extern void _ZN3ccc8DD9x7y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x7y13E[] = {
  NSPAIR(_ZN3ccc8DD9x7y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x7y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD9x7y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y13E[];
extern void _ZN3ccc8DD9x7y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x7y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x7y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x7y13E[] = {
  {&(_ZTVN3ccc8DD9x7y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x7y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x7y13E[];
Class_Descriptor cd__ZN3ccc8DD9x7y13E = {  "_ZN3ccc8DD9x7y13E", // class name
  bases__ZN3ccc8DD9x7y13E, 2,
  &(vtc__ZN3ccc8DD9x7y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x7y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x7y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x7y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x7y13E),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  CC9x7y14  : virtual ::ccc::AA9 , ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8CC9x7y143pqrEv
  ~CC9x7y14(); // tgen
  CC9x7y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC9x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x7y143pqrEv");}
ccc::CC9x7y14 ::~CC9x7y14(){ note_dtor("_ZN3ccc8CC9x7y14E", this);} // tgen
ccc::CC9x7y14 ::CC9x7y14(){ note_ctor("_ZN3ccc8CC9x7y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x7y14E, buf);
    ::ccc::CC9x7y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x7y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC9x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x7y14E);
    dp->::ccc::CC9x7y14::~CC9x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x7y14E(Test__ZN3ccc8CC9x7y14E, "_ZN3ccc8CC9x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x7y14C1Ev();
extern void _ZN3ccc8CC9x7y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x7y14E[] = {
  NSPAIR(_ZN3ccc8CC9x7y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC9x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x7y14E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc8CC9x7y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x7y143pqrEv,_ZTv0_n16_N3ccc8CC9x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x7y143pqrEv,_ZThn4_N3ccc8CC9x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x7y143pqrEv,_ZTv0_n16_N3ccc8CC9x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x7y14E[] = {
  {&(_ZTVN3ccc8CC9x7y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x7y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x7y14E[];
static VTBL_ENTRY alt_thunk_names1818[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x7y143pqrEv,_ZTv0_n16_N3ccc8CC9x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x7y143pqrEv,_ZThn4_N3ccc8CC9x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x7y14E = {  "_ZN3ccc8CC9x7y14E", // class name
  bases__ZN3ccc8CC9x7y14E, 2,
  &(vtc__ZN3ccc8CC9x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x7y14E),2, //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  DD9x7y14  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  virtual void  pqr(); // _ZN3ccc8DD9x7y143pqrEv
  ~DD9x7y14(); // tgen
  DD9x7y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x7y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD9x7y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x7y143pqrEv");}
ccc::DD9x7y14 ::~DD9x7y14(){ note_dtor("_ZN3ccc8DD9x7y14E", this);} // tgen
ccc::DD9x7y14 ::DD9x7y14(){ note_ctor("_ZN3ccc8DD9x7y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x7y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x7y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x7y14E, buf);
    ::ccc::DD9x7y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x7y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x7y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x7y14E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD9x7y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x7y14E);
    dp->::ccc::DD9x7y14::~DD9x7y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x7y14E(Test__ZN3ccc8DD9x7y14E, "_ZN3ccc8DD9x7y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x7y14C1Ev();
extern void _ZN3ccc8DD9x7y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x7y14E[] = {
  NSPAIR(_ZN3ccc8DD9x7y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x7y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD9x7y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x7y143pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x7y143pqrEv,_ZTv0_n16_N3ccc8DD9x7y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x7y143pqrEv,_ZThn4_N3ccc8DD9x7y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x7y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x7y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x7y143pqrEv,_ZTv0_n16_N3ccc8DD9x7y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x7y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x7y14E[] = {
  {&(_ZTVN3ccc8DD9x7y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x7y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x7y14E[];
static VTBL_ENTRY alt_thunk_names1819[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x7y143pqrEv,_ZTv0_n16_N3ccc8DD9x7y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x7y143pqrEv,_ZThn4_N3ccc8DD9x7y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x7y14E = {  "_ZN3ccc8DD9x7y14E", // class name
  bases__ZN3ccc8DD9x7y14E, 2,
  &(vtc__ZN3ccc8DD9x7y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x7y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x7y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x7y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x7y14E),3, //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  CC9x7y15  : virtual ::ccc::AA9 , ::ccc::BB7 {
  ~CC9x7y15(); // tgen
  CC9x7y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x7y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC9x7y15 ::~CC9x7y15(){ note_dtor("_ZN3ccc8CC9x7y15E", this);} // tgen
ccc::CC9x7y15 ::CC9x7y15(){ note_ctor("_ZN3ccc8CC9x7y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x7y15E, buf);
    ::ccc::CC9x7y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x7y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), 0, "_ZN3ccc8CC9x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x7y15E);
    dp->::ccc::CC9x7y15::~CC9x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x7y15E(Test__ZN3ccc8CC9x7y15E, "_ZN3ccc8CC9x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x7y15C1Ev();
extern void _ZN3ccc8CC9x7y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x7y15E[] = {
  NSPAIR(_ZN3ccc8CC9x7y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8CC9x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x7y15E[];
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x7y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x7y15E[] = {
  {&(_ZTVN3ccc8CC9x7y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x7y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x7y15E[];
Class_Descriptor cd__ZN3ccc8CC9x7y15E = {  "_ZN3ccc8CC9x7y15E", // class name
  bases__ZN3ccc8CC9x7y15E, 2,
  &(vtc__ZN3ccc8CC9x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x7y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x7y15E),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  DD9x7y15  : virtual ::ccc::AA9 , virtual ::ccc::BB7 {
  ~DD9x7y15(); // tgen
  DD9x7y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x7y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD9x7y15 ::~DD9x7y15(){ note_dtor("_ZN3ccc8DD9x7y15E", this);} // tgen
ccc::DD9x7y15 ::DD9x7y15(){ note_ctor("_ZN3ccc8DD9x7y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x7y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x7y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x7y15E, buf);
    ::ccc::DD9x7y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x7y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x7y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x7y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x7y15E");
    check_base_class_offset(lv, (::ccc::BB7*), ABISELECT(8,4), "_ZN3ccc8DD9x7y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x7y15E);
    dp->::ccc::DD9x7y15::~DD9x7y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x7y15E(Test__ZN3ccc8DD9x7y15E, "_ZN3ccc8DD9x7y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x7y15C1Ev();
extern void _ZN3ccc8DD9x7y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x7y15E[] = {
  NSPAIR(_ZN3ccc8DD9x7y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x7y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB7E;
extern VTBL_ENTRY _ZTIN3ccc3BB7E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB7E[];
static Base_Class bases__ZN3ccc8DD9x7y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB7E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB73abcEv();
extern void _ZN3ccc3BB73pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x7y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x7y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB73pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x7y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x7y15E[] = {
  {&(_ZTVN3ccc8DD9x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x7y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x7y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x7y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x7y15E[];
Class_Descriptor cd__ZN3ccc8DD9x7y15E = {  "_ZN3ccc8DD9x7y15E", // class name
  bases__ZN3ccc8DD9x7y15E, 2,
  &(vtc__ZN3ccc8DD9x7y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x7y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x7y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x7y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x7y15E),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  CC9x8y0  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y03pqrEv
  ~CC9x8y0(); // tgen
  CC9x8y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y0E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y03abcEv");}
void  ccc::CC9x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y03efgEv");}
void  ccc::CC9x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y03pqrEv");}
ccc::CC9x8y0 ::~CC9x8y0(){ note_dtor("_ZN3ccc7CC9x8y0E", this);} // tgen
ccc::CC9x8y0 ::CC9x8y0(){ note_ctor("_ZN3ccc7CC9x8y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y0E, buf);
    ::ccc::CC9x8y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y0E);
    dp->::ccc::CC9x8y0::~CC9x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y0E(Test__ZN3ccc7CC9x8y0E, "_ZN3ccc7CC9x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y0C1Ev();
extern void _ZN3ccc7CC9x8y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y0E[] = {
  NSPAIR(_ZN3ccc7CC9x8y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y0E[];
extern void _ZN3ccc7CC9x8y03efgEv();
extern void _ZN3ccc7CC9x8y03abcEv();
extern void _ZN3ccc7CC9x8y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y03efgEv,_ZTv0_n12_N3ccc7CC9x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y03efgEv,_ZThn4_N3ccc7CC9x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y03pqrEv,_ZTv0_n16_N3ccc7CC9x8y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y03pqrEv,_ZThn4_N3ccc7CC9x8y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y03efgEv,_ZTv0_n12_N3ccc7CC9x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y03pqrEv,_ZTv0_n16_N3ccc7CC9x8y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y0E[] = {
  {&(_ZTVN3ccc7CC9x8y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y0E[];
static VTBL_ENTRY alt_thunk_names1820[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y03pqrEv,_ZTv0_n16_N3ccc7CC9x8y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y03pqrEv,_ZThn4_N3ccc7CC9x8y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y03efgEv,_ZTv0_n12_N3ccc7CC9x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y03efgEv,_ZThn4_N3ccc7CC9x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y0E = {  "_ZN3ccc7CC9x8y0E", // class name
  bases__ZN3ccc7CC9x8y0E, 2,
  &(vtc__ZN3ccc7CC9x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y0E),2, //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  DD9x8y0  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD9x8y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x8y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x8y03pqrEv
  ~DD9x8y0(); // tgen
  DD9x8y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y0E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x8y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y03abcEv");}
void  ccc::DD9x8y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y03efgEv");}
void  ccc::DD9x8y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y03pqrEv");}
ccc::DD9x8y0 ::~DD9x8y0(){ note_dtor("_ZN3ccc7DD9x8y0E", this);} // tgen
ccc::DD9x8y0 ::DD9x8y0(){ note_ctor("_ZN3ccc7DD9x8y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y0E, buf);
    ::ccc::DD9x8y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y0E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y0E);
    dp->::ccc::DD9x8y0::~DD9x8y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y0E(Test__ZN3ccc7DD9x8y0E, "_ZN3ccc7DD9x8y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y0C1Ev();
extern void _ZN3ccc7DD9x8y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y0E[] = {
  NSPAIR(_ZN3ccc7DD9x8y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y0E[];
extern void _ZN3ccc7DD9x8y03efgEv();
extern void _ZN3ccc7DD9x8y03pqrEv();
extern void _ZN3ccc7DD9x8y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y03efgEv,_ZTv0_n12_N3ccc7DD9x8y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y03efgEv,_ZThn4_N3ccc7DD9x8y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y03abcEv,_ZTv0_n16_N3ccc7DD9x8y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y03abcEv,_ZThn4_N3ccc7DD9x8y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y03efgEv,_ZTv0_n12_N3ccc7DD9x8y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y03abcEv,_ZTv0_n16_N3ccc7DD9x8y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y0E[] = {
  {&(_ZTVN3ccc7DD9x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y0E[];
static VTBL_ENTRY alt_thunk_names1821[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y03abcEv,_ZTv0_n16_N3ccc7DD9x8y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y03abcEv,_ZThn4_N3ccc7DD9x8y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y03efgEv,_ZTv0_n12_N3ccc7DD9x8y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y03efgEv,_ZThn4_N3ccc7DD9x8y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y0E = {  "_ZN3ccc7DD9x8y0E", // class name
  bases__ZN3ccc7DD9x8y0E, 2,
  &(vtc__ZN3ccc7DD9x8y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y0E),3, //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  CC9x8y1  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x8y13efgEv
  ~CC9x8y1(); // tgen
  CC9x8y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y1E) C1{ VBC2{ v3 v2} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y13abcEv");}
void  ccc::CC9x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y13pqrEv");}
void  ccc::CC9x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y13efgEv");}
ccc::CC9x8y1 ::~CC9x8y1(){ note_dtor("_ZN3ccc7CC9x8y1E", this);} // tgen
ccc::CC9x8y1 ::CC9x8y1(){ note_ctor("_ZN3ccc7CC9x8y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y1E, buf);
    ::ccc::CC9x8y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y1E);
    dp->::ccc::CC9x8y1::~CC9x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y1E(Test__ZN3ccc7CC9x8y1E, "_ZN3ccc7CC9x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y1C1Ev();
extern void _ZN3ccc7CC9x8y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y1E[] = {
  NSPAIR(_ZN3ccc7CC9x8y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y1E[];
extern void _ZN3ccc7CC9x8y13efgEv();
extern void _ZN3ccc7CC9x8y13abcEv();
extern void _ZN3ccc7CC9x8y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y13efgEv,_ZTv0_n12_N3ccc7CC9x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y13efgEv,_ZThn4_N3ccc7CC9x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y13pqrEv,_ZTv0_n16_N3ccc7CC9x8y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y13pqrEv,_ZThn4_N3ccc7CC9x8y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y13efgEv,_ZTv0_n12_N3ccc7CC9x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y13pqrEv,_ZTv0_n16_N3ccc7CC9x8y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y1E[] = {
  {&(_ZTVN3ccc7CC9x8y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y1E[];
static VTBL_ENTRY alt_thunk_names1822[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y13pqrEv,_ZTv0_n16_N3ccc7CC9x8y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y13pqrEv,_ZThn4_N3ccc7CC9x8y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y13efgEv,_ZTv0_n12_N3ccc7CC9x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y13efgEv,_ZThn4_N3ccc7CC9x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y1E = {  "_ZN3ccc7CC9x8y1E", // class name
  bases__ZN3ccc7CC9x8y1E, 2,
  &(vtc__ZN3ccc7CC9x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y1E),2, //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  DD9x8y1  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD9x8y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x8y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x8y13efgEv
  ~DD9x8y1(); // tgen
  DD9x8y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y1E) C1{ VBC2{ v3 v2} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x8y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y13abcEv");}
void  ccc::DD9x8y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y13pqrEv");}
void  ccc::DD9x8y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y13efgEv");}
ccc::DD9x8y1 ::~DD9x8y1(){ note_dtor("_ZN3ccc7DD9x8y1E", this);} // tgen
ccc::DD9x8y1 ::DD9x8y1(){ note_ctor("_ZN3ccc7DD9x8y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y1E, buf);
    ::ccc::DD9x8y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y1E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y1E);
    dp->::ccc::DD9x8y1::~DD9x8y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y1E(Test__ZN3ccc7DD9x8y1E, "_ZN3ccc7DD9x8y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y1C1Ev();
extern void _ZN3ccc7DD9x8y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y1E[] = {
  NSPAIR(_ZN3ccc7DD9x8y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y1E[];
extern void _ZN3ccc7DD9x8y13efgEv();
extern void _ZN3ccc7DD9x8y13pqrEv();
extern void _ZN3ccc7DD9x8y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y13efgEv,_ZTv0_n12_N3ccc7DD9x8y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y13efgEv,_ZThn4_N3ccc7DD9x8y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y13abcEv,_ZTv0_n16_N3ccc7DD9x8y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y13abcEv,_ZThn4_N3ccc7DD9x8y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y13efgEv,_ZTv0_n12_N3ccc7DD9x8y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y13abcEv,_ZTv0_n16_N3ccc7DD9x8y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y1E[] = {
  {&(_ZTVN3ccc7DD9x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y1E[];
static VTBL_ENTRY alt_thunk_names1823[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y13abcEv,_ZTv0_n16_N3ccc7DD9x8y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y13abcEv,_ZThn4_N3ccc7DD9x8y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y13efgEv,_ZTv0_n12_N3ccc7DD9x8y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y13efgEv,_ZThn4_N3ccc7DD9x8y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y1E = {  "_ZN3ccc7DD9x8y1E", // class name
  bases__ZN3ccc7DD9x8y1E, 2,
  &(vtc__ZN3ccc7DD9x8y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y1E),3, //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  CC9x8y2  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y23pqrEv
  ~CC9x8y2(); // tgen
  CC9x8y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y2E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y23efgEv");}
void  ccc::CC9x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y23abcEv");}
void  ccc::CC9x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y23pqrEv");}
ccc::CC9x8y2 ::~CC9x8y2(){ note_dtor("_ZN3ccc7CC9x8y2E", this);} // tgen
ccc::CC9x8y2 ::CC9x8y2(){ note_ctor("_ZN3ccc7CC9x8y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y2E, buf);
    ::ccc::CC9x8y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y2E);
    dp->::ccc::CC9x8y2::~CC9x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y2E(Test__ZN3ccc7CC9x8y2E, "_ZN3ccc7CC9x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y2C1Ev();
extern void _ZN3ccc7CC9x8y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y2E[] = {
  NSPAIR(_ZN3ccc7CC9x8y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y2E[];
extern void _ZN3ccc7CC9x8y23efgEv();
extern void _ZN3ccc7CC9x8y23abcEv();
extern void _ZN3ccc7CC9x8y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y23efgEv,_ZTv0_n12_N3ccc7CC9x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y23efgEv,_ZThn4_N3ccc7CC9x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y23pqrEv,_ZTv0_n16_N3ccc7CC9x8y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y23pqrEv,_ZThn4_N3ccc7CC9x8y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y23efgEv,_ZTv0_n12_N3ccc7CC9x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y23pqrEv,_ZTv0_n16_N3ccc7CC9x8y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y2E[] = {
  {&(_ZTVN3ccc7CC9x8y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y2E[];
static VTBL_ENTRY alt_thunk_names1824[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y23pqrEv,_ZTv0_n16_N3ccc7CC9x8y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y23pqrEv,_ZThn4_N3ccc7CC9x8y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y23efgEv,_ZTv0_n12_N3ccc7CC9x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y23efgEv,_ZThn4_N3ccc7CC9x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y2E = {  "_ZN3ccc7CC9x8y2E", // class name
  bases__ZN3ccc7CC9x8y2E, 2,
  &(vtc__ZN3ccc7CC9x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y2E),2, //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  DD9x8y2  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD9x8y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x8y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x8y23pqrEv
  ~DD9x8y2(); // tgen
  DD9x8y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y2E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x8y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y23efgEv");}
void  ccc::DD9x8y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y23abcEv");}
void  ccc::DD9x8y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y23pqrEv");}
ccc::DD9x8y2 ::~DD9x8y2(){ note_dtor("_ZN3ccc7DD9x8y2E", this);} // tgen
ccc::DD9x8y2 ::DD9x8y2(){ note_ctor("_ZN3ccc7DD9x8y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y2E, buf);
    ::ccc::DD9x8y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y2E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y2E);
    dp->::ccc::DD9x8y2::~DD9x8y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y2E(Test__ZN3ccc7DD9x8y2E, "_ZN3ccc7DD9x8y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y2C1Ev();
extern void _ZN3ccc7DD9x8y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y2E[] = {
  NSPAIR(_ZN3ccc7DD9x8y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y2E[];
extern void _ZN3ccc7DD9x8y23efgEv();
extern void _ZN3ccc7DD9x8y23pqrEv();
extern void _ZN3ccc7DD9x8y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y23efgEv,_ZTv0_n12_N3ccc7DD9x8y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y23efgEv,_ZThn4_N3ccc7DD9x8y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y23abcEv,_ZTv0_n16_N3ccc7DD9x8y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y23abcEv,_ZThn4_N3ccc7DD9x8y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y23efgEv,_ZTv0_n12_N3ccc7DD9x8y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y23abcEv,_ZTv0_n16_N3ccc7DD9x8y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y2E[] = {
  {&(_ZTVN3ccc7DD9x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y2E[];
static VTBL_ENTRY alt_thunk_names1825[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y23abcEv,_ZTv0_n16_N3ccc7DD9x8y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y23abcEv,_ZThn4_N3ccc7DD9x8y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y23efgEv,_ZTv0_n12_N3ccc7DD9x8y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y23efgEv,_ZThn4_N3ccc7DD9x8y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y2E = {  "_ZN3ccc7DD9x8y2E", // class name
  bases__ZN3ccc7DD9x8y2E, 2,
  &(vtc__ZN3ccc7DD9x8y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y2E),3, //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  CC9x8y3  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x8y33abcEv
  ~CC9x8y3(); // tgen
  CC9x8y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y3E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y33efgEv");}
void  ccc::CC9x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y33pqrEv");}
void  ccc::CC9x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y33abcEv");}
ccc::CC9x8y3 ::~CC9x8y3(){ note_dtor("_ZN3ccc7CC9x8y3E", this);} // tgen
ccc::CC9x8y3 ::CC9x8y3(){ note_ctor("_ZN3ccc7CC9x8y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y3E, buf);
    ::ccc::CC9x8y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y3E);
    dp->::ccc::CC9x8y3::~CC9x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y3E(Test__ZN3ccc7CC9x8y3E, "_ZN3ccc7CC9x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y3C1Ev();
extern void _ZN3ccc7CC9x8y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y3E[] = {
  NSPAIR(_ZN3ccc7CC9x8y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y3E[];
extern void _ZN3ccc7CC9x8y33efgEv();
extern void _ZN3ccc7CC9x8y33abcEv();
extern void _ZN3ccc7CC9x8y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y33efgEv,_ZTv0_n12_N3ccc7CC9x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y33efgEv,_ZThn4_N3ccc7CC9x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y33pqrEv,_ZTv0_n16_N3ccc7CC9x8y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y33pqrEv,_ZThn4_N3ccc7CC9x8y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y33efgEv,_ZTv0_n12_N3ccc7CC9x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y33pqrEv,_ZTv0_n16_N3ccc7CC9x8y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y3E[] = {
  {&(_ZTVN3ccc7CC9x8y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y3E[];
static VTBL_ENTRY alt_thunk_names1826[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y33pqrEv,_ZTv0_n16_N3ccc7CC9x8y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y33pqrEv,_ZThn4_N3ccc7CC9x8y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y33efgEv,_ZTv0_n12_N3ccc7CC9x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y33efgEv,_ZThn4_N3ccc7CC9x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y3E = {  "_ZN3ccc7CC9x8y3E", // class name
  bases__ZN3ccc7CC9x8y3E, 2,
  &(vtc__ZN3ccc7CC9x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y3E),2, //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  DD9x8y3  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD9x8y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x8y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x8y33abcEv
  ~DD9x8y3(); // tgen
  DD9x8y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y3E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x8y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y33efgEv");}
void  ccc::DD9x8y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y33pqrEv");}
void  ccc::DD9x8y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y33abcEv");}
ccc::DD9x8y3 ::~DD9x8y3(){ note_dtor("_ZN3ccc7DD9x8y3E", this);} // tgen
ccc::DD9x8y3 ::DD9x8y3(){ note_ctor("_ZN3ccc7DD9x8y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y3E, buf);
    ::ccc::DD9x8y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y3E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y3E);
    dp->::ccc::DD9x8y3::~DD9x8y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y3E(Test__ZN3ccc7DD9x8y3E, "_ZN3ccc7DD9x8y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y3C1Ev();
extern void _ZN3ccc7DD9x8y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y3E[] = {
  NSPAIR(_ZN3ccc7DD9x8y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y3E[];
extern void _ZN3ccc7DD9x8y33efgEv();
extern void _ZN3ccc7DD9x8y33pqrEv();
extern void _ZN3ccc7DD9x8y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y33efgEv,_ZTv0_n12_N3ccc7DD9x8y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y33efgEv,_ZThn4_N3ccc7DD9x8y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y33abcEv,_ZTv0_n16_N3ccc7DD9x8y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y33abcEv,_ZThn4_N3ccc7DD9x8y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y33efgEv,_ZTv0_n12_N3ccc7DD9x8y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y33abcEv,_ZTv0_n16_N3ccc7DD9x8y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y3E[] = {
  {&(_ZTVN3ccc7DD9x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y3E[];
static VTBL_ENTRY alt_thunk_names1827[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y33abcEv,_ZTv0_n16_N3ccc7DD9x8y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y33abcEv,_ZThn4_N3ccc7DD9x8y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y33efgEv,_ZTv0_n12_N3ccc7DD9x8y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y33efgEv,_ZThn4_N3ccc7DD9x8y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y3E = {  "_ZN3ccc7DD9x8y3E", // class name
  bases__ZN3ccc7DD9x8y3E, 2,
  &(vtc__ZN3ccc7DD9x8y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y3E),3, //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  CC9x8y4  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC9x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x8y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x8y43efgEv
  ~CC9x8y4(); // tgen
  CC9x8y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y4E) C1{ VBC2{ v3 v1} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y43pqrEv");}
void  ccc::CC9x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y43abcEv");}
void  ccc::CC9x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y43efgEv");}
ccc::CC9x8y4 ::~CC9x8y4(){ note_dtor("_ZN3ccc7CC9x8y4E", this);} // tgen
ccc::CC9x8y4 ::CC9x8y4(){ note_ctor("_ZN3ccc7CC9x8y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y4E, buf);
    ::ccc::CC9x8y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y4E);
    dp->::ccc::CC9x8y4::~CC9x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y4E(Test__ZN3ccc7CC9x8y4E, "_ZN3ccc7CC9x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y4C1Ev();
extern void _ZN3ccc7CC9x8y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y4E[] = {
  NSPAIR(_ZN3ccc7CC9x8y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y4E[];
extern void _ZN3ccc7CC9x8y43efgEv();
extern void _ZN3ccc7CC9x8y43abcEv();
extern void _ZN3ccc7CC9x8y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y43efgEv,_ZTv0_n12_N3ccc7CC9x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y43efgEv,_ZThn4_N3ccc7CC9x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y43pqrEv,_ZTv0_n16_N3ccc7CC9x8y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y43pqrEv,_ZThn4_N3ccc7CC9x8y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y43efgEv,_ZTv0_n12_N3ccc7CC9x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y43pqrEv,_ZTv0_n16_N3ccc7CC9x8y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y4E[] = {
  {&(_ZTVN3ccc7CC9x8y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y4E[];
static VTBL_ENTRY alt_thunk_names1828[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y43pqrEv,_ZTv0_n16_N3ccc7CC9x8y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y43pqrEv,_ZThn4_N3ccc7CC9x8y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y43efgEv,_ZTv0_n12_N3ccc7CC9x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y43efgEv,_ZThn4_N3ccc7CC9x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y4E = {  "_ZN3ccc7CC9x8y4E", // class name
  bases__ZN3ccc7CC9x8y4E, 2,
  &(vtc__ZN3ccc7CC9x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y4E),2, //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  DD9x8y4  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD9x8y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x8y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x8y43efgEv
  ~DD9x8y4(); // tgen
  DD9x8y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y4E) C1{ VBC2{ v3 v1} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x8y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y43pqrEv");}
void  ccc::DD9x8y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y43abcEv");}
void  ccc::DD9x8y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y43efgEv");}
ccc::DD9x8y4 ::~DD9x8y4(){ note_dtor("_ZN3ccc7DD9x8y4E", this);} // tgen
ccc::DD9x8y4 ::DD9x8y4(){ note_ctor("_ZN3ccc7DD9x8y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y4E, buf);
    ::ccc::DD9x8y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y4E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y4E);
    dp->::ccc::DD9x8y4::~DD9x8y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y4E(Test__ZN3ccc7DD9x8y4E, "_ZN3ccc7DD9x8y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y4C1Ev();
extern void _ZN3ccc7DD9x8y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y4E[] = {
  NSPAIR(_ZN3ccc7DD9x8y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y4E[];
extern void _ZN3ccc7DD9x8y43efgEv();
extern void _ZN3ccc7DD9x8y43pqrEv();
extern void _ZN3ccc7DD9x8y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y43efgEv,_ZTv0_n12_N3ccc7DD9x8y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y43efgEv,_ZThn4_N3ccc7DD9x8y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y43abcEv,_ZTv0_n16_N3ccc7DD9x8y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y43abcEv,_ZThn4_N3ccc7DD9x8y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y43efgEv,_ZTv0_n12_N3ccc7DD9x8y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y43abcEv,_ZTv0_n16_N3ccc7DD9x8y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y4E[] = {
  {&(_ZTVN3ccc7DD9x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y4E[];
static VTBL_ENTRY alt_thunk_names1829[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y43abcEv,_ZTv0_n16_N3ccc7DD9x8y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y43abcEv,_ZThn4_N3ccc7DD9x8y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y43efgEv,_ZTv0_n12_N3ccc7DD9x8y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y43efgEv,_ZThn4_N3ccc7DD9x8y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y4E = {  "_ZN3ccc7DD9x8y4E", // class name
  bases__ZN3ccc7DD9x8y4E, 2,
  &(vtc__ZN3ccc7DD9x8y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y4E),3, //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  CC9x8y5  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7CC9x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x8y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x8y53abcEv
  ~CC9x8y5(); // tgen
  CC9x8y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y5E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y53pqrEv");}
void  ccc::CC9x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y53efgEv");}
void  ccc::CC9x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y53abcEv");}
ccc::CC9x8y5 ::~CC9x8y5(){ note_dtor("_ZN3ccc7CC9x8y5E", this);} // tgen
ccc::CC9x8y5 ::CC9x8y5(){ note_ctor("_ZN3ccc7CC9x8y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y5E, buf);
    ::ccc::CC9x8y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y5E);
    dp->::ccc::CC9x8y5::~CC9x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y5E(Test__ZN3ccc7CC9x8y5E, "_ZN3ccc7CC9x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y5C1Ev();
extern void _ZN3ccc7CC9x8y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y5E[] = {
  NSPAIR(_ZN3ccc7CC9x8y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y5E[];
extern void _ZN3ccc7CC9x8y53efgEv();
extern void _ZN3ccc7CC9x8y53abcEv();
extern void _ZN3ccc7CC9x8y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y53efgEv,_ZTv0_n12_N3ccc7CC9x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y53efgEv,_ZThn4_N3ccc7CC9x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y53pqrEv,_ZTv0_n16_N3ccc7CC9x8y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y53pqrEv,_ZThn4_N3ccc7CC9x8y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y53efgEv,_ZTv0_n12_N3ccc7CC9x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y53pqrEv,_ZTv0_n16_N3ccc7CC9x8y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y5E[] = {
  {&(_ZTVN3ccc7CC9x8y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y5E[];
static VTBL_ENTRY alt_thunk_names1830[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y53pqrEv,_ZTv0_n16_N3ccc7CC9x8y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y53pqrEv,_ZThn4_N3ccc7CC9x8y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y53efgEv,_ZTv0_n12_N3ccc7CC9x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y53efgEv,_ZThn4_N3ccc7CC9x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y5E = {  "_ZN3ccc7CC9x8y5E", // class name
  bases__ZN3ccc7CC9x8y5E, 2,
  &(vtc__ZN3ccc7CC9x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y5E),2, //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  DD9x8y5  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc7DD9x8y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x8y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x8y53abcEv
  ~DD9x8y5(); // tgen
  DD9x8y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y5E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x8y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y53pqrEv");}
void  ccc::DD9x8y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y53efgEv");}
void  ccc::DD9x8y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y53abcEv");}
ccc::DD9x8y5 ::~DD9x8y5(){ note_dtor("_ZN3ccc7DD9x8y5E", this);} // tgen
ccc::DD9x8y5 ::DD9x8y5(){ note_ctor("_ZN3ccc7DD9x8y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y5E, buf);
    ::ccc::DD9x8y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y5E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y5E);
    dp->::ccc::DD9x8y5::~DD9x8y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y5E(Test__ZN3ccc7DD9x8y5E, "_ZN3ccc7DD9x8y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y5C1Ev();
extern void _ZN3ccc7DD9x8y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y5E[] = {
  NSPAIR(_ZN3ccc7DD9x8y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y5E[];
extern void _ZN3ccc7DD9x8y53efgEv();
extern void _ZN3ccc7DD9x8y53pqrEv();
extern void _ZN3ccc7DD9x8y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y53efgEv,_ZTv0_n12_N3ccc7DD9x8y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y53efgEv,_ZThn4_N3ccc7DD9x8y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y53abcEv,_ZTv0_n16_N3ccc7DD9x8y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y53abcEv,_ZThn4_N3ccc7DD9x8y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y53efgEv,_ZTv0_n12_N3ccc7DD9x8y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y53abcEv,_ZTv0_n16_N3ccc7DD9x8y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y5E[] = {
  {&(_ZTVN3ccc7DD9x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y5E[];
static VTBL_ENTRY alt_thunk_names1831[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y53abcEv,_ZTv0_n16_N3ccc7DD9x8y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y53abcEv,_ZThn4_N3ccc7DD9x8y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y53efgEv,_ZTv0_n12_N3ccc7DD9x8y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y53efgEv,_ZThn4_N3ccc7DD9x8y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y5E = {  "_ZN3ccc7DD9x8y5E", // class name
  bases__ZN3ccc7DD9x8y5E, 2,
  &(vtc__ZN3ccc7DD9x8y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y5E),3, //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  CC9x8y6  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x8y63efgEv
  ~CC9x8y6(); // tgen
  CC9x8y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y6E) C1{ VBC2{ v2 v3} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y63abcEv");}
void  ccc::CC9x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y63efgEv");}
ccc::CC9x8y6 ::~CC9x8y6(){ note_dtor("_ZN3ccc7CC9x8y6E", this);} // tgen
ccc::CC9x8y6 ::CC9x8y6(){ note_ctor("_ZN3ccc7CC9x8y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y6E, buf);
    ::ccc::CC9x8y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y6E);
    dp->::ccc::CC9x8y6::~CC9x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y6E(Test__ZN3ccc7CC9x8y6E, "_ZN3ccc7CC9x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y6C1Ev();
extern void _ZN3ccc7CC9x8y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y6E[] = {
  NSPAIR(_ZN3ccc7CC9x8y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y6E[];
extern void _ZN3ccc7CC9x8y63efgEv();
extern void _ZN3ccc7CC9x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y63efgEv,_ZTv0_n12_N3ccc7CC9x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y63efgEv,_ZThn4_N3ccc7CC9x8y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y63efgEv,_ZTv0_n12_N3ccc7CC9x8y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y6E[] = {
  {&(_ZTVN3ccc7CC9x8y6E[3]),  3,11},
  {&(_ZTVN3ccc7CC9x8y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y6E[];
static VTBL_ENTRY alt_thunk_names1832[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y63efgEv,_ZTv0_n12_N3ccc7CC9x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y63efgEv,_ZThn4_N3ccc7CC9x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y6E = {  "_ZN3ccc7CC9x8y6E", // class name
  bases__ZN3ccc7CC9x8y6E, 2,
  &(vtc__ZN3ccc7CC9x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y6E),2, //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  DD9x8y6  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD9x8y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x8y63efgEv
  ~DD9x8y6(); // tgen
  DD9x8y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y6E) C1{ VBC2{ v2 v3} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x8y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y63abcEv");}
void  ccc::DD9x8y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y63efgEv");}
ccc::DD9x8y6 ::~DD9x8y6(){ note_dtor("_ZN3ccc7DD9x8y6E", this);} // tgen
ccc::DD9x8y6 ::DD9x8y6(){ note_ctor("_ZN3ccc7DD9x8y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y6E, buf);
    ::ccc::DD9x8y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y6E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y6E);
    dp->::ccc::DD9x8y6::~DD9x8y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y6E(Test__ZN3ccc7DD9x8y6E, "_ZN3ccc7DD9x8y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y6C1Ev();
extern void _ZN3ccc7DD9x8y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y6E[] = {
  NSPAIR(_ZN3ccc7DD9x8y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y6E[];
extern void _ZN3ccc7DD9x8y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x8y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y63efgEv,_ZTv0_n12_N3ccc7DD9x8y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y63efgEv,_ZThn4_N3ccc7DD9x8y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y63abcEv,_ZTv0_n16_N3ccc7DD9x8y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y63abcEv,_ZThn4_N3ccc7DD9x8y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y63efgEv,_ZTv0_n12_N3ccc7DD9x8y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y63abcEv,_ZTv0_n16_N3ccc7DD9x8y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y6E[] = {
  {&(_ZTVN3ccc7DD9x8y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y6E[];
static VTBL_ENTRY alt_thunk_names1833[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y63abcEv,_ZTv0_n16_N3ccc7DD9x8y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y63abcEv,_ZThn4_N3ccc7DD9x8y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y63efgEv,_ZTv0_n12_N3ccc7DD9x8y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y63efgEv,_ZThn4_N3ccc7DD9x8y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y6E = {  "_ZN3ccc7DD9x8y6E", // class name
  bases__ZN3ccc7DD9x8y6E, 2,
  &(vtc__ZN3ccc7DD9x8y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y6E),3, //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  CC9x8y7  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7CC9x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y73pqrEv
  ~CC9x8y7(); // tgen
  CC9x8y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y7E) C1{ VBC2{ v3 v2} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y73abcEv");}
void  ccc::CC9x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y73pqrEv");}
ccc::CC9x8y7 ::~CC9x8y7(){ note_dtor("_ZN3ccc7CC9x8y7E", this);} // tgen
ccc::CC9x8y7 ::CC9x8y7(){ note_ctor("_ZN3ccc7CC9x8y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y7E, buf);
    ::ccc::CC9x8y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y7E);
    dp->::ccc::CC9x8y7::~CC9x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y7E(Test__ZN3ccc7CC9x8y7E, "_ZN3ccc7CC9x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y7C1Ev();
extern void _ZN3ccc7CC9x8y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y7E[] = {
  NSPAIR(_ZN3ccc7CC9x8y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y7E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc7CC9x8y73abcEv();
extern void _ZN3ccc7CC9x8y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y73pqrEv,_ZTv0_n16_N3ccc7CC9x8y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y73pqrEv,_ZThn4_N3ccc7CC9x8y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y73pqrEv,_ZTv0_n16_N3ccc7CC9x8y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y7E[] = {
  {&(_ZTVN3ccc7CC9x8y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y7E[];
static VTBL_ENTRY alt_thunk_names1834[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y73pqrEv,_ZTv0_n16_N3ccc7CC9x8y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y73pqrEv,_ZThn4_N3ccc7CC9x8y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y7E = {  "_ZN3ccc7CC9x8y7E", // class name
  bases__ZN3ccc7CC9x8y7E, 2,
  &(vtc__ZN3ccc7CC9x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y7E),2, //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  DD9x8y7  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc7DD9x8y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x8y73pqrEv
  ~DD9x8y7(); // tgen
  DD9x8y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y7E) C1{ VBC2{ v3 v2} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x8y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y73abcEv");}
void  ccc::DD9x8y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y73pqrEv");}
ccc::DD9x8y7 ::~DD9x8y7(){ note_dtor("_ZN3ccc7DD9x8y7E", this);} // tgen
ccc::DD9x8y7 ::DD9x8y7(){ note_ctor("_ZN3ccc7DD9x8y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y7E, buf);
    ::ccc::DD9x8y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y7E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y7E);
    dp->::ccc::DD9x8y7::~DD9x8y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y7E(Test__ZN3ccc7DD9x8y7E, "_ZN3ccc7DD9x8y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y7C1Ev();
extern void _ZN3ccc7DD9x8y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y7E[] = {
  NSPAIR(_ZN3ccc7DD9x8y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x8y73pqrEv();
extern void _ZN3ccc7DD9x8y73abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y73abcEv,_ZTv0_n16_N3ccc7DD9x8y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y73abcEv,_ZThn4_N3ccc7DD9x8y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y73abcEv,_ZTv0_n16_N3ccc7DD9x8y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y7E[] = {
  {&(_ZTVN3ccc7DD9x8y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y7E[];
static VTBL_ENTRY alt_thunk_names1835[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y73abcEv,_ZTv0_n16_N3ccc7DD9x8y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y73abcEv,_ZThn4_N3ccc7DD9x8y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y7E = {  "_ZN3ccc7DD9x8y7E", // class name
  bases__ZN3ccc7DD9x8y7E, 2,
  &(vtc__ZN3ccc7DD9x8y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y7E),3, //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  CC9x8y8  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x8y83abcEv
  ~CC9x8y8(); // tgen
  CC9x8y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y8E) C1{ VBC2{ v1 v3} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y83efgEv");}
void  ccc::CC9x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x8y83abcEv");}
ccc::CC9x8y8 ::~CC9x8y8(){ note_dtor("_ZN3ccc7CC9x8y8E", this);} // tgen
ccc::CC9x8y8 ::CC9x8y8(){ note_ctor("_ZN3ccc7CC9x8y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y8E, buf);
    ::ccc::CC9x8y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y8E);
    dp->::ccc::CC9x8y8::~CC9x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y8E(Test__ZN3ccc7CC9x8y8E, "_ZN3ccc7CC9x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y8C1Ev();
extern void _ZN3ccc7CC9x8y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y8E[] = {
  NSPAIR(_ZN3ccc7CC9x8y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y8E[];
extern void _ZN3ccc7CC9x8y83efgEv();
extern void _ZN3ccc7CC9x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y83efgEv,_ZTv0_n12_N3ccc7CC9x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y83efgEv,_ZThn4_N3ccc7CC9x8y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y83efgEv,_ZTv0_n12_N3ccc7CC9x8y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y8E[] = {
  {&(_ZTVN3ccc7CC9x8y8E[3]),  3,11},
  {&(_ZTVN3ccc7CC9x8y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y8E[];
static VTBL_ENTRY alt_thunk_names1836[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y83efgEv,_ZTv0_n12_N3ccc7CC9x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y83efgEv,_ZThn4_N3ccc7CC9x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y8E = {  "_ZN3ccc7CC9x8y8E", // class name
  bases__ZN3ccc7CC9x8y8E, 2,
  &(vtc__ZN3ccc7CC9x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y8E),2, //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  DD9x8y8  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD9x8y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x8y83abcEv
  ~DD9x8y8(); // tgen
  DD9x8y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y8E) C1{ VBC2{ v1 v3} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x8y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y83efgEv");}
void  ccc::DD9x8y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x8y83abcEv");}
ccc::DD9x8y8 ::~DD9x8y8(){ note_dtor("_ZN3ccc7DD9x8y8E", this);} // tgen
ccc::DD9x8y8 ::DD9x8y8(){ note_ctor("_ZN3ccc7DD9x8y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y8E, buf);
    ::ccc::DD9x8y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y8E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y8E);
    dp->::ccc::DD9x8y8::~DD9x8y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y8E(Test__ZN3ccc7DD9x8y8E, "_ZN3ccc7DD9x8y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y8C1Ev();
extern void _ZN3ccc7DD9x8y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y8E[] = {
  NSPAIR(_ZN3ccc7DD9x8y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y8E[];
extern void _ZN3ccc7DD9x8y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x8y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y83efgEv,_ZTv0_n12_N3ccc7DD9x8y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y83efgEv,_ZThn4_N3ccc7DD9x8y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x8y83abcEv,_ZTv0_n16_N3ccc7DD9x8y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y83abcEv,_ZThn4_N3ccc7DD9x8y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y83efgEv,_ZTv0_n12_N3ccc7DD9x8y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x8y83abcEv,_ZTv0_n16_N3ccc7DD9x8y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y8E[] = {
  {&(_ZTVN3ccc7DD9x8y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x8y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y8E[];
static VTBL_ENTRY alt_thunk_names1837[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x8y83abcEv,_ZTv0_n16_N3ccc7DD9x8y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y83abcEv,_ZThn4_N3ccc7DD9x8y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y83efgEv,_ZTv0_n12_N3ccc7DD9x8y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y83efgEv,_ZThn4_N3ccc7DD9x8y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y8E = {  "_ZN3ccc7DD9x8y8E", // class name
  bases__ZN3ccc7DD9x8y8E, 2,
  &(vtc__ZN3ccc7DD9x8y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y8E),3, //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  CC9x8y9  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7CC9x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x8y93pqrEv
  ~CC9x8y9(); // tgen
  CC9x8y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x8y9E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x8y93efgEv");}
void  ccc::CC9x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x8y93pqrEv");}
ccc::CC9x8y9 ::~CC9x8y9(){ note_dtor("_ZN3ccc7CC9x8y9E", this);} // tgen
ccc::CC9x8y9 ::CC9x8y9(){ note_ctor("_ZN3ccc7CC9x8y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x8y9E, buf);
    ::ccc::CC9x8y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x8y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc7CC9x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x8y9E);
    dp->::ccc::CC9x8y9::~CC9x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x8y9E(Test__ZN3ccc7CC9x8y9E, "_ZN3ccc7CC9x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x8y9C1Ev();
extern void _ZN3ccc7CC9x8y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x8y9E[] = {
  NSPAIR(_ZN3ccc7CC9x8y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7CC9x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x8y9E[];
extern void _ZN3ccc7CC9x8y93efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc7CC9x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x8y93efgEv,_ZTv0_n12_N3ccc7CC9x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y93efgEv,_ZThn4_N3ccc7CC9x8y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x8y93pqrEv,_ZTv0_n16_N3ccc7CC9x8y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x8y93pqrEv,_ZThn4_N3ccc7CC9x8y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x8y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x8y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x8y93efgEv,_ZTv0_n12_N3ccc7CC9x8y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x8y93pqrEv,_ZTv0_n16_N3ccc7CC9x8y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x8y9E[] = {
  {&(_ZTVN3ccc7CC9x8y9E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x8y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x8y9E[];
static VTBL_ENTRY alt_thunk_names1838[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x8y93pqrEv,_ZTv0_n16_N3ccc7CC9x8y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y93pqrEv,_ZThn4_N3ccc7CC9x8y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x8y93efgEv,_ZTv0_n12_N3ccc7CC9x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x8y93efgEv,_ZThn4_N3ccc7CC9x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x8y9E = {  "_ZN3ccc7CC9x8y9E", // class name
  bases__ZN3ccc7CC9x8y9E, 2,
  &(vtc__ZN3ccc7CC9x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x8y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x8y9E),2, //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  DD9x8y9  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc7DD9x8y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x8y93pqrEv
  ~DD9x8y9(); // tgen
  DD9x8y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x8y9E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x8y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x8y93efgEv");}
void  ccc::DD9x8y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x8y93pqrEv");}
ccc::DD9x8y9 ::~DD9x8y9(){ note_dtor("_ZN3ccc7DD9x8y9E", this);} // tgen
ccc::DD9x8y9 ::DD9x8y9(){ note_ctor("_ZN3ccc7DD9x8y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x8y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x8y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x8y9E, buf);
    ::ccc::DD9x8y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x8y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x8y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x8y9E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc7DD9x8y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x8y9E);
    dp->::ccc::DD9x8y9::~DD9x8y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x8y9E(Test__ZN3ccc7DD9x8y9E, "_ZN3ccc7DD9x8y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x8y9C1Ev();
extern void _ZN3ccc7DD9x8y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x8y9E[] = {
  NSPAIR(_ZN3ccc7DD9x8y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x8y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc7DD9x8y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y9E[];
extern void _ZN3ccc7DD9x8y93efgEv();
extern void _ZN3ccc7DD9x8y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x8y93efgEv,_ZTv0_n12_N3ccc7DD9x8y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x8y93efgEv,_ZThn4_N3ccc7DD9x8y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x8y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x8y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x8y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x8y93efgEv,_ZTv0_n12_N3ccc7DD9x8y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x8y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x8y9E[] = {
  {&(_ZTVN3ccc7DD9x8y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x8y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x8y9E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x8y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x8y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x8y9E[];
static VTBL_ENTRY alt_thunk_names1839[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x8y93efgEv,_ZTv0_n12_N3ccc7DD9x8y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x8y93efgEv,_ZThn4_N3ccc7DD9x8y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x8y9E = {  "_ZN3ccc7DD9x8y9E", // class name
  bases__ZN3ccc7DD9x8y9E, 2,
  &(vtc__ZN3ccc7DD9x8y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x8y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x8y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x8y9E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x8y9E),3, //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  CC9x8y10  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC9x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x8y103abcEv
  ~CC9x8y10(); // tgen
  CC9x8y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y10E) C1{ VBC2{ v3 v1} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x8y103pqrEv");}
void  ccc::CC9x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x8y103abcEv");}
ccc::CC9x8y10 ::~CC9x8y10(){ note_dtor("_ZN3ccc8CC9x8y10E", this);} // tgen
ccc::CC9x8y10 ::CC9x8y10(){ note_ctor("_ZN3ccc8CC9x8y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x8y10E, buf);
    ::ccc::CC9x8y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x8y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC9x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x8y10E);
    dp->::ccc::CC9x8y10::~CC9x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x8y10E(Test__ZN3ccc8CC9x8y10E, "_ZN3ccc8CC9x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x8y10C1Ev();
extern void _ZN3ccc8CC9x8y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x8y10E[] = {
  NSPAIR(_ZN3ccc8CC9x8y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC9x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x8y10E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC9x8y103abcEv();
extern void _ZN3ccc8CC9x8y103pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x8y103pqrEv,_ZTv0_n16_N3ccc8CC9x8y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y103pqrEv,_ZThn4_N3ccc8CC9x8y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x8y103pqrEv,_ZTv0_n16_N3ccc8CC9x8y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x8y10E[] = {
  {&(_ZTVN3ccc8CC9x8y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x8y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x8y10E[];
static VTBL_ENTRY alt_thunk_names1840[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x8y103pqrEv,_ZTv0_n16_N3ccc8CC9x8y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x8y103pqrEv,_ZThn4_N3ccc8CC9x8y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x8y10E = {  "_ZN3ccc8CC9x8y10E", // class name
  bases__ZN3ccc8CC9x8y10E, 2,
  &(vtc__ZN3ccc8CC9x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x8y10E),2, //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  DD9x8y10  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD9x8y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x8y103abcEv
  ~DD9x8y10(); // tgen
  DD9x8y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x8y10E) C1{ VBC2{ v3 v1} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x8y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x8y103pqrEv");}
void  ccc::DD9x8y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x8y103abcEv");}
ccc::DD9x8y10 ::~DD9x8y10(){ note_dtor("_ZN3ccc8DD9x8y10E", this);} // tgen
ccc::DD9x8y10 ::DD9x8y10(){ note_ctor("_ZN3ccc8DD9x8y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x8y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x8y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x8y10E, buf);
    ::ccc::DD9x8y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x8y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x8y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x8y10E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD9x8y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x8y10E);
    dp->::ccc::DD9x8y10::~DD9x8y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x8y10E(Test__ZN3ccc8DD9x8y10E, "_ZN3ccc8DD9x8y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x8y10C1Ev();
extern void _ZN3ccc8DD9x8y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x8y10E[] = {
  NSPAIR(_ZN3ccc8DD9x8y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x8y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD9x8y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x8y103pqrEv();
extern void _ZN3ccc8DD9x8y103abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x8y103abcEv,_ZTv0_n16_N3ccc8DD9x8y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x8y103abcEv,_ZThn4_N3ccc8DD9x8y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x8y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x8y103abcEv,_ZTv0_n16_N3ccc8DD9x8y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x8y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x8y10E[] = {
  {&(_ZTVN3ccc8DD9x8y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x8y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x8y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x8y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x8y10E[];
static VTBL_ENTRY alt_thunk_names1841[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x8y103abcEv,_ZTv0_n16_N3ccc8DD9x8y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x8y103abcEv,_ZThn4_N3ccc8DD9x8y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x8y10E = {  "_ZN3ccc8DD9x8y10E", // class name
  bases__ZN3ccc8DD9x8y10E, 2,
  &(vtc__ZN3ccc8DD9x8y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x8y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x8y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x8y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x8y10E),3, //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  CC9x8y11  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC9x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x8y113efgEv
  ~CC9x8y11(); // tgen
  CC9x8y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y11E) C1{ VBC2{ v2 v1} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x8y113pqrEv");}
void  ccc::CC9x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x8y113efgEv");}
ccc::CC9x8y11 ::~CC9x8y11(){ note_dtor("_ZN3ccc8CC9x8y11E", this);} // tgen
ccc::CC9x8y11 ::CC9x8y11(){ note_ctor("_ZN3ccc8CC9x8y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x8y11E, buf);
    ::ccc::CC9x8y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x8y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC9x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x8y11E);
    dp->::ccc::CC9x8y11::~CC9x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x8y11E(Test__ZN3ccc8CC9x8y11E, "_ZN3ccc8CC9x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x8y11C1Ev();
extern void _ZN3ccc8CC9x8y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x8y11E[] = {
  NSPAIR(_ZN3ccc8CC9x8y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC9x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x8y11E[];
extern void _ZN3ccc8CC9x8y113efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC9x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x8y113efgEv,_ZTv0_n12_N3ccc8CC9x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y113efgEv,_ZThn4_N3ccc8CC9x8y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x8y113pqrEv,_ZTv0_n16_N3ccc8CC9x8y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y113pqrEv,_ZThn4_N3ccc8CC9x8y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x8y113efgEv,_ZTv0_n12_N3ccc8CC9x8y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x8y113pqrEv,_ZTv0_n16_N3ccc8CC9x8y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x8y11E[] = {
  {&(_ZTVN3ccc8CC9x8y11E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x8y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x8y11E[];
static VTBL_ENTRY alt_thunk_names1842[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x8y113pqrEv,_ZTv0_n16_N3ccc8CC9x8y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x8y113pqrEv,_ZThn4_N3ccc8CC9x8y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x8y113efgEv,_ZTv0_n12_N3ccc8CC9x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x8y113efgEv,_ZThn4_N3ccc8CC9x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x8y11E = {  "_ZN3ccc8CC9x8y11E", // class name
  bases__ZN3ccc8CC9x8y11E, 2,
  &(vtc__ZN3ccc8CC9x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x8y11E),2, //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  DD9x8y11  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD9x8y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x8y113efgEv
  ~DD9x8y11(); // tgen
  DD9x8y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x8y11E) C1{ VBC2{ v2 v1} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x8y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x8y113pqrEv");}
void  ccc::DD9x8y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x8y113efgEv");}
ccc::DD9x8y11 ::~DD9x8y11(){ note_dtor("_ZN3ccc8DD9x8y11E", this);} // tgen
ccc::DD9x8y11 ::DD9x8y11(){ note_ctor("_ZN3ccc8DD9x8y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x8y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x8y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x8y11E, buf);
    ::ccc::DD9x8y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x8y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x8y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x8y11E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD9x8y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x8y11E);
    dp->::ccc::DD9x8y11::~DD9x8y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x8y11E(Test__ZN3ccc8DD9x8y11E, "_ZN3ccc8DD9x8y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x8y11C1Ev();
extern void _ZN3ccc8DD9x8y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x8y11E[] = {
  NSPAIR(_ZN3ccc8DD9x8y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x8y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD9x8y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y11E[];
extern void _ZN3ccc8DD9x8y113efgEv();
extern void _ZN3ccc8DD9x8y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x8y113efgEv,_ZTv0_n12_N3ccc8DD9x8y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x8y113efgEv,_ZThn4_N3ccc8DD9x8y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x8y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x8y113efgEv,_ZTv0_n12_N3ccc8DD9x8y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x8y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x8y11E[] = {
  {&(_ZTVN3ccc8DD9x8y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y11E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x8y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x8y11E[];
static VTBL_ENTRY alt_thunk_names1843[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x8y113efgEv,_ZTv0_n12_N3ccc8DD9x8y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x8y113efgEv,_ZThn4_N3ccc8DD9x8y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x8y11E = {  "_ZN3ccc8DD9x8y11E", // class name
  bases__ZN3ccc8DD9x8y11E, 2,
  &(vtc__ZN3ccc8DD9x8y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x8y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x8y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x8y11E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x8y11E),3, //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  CC9x8y12  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8CC9x8y123abcEv
  ~CC9x8y12(); // tgen
  CC9x8y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y12E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC9x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x8y123abcEv");}
ccc::CC9x8y12 ::~CC9x8y12(){ note_dtor("_ZN3ccc8CC9x8y12E", this);} // tgen
ccc::CC9x8y12 ::CC9x8y12(){ note_ctor("_ZN3ccc8CC9x8y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x8y12E, buf);
    ::ccc::CC9x8y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x8y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC9x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x8y12E);
    dp->::ccc::CC9x8y12::~CC9x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x8y12E(Test__ZN3ccc8CC9x8y12E, "_ZN3ccc8CC9x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x8y12C1Ev();
extern void _ZN3ccc8CC9x8y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x8y12E[] = {
  NSPAIR(_ZN3ccc8CC9x8y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC9x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x8y12E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc8CC9x8y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x8y12E[] = {
  {&(_ZTVN3ccc8CC9x8y12E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x8y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x8y12E[];
Class_Descriptor cd__ZN3ccc8CC9x8y12E = {  "_ZN3ccc8CC9x8y12E", // class name
  bases__ZN3ccc8CC9x8y12E, 2,
  &(vtc__ZN3ccc8CC9x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x8y12E),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  DD9x8y12  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  abc(); // _ZN3ccc8DD9x8y123abcEv
  ~DD9x8y12(); // tgen
  DD9x8y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x8y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD9x8y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x8y123abcEv");}
ccc::DD9x8y12 ::~DD9x8y12(){ note_dtor("_ZN3ccc8DD9x8y12E", this);} // tgen
ccc::DD9x8y12 ::DD9x8y12(){ note_ctor("_ZN3ccc8DD9x8y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x8y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x8y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x8y12E, buf);
    ::ccc::DD9x8y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x8y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x8y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x8y12E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD9x8y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x8y12E);
    dp->::ccc::DD9x8y12::~DD9x8y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x8y12E(Test__ZN3ccc8DD9x8y12E, "_ZN3ccc8DD9x8y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x8y12C1Ev();
extern void _ZN3ccc8DD9x8y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x8y12E[] = {
  NSPAIR(_ZN3ccc8DD9x8y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x8y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD9x8y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x8y123abcEv();
extern void _ZN3ccc3BB83efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x8y123abcEv,_ZTv0_n16_N3ccc8DD9x8y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x8y123abcEv,_ZThn4_N3ccc8DD9x8y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x8y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x8y123abcEv,_ZTv0_n16_N3ccc8DD9x8y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x8y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x8y12E[] = {
  {&(_ZTVN3ccc8DD9x8y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x8y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x8y12E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x8y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x8y12E[];
static VTBL_ENTRY alt_thunk_names1844[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x8y123abcEv,_ZTv0_n16_N3ccc8DD9x8y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x8y123abcEv,_ZThn4_N3ccc8DD9x8y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x8y12E = {  "_ZN3ccc8DD9x8y12E", // class name
  bases__ZN3ccc8DD9x8y12E, 2,
  &(vtc__ZN3ccc8DD9x8y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x8y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x8y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x8y12E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x8y12E),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  CC9x8y13  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8CC9x8y133efgEv
  ~CC9x8y13(); // tgen
  CC9x8y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC9x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x8y133efgEv");}
ccc::CC9x8y13 ::~CC9x8y13(){ note_dtor("_ZN3ccc8CC9x8y13E", this);} // tgen
ccc::CC9x8y13 ::CC9x8y13(){ note_ctor("_ZN3ccc8CC9x8y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x8y13E, buf);
    ::ccc::CC9x8y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x8y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC9x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x8y13E);
    dp->::ccc::CC9x8y13::~CC9x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x8y13E(Test__ZN3ccc8CC9x8y13E, "_ZN3ccc8CC9x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x8y13C1Ev();
extern void _ZN3ccc8CC9x8y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x8y13E[] = {
  NSPAIR(_ZN3ccc8CC9x8y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC9x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x8y13E[];
extern void _ZN3ccc8CC9x8y133efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x8y133efgEv,_ZTv0_n12_N3ccc8CC9x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y133efgEv,_ZThn4_N3ccc8CC9x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x8y133efgEv,_ZTv0_n12_N3ccc8CC9x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x8y13E[] = {
  {&(_ZTVN3ccc8CC9x8y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x8y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x8y13E[];
static VTBL_ENTRY alt_thunk_names1845[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x8y133efgEv,_ZTv0_n12_N3ccc8CC9x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x8y133efgEv,_ZThn4_N3ccc8CC9x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x8y13E = {  "_ZN3ccc8CC9x8y13E", // class name
  bases__ZN3ccc8CC9x8y13E, 2,
  &(vtc__ZN3ccc8CC9x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x8y13E),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  DD9x8y13  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  efg(); // _ZN3ccc8DD9x8y133efgEv
  ~DD9x8y13(); // tgen
  DD9x8y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x8y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD9x8y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x8y133efgEv");}
ccc::DD9x8y13 ::~DD9x8y13(){ note_dtor("_ZN3ccc8DD9x8y13E", this);} // tgen
ccc::DD9x8y13 ::DD9x8y13(){ note_ctor("_ZN3ccc8DD9x8y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x8y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x8y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x8y13E, buf);
    ::ccc::DD9x8y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x8y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x8y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x8y13E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD9x8y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x8y13E);
    dp->::ccc::DD9x8y13::~DD9x8y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x8y13E(Test__ZN3ccc8DD9x8y13E, "_ZN3ccc8DD9x8y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x8y13C1Ev();
extern void _ZN3ccc8DD9x8y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x8y13E[] = {
  NSPAIR(_ZN3ccc8DD9x8y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x8y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD9x8y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y13E[];
extern void _ZN3ccc8DD9x8y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x8y133efgEv,_ZTv0_n12_N3ccc8DD9x8y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x8y133efgEv,_ZThn4_N3ccc8DD9x8y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x8y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x8y133efgEv,_ZTv0_n12_N3ccc8DD9x8y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x8y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x8y13E[] = {
  {&(_ZTVN3ccc8DD9x8y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x8y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x8y13E[];
static VTBL_ENTRY alt_thunk_names1846[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x8y133efgEv,_ZTv0_n12_N3ccc8DD9x8y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x8y133efgEv,_ZThn4_N3ccc8DD9x8y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x8y13E = {  "_ZN3ccc8DD9x8y13E", // class name
  bases__ZN3ccc8DD9x8y13E, 2,
  &(vtc__ZN3ccc8DD9x8y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x8y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x8y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x8y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x8y13E),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  CC9x8y14  : virtual ::ccc::AA9 , ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8CC9x8y143pqrEv
  ~CC9x8y14(); // tgen
  CC9x8y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y14E) C1{ VBC2{ v2 v1} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x8y143pqrEv");}
ccc::CC9x8y14 ::~CC9x8y14(){ note_dtor("_ZN3ccc8CC9x8y14E", this);} // tgen
ccc::CC9x8y14 ::CC9x8y14(){ note_ctor("_ZN3ccc8CC9x8y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x8y14E, buf);
    ::ccc::CC9x8y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x8y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC9x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x8y14E);
    dp->::ccc::CC9x8y14::~CC9x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x8y14E(Test__ZN3ccc8CC9x8y14E, "_ZN3ccc8CC9x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x8y14C1Ev();
extern void _ZN3ccc8CC9x8y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x8y14E[] = {
  NSPAIR(_ZN3ccc8CC9x8y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC9x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x8y14E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc8CC9x8y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x8y143pqrEv,_ZTv0_n16_N3ccc8CC9x8y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x8y143pqrEv,_ZThn4_N3ccc8CC9x8y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x8y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x8y143pqrEv,_ZTv0_n16_N3ccc8CC9x8y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x8y14E[] = {
  {&(_ZTVN3ccc8CC9x8y14E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x8y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x8y14E[];
static VTBL_ENTRY alt_thunk_names1847[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x8y143pqrEv,_ZTv0_n16_N3ccc8CC9x8y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x8y143pqrEv,_ZThn4_N3ccc8CC9x8y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x8y14E = {  "_ZN3ccc8CC9x8y14E", // class name
  bases__ZN3ccc8CC9x8y14E, 2,
  &(vtc__ZN3ccc8CC9x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x8y14E),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  DD9x8y14  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  virtual void  pqr(); // _ZN3ccc8DD9x8y143pqrEv
  ~DD9x8y14(); // tgen
  DD9x8y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x8y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x8y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x8y143pqrEv");}
ccc::DD9x8y14 ::~DD9x8y14(){ note_dtor("_ZN3ccc8DD9x8y14E", this);} // tgen
ccc::DD9x8y14 ::DD9x8y14(){ note_ctor("_ZN3ccc8DD9x8y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x8y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x8y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x8y14E, buf);
    ::ccc::DD9x8y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x8y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x8y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x8y14E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD9x8y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x8y14E);
    dp->::ccc::DD9x8y14::~DD9x8y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x8y14E(Test__ZN3ccc8DD9x8y14E, "_ZN3ccc8DD9x8y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x8y14C1Ev();
extern void _ZN3ccc8DD9x8y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x8y14E[] = {
  NSPAIR(_ZN3ccc8DD9x8y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x8y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD9x8y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x8y143pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x8y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x8y143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x8y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x8y14E[] = {
  {&(_ZTVN3ccc8DD9x8y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x8y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x8y14E[];
Class_Descriptor cd__ZN3ccc8DD9x8y14E = {  "_ZN3ccc8DD9x8y14E", // class name
  bases__ZN3ccc8DD9x8y14E, 2,
  &(vtc__ZN3ccc8DD9x8y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x8y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x8y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x8y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x8y14E),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  CC9x8y15  : virtual ::ccc::AA9 , ::ccc::BB8 {
  ~CC9x8y15(); // tgen
  CC9x8y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x8y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC9x8y15 ::~CC9x8y15(){ note_dtor("_ZN3ccc8CC9x8y15E", this);} // tgen
ccc::CC9x8y15 ::CC9x8y15(){ note_ctor("_ZN3ccc8CC9x8y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x8y15E, buf);
    ::ccc::CC9x8y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x8y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), 0, "_ZN3ccc8CC9x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x8y15E);
    dp->::ccc::CC9x8y15::~CC9x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x8y15E(Test__ZN3ccc8CC9x8y15E, "_ZN3ccc8CC9x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x8y15C1Ev();
extern void _ZN3ccc8CC9x8y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x8y15E[] = {
  NSPAIR(_ZN3ccc8CC9x8y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8CC9x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x8y15E[];
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x8y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x8y15E[] = {
  {&(_ZTVN3ccc8CC9x8y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x8y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x8y15E[];
Class_Descriptor cd__ZN3ccc8CC9x8y15E = {  "_ZN3ccc8CC9x8y15E", // class name
  bases__ZN3ccc8CC9x8y15E, 2,
  &(vtc__ZN3ccc8CC9x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x8y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x8y15E),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  DD9x8y15  : virtual ::ccc::AA9 , virtual ::ccc::BB8 {
  ~DD9x8y15(); // tgen
  DD9x8y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x8y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD9x8y15 ::~DD9x8y15(){ note_dtor("_ZN3ccc8DD9x8y15E", this);} // tgen
ccc::DD9x8y15 ::DD9x8y15(){ note_ctor("_ZN3ccc8DD9x8y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x8y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x8y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x8y15E, buf);
    ::ccc::DD9x8y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x8y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x8y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x8y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x8y15E");
    check_base_class_offset(lv, (::ccc::BB8*), ABISELECT(8,4), "_ZN3ccc8DD9x8y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x8y15E);
    dp->::ccc::DD9x8y15::~DD9x8y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x8y15E(Test__ZN3ccc8DD9x8y15E, "_ZN3ccc8DD9x8y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x8y15C1Ev();
extern void _ZN3ccc8DD9x8y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x8y15E[] = {
  NSPAIR(_ZN3ccc8DD9x8y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x8y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB8E;
extern VTBL_ENTRY _ZTIN3ccc3BB8E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB8E[];
static Base_Class bases__ZN3ccc8DD9x8y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB8E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB83efgEv();
extern void _ZN3ccc3BB83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x8y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x8y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x8y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x8y15E[] = {
  {&(_ZTVN3ccc8DD9x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x8y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x8y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x8y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x8y15E[];
Class_Descriptor cd__ZN3ccc8DD9x8y15E = {  "_ZN3ccc8DD9x8y15E", // class name
  bases__ZN3ccc8DD9x8y15E, 2,
  &(vtc__ZN3ccc8DD9x8y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x8y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x8y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x8y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x8y15E),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  CC9x9y0  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y03abcEv
  virtual void  efg(); // _ZN3ccc7CC9x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y03pqrEv
  ~CC9x9y0(); // tgen
  CC9x9y0(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y0E) C1{ VBC2{ v2 v3} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y03abcEv");}
void  ccc::CC9x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y03efgEv");}
void  ccc::CC9x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y03pqrEv");}
ccc::CC9x9y0 ::~CC9x9y0(){ note_dtor("_ZN3ccc7CC9x9y0E", this);} // tgen
ccc::CC9x9y0 ::CC9x9y0(){ note_ctor("_ZN3ccc7CC9x9y0E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y0E, buf);
    ::ccc::CC9x9y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y0E);
    dp->::ccc::CC9x9y0::~CC9x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y0E(Test__ZN3ccc7CC9x9y0E, "_ZN3ccc7CC9x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y0C1Ev();
extern void _ZN3ccc7CC9x9y0D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y0E[] = {
  NSPAIR(_ZN3ccc7CC9x9y0C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y0E[];
extern void _ZN3ccc7CC9x9y03efgEv();
extern void _ZN3ccc7CC9x9y03pqrEv();
extern void _ZN3ccc7CC9x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y03efgEv,_ZTv0_n12_N3ccc7CC9x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y03efgEv,_ZThn4_N3ccc7CC9x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y03pqrEv,_ZTv0_n16_N3ccc7CC9x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y03pqrEv,_ZThn4_N3ccc7CC9x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y03efgEv,_ZTv0_n12_N3ccc7CC9x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y03pqrEv,_ZTv0_n16_N3ccc7CC9x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y0E[] = {
  {&(_ZTVN3ccc7CC9x9y0E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y0E[];
static VTBL_ENTRY alt_thunk_names1848[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y03pqrEv,_ZTv0_n16_N3ccc7CC9x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y03pqrEv,_ZThn4_N3ccc7CC9x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y03efgEv,_ZTv0_n12_N3ccc7CC9x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y03efgEv,_ZThn4_N3ccc7CC9x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y0E = {  "_ZN3ccc7CC9x9y0E", // class name
  bases__ZN3ccc7CC9x9y0E, 2,
  &(vtc__ZN3ccc7CC9x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y0E),2, //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  DD9x9y0  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD9x9y03abcEv
  virtual void  efg(); // _ZN3ccc7DD9x9y03efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x9y03pqrEv
  ~DD9x9y0(); // tgen
  DD9x9y0(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y0E) C1{ VBC2{ v2 v3} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x9y0 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y03abcEv");}
void  ccc::DD9x9y0 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y03efgEv");}
void  ccc::DD9x9y0 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y03pqrEv");}
ccc::DD9x9y0 ::~DD9x9y0(){ note_dtor("_ZN3ccc7DD9x9y0E", this);} // tgen
ccc::DD9x9y0 ::DD9x9y0(){ note_ctor("_ZN3ccc7DD9x9y0E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y0E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y0E, buf);
    ::ccc::DD9x9y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y0E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y0E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y0E);
    dp->::ccc::DD9x9y0::~DD9x9y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y0E(Test__ZN3ccc7DD9x9y0E, "_ZN3ccc7DD9x9y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y0C1Ev();
extern void _ZN3ccc7DD9x9y0D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y0E[] = {
  NSPAIR(_ZN3ccc7DD9x9y0C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y0E[];
extern void _ZN3ccc7DD9x9y03efgEv();
extern void _ZN3ccc7DD9x9y03pqrEv();
extern void _ZN3ccc7DD9x9y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y03efgEv,_ZTv0_n12_N3ccc7DD9x9y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y03efgEv,_ZThn4_N3ccc7DD9x9y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y03pqrEv,_ZTv0_n16_N3ccc7DD9x9y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y03pqrEv,_ZThn4_N3ccc7DD9x9y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y03efgEv,_ZTv0_n12_N3ccc7DD9x9y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y03pqrEv,_ZTv0_n16_N3ccc7DD9x9y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y0E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y0E[] = {
  {&(_ZTVN3ccc7DD9x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y0E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y0E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y0E[];
static VTBL_ENTRY alt_thunk_names1849[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y03pqrEv,_ZTv0_n16_N3ccc7DD9x9y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y03pqrEv,_ZThn4_N3ccc7DD9x9y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y03efgEv,_ZTv0_n12_N3ccc7DD9x9y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y03efgEv,_ZThn4_N3ccc7DD9x9y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y0E = {  "_ZN3ccc7DD9x9y0E", // class name
  bases__ZN3ccc7DD9x9y0E, 2,
  &(vtc__ZN3ccc7DD9x9y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y0E),3, //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  CC9x9y1  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x9y13efgEv
  ~CC9x9y1(); // tgen
  CC9x9y1(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y1E) C1{ VBC2{ v3 v2} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y13abcEv");}
void  ccc::CC9x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y13pqrEv");}
void  ccc::CC9x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y13efgEv");}
ccc::CC9x9y1 ::~CC9x9y1(){ note_dtor("_ZN3ccc7CC9x9y1E", this);} // tgen
ccc::CC9x9y1 ::CC9x9y1(){ note_ctor("_ZN3ccc7CC9x9y1E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y1E, buf);
    ::ccc::CC9x9y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y1E);
    dp->::ccc::CC9x9y1::~CC9x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y1E(Test__ZN3ccc7CC9x9y1E, "_ZN3ccc7CC9x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y1C1Ev();
extern void _ZN3ccc7CC9x9y1D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y1E[] = {
  NSPAIR(_ZN3ccc7CC9x9y1C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y1E[];
extern void _ZN3ccc7CC9x9y13efgEv();
extern void _ZN3ccc7CC9x9y13pqrEv();
extern void _ZN3ccc7CC9x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y13efgEv,_ZTv0_n12_N3ccc7CC9x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y13efgEv,_ZThn4_N3ccc7CC9x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y13pqrEv,_ZTv0_n16_N3ccc7CC9x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y13pqrEv,_ZThn4_N3ccc7CC9x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y13efgEv,_ZTv0_n12_N3ccc7CC9x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y13pqrEv,_ZTv0_n16_N3ccc7CC9x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y1E[] = {
  {&(_ZTVN3ccc7CC9x9y1E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y1E[];
static VTBL_ENTRY alt_thunk_names1850[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y13pqrEv,_ZTv0_n16_N3ccc7CC9x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y13pqrEv,_ZThn4_N3ccc7CC9x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y13efgEv,_ZTv0_n12_N3ccc7CC9x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y13efgEv,_ZThn4_N3ccc7CC9x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y1E = {  "_ZN3ccc7CC9x9y1E", // class name
  bases__ZN3ccc7CC9x9y1E, 2,
  &(vtc__ZN3ccc7CC9x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y1E),2, //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  DD9x9y1  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD9x9y13abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x9y13pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x9y13efgEv
  ~DD9x9y1(); // tgen
  DD9x9y1(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y1E) C1{ VBC2{ v3 v2} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x9y1 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y13abcEv");}
void  ccc::DD9x9y1 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y13pqrEv");}
void  ccc::DD9x9y1 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y13efgEv");}
ccc::DD9x9y1 ::~DD9x9y1(){ note_dtor("_ZN3ccc7DD9x9y1E", this);} // tgen
ccc::DD9x9y1 ::DD9x9y1(){ note_ctor("_ZN3ccc7DD9x9y1E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y1E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y1E, buf);
    ::ccc::DD9x9y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y1E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y1E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y1E);
    dp->::ccc::DD9x9y1::~DD9x9y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y1E(Test__ZN3ccc7DD9x9y1E, "_ZN3ccc7DD9x9y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y1C1Ev();
extern void _ZN3ccc7DD9x9y1D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y1E[] = {
  NSPAIR(_ZN3ccc7DD9x9y1C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y1E[];
extern void _ZN3ccc7DD9x9y13efgEv();
extern void _ZN3ccc7DD9x9y13pqrEv();
extern void _ZN3ccc7DD9x9y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y13efgEv,_ZTv0_n12_N3ccc7DD9x9y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y13efgEv,_ZThn4_N3ccc7DD9x9y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y13pqrEv,_ZTv0_n16_N3ccc7DD9x9y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y13pqrEv,_ZThn4_N3ccc7DD9x9y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y13efgEv,_ZTv0_n12_N3ccc7DD9x9y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y13pqrEv,_ZTv0_n16_N3ccc7DD9x9y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y1E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y1E[] = {
  {&(_ZTVN3ccc7DD9x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y1E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y1E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y1E[];
static VTBL_ENTRY alt_thunk_names1851[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y13pqrEv,_ZTv0_n16_N3ccc7DD9x9y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y13pqrEv,_ZThn4_N3ccc7DD9x9y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y13efgEv,_ZTv0_n12_N3ccc7DD9x9y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y13efgEv,_ZThn4_N3ccc7DD9x9y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y1E = {  "_ZN3ccc7DD9x9y1E", // class name
  bases__ZN3ccc7DD9x9y1E, 2,
  &(vtc__ZN3ccc7DD9x9y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y1E),3, //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  CC9x9y2  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y23efgEv
  virtual void  abc(); // _ZN3ccc7CC9x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y23pqrEv
  ~CC9x9y2(); // tgen
  CC9x9y2(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y2E) C1{ VBC2{ v1 v3} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y23efgEv");}
void  ccc::CC9x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y23abcEv");}
void  ccc::CC9x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y23pqrEv");}
ccc::CC9x9y2 ::~CC9x9y2(){ note_dtor("_ZN3ccc7CC9x9y2E", this);} // tgen
ccc::CC9x9y2 ::CC9x9y2(){ note_ctor("_ZN3ccc7CC9x9y2E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y2E, buf);
    ::ccc::CC9x9y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y2E);
    dp->::ccc::CC9x9y2::~CC9x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y2E(Test__ZN3ccc7CC9x9y2E, "_ZN3ccc7CC9x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y2C1Ev();
extern void _ZN3ccc7CC9x9y2D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y2E[] = {
  NSPAIR(_ZN3ccc7CC9x9y2C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y2E[];
extern void _ZN3ccc7CC9x9y23efgEv();
extern void _ZN3ccc7CC9x9y23pqrEv();
extern void _ZN3ccc7CC9x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y23efgEv,_ZTv0_n12_N3ccc7CC9x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y23efgEv,_ZThn4_N3ccc7CC9x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y23pqrEv,_ZTv0_n16_N3ccc7CC9x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y23pqrEv,_ZThn4_N3ccc7CC9x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y23efgEv,_ZTv0_n12_N3ccc7CC9x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y23pqrEv,_ZTv0_n16_N3ccc7CC9x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y2E[] = {
  {&(_ZTVN3ccc7CC9x9y2E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y2E[];
static VTBL_ENTRY alt_thunk_names1852[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y23pqrEv,_ZTv0_n16_N3ccc7CC9x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y23pqrEv,_ZThn4_N3ccc7CC9x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y23efgEv,_ZTv0_n12_N3ccc7CC9x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y23efgEv,_ZThn4_N3ccc7CC9x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y2E = {  "_ZN3ccc7CC9x9y2E", // class name
  bases__ZN3ccc7CC9x9y2E, 2,
  &(vtc__ZN3ccc7CC9x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y2E),2, //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  DD9x9y2  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD9x9y23efgEv
  virtual void  abc(); // _ZN3ccc7DD9x9y23abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x9y23pqrEv
  ~DD9x9y2(); // tgen
  DD9x9y2(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y2E) C1{ VBC2{ v1 v3} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x9y2 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y23efgEv");}
void  ccc::DD9x9y2 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y23abcEv");}
void  ccc::DD9x9y2 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y23pqrEv");}
ccc::DD9x9y2 ::~DD9x9y2(){ note_dtor("_ZN3ccc7DD9x9y2E", this);} // tgen
ccc::DD9x9y2 ::DD9x9y2(){ note_ctor("_ZN3ccc7DD9x9y2E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y2E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y2E, buf);
    ::ccc::DD9x9y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y2E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y2E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y2E);
    dp->::ccc::DD9x9y2::~DD9x9y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y2E(Test__ZN3ccc7DD9x9y2E, "_ZN3ccc7DD9x9y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y2C1Ev();
extern void _ZN3ccc7DD9x9y2D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y2E[] = {
  NSPAIR(_ZN3ccc7DD9x9y2C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y2E[];
extern void _ZN3ccc7DD9x9y23efgEv();
extern void _ZN3ccc7DD9x9y23pqrEv();
extern void _ZN3ccc7DD9x9y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y23efgEv,_ZTv0_n12_N3ccc7DD9x9y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y23efgEv,_ZThn4_N3ccc7DD9x9y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y23pqrEv,_ZTv0_n16_N3ccc7DD9x9y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y23pqrEv,_ZThn4_N3ccc7DD9x9y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y23efgEv,_ZTv0_n12_N3ccc7DD9x9y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y23pqrEv,_ZTv0_n16_N3ccc7DD9x9y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y2E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y2E[] = {
  {&(_ZTVN3ccc7DD9x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y2E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y2E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y2E[];
static VTBL_ENTRY alt_thunk_names1853[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y23pqrEv,_ZTv0_n16_N3ccc7DD9x9y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y23pqrEv,_ZThn4_N3ccc7DD9x9y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y23efgEv,_ZTv0_n12_N3ccc7DD9x9y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y23efgEv,_ZThn4_N3ccc7DD9x9y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y2E = {  "_ZN3ccc7DD9x9y2E", // class name
  bases__ZN3ccc7DD9x9y2E, 2,
  &(vtc__ZN3ccc7DD9x9y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y2E),3, //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  CC9x9y3  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x9y33abcEv
  ~CC9x9y3(); // tgen
  CC9x9y3(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y3E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y33efgEv");}
void  ccc::CC9x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y33pqrEv");}
void  ccc::CC9x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y33abcEv");}
ccc::CC9x9y3 ::~CC9x9y3(){ note_dtor("_ZN3ccc7CC9x9y3E", this);} // tgen
ccc::CC9x9y3 ::CC9x9y3(){ note_ctor("_ZN3ccc7CC9x9y3E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y3E, buf);
    ::ccc::CC9x9y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y3E);
    dp->::ccc::CC9x9y3::~CC9x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y3E(Test__ZN3ccc7CC9x9y3E, "_ZN3ccc7CC9x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y3C1Ev();
extern void _ZN3ccc7CC9x9y3D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y3E[] = {
  NSPAIR(_ZN3ccc7CC9x9y3C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y3E[];
extern void _ZN3ccc7CC9x9y33efgEv();
extern void _ZN3ccc7CC9x9y33pqrEv();
extern void _ZN3ccc7CC9x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y33efgEv,_ZTv0_n12_N3ccc7CC9x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y33efgEv,_ZThn4_N3ccc7CC9x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y33pqrEv,_ZTv0_n16_N3ccc7CC9x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y33pqrEv,_ZThn4_N3ccc7CC9x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y33efgEv,_ZTv0_n12_N3ccc7CC9x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y33pqrEv,_ZTv0_n16_N3ccc7CC9x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y3E[] = {
  {&(_ZTVN3ccc7CC9x9y3E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y3E[];
static VTBL_ENTRY alt_thunk_names1854[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y33pqrEv,_ZTv0_n16_N3ccc7CC9x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y33pqrEv,_ZThn4_N3ccc7CC9x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y33efgEv,_ZTv0_n12_N3ccc7CC9x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y33efgEv,_ZThn4_N3ccc7CC9x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y3E = {  "_ZN3ccc7CC9x9y3E", // class name
  bases__ZN3ccc7CC9x9y3E, 2,
  &(vtc__ZN3ccc7CC9x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y3E),2, //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  DD9x9y3  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD9x9y33efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x9y33pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x9y33abcEv
  ~DD9x9y3(); // tgen
  DD9x9y3(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y3E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x9y3 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y33efgEv");}
void  ccc::DD9x9y3 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y33pqrEv");}
void  ccc::DD9x9y3 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y33abcEv");}
ccc::DD9x9y3 ::~DD9x9y3(){ note_dtor("_ZN3ccc7DD9x9y3E", this);} // tgen
ccc::DD9x9y3 ::DD9x9y3(){ note_ctor("_ZN3ccc7DD9x9y3E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y3E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y3E, buf);
    ::ccc::DD9x9y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y3E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y3E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y3E);
    dp->::ccc::DD9x9y3::~DD9x9y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y3E(Test__ZN3ccc7DD9x9y3E, "_ZN3ccc7DD9x9y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y3C1Ev();
extern void _ZN3ccc7DD9x9y3D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y3E[] = {
  NSPAIR(_ZN3ccc7DD9x9y3C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y3E[];
extern void _ZN3ccc7DD9x9y33efgEv();
extern void _ZN3ccc7DD9x9y33pqrEv();
extern void _ZN3ccc7DD9x9y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y33efgEv,_ZTv0_n12_N3ccc7DD9x9y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y33efgEv,_ZThn4_N3ccc7DD9x9y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y33pqrEv,_ZTv0_n16_N3ccc7DD9x9y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y33pqrEv,_ZThn4_N3ccc7DD9x9y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y33efgEv,_ZTv0_n12_N3ccc7DD9x9y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y33pqrEv,_ZTv0_n16_N3ccc7DD9x9y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y3E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y3E[] = {
  {&(_ZTVN3ccc7DD9x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y3E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y3E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y3E[];
static VTBL_ENTRY alt_thunk_names1855[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y33pqrEv,_ZTv0_n16_N3ccc7DD9x9y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y33pqrEv,_ZThn4_N3ccc7DD9x9y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y33efgEv,_ZTv0_n12_N3ccc7DD9x9y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y33efgEv,_ZThn4_N3ccc7DD9x9y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y3E = {  "_ZN3ccc7DD9x9y3E", // class name
  bases__ZN3ccc7DD9x9y3E, 2,
  &(vtc__ZN3ccc7DD9x9y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y3E),3, //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  CC9x9y4  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC9x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7CC9x9y43abcEv
  virtual void  efg(); // _ZN3ccc7CC9x9y43efgEv
  ~CC9x9y4(); // tgen
  CC9x9y4(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y4E) C1{ VBC2{ v3 v1} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y43pqrEv");}
void  ccc::CC9x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y43abcEv");}
void  ccc::CC9x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y43efgEv");}
ccc::CC9x9y4 ::~CC9x9y4(){ note_dtor("_ZN3ccc7CC9x9y4E", this);} // tgen
ccc::CC9x9y4 ::CC9x9y4(){ note_ctor("_ZN3ccc7CC9x9y4E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y4E, buf);
    ::ccc::CC9x9y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y4E);
    dp->::ccc::CC9x9y4::~CC9x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y4E(Test__ZN3ccc7CC9x9y4E, "_ZN3ccc7CC9x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y4C1Ev();
extern void _ZN3ccc7CC9x9y4D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y4E[] = {
  NSPAIR(_ZN3ccc7CC9x9y4C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y4E[];
extern void _ZN3ccc7CC9x9y43efgEv();
extern void _ZN3ccc7CC9x9y43pqrEv();
extern void _ZN3ccc7CC9x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y43efgEv,_ZTv0_n12_N3ccc7CC9x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y43efgEv,_ZThn4_N3ccc7CC9x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y43pqrEv,_ZTv0_n16_N3ccc7CC9x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y43pqrEv,_ZThn4_N3ccc7CC9x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y43efgEv,_ZTv0_n12_N3ccc7CC9x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y43pqrEv,_ZTv0_n16_N3ccc7CC9x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y4E[] = {
  {&(_ZTVN3ccc7CC9x9y4E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y4E[];
static VTBL_ENTRY alt_thunk_names1856[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y43pqrEv,_ZTv0_n16_N3ccc7CC9x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y43pqrEv,_ZThn4_N3ccc7CC9x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y43efgEv,_ZTv0_n12_N3ccc7CC9x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y43efgEv,_ZThn4_N3ccc7CC9x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y4E = {  "_ZN3ccc7CC9x9y4E", // class name
  bases__ZN3ccc7CC9x9y4E, 2,
  &(vtc__ZN3ccc7CC9x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y4E),2, //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  DD9x9y4  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD9x9y43pqrEv
  virtual void  abc(); // _ZN3ccc7DD9x9y43abcEv
  virtual void  efg(); // _ZN3ccc7DD9x9y43efgEv
  ~DD9x9y4(); // tgen
  DD9x9y4(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y4E) C1{ VBC2{ v3 v1} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x9y4 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y43pqrEv");}
void  ccc::DD9x9y4 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y43abcEv");}
void  ccc::DD9x9y4 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y43efgEv");}
ccc::DD9x9y4 ::~DD9x9y4(){ note_dtor("_ZN3ccc7DD9x9y4E", this);} // tgen
ccc::DD9x9y4 ::DD9x9y4(){ note_ctor("_ZN3ccc7DD9x9y4E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y4E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y4E, buf);
    ::ccc::DD9x9y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y4E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y4E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y4E);
    dp->::ccc::DD9x9y4::~DD9x9y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y4E(Test__ZN3ccc7DD9x9y4E, "_ZN3ccc7DD9x9y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y4C1Ev();
extern void _ZN3ccc7DD9x9y4D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y4E[] = {
  NSPAIR(_ZN3ccc7DD9x9y4C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y4E[];
extern void _ZN3ccc7DD9x9y43efgEv();
extern void _ZN3ccc7DD9x9y43pqrEv();
extern void _ZN3ccc7DD9x9y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y43efgEv,_ZTv0_n12_N3ccc7DD9x9y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y43efgEv,_ZThn4_N3ccc7DD9x9y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y43pqrEv,_ZTv0_n16_N3ccc7DD9x9y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y43pqrEv,_ZThn4_N3ccc7DD9x9y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y43efgEv,_ZTv0_n12_N3ccc7DD9x9y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y43pqrEv,_ZTv0_n16_N3ccc7DD9x9y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y4E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y4E[] = {
  {&(_ZTVN3ccc7DD9x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y4E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y4E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y4E[];
static VTBL_ENTRY alt_thunk_names1857[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y43pqrEv,_ZTv0_n16_N3ccc7DD9x9y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y43pqrEv,_ZThn4_N3ccc7DD9x9y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y43efgEv,_ZTv0_n12_N3ccc7DD9x9y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y43efgEv,_ZThn4_N3ccc7DD9x9y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y4E = {  "_ZN3ccc7DD9x9y4E", // class name
  bases__ZN3ccc7DD9x9y4E, 2,
  &(vtc__ZN3ccc7DD9x9y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y4E),3, //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  CC9x9y5  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7CC9x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7CC9x9y53efgEv
  virtual void  abc(); // _ZN3ccc7CC9x9y53abcEv
  ~CC9x9y5(); // tgen
  CC9x9y5(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y5E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y53pqrEv");}
void  ccc::CC9x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y53efgEv");}
void  ccc::CC9x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y53abcEv");}
ccc::CC9x9y5 ::~CC9x9y5(){ note_dtor("_ZN3ccc7CC9x9y5E", this);} // tgen
ccc::CC9x9y5 ::CC9x9y5(){ note_ctor("_ZN3ccc7CC9x9y5E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y5E, buf);
    ::ccc::CC9x9y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y5E);
    dp->::ccc::CC9x9y5::~CC9x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y5E(Test__ZN3ccc7CC9x9y5E, "_ZN3ccc7CC9x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y5C1Ev();
extern void _ZN3ccc7CC9x9y5D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y5E[] = {
  NSPAIR(_ZN3ccc7CC9x9y5C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y5E[];
extern void _ZN3ccc7CC9x9y53efgEv();
extern void _ZN3ccc7CC9x9y53pqrEv();
extern void _ZN3ccc7CC9x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y53efgEv,_ZTv0_n12_N3ccc7CC9x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y53efgEv,_ZThn4_N3ccc7CC9x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y53pqrEv,_ZTv0_n16_N3ccc7CC9x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y53pqrEv,_ZThn4_N3ccc7CC9x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y53efgEv,_ZTv0_n12_N3ccc7CC9x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y53pqrEv,_ZTv0_n16_N3ccc7CC9x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y5E[] = {
  {&(_ZTVN3ccc7CC9x9y5E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y5E[];
static VTBL_ENTRY alt_thunk_names1858[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y53pqrEv,_ZTv0_n16_N3ccc7CC9x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y53pqrEv,_ZThn4_N3ccc7CC9x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y53efgEv,_ZTv0_n12_N3ccc7CC9x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y53efgEv,_ZThn4_N3ccc7CC9x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y5E = {  "_ZN3ccc7CC9x9y5E", // class name
  bases__ZN3ccc7CC9x9y5E, 2,
  &(vtc__ZN3ccc7CC9x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y5E),2, //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  DD9x9y5  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc7DD9x9y53pqrEv
  virtual void  efg(); // _ZN3ccc7DD9x9y53efgEv
  virtual void  abc(); // _ZN3ccc7DD9x9y53abcEv
  ~DD9x9y5(); // tgen
  DD9x9y5(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y5E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x9y5 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y53pqrEv");}
void  ccc::DD9x9y5 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y53efgEv");}
void  ccc::DD9x9y5 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y53abcEv");}
ccc::DD9x9y5 ::~DD9x9y5(){ note_dtor("_ZN3ccc7DD9x9y5E", this);} // tgen
ccc::DD9x9y5 ::DD9x9y5(){ note_ctor("_ZN3ccc7DD9x9y5E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y5E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y5E, buf);
    ::ccc::DD9x9y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y5E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y5E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y5E);
    dp->::ccc::DD9x9y5::~DD9x9y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y5E(Test__ZN3ccc7DD9x9y5E, "_ZN3ccc7DD9x9y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y5C1Ev();
extern void _ZN3ccc7DD9x9y5D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y5E[] = {
  NSPAIR(_ZN3ccc7DD9x9y5C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y5E[];
extern void _ZN3ccc7DD9x9y53efgEv();
extern void _ZN3ccc7DD9x9y53pqrEv();
extern void _ZN3ccc7DD9x9y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y53efgEv,_ZTv0_n12_N3ccc7DD9x9y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y53efgEv,_ZThn4_N3ccc7DD9x9y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y53pqrEv,_ZTv0_n16_N3ccc7DD9x9y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y53pqrEv,_ZThn4_N3ccc7DD9x9y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y53efgEv,_ZTv0_n12_N3ccc7DD9x9y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y53pqrEv,_ZTv0_n16_N3ccc7DD9x9y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y5E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y5E[] = {
  {&(_ZTVN3ccc7DD9x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y5E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y5E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y5E[];
static VTBL_ENTRY alt_thunk_names1859[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y53pqrEv,_ZTv0_n16_N3ccc7DD9x9y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y53pqrEv,_ZThn4_N3ccc7DD9x9y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y53efgEv,_ZTv0_n12_N3ccc7DD9x9y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y53efgEv,_ZThn4_N3ccc7DD9x9y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y5E = {  "_ZN3ccc7DD9x9y5E", // class name
  bases__ZN3ccc7DD9x9y5E, 2,
  &(vtc__ZN3ccc7DD9x9y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y5E),3, //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  CC9x9y6  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y63abcEv
  virtual void  efg(); // _ZN3ccc7CC9x9y63efgEv
  ~CC9x9y6(); // tgen
  CC9x9y6(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y6E) C1{ VBC2{ v2 v3} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y63abcEv");}
void  ccc::CC9x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y63efgEv");}
ccc::CC9x9y6 ::~CC9x9y6(){ note_dtor("_ZN3ccc7CC9x9y6E", this);} // tgen
ccc::CC9x9y6 ::CC9x9y6(){ note_ctor("_ZN3ccc7CC9x9y6E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y6E, buf);
    ::ccc::CC9x9y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y6E);
    dp->::ccc::CC9x9y6::~CC9x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y6E(Test__ZN3ccc7CC9x9y6E, "_ZN3ccc7CC9x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y6C1Ev();
extern void _ZN3ccc7CC9x9y6D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y6E[] = {
  NSPAIR(_ZN3ccc7CC9x9y6C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y6E[];
extern void _ZN3ccc7CC9x9y63efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC9x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y63efgEv,_ZTv0_n12_N3ccc7CC9x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y63efgEv,_ZThn4_N3ccc7CC9x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y63efgEv,_ZTv0_n12_N3ccc7CC9x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y6E[] = {
  {&(_ZTVN3ccc7CC9x9y6E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y6E[];
static VTBL_ENTRY alt_thunk_names1860[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y63efgEv,_ZTv0_n12_N3ccc7CC9x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y63efgEv,_ZThn4_N3ccc7CC9x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y6E = {  "_ZN3ccc7CC9x9y6E", // class name
  bases__ZN3ccc7CC9x9y6E, 2,
  &(vtc__ZN3ccc7CC9x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y6E),2, //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  DD9x9y6  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD9x9y63abcEv
  virtual void  efg(); // _ZN3ccc7DD9x9y63efgEv
  ~DD9x9y6(); // tgen
  DD9x9y6(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y6E) C1{ VBC2{ v2 v3} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x9y6 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y63abcEv");}
void  ccc::DD9x9y6 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y63efgEv");}
ccc::DD9x9y6 ::~DD9x9y6(){ note_dtor("_ZN3ccc7DD9x9y6E", this);} // tgen
ccc::DD9x9y6 ::DD9x9y6(){ note_ctor("_ZN3ccc7DD9x9y6E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y6E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y6E, buf);
    ::ccc::DD9x9y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y6E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y6E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y6E);
    dp->::ccc::DD9x9y6::~DD9x9y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y6E(Test__ZN3ccc7DD9x9y6E, "_ZN3ccc7DD9x9y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y6C1Ev();
extern void _ZN3ccc7DD9x9y6D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y6E[] = {
  NSPAIR(_ZN3ccc7DD9x9y6C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y6E[];
extern void _ZN3ccc7DD9x9y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x9y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y63efgEv,_ZTv0_n12_N3ccc7DD9x9y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y63efgEv,_ZThn4_N3ccc7DD9x9y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y63efgEv,_ZTv0_n12_N3ccc7DD9x9y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y6E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y6E[] = {
  {&(_ZTVN3ccc7DD9x9y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y6E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y6E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y6E[];
static VTBL_ENTRY alt_thunk_names1861[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y63efgEv,_ZTv0_n12_N3ccc7DD9x9y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y63efgEv,_ZThn4_N3ccc7DD9x9y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y6E = {  "_ZN3ccc7DD9x9y6E", // class name
  bases__ZN3ccc7DD9x9y6E, 2,
  &(vtc__ZN3ccc7DD9x9y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y6E),3, //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  CC9x9y7  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7CC9x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y73pqrEv
  ~CC9x9y7(); // tgen
  CC9x9y7(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y7E) C1{ VBC2{ v3 v2} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y73abcEv");}
void  ccc::CC9x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y73pqrEv");}
ccc::CC9x9y7 ::~CC9x9y7(){ note_dtor("_ZN3ccc7CC9x9y7E", this);} // tgen
ccc::CC9x9y7 ::CC9x9y7(){ note_ctor("_ZN3ccc7CC9x9y7E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y7E, buf);
    ::ccc::CC9x9y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y7E);
    dp->::ccc::CC9x9y7::~CC9x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y7E(Test__ZN3ccc7CC9x9y7E, "_ZN3ccc7CC9x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y7C1Ev();
extern void _ZN3ccc7CC9x9y7D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y7E[] = {
  NSPAIR(_ZN3ccc7CC9x9y7C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y7E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc7CC9x9y73pqrEv();
extern void _ZN3ccc7CC9x9y73abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y73pqrEv,_ZTv0_n16_N3ccc7CC9x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y73pqrEv,_ZThn4_N3ccc7CC9x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y73pqrEv,_ZTv0_n16_N3ccc7CC9x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y7E[] = {
  {&(_ZTVN3ccc7CC9x9y7E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y7E[];
static VTBL_ENTRY alt_thunk_names1862[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y73pqrEv,_ZTv0_n16_N3ccc7CC9x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y73pqrEv,_ZThn4_N3ccc7CC9x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y7E = {  "_ZN3ccc7CC9x9y7E", // class name
  bases__ZN3ccc7CC9x9y7E, 2,
  &(vtc__ZN3ccc7CC9x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y7E),2, //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  DD9x9y7  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc7DD9x9y73abcEv
  virtual void  pqr(); // _ZN3ccc7DD9x9y73pqrEv
  ~DD9x9y7(); // tgen
  DD9x9y7(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y7E) C1{ VBC2{ v3 v2} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x9y7 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y73abcEv");}
void  ccc::DD9x9y7 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y73pqrEv");}
ccc::DD9x9y7 ::~DD9x9y7(){ note_dtor("_ZN3ccc7DD9x9y7E", this);} // tgen
ccc::DD9x9y7 ::DD9x9y7(){ note_ctor("_ZN3ccc7DD9x9y7E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y7E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y7E, buf);
    ::ccc::DD9x9y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y7E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y7E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y7E);
    dp->::ccc::DD9x9y7::~DD9x9y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y7E(Test__ZN3ccc7DD9x9y7E, "_ZN3ccc7DD9x9y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y7C1Ev();
extern void _ZN3ccc7DD9x9y7D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y7E[] = {
  NSPAIR(_ZN3ccc7DD9x9y7C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc7DD9x9y73pqrEv();
extern void _ZN3ccc7DD9x9y73abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y73pqrEv,_ZTv0_n16_N3ccc7DD9x9y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y73pqrEv,_ZThn4_N3ccc7DD9x9y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y73pqrEv,_ZTv0_n16_N3ccc7DD9x9y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y7E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y7E[] = {
  {&(_ZTVN3ccc7DD9x9y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y7E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y7E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y7E[];
static VTBL_ENTRY alt_thunk_names1863[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y73pqrEv,_ZTv0_n16_N3ccc7DD9x9y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y73pqrEv,_ZThn4_N3ccc7DD9x9y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y7E = {  "_ZN3ccc7DD9x9y7E", // class name
  bases__ZN3ccc7DD9x9y7E, 2,
  &(vtc__ZN3ccc7DD9x9y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y7E),3, //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  CC9x9y8  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y83efgEv
  virtual void  abc(); // _ZN3ccc7CC9x9y83abcEv
  ~CC9x9y8(); // tgen
  CC9x9y8(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y8E) C1{ VBC2{ v1 v3} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y83efgEv");}
void  ccc::CC9x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7CC9x9y83abcEv");}
ccc::CC9x9y8 ::~CC9x9y8(){ note_dtor("_ZN3ccc7CC9x9y8E", this);} // tgen
ccc::CC9x9y8 ::CC9x9y8(){ note_ctor("_ZN3ccc7CC9x9y8E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y8E, buf);
    ::ccc::CC9x9y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y8E);
    dp->::ccc::CC9x9y8::~CC9x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y8E(Test__ZN3ccc7CC9x9y8E, "_ZN3ccc7CC9x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y8C1Ev();
extern void _ZN3ccc7CC9x9y8D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y8E[] = {
  NSPAIR(_ZN3ccc7CC9x9y8C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y8E[];
extern void _ZN3ccc7CC9x9y83efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc7CC9x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y83efgEv,_ZTv0_n12_N3ccc7CC9x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y83efgEv,_ZThn4_N3ccc7CC9x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y83efgEv,_ZTv0_n12_N3ccc7CC9x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y8E[] = {
  {&(_ZTVN3ccc7CC9x9y8E[3]),  3,12},
  {&(_ZTVN3ccc7CC9x9y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y8E[];
static VTBL_ENTRY alt_thunk_names1864[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y83efgEv,_ZTv0_n12_N3ccc7CC9x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y83efgEv,_ZThn4_N3ccc7CC9x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y8E = {  "_ZN3ccc7CC9x9y8E", // class name
  bases__ZN3ccc7CC9x9y8E, 2,
  &(vtc__ZN3ccc7CC9x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y8E),2, //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  DD9x9y8  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD9x9y83efgEv
  virtual void  abc(); // _ZN3ccc7DD9x9y83abcEv
  ~DD9x9y8(); // tgen
  DD9x9y8(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y8E) C1{ VBC2{ v1 v3} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x9y8 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y83efgEv");}
void  ccc::DD9x9y8 ::abc(){vfunc_called(this, "_ZN3ccc7DD9x9y83abcEv");}
ccc::DD9x9y8 ::~DD9x9y8(){ note_dtor("_ZN3ccc7DD9x9y8E", this);} // tgen
ccc::DD9x9y8 ::DD9x9y8(){ note_ctor("_ZN3ccc7DD9x9y8E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y8E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y8E, buf);
    ::ccc::DD9x9y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y8E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y8E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y8E);
    dp->::ccc::DD9x9y8::~DD9x9y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y8E(Test__ZN3ccc7DD9x9y8E, "_ZN3ccc7DD9x9y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y8C1Ev();
extern void _ZN3ccc7DD9x9y8D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y8E[] = {
  NSPAIR(_ZN3ccc7DD9x9y8C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y8E[];
extern void _ZN3ccc7DD9x9y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc7DD9x9y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y83efgEv,_ZTv0_n12_N3ccc7DD9x9y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y83efgEv,_ZThn4_N3ccc7DD9x9y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y83efgEv,_ZTv0_n12_N3ccc7DD9x9y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y8E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y8E[] = {
  {&(_ZTVN3ccc7DD9x9y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y8E[6]),  6,15},
  {&(_ZTVN3ccc7DD9x9y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y8E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y8E[];
static VTBL_ENTRY alt_thunk_names1865[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y83efgEv,_ZTv0_n12_N3ccc7DD9x9y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y83efgEv,_ZThn4_N3ccc7DD9x9y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y8E = {  "_ZN3ccc7DD9x9y8E", // class name
  bases__ZN3ccc7DD9x9y8E, 2,
  &(vtc__ZN3ccc7DD9x9y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y8E),3, //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  CC9x9y9  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7CC9x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7CC9x9y93pqrEv
  ~CC9x9y9(); // tgen
  CC9x9y9(); // tgen
};
//SIG(1 _ZN3ccc7CC9x9y9E) C1{ VBC2{ v1 v2} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7CC9x9y93efgEv");}
void  ccc::CC9x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7CC9x9y93pqrEv");}
ccc::CC9x9y9 ::~CC9x9y9(){ note_dtor("_ZN3ccc7CC9x9y9E", this);} // tgen
ccc::CC9x9y9 ::CC9x9y9(){ note_ctor("_ZN3ccc7CC9x9y9E", this);} // tgen
}
static void Test__ZN3ccc7CC9x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7CC9x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7CC9x9y9E, buf);
    ::ccc::CC9x9y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7CC9x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7CC9x9y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc7CC9x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc7CC9x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7CC9x9y9E);
    dp->::ccc::CC9x9y9::~CC9x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7CC9x9y9E(Test__ZN3ccc7CC9x9y9E, "_ZN3ccc7CC9x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7CC9x9y9C1Ev();
extern void _ZN3ccc7CC9x9y9D1Ev();
Name_Map name_map__ZN3ccc7CC9x9y9E[] = {
  NSPAIR(_ZN3ccc7CC9x9y9C1Ev),
  NSPAIR(_ZN3ccc7CC9x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7CC9x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc7CC9x9y9E[];
extern void _ZN3ccc7CC9x9y93efgEv();
extern void _ZN3ccc7CC9x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7CC9x9y93efgEv,_ZTv0_n12_N3ccc7CC9x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y93efgEv,_ZThn4_N3ccc7CC9x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7CC9x9y93pqrEv,_ZTv0_n16_N3ccc7CC9x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7CC9x9y93pqrEv,_ZThn4_N3ccc7CC9x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7CC9x9y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7CC9x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7CC9x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7CC9x9y93efgEv,_ZTv0_n12_N3ccc7CC9x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7CC9x9y93pqrEv,_ZTv0_n16_N3ccc7CC9x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7CC9x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7CC9x9y9E[] = {
  {&(_ZTVN3ccc7CC9x9y9E[3]),  3,11},
  {&(_ZTVN3ccc7CC9x9y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc7CC9x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7CC9x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7CC9x9y9E[];
static VTBL_ENTRY alt_thunk_names1866[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7CC9x9y93pqrEv,_ZTv0_n16_N3ccc7CC9x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y93pqrEv,_ZThn4_N3ccc7CC9x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7CC9x9y93efgEv,_ZTv0_n12_N3ccc7CC9x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7CC9x9y93efgEv,_ZThn4_N3ccc7CC9x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7CC9x9y9E = {  "_ZN3ccc7CC9x9y9E", // class name
  bases__ZN3ccc7CC9x9y9E, 2,
  &(vtc__ZN3ccc7CC9x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7CC9x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7CC9x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7CC9x9y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7CC9x9y9E),2, //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  DD9x9y9  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc7DD9x9y93efgEv
  virtual void  pqr(); // _ZN3ccc7DD9x9y93pqrEv
  ~DD9x9y9(); // tgen
  DD9x9y9(); // tgen
};
//SIG(1 _ZN3ccc7DD9x9y9E) C1{ VBC2{ v1 v2} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x9y9 ::efg(){vfunc_called(this, "_ZN3ccc7DD9x9y93efgEv");}
void  ccc::DD9x9y9 ::pqr(){vfunc_called(this, "_ZN3ccc7DD9x9y93pqrEv");}
ccc::DD9x9y9 ::~DD9x9y9(){ note_dtor("_ZN3ccc7DD9x9y9E", this);} // tgen
ccc::DD9x9y9 ::DD9x9y9(){ note_ctor("_ZN3ccc7DD9x9y9E", this);} // tgen
}
static void Test__ZN3ccc7DD9x9y9E()
{
  extern Class_Descriptor cd__ZN3ccc7DD9x9y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc7DD9x9y9E, buf);
    ::ccc::DD9x9y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc7DD9x9y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc7DD9x9y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc7DD9x9y9E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc7DD9x9y9E");
    test_class_info(&lv, &cd__ZN3ccc7DD9x9y9E);
    dp->::ccc::DD9x9y9::~DD9x9y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc7DD9x9y9E(Test__ZN3ccc7DD9x9y9E, "_ZN3ccc7DD9x9y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc7DD9x9y9C1Ev();
extern void _ZN3ccc7DD9x9y9D1Ev();
Name_Map name_map__ZN3ccc7DD9x9y9E[] = {
  NSPAIR(_ZN3ccc7DD9x9y9C1Ev),
  NSPAIR(_ZN3ccc7DD9x9y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc7DD9x9y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y9E[];
extern void _ZN3ccc7DD9x9y93efgEv();
extern void _ZN3ccc7DD9x9y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc7DD9x9y93efgEv,_ZTv0_n12_N3ccc7DD9x9y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y93efgEv,_ZThn4_N3ccc7DD9x9y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc7DD9x9y93pqrEv,_ZTv0_n16_N3ccc7DD9x9y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc7DD9x9y93pqrEv,_ZThn4_N3ccc7DD9x9y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc7DD9x9y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc7DD9x9y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc7DD9x9y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc7DD9x9y93efgEv,_ZTv0_n12_N3ccc7DD9x9y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc7DD9x9y93pqrEv,_ZTv0_n16_N3ccc7DD9x9y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc7DD9x9y9E[];
static  VTT_ENTRY vtt__ZN3ccc7DD9x9y9E[] = {
  {&(_ZTVN3ccc7DD9x9y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x9y9E[6]),  6,14},
  {&(_ZTVN3ccc7DD9x9y9E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc7DD9x9y9E[];
extern  VTBL_ENTRY _ZTVN3ccc7DD9x9y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc7DD9x9y9E[];
static VTBL_ENTRY alt_thunk_names1867[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc7DD9x9y93pqrEv,_ZTv0_n16_N3ccc7DD9x9y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y93pqrEv,_ZThn4_N3ccc7DD9x9y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc7DD9x9y93efgEv,_ZTv0_n12_N3ccc7DD9x9y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc7DD9x9y93efgEv,_ZThn4_N3ccc7DD9x9y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc7DD9x9y9E = {  "_ZN3ccc7DD9x9y9E", // class name
  bases__ZN3ccc7DD9x9y9E, 2,
  &(vtc__ZN3ccc7DD9x9y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc7DD9x9y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc7DD9x9y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc7DD9x9y9E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc7DD9x9y9E),3, //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  CC9x9y10  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC9x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x9y103abcEv
  ~CC9x9y10(); // tgen
  CC9x9y10(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y10E) C1{ VBC2{ v3 v1} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x9y103pqrEv");}
void  ccc::CC9x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x9y103abcEv");}
ccc::CC9x9y10 ::~CC9x9y10(){ note_dtor("_ZN3ccc8CC9x9y10E", this);} // tgen
ccc::CC9x9y10 ::CC9x9y10(){ note_ctor("_ZN3ccc8CC9x9y10E", this);} // tgen
}
static void Test__ZN3ccc8CC9x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x9y10E, buf);
    ::ccc::CC9x9y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x9y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC9x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x9y10E);
    dp->::ccc::CC9x9y10::~CC9x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x9y10E(Test__ZN3ccc8CC9x9y10E, "_ZN3ccc8CC9x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x9y10C1Ev();
extern void _ZN3ccc8CC9x9y10D1Ev();
Name_Map name_map__ZN3ccc8CC9x9y10E[] = {
  NSPAIR(_ZN3ccc8CC9x9y10C1Ev),
  NSPAIR(_ZN3ccc8CC9x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC9x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x9y10E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC9x9y103pqrEv();
extern void _ZN3ccc8CC9x9y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x9y103pqrEv,_ZTv0_n16_N3ccc8CC9x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y103pqrEv,_ZThn4_N3ccc8CC9x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x9y103pqrEv,_ZTv0_n16_N3ccc8CC9x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x9y10E[] = {
  {&(_ZTVN3ccc8CC9x9y10E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x9y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x9y10E[];
static VTBL_ENTRY alt_thunk_names1868[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x9y103pqrEv,_ZTv0_n16_N3ccc8CC9x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x9y103pqrEv,_ZThn4_N3ccc8CC9x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x9y10E = {  "_ZN3ccc8CC9x9y10E", // class name
  bases__ZN3ccc8CC9x9y10E, 2,
  &(vtc__ZN3ccc8CC9x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x9y10E),2, //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  DD9x9y10  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD9x9y103pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x9y103abcEv
  ~DD9x9y10(); // tgen
  DD9x9y10(); // tgen
};
//SIG(1 _ZN3ccc8DD9x9y10E) C1{ VBC2{ v3 v1} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x9y10 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x9y103pqrEv");}
void  ccc::DD9x9y10 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x9y103abcEv");}
ccc::DD9x9y10 ::~DD9x9y10(){ note_dtor("_ZN3ccc8DD9x9y10E", this);} // tgen
ccc::DD9x9y10 ::DD9x9y10(){ note_ctor("_ZN3ccc8DD9x9y10E", this);} // tgen
}
static void Test__ZN3ccc8DD9x9y10E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x9y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x9y10E, buf);
    ::ccc::DD9x9y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x9y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x9y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x9y10E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD9x9y10E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x9y10E);
    dp->::ccc::DD9x9y10::~DD9x9y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x9y10E(Test__ZN3ccc8DD9x9y10E, "_ZN3ccc8DD9x9y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x9y10C1Ev();
extern void _ZN3ccc8DD9x9y10D1Ev();
Name_Map name_map__ZN3ccc8DD9x9y10E[] = {
  NSPAIR(_ZN3ccc8DD9x9y10C1Ev),
  NSPAIR(_ZN3ccc8DD9x9y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD9x9y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x9y103pqrEv();
extern void _ZN3ccc8DD9x9y103abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x9y103pqrEv,_ZTv0_n16_N3ccc8DD9x9y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x9y103pqrEv,_ZThn4_N3ccc8DD9x9y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x9y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x9y103pqrEv,_ZTv0_n16_N3ccc8DD9x9y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x9y10E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x9y10E[] = {
  {&(_ZTVN3ccc8DD9x9y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x9y10E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x9y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y10E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x9y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x9y10E[];
static VTBL_ENTRY alt_thunk_names1869[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x9y103pqrEv,_ZTv0_n16_N3ccc8DD9x9y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x9y103pqrEv,_ZThn4_N3ccc8DD9x9y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x9y10E = {  "_ZN3ccc8DD9x9y10E", // class name
  bases__ZN3ccc8DD9x9y10E, 2,
  &(vtc__ZN3ccc8DD9x9y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x9y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x9y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x9y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x9y10E),3, //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  CC9x9y11  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC9x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x9y113efgEv
  ~CC9x9y11(); // tgen
  CC9x9y11(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y11E) C1{ VBC2{ v2 v1} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x9y113pqrEv");}
void  ccc::CC9x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x9y113efgEv");}
ccc::CC9x9y11 ::~CC9x9y11(){ note_dtor("_ZN3ccc8CC9x9y11E", this);} // tgen
ccc::CC9x9y11 ::CC9x9y11(){ note_ctor("_ZN3ccc8CC9x9y11E", this);} // tgen
}
static void Test__ZN3ccc8CC9x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x9y11E, buf);
    ::ccc::CC9x9y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x9y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC9x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x9y11E);
    dp->::ccc::CC9x9y11::~CC9x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x9y11E(Test__ZN3ccc8CC9x9y11E, "_ZN3ccc8CC9x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x9y11C1Ev();
extern void _ZN3ccc8CC9x9y11D1Ev();
Name_Map name_map__ZN3ccc8CC9x9y11E[] = {
  NSPAIR(_ZN3ccc8CC9x9y11C1Ev),
  NSPAIR(_ZN3ccc8CC9x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC9x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x9y11E[];
extern void _ZN3ccc8CC9x9y113efgEv();
extern void _ZN3ccc8CC9x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x9y113efgEv,_ZTv0_n12_N3ccc8CC9x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y113efgEv,_ZThn4_N3ccc8CC9x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x9y113pqrEv,_ZTv0_n16_N3ccc8CC9x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y113pqrEv,_ZThn4_N3ccc8CC9x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x9y113efgEv,_ZTv0_n12_N3ccc8CC9x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x9y113pqrEv,_ZTv0_n16_N3ccc8CC9x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x9y11E[] = {
  {&(_ZTVN3ccc8CC9x9y11E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x9y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x9y11E[];
static VTBL_ENTRY alt_thunk_names1870[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x9y113pqrEv,_ZTv0_n16_N3ccc8CC9x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x9y113pqrEv,_ZThn4_N3ccc8CC9x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x9y113efgEv,_ZTv0_n12_N3ccc8CC9x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x9y113efgEv,_ZThn4_N3ccc8CC9x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x9y11E = {  "_ZN3ccc8CC9x9y11E", // class name
  bases__ZN3ccc8CC9x9y11E, 2,
  &(vtc__ZN3ccc8CC9x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x9y11E),2, //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  DD9x9y11  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD9x9y113pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x9y113efgEv
  ~DD9x9y11(); // tgen
  DD9x9y11(); // tgen
};
//SIG(1 _ZN3ccc8DD9x9y11E) C1{ VBC2{ v2 v1} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x9y11 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x9y113pqrEv");}
void  ccc::DD9x9y11 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x9y113efgEv");}
ccc::DD9x9y11 ::~DD9x9y11(){ note_dtor("_ZN3ccc8DD9x9y11E", this);} // tgen
ccc::DD9x9y11 ::DD9x9y11(){ note_ctor("_ZN3ccc8DD9x9y11E", this);} // tgen
}
static void Test__ZN3ccc8DD9x9y11E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x9y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x9y11E, buf);
    ::ccc::DD9x9y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x9y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x9y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x9y11E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD9x9y11E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x9y11E);
    dp->::ccc::DD9x9y11::~DD9x9y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x9y11E(Test__ZN3ccc8DD9x9y11E, "_ZN3ccc8DD9x9y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x9y11C1Ev();
extern void _ZN3ccc8DD9x9y11D1Ev();
Name_Map name_map__ZN3ccc8DD9x9y11E[] = {
  NSPAIR(_ZN3ccc8DD9x9y11C1Ev),
  NSPAIR(_ZN3ccc8DD9x9y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD9x9y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y11E[];
extern void _ZN3ccc8DD9x9y113efgEv();
extern void _ZN3ccc8DD9x9y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x9y113efgEv,_ZTv0_n12_N3ccc8DD9x9y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x9y113efgEv,_ZThn4_N3ccc8DD9x9y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x9y113pqrEv,_ZTv0_n16_N3ccc8DD9x9y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x9y113pqrEv,_ZThn4_N3ccc8DD9x9y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x9y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x9y113efgEv,_ZTv0_n12_N3ccc8DD9x9y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x9y113pqrEv,_ZTv0_n16_N3ccc8DD9x9y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x9y11E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x9y11E[] = {
  {&(_ZTVN3ccc8DD9x9y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y11E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y11E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y11E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x9y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x9y11E[];
static VTBL_ENTRY alt_thunk_names1871[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x9y113pqrEv,_ZTv0_n16_N3ccc8DD9x9y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x9y113pqrEv,_ZThn4_N3ccc8DD9x9y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x9y113efgEv,_ZTv0_n12_N3ccc8DD9x9y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x9y113efgEv,_ZThn4_N3ccc8DD9x9y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x9y11E = {  "_ZN3ccc8DD9x9y11E", // class name
  bases__ZN3ccc8DD9x9y11E, 2,
  &(vtc__ZN3ccc8DD9x9y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x9y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x9y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x9y11E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x9y11E),3, //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  CC9x9y12  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8CC9x9y123abcEv
  ~CC9x9y12(); // tgen
  CC9x9y12(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y12E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC9x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x9y123abcEv");}
ccc::CC9x9y12 ::~CC9x9y12(){ note_dtor("_ZN3ccc8CC9x9y12E", this);} // tgen
ccc::CC9x9y12 ::CC9x9y12(){ note_ctor("_ZN3ccc8CC9x9y12E", this);} // tgen
}
static void Test__ZN3ccc8CC9x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x9y12E, buf);
    ::ccc::CC9x9y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x9y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC9x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x9y12E);
    dp->::ccc::CC9x9y12::~CC9x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x9y12E(Test__ZN3ccc8CC9x9y12E, "_ZN3ccc8CC9x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x9y12C1Ev();
extern void _ZN3ccc8CC9x9y12D1Ev();
Name_Map name_map__ZN3ccc8CC9x9y12E[] = {
  NSPAIR(_ZN3ccc8CC9x9y12C1Ev),
  NSPAIR(_ZN3ccc8CC9x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC9x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x9y12E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc8CC9x9y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x9y12E[] = {
  {&(_ZTVN3ccc8CC9x9y12E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x9y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x9y12E[];
Class_Descriptor cd__ZN3ccc8CC9x9y12E = {  "_ZN3ccc8CC9x9y12E", // class name
  bases__ZN3ccc8CC9x9y12E, 2,
  &(vtc__ZN3ccc8CC9x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x9y12E),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  DD9x9y12  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  abc(); // _ZN3ccc8DD9x9y123abcEv
  ~DD9x9y12(); // tgen
  DD9x9y12(); // tgen
};
//SIG(1 _ZN3ccc8DD9x9y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD9x9y12 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x9y123abcEv");}
ccc::DD9x9y12 ::~DD9x9y12(){ note_dtor("_ZN3ccc8DD9x9y12E", this);} // tgen
ccc::DD9x9y12 ::DD9x9y12(){ note_ctor("_ZN3ccc8DD9x9y12E", this);} // tgen
}
static void Test__ZN3ccc8DD9x9y12E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x9y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x9y12E, buf);
    ::ccc::DD9x9y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x9y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x9y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x9y12E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD9x9y12E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x9y12E);
    dp->::ccc::DD9x9y12::~DD9x9y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x9y12E(Test__ZN3ccc8DD9x9y12E, "_ZN3ccc8DD9x9y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x9y12C1Ev();
extern void _ZN3ccc8DD9x9y12D1Ev();
Name_Map name_map__ZN3ccc8DD9x9y12E[] = {
  NSPAIR(_ZN3ccc8DD9x9y12C1Ev),
  NSPAIR(_ZN3ccc8DD9x9y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD9x9y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x9y123abcEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x9y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x9y12E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x9y12E[] = {
  {&(_ZTVN3ccc8DD9x9y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x9y12E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x9y12E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y12E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x9y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x9y12E[];
Class_Descriptor cd__ZN3ccc8DD9x9y12E = {  "_ZN3ccc8DD9x9y12E", // class name
  bases__ZN3ccc8DD9x9y12E, 2,
  &(vtc__ZN3ccc8DD9x9y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x9y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x9y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x9y12E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x9y12E),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  CC9x9y13  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8CC9x9y133efgEv
  ~CC9x9y13(); // tgen
  CC9x9y13(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y13E) C1{ VBC2{ v1 v2} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC9x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x9y133efgEv");}
ccc::CC9x9y13 ::~CC9x9y13(){ note_dtor("_ZN3ccc8CC9x9y13E", this);} // tgen
ccc::CC9x9y13 ::CC9x9y13(){ note_ctor("_ZN3ccc8CC9x9y13E", this);} // tgen
}
static void Test__ZN3ccc8CC9x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x9y13E, buf);
    ::ccc::CC9x9y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x9y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC9x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x9y13E);
    dp->::ccc::CC9x9y13::~CC9x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x9y13E(Test__ZN3ccc8CC9x9y13E, "_ZN3ccc8CC9x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x9y13C1Ev();
extern void _ZN3ccc8CC9x9y13D1Ev();
Name_Map name_map__ZN3ccc8CC9x9y13E[] = {
  NSPAIR(_ZN3ccc8CC9x9y13C1Ev),
  NSPAIR(_ZN3ccc8CC9x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC9x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x9y13E[];
extern void _ZN3ccc8CC9x9y133efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x9y133efgEv,_ZTv0_n12_N3ccc8CC9x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y133efgEv,_ZThn4_N3ccc8CC9x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x9y133efgEv,_ZTv0_n12_N3ccc8CC9x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x9y13E[] = {
  {&(_ZTVN3ccc8CC9x9y13E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x9y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x9y13E[];
static VTBL_ENTRY alt_thunk_names1872[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x9y133efgEv,_ZTv0_n12_N3ccc8CC9x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x9y133efgEv,_ZThn4_N3ccc8CC9x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x9y13E = {  "_ZN3ccc8CC9x9y13E", // class name
  bases__ZN3ccc8CC9x9y13E, 2,
  &(vtc__ZN3ccc8CC9x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x9y13E),2, //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  DD9x9y13  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  efg(); // _ZN3ccc8DD9x9y133efgEv
  ~DD9x9y13(); // tgen
  DD9x9y13(); // tgen
};
//SIG(1 _ZN3ccc8DD9x9y13E) C1{ VBC2{ v1 v2} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD9x9y13 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x9y133efgEv");}
ccc::DD9x9y13 ::~DD9x9y13(){ note_dtor("_ZN3ccc8DD9x9y13E", this);} // tgen
ccc::DD9x9y13 ::DD9x9y13(){ note_ctor("_ZN3ccc8DD9x9y13E", this);} // tgen
}
static void Test__ZN3ccc8DD9x9y13E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x9y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x9y13E, buf);
    ::ccc::DD9x9y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x9y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x9y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x9y13E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD9x9y13E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x9y13E);
    dp->::ccc::DD9x9y13::~DD9x9y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x9y13E(Test__ZN3ccc8DD9x9y13E, "_ZN3ccc8DD9x9y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x9y13C1Ev();
extern void _ZN3ccc8DD9x9y13D1Ev();
Name_Map name_map__ZN3ccc8DD9x9y13E[] = {
  NSPAIR(_ZN3ccc8DD9x9y13C1Ev),
  NSPAIR(_ZN3ccc8DD9x9y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD9x9y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y13E[];
extern void _ZN3ccc8DD9x9y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x9y133efgEv,_ZTv0_n12_N3ccc8DD9x9y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x9y133efgEv,_ZThn4_N3ccc8DD9x9y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x9y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x9y133efgEv,_ZTv0_n12_N3ccc8DD9x9y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x9y13E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x9y13E[] = {
  {&(_ZTVN3ccc8DD9x9y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y13E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y13E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x9y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x9y13E[];
static VTBL_ENTRY alt_thunk_names1873[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x9y133efgEv,_ZTv0_n12_N3ccc8DD9x9y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x9y133efgEv,_ZThn4_N3ccc8DD9x9y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x9y13E = {  "_ZN3ccc8DD9x9y13E", // class name
  bases__ZN3ccc8DD9x9y13E, 2,
  &(vtc__ZN3ccc8DD9x9y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x9y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x9y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x9y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x9y13E),3, //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  CC9x9y14  : virtual ::ccc::AA9 , ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8CC9x9y143pqrEv
  ~CC9x9y14(); // tgen
  CC9x9y14(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y14E) C1{ VBC2{ v2 v1} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC9x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x9y143pqrEv");}
ccc::CC9x9y14 ::~CC9x9y14(){ note_dtor("_ZN3ccc8CC9x9y14E", this);} // tgen
ccc::CC9x9y14 ::CC9x9y14(){ note_ctor("_ZN3ccc8CC9x9y14E", this);} // tgen
}
static void Test__ZN3ccc8CC9x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x9y14E, buf);
    ::ccc::CC9x9y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x9y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC9x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x9y14E);
    dp->::ccc::CC9x9y14::~CC9x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x9y14E(Test__ZN3ccc8CC9x9y14E, "_ZN3ccc8CC9x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x9y14C1Ev();
extern void _ZN3ccc8CC9x9y14D1Ev();
Name_Map name_map__ZN3ccc8CC9x9y14E[] = {
  NSPAIR(_ZN3ccc8CC9x9y14C1Ev),
  NSPAIR(_ZN3ccc8CC9x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC9x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x9y14E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc8CC9x9y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x9y143pqrEv,_ZTv0_n16_N3ccc8CC9x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x9y143pqrEv,_ZThn4_N3ccc8CC9x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x9y143pqrEv,_ZTv0_n16_N3ccc8CC9x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x9y14E[] = {
  {&(_ZTVN3ccc8CC9x9y14E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x9y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x9y14E[];
static VTBL_ENTRY alt_thunk_names1874[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x9y143pqrEv,_ZTv0_n16_N3ccc8CC9x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x9y143pqrEv,_ZThn4_N3ccc8CC9x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x9y14E = {  "_ZN3ccc8CC9x9y14E", // class name
  bases__ZN3ccc8CC9x9y14E, 2,
  &(vtc__ZN3ccc8CC9x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x9y14E),2, //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  DD9x9y14  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  virtual void  pqr(); // _ZN3ccc8DD9x9y143pqrEv
  ~DD9x9y14(); // tgen
  DD9x9y14(); // tgen
};
//SIG(1 _ZN3ccc8DD9x9y14E) C1{ VBC2{ v2 v1} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD9x9y14 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x9y143pqrEv");}
ccc::DD9x9y14 ::~DD9x9y14(){ note_dtor("_ZN3ccc8DD9x9y14E", this);} // tgen
ccc::DD9x9y14 ::DD9x9y14(){ note_ctor("_ZN3ccc8DD9x9y14E", this);} // tgen
}
static void Test__ZN3ccc8DD9x9y14E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x9y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x9y14E, buf);
    ::ccc::DD9x9y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x9y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x9y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x9y14E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD9x9y14E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x9y14E);
    dp->::ccc::DD9x9y14::~DD9x9y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x9y14E(Test__ZN3ccc8DD9x9y14E, "_ZN3ccc8DD9x9y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x9y14C1Ev();
extern void _ZN3ccc8DD9x9y14D1Ev();
Name_Map name_map__ZN3ccc8DD9x9y14E[] = {
  NSPAIR(_ZN3ccc8DD9x9y14C1Ev),
  NSPAIR(_ZN3ccc8DD9x9y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD9x9y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x9y143pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x9y143pqrEv,_ZTv0_n16_N3ccc8DD9x9y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x9y143pqrEv,_ZThn4_N3ccc8DD9x9y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x9y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x9y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x9y143pqrEv,_ZTv0_n16_N3ccc8DD9x9y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x9y14E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x9y14E[] = {
  {&(_ZTVN3ccc8DD9x9y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y14E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y14E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x9y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x9y14E[];
static VTBL_ENTRY alt_thunk_names1875[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x9y143pqrEv,_ZTv0_n16_N3ccc8DD9x9y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x9y143pqrEv,_ZThn4_N3ccc8DD9x9y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x9y14E = {  "_ZN3ccc8DD9x9y14E", // class name
  bases__ZN3ccc8DD9x9y14E, 2,
  &(vtc__ZN3ccc8DD9x9y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x9y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x9y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x9y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x9y14E),3, //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  CC9x9y15  : virtual ::ccc::AA9 , ::ccc::BB9 {
  ~CC9x9y15(); // tgen
  CC9x9y15(); // tgen
};
//SIG(1 _ZN3ccc8CC9x9y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC9x9y15 ::~CC9x9y15(){ note_dtor("_ZN3ccc8CC9x9y15E", this);} // tgen
ccc::CC9x9y15 ::CC9x9y15(){ note_ctor("_ZN3ccc8CC9x9y15E", this);} // tgen
}
static void Test__ZN3ccc8CC9x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x9y15E, buf);
    ::ccc::CC9x9y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x9y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), 0, "_ZN3ccc8CC9x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x9y15E);
    dp->::ccc::CC9x9y15::~CC9x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x9y15E(Test__ZN3ccc8CC9x9y15E, "_ZN3ccc8CC9x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x9y15C1Ev();
extern void _ZN3ccc8CC9x9y15D1Ev();
Name_Map name_map__ZN3ccc8CC9x9y15E[] = {
  NSPAIR(_ZN3ccc8CC9x9y15C1Ev),
  NSPAIR(_ZN3ccc8CC9x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8CC9x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x9y15E[];
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x9y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x9y15E[] = {
  {&(_ZTVN3ccc8CC9x9y15E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x9y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x9y15E[];
Class_Descriptor cd__ZN3ccc8CC9x9y15E = {  "_ZN3ccc8CC9x9y15E", // class name
  bases__ZN3ccc8CC9x9y15E, 2,
  &(vtc__ZN3ccc8CC9x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x9y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x9y15E),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  DD9x9y15  : virtual ::ccc::AA9 , virtual ::ccc::BB9 {
  ~DD9x9y15(); // tgen
  DD9x9y15(); // tgen
};
//SIG(1 _ZN3ccc8DD9x9y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD9x9y15 ::~DD9x9y15(){ note_dtor("_ZN3ccc8DD9x9y15E", this);} // tgen
ccc::DD9x9y15 ::DD9x9y15(){ note_ctor("_ZN3ccc8DD9x9y15E", this);} // tgen
}
static void Test__ZN3ccc8DD9x9y15E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x9y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x9y15E, buf);
    ::ccc::DD9x9y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x9y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x9y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x9y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x9y15E");
    check_base_class_offset(lv, (::ccc::BB9*), ABISELECT(8,4), "_ZN3ccc8DD9x9y15E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x9y15E);
    dp->::ccc::DD9x9y15::~DD9x9y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x9y15E(Test__ZN3ccc8DD9x9y15E, "_ZN3ccc8DD9x9y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x9y15C1Ev();
extern void _ZN3ccc8DD9x9y15D1Ev();
Name_Map name_map__ZN3ccc8DD9x9y15E[] = {
  NSPAIR(_ZN3ccc8DD9x9y15C1Ev),
  NSPAIR(_ZN3ccc8DD9x9y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc3BB9E;
extern VTBL_ENTRY _ZTIN3ccc3BB9E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB9E[];
static Base_Class bases__ZN3ccc8DD9x9y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB9E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc3BB93efgEv();
extern void _ZN3ccc3BB93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x9y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x9y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x9y15E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x9y15E[] = {
  {&(_ZTVN3ccc8DD9x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y15E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x9y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x9y15E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x9y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x9y15E[];
Class_Descriptor cd__ZN3ccc8DD9x9y15E = {  "_ZN3ccc8DD9x9y15E", // class name
  bases__ZN3ccc8DD9x9y15E, 2,
  &(vtc__ZN3ccc8DD9x9y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x9y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x9y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x9y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x9y15E),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  CC9x10y0  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y03pqrEv
  ~CC9x10y0(); // tgen
  CC9x10y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y0E) C1{ VBC2{ v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y03abcEv");}
void  ccc::CC9x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y03efgEv");}
void  ccc::CC9x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y03pqrEv");}
ccc::CC9x10y0 ::~CC9x10y0(){ note_dtor("_ZN3ccc8CC9x10y0E", this);} // tgen
ccc::CC9x10y0 ::CC9x10y0(){ note_ctor("_ZN3ccc8CC9x10y0E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y0E, buf);
    ::ccc::CC9x10y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y0E);
    dp->::ccc::CC9x10y0::~CC9x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y0E(Test__ZN3ccc8CC9x10y0E, "_ZN3ccc8CC9x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y0C1Ev();
extern void _ZN3ccc8CC9x10y0D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y0E[] = {
  NSPAIR(_ZN3ccc8CC9x10y0C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y0E[];
extern void _ZN3ccc8CC9x10y03pqrEv();
extern void _ZN3ccc8CC9x10y03abcEv();
extern void _ZN3ccc8CC9x10y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y03efgEv,_ZTv0_n12_N3ccc8CC9x10y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y03efgEv,_ZThn4_N3ccc8CC9x10y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y03pqrEv,_ZTv0_n16_N3ccc8CC9x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y03pqrEv,_ZThn4_N3ccc8CC9x10y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y03efgEv,_ZTv0_n12_N3ccc8CC9x10y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y03pqrEv,_ZTv0_n16_N3ccc8CC9x10y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y0E[] = {
  {&(_ZTVN3ccc8CC9x10y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y0E[];
static VTBL_ENTRY alt_thunk_names1876[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y03pqrEv,_ZTv0_n16_N3ccc8CC9x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y03pqrEv,_ZThn4_N3ccc8CC9x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y03efgEv,_ZTv0_n12_N3ccc8CC9x10y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y03efgEv,_ZThn4_N3ccc8CC9x10y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y0E = {  "_ZN3ccc8CC9x10y0E", // class name
  bases__ZN3ccc8CC9x10y0E, 2,
  &(vtc__ZN3ccc8CC9x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y0E),2, //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  DD9x10y0  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD9x10y03abcEv
  virtual void  efg(); // _ZN3ccc8DD9x10y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x10y03pqrEv
  ~DD9x10y0(); // tgen
  DD9x10y0(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y0E) C1{ VBC2{ v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x10y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y03abcEv");}
void  ccc::DD9x10y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y03efgEv");}
void  ccc::DD9x10y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y03pqrEv");}
ccc::DD9x10y0 ::~DD9x10y0(){ note_dtor("_ZN3ccc8DD9x10y0E", this);} // tgen
ccc::DD9x10y0 ::DD9x10y0(){ note_ctor("_ZN3ccc8DD9x10y0E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y0E, buf);
    ::ccc::DD9x10y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y0E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y0E);
    dp->::ccc::DD9x10y0::~DD9x10y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y0E(Test__ZN3ccc8DD9x10y0E, "_ZN3ccc8DD9x10y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y0C1Ev();
extern void _ZN3ccc8DD9x10y0D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y0E[] = {
  NSPAIR(_ZN3ccc8DD9x10y0C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y0E[];
extern void _ZN3ccc8DD9x10y03efgEv();
extern void _ZN3ccc8DD9x10y03pqrEv();
extern void _ZN3ccc8DD9x10y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y03pqrEv,_ZTv0_n12_N3ccc8DD9x10y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y03pqrEv,_ZThn4_N3ccc8DD9x10y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y03abcEv,_ZTv0_n16_N3ccc8DD9x10y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y03abcEv,_ZThn4_N3ccc8DD9x10y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y03pqrEv,_ZTv0_n12_N3ccc8DD9x10y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y03abcEv,_ZTv0_n16_N3ccc8DD9x10y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y0E[] = {
  {&(_ZTVN3ccc8DD9x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y0E[];
static VTBL_ENTRY alt_thunk_names1877[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y03abcEv,_ZTv0_n16_N3ccc8DD9x10y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y03abcEv,_ZThn4_N3ccc8DD9x10y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y03pqrEv,_ZTv0_n12_N3ccc8DD9x10y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y03pqrEv,_ZThn4_N3ccc8DD9x10y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y0E = {  "_ZN3ccc8DD9x10y0E", // class name
  bases__ZN3ccc8DD9x10y0E, 2,
  &(vtc__ZN3ccc8DD9x10y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y0E),3, //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  CC9x10y1  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x10y13efgEv
  ~CC9x10y1(); // tgen
  CC9x10y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y1E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y13abcEv");}
void  ccc::CC9x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y13pqrEv");}
void  ccc::CC9x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y13efgEv");}
ccc::CC9x10y1 ::~CC9x10y1(){ note_dtor("_ZN3ccc8CC9x10y1E", this);} // tgen
ccc::CC9x10y1 ::CC9x10y1(){ note_ctor("_ZN3ccc8CC9x10y1E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y1E, buf);
    ::ccc::CC9x10y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y1E);
    dp->::ccc::CC9x10y1::~CC9x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y1E(Test__ZN3ccc8CC9x10y1E, "_ZN3ccc8CC9x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y1C1Ev();
extern void _ZN3ccc8CC9x10y1D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y1E[] = {
  NSPAIR(_ZN3ccc8CC9x10y1C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y1E[];
extern void _ZN3ccc8CC9x10y13pqrEv();
extern void _ZN3ccc8CC9x10y13abcEv();
extern void _ZN3ccc8CC9x10y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y13efgEv,_ZTv0_n12_N3ccc8CC9x10y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y13efgEv,_ZThn4_N3ccc8CC9x10y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y13pqrEv,_ZTv0_n16_N3ccc8CC9x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y13pqrEv,_ZThn4_N3ccc8CC9x10y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y13efgEv,_ZTv0_n12_N3ccc8CC9x10y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y13pqrEv,_ZTv0_n16_N3ccc8CC9x10y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y1E[] = {
  {&(_ZTVN3ccc8CC9x10y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y1E[];
static VTBL_ENTRY alt_thunk_names1878[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y13pqrEv,_ZTv0_n16_N3ccc8CC9x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y13pqrEv,_ZThn4_N3ccc8CC9x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y13efgEv,_ZTv0_n12_N3ccc8CC9x10y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y13efgEv,_ZThn4_N3ccc8CC9x10y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y1E = {  "_ZN3ccc8CC9x10y1E", // class name
  bases__ZN3ccc8CC9x10y1E, 2,
  &(vtc__ZN3ccc8CC9x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y1E),2, //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  DD9x10y1  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD9x10y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x10y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x10y13efgEv
  ~DD9x10y1(); // tgen
  DD9x10y1(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y1E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x10y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y13abcEv");}
void  ccc::DD9x10y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y13pqrEv");}
void  ccc::DD9x10y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y13efgEv");}
ccc::DD9x10y1 ::~DD9x10y1(){ note_dtor("_ZN3ccc8DD9x10y1E", this);} // tgen
ccc::DD9x10y1 ::DD9x10y1(){ note_ctor("_ZN3ccc8DD9x10y1E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y1E, buf);
    ::ccc::DD9x10y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y1E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y1E);
    dp->::ccc::DD9x10y1::~DD9x10y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y1E(Test__ZN3ccc8DD9x10y1E, "_ZN3ccc8DD9x10y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y1C1Ev();
extern void _ZN3ccc8DD9x10y1D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y1E[] = {
  NSPAIR(_ZN3ccc8DD9x10y1C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y1E[];
extern void _ZN3ccc8DD9x10y13efgEv();
extern void _ZN3ccc8DD9x10y13pqrEv();
extern void _ZN3ccc8DD9x10y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y13pqrEv,_ZTv0_n12_N3ccc8DD9x10y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y13pqrEv,_ZThn4_N3ccc8DD9x10y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y13abcEv,_ZTv0_n16_N3ccc8DD9x10y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y13abcEv,_ZThn4_N3ccc8DD9x10y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y13pqrEv,_ZTv0_n12_N3ccc8DD9x10y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y13abcEv,_ZTv0_n16_N3ccc8DD9x10y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y1E[] = {
  {&(_ZTVN3ccc8DD9x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y1E[];
static VTBL_ENTRY alt_thunk_names1879[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y13abcEv,_ZTv0_n16_N3ccc8DD9x10y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y13abcEv,_ZThn4_N3ccc8DD9x10y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y13pqrEv,_ZTv0_n12_N3ccc8DD9x10y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y13pqrEv,_ZThn4_N3ccc8DD9x10y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y1E = {  "_ZN3ccc8DD9x10y1E", // class name
  bases__ZN3ccc8DD9x10y1E, 2,
  &(vtc__ZN3ccc8DD9x10y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y1E),3, //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  CC9x10y2  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y23pqrEv
  ~CC9x10y2(); // tgen
  CC9x10y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y2E) C1{ VBC2{ v1 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y23efgEv");}
void  ccc::CC9x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y23abcEv");}
void  ccc::CC9x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y23pqrEv");}
ccc::CC9x10y2 ::~CC9x10y2(){ note_dtor("_ZN3ccc8CC9x10y2E", this);} // tgen
ccc::CC9x10y2 ::CC9x10y2(){ note_ctor("_ZN3ccc8CC9x10y2E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y2E, buf);
    ::ccc::CC9x10y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y2E);
    dp->::ccc::CC9x10y2::~CC9x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y2E(Test__ZN3ccc8CC9x10y2E, "_ZN3ccc8CC9x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y2C1Ev();
extern void _ZN3ccc8CC9x10y2D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y2E[] = {
  NSPAIR(_ZN3ccc8CC9x10y2C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y2E[];
extern void _ZN3ccc8CC9x10y23pqrEv();
extern void _ZN3ccc8CC9x10y23abcEv();
extern void _ZN3ccc8CC9x10y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y23efgEv,_ZTv0_n12_N3ccc8CC9x10y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y23efgEv,_ZThn4_N3ccc8CC9x10y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y23pqrEv,_ZTv0_n16_N3ccc8CC9x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y23pqrEv,_ZThn4_N3ccc8CC9x10y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y23efgEv,_ZTv0_n12_N3ccc8CC9x10y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y23pqrEv,_ZTv0_n16_N3ccc8CC9x10y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y2E[] = {
  {&(_ZTVN3ccc8CC9x10y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y2E[];
static VTBL_ENTRY alt_thunk_names1880[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y23pqrEv,_ZTv0_n16_N3ccc8CC9x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y23pqrEv,_ZThn4_N3ccc8CC9x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y23efgEv,_ZTv0_n12_N3ccc8CC9x10y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y23efgEv,_ZThn4_N3ccc8CC9x10y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y2E = {  "_ZN3ccc8CC9x10y2E", // class name
  bases__ZN3ccc8CC9x10y2E, 2,
  &(vtc__ZN3ccc8CC9x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y2E),2, //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  DD9x10y2  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD9x10y23efgEv
  virtual void  abc(); // _ZN3ccc8DD9x10y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x10y23pqrEv
  ~DD9x10y2(); // tgen
  DD9x10y2(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y2E) C1{ VBC2{ v1 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x10y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y23efgEv");}
void  ccc::DD9x10y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y23abcEv");}
void  ccc::DD9x10y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y23pqrEv");}
ccc::DD9x10y2 ::~DD9x10y2(){ note_dtor("_ZN3ccc8DD9x10y2E", this);} // tgen
ccc::DD9x10y2 ::DD9x10y2(){ note_ctor("_ZN3ccc8DD9x10y2E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y2E, buf);
    ::ccc::DD9x10y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y2E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y2E);
    dp->::ccc::DD9x10y2::~DD9x10y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y2E(Test__ZN3ccc8DD9x10y2E, "_ZN3ccc8DD9x10y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y2C1Ev();
extern void _ZN3ccc8DD9x10y2D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y2E[] = {
  NSPAIR(_ZN3ccc8DD9x10y2C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y2E[];
extern void _ZN3ccc8DD9x10y23efgEv();
extern void _ZN3ccc8DD9x10y23pqrEv();
extern void _ZN3ccc8DD9x10y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y23pqrEv,_ZTv0_n12_N3ccc8DD9x10y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y23pqrEv,_ZThn4_N3ccc8DD9x10y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y23abcEv,_ZTv0_n16_N3ccc8DD9x10y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y23abcEv,_ZThn4_N3ccc8DD9x10y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y23pqrEv,_ZTv0_n12_N3ccc8DD9x10y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y23abcEv,_ZTv0_n16_N3ccc8DD9x10y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y2E[] = {
  {&(_ZTVN3ccc8DD9x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y2E[];
static VTBL_ENTRY alt_thunk_names1881[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y23abcEv,_ZTv0_n16_N3ccc8DD9x10y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y23abcEv,_ZThn4_N3ccc8DD9x10y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y23pqrEv,_ZTv0_n12_N3ccc8DD9x10y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y23pqrEv,_ZThn4_N3ccc8DD9x10y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y2E = {  "_ZN3ccc8DD9x10y2E", // class name
  bases__ZN3ccc8DD9x10y2E, 2,
  &(vtc__ZN3ccc8DD9x10y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y2E),3, //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  CC9x10y3  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x10y33abcEv
  ~CC9x10y3(); // tgen
  CC9x10y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y3E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y33efgEv");}
void  ccc::CC9x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y33pqrEv");}
void  ccc::CC9x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y33abcEv");}
ccc::CC9x10y3 ::~CC9x10y3(){ note_dtor("_ZN3ccc8CC9x10y3E", this);} // tgen
ccc::CC9x10y3 ::CC9x10y3(){ note_ctor("_ZN3ccc8CC9x10y3E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y3E, buf);
    ::ccc::CC9x10y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y3E);
    dp->::ccc::CC9x10y3::~CC9x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y3E(Test__ZN3ccc8CC9x10y3E, "_ZN3ccc8CC9x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y3C1Ev();
extern void _ZN3ccc8CC9x10y3D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y3E[] = {
  NSPAIR(_ZN3ccc8CC9x10y3C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y3E[];
extern void _ZN3ccc8CC9x10y33pqrEv();
extern void _ZN3ccc8CC9x10y33abcEv();
extern void _ZN3ccc8CC9x10y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y33efgEv,_ZTv0_n12_N3ccc8CC9x10y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y33efgEv,_ZThn4_N3ccc8CC9x10y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y33pqrEv,_ZTv0_n16_N3ccc8CC9x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y33pqrEv,_ZThn4_N3ccc8CC9x10y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y33efgEv,_ZTv0_n12_N3ccc8CC9x10y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y33pqrEv,_ZTv0_n16_N3ccc8CC9x10y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y3E[] = {
  {&(_ZTVN3ccc8CC9x10y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y3E[];
static VTBL_ENTRY alt_thunk_names1882[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y33pqrEv,_ZTv0_n16_N3ccc8CC9x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y33pqrEv,_ZThn4_N3ccc8CC9x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y33efgEv,_ZTv0_n12_N3ccc8CC9x10y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y33efgEv,_ZThn4_N3ccc8CC9x10y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y3E = {  "_ZN3ccc8CC9x10y3E", // class name
  bases__ZN3ccc8CC9x10y3E, 2,
  &(vtc__ZN3ccc8CC9x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y3E),2, //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  DD9x10y3  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD9x10y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x10y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x10y33abcEv
  ~DD9x10y3(); // tgen
  DD9x10y3(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y3E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x10y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y33efgEv");}
void  ccc::DD9x10y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y33pqrEv");}
void  ccc::DD9x10y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y33abcEv");}
ccc::DD9x10y3 ::~DD9x10y3(){ note_dtor("_ZN3ccc8DD9x10y3E", this);} // tgen
ccc::DD9x10y3 ::DD9x10y3(){ note_ctor("_ZN3ccc8DD9x10y3E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y3E, buf);
    ::ccc::DD9x10y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y3E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y3E);
    dp->::ccc::DD9x10y3::~DD9x10y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y3E(Test__ZN3ccc8DD9x10y3E, "_ZN3ccc8DD9x10y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y3C1Ev();
extern void _ZN3ccc8DD9x10y3D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y3E[] = {
  NSPAIR(_ZN3ccc8DD9x10y3C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y3E[];
extern void _ZN3ccc8DD9x10y33efgEv();
extern void _ZN3ccc8DD9x10y33pqrEv();
extern void _ZN3ccc8DD9x10y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y33pqrEv,_ZTv0_n12_N3ccc8DD9x10y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y33pqrEv,_ZThn4_N3ccc8DD9x10y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y33abcEv,_ZTv0_n16_N3ccc8DD9x10y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y33abcEv,_ZThn4_N3ccc8DD9x10y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y33pqrEv,_ZTv0_n12_N3ccc8DD9x10y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y33abcEv,_ZTv0_n16_N3ccc8DD9x10y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y3E[] = {
  {&(_ZTVN3ccc8DD9x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y3E[];
static VTBL_ENTRY alt_thunk_names1883[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y33abcEv,_ZTv0_n16_N3ccc8DD9x10y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y33abcEv,_ZThn4_N3ccc8DD9x10y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y33pqrEv,_ZTv0_n12_N3ccc8DD9x10y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y33pqrEv,_ZThn4_N3ccc8DD9x10y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y3E = {  "_ZN3ccc8DD9x10y3E", // class name
  bases__ZN3ccc8DD9x10y3E, 2,
  &(vtc__ZN3ccc8DD9x10y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y3E),3, //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  CC9x10y4  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC9x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x10y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x10y43efgEv
  ~CC9x10y4(); // tgen
  CC9x10y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y4E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y43pqrEv");}
void  ccc::CC9x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y43abcEv");}
void  ccc::CC9x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y43efgEv");}
ccc::CC9x10y4 ::~CC9x10y4(){ note_dtor("_ZN3ccc8CC9x10y4E", this);} // tgen
ccc::CC9x10y4 ::CC9x10y4(){ note_ctor("_ZN3ccc8CC9x10y4E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y4E, buf);
    ::ccc::CC9x10y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y4E);
    dp->::ccc::CC9x10y4::~CC9x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y4E(Test__ZN3ccc8CC9x10y4E, "_ZN3ccc8CC9x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y4C1Ev();
extern void _ZN3ccc8CC9x10y4D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y4E[] = {
  NSPAIR(_ZN3ccc8CC9x10y4C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y4E[];
extern void _ZN3ccc8CC9x10y43pqrEv();
extern void _ZN3ccc8CC9x10y43abcEv();
extern void _ZN3ccc8CC9x10y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y43efgEv,_ZTv0_n12_N3ccc8CC9x10y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y43efgEv,_ZThn4_N3ccc8CC9x10y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y43pqrEv,_ZTv0_n16_N3ccc8CC9x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y43pqrEv,_ZThn4_N3ccc8CC9x10y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y43efgEv,_ZTv0_n12_N3ccc8CC9x10y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y43pqrEv,_ZTv0_n16_N3ccc8CC9x10y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y4E[] = {
  {&(_ZTVN3ccc8CC9x10y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y4E[];
static VTBL_ENTRY alt_thunk_names1884[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y43pqrEv,_ZTv0_n16_N3ccc8CC9x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y43pqrEv,_ZThn4_N3ccc8CC9x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y43efgEv,_ZTv0_n12_N3ccc8CC9x10y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y43efgEv,_ZThn4_N3ccc8CC9x10y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y4E = {  "_ZN3ccc8CC9x10y4E", // class name
  bases__ZN3ccc8CC9x10y4E, 2,
  &(vtc__ZN3ccc8CC9x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y4E),2, //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  DD9x10y4  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD9x10y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x10y43abcEv
  virtual void  efg(); // _ZN3ccc8DD9x10y43efgEv
  ~DD9x10y4(); // tgen
  DD9x10y4(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y4E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x10y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y43pqrEv");}
void  ccc::DD9x10y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y43abcEv");}
void  ccc::DD9x10y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y43efgEv");}
ccc::DD9x10y4 ::~DD9x10y4(){ note_dtor("_ZN3ccc8DD9x10y4E", this);} // tgen
ccc::DD9x10y4 ::DD9x10y4(){ note_ctor("_ZN3ccc8DD9x10y4E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y4E, buf);
    ::ccc::DD9x10y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y4E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y4E);
    dp->::ccc::DD9x10y4::~DD9x10y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y4E(Test__ZN3ccc8DD9x10y4E, "_ZN3ccc8DD9x10y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y4C1Ev();
extern void _ZN3ccc8DD9x10y4D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y4E[] = {
  NSPAIR(_ZN3ccc8DD9x10y4C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y4E[];
extern void _ZN3ccc8DD9x10y43efgEv();
extern void _ZN3ccc8DD9x10y43pqrEv();
extern void _ZN3ccc8DD9x10y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y43pqrEv,_ZTv0_n12_N3ccc8DD9x10y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y43pqrEv,_ZThn4_N3ccc8DD9x10y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y43abcEv,_ZTv0_n16_N3ccc8DD9x10y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y43abcEv,_ZThn4_N3ccc8DD9x10y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y43pqrEv,_ZTv0_n12_N3ccc8DD9x10y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y43abcEv,_ZTv0_n16_N3ccc8DD9x10y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y4E[] = {
  {&(_ZTVN3ccc8DD9x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y4E[];
static VTBL_ENTRY alt_thunk_names1885[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y43abcEv,_ZTv0_n16_N3ccc8DD9x10y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y43abcEv,_ZThn4_N3ccc8DD9x10y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y43pqrEv,_ZTv0_n12_N3ccc8DD9x10y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y43pqrEv,_ZThn4_N3ccc8DD9x10y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y4E = {  "_ZN3ccc8DD9x10y4E", // class name
  bases__ZN3ccc8DD9x10y4E, 2,
  &(vtc__ZN3ccc8DD9x10y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y4E),3, //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  CC9x10y5  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8CC9x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x10y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x10y53abcEv
  ~CC9x10y5(); // tgen
  CC9x10y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y5E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y53pqrEv");}
void  ccc::CC9x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y53efgEv");}
void  ccc::CC9x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y53abcEv");}
ccc::CC9x10y5 ::~CC9x10y5(){ note_dtor("_ZN3ccc8CC9x10y5E", this);} // tgen
ccc::CC9x10y5 ::CC9x10y5(){ note_ctor("_ZN3ccc8CC9x10y5E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y5E, buf);
    ::ccc::CC9x10y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y5E);
    dp->::ccc::CC9x10y5::~CC9x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y5E(Test__ZN3ccc8CC9x10y5E, "_ZN3ccc8CC9x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y5C1Ev();
extern void _ZN3ccc8CC9x10y5D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y5E[] = {
  NSPAIR(_ZN3ccc8CC9x10y5C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y5E[];
extern void _ZN3ccc8CC9x10y53pqrEv();
extern void _ZN3ccc8CC9x10y53abcEv();
extern void _ZN3ccc8CC9x10y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y53efgEv,_ZTv0_n12_N3ccc8CC9x10y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y53efgEv,_ZThn4_N3ccc8CC9x10y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y53pqrEv,_ZTv0_n16_N3ccc8CC9x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y53pqrEv,_ZThn4_N3ccc8CC9x10y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y53efgEv,_ZTv0_n12_N3ccc8CC9x10y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y53pqrEv,_ZTv0_n16_N3ccc8CC9x10y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y5E[] = {
  {&(_ZTVN3ccc8CC9x10y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y5E[];
static VTBL_ENTRY alt_thunk_names1886[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y53pqrEv,_ZTv0_n16_N3ccc8CC9x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y53pqrEv,_ZThn4_N3ccc8CC9x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y53efgEv,_ZTv0_n12_N3ccc8CC9x10y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y53efgEv,_ZThn4_N3ccc8CC9x10y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y5E = {  "_ZN3ccc8CC9x10y5E", // class name
  bases__ZN3ccc8CC9x10y5E, 2,
  &(vtc__ZN3ccc8CC9x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y5E),2, //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  DD9x10y5  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc8DD9x10y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x10y53efgEv
  virtual void  abc(); // _ZN3ccc8DD9x10y53abcEv
  ~DD9x10y5(); // tgen
  DD9x10y5(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y5E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x10y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y53pqrEv");}
void  ccc::DD9x10y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y53efgEv");}
void  ccc::DD9x10y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y53abcEv");}
ccc::DD9x10y5 ::~DD9x10y5(){ note_dtor("_ZN3ccc8DD9x10y5E", this);} // tgen
ccc::DD9x10y5 ::DD9x10y5(){ note_ctor("_ZN3ccc8DD9x10y5E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y5E, buf);
    ::ccc::DD9x10y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y5E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y5E);
    dp->::ccc::DD9x10y5::~DD9x10y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y5E(Test__ZN3ccc8DD9x10y5E, "_ZN3ccc8DD9x10y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y5C1Ev();
extern void _ZN3ccc8DD9x10y5D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y5E[] = {
  NSPAIR(_ZN3ccc8DD9x10y5C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y5E[];
extern void _ZN3ccc8DD9x10y53efgEv();
extern void _ZN3ccc8DD9x10y53pqrEv();
extern void _ZN3ccc8DD9x10y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y53pqrEv,_ZTv0_n12_N3ccc8DD9x10y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y53pqrEv,_ZThn4_N3ccc8DD9x10y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y53abcEv,_ZTv0_n16_N3ccc8DD9x10y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y53abcEv,_ZThn4_N3ccc8DD9x10y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y53pqrEv,_ZTv0_n12_N3ccc8DD9x10y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y53abcEv,_ZTv0_n16_N3ccc8DD9x10y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y5E[] = {
  {&(_ZTVN3ccc8DD9x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y5E[];
static VTBL_ENTRY alt_thunk_names1887[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y53abcEv,_ZTv0_n16_N3ccc8DD9x10y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y53abcEv,_ZThn4_N3ccc8DD9x10y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y53pqrEv,_ZTv0_n12_N3ccc8DD9x10y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y53pqrEv,_ZThn4_N3ccc8DD9x10y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y5E = {  "_ZN3ccc8DD9x10y5E", // class name
  bases__ZN3ccc8DD9x10y5E, 2,
  &(vtc__ZN3ccc8DD9x10y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y5E),3, //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  CC9x10y6  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x10y63efgEv
  ~CC9x10y6(); // tgen
  CC9x10y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y6E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y63abcEv");}
void  ccc::CC9x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y63efgEv");}
ccc::CC9x10y6 ::~CC9x10y6(){ note_dtor("_ZN3ccc8CC9x10y6E", this);} // tgen
ccc::CC9x10y6 ::CC9x10y6(){ note_ctor("_ZN3ccc8CC9x10y6E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y6E, buf);
    ::ccc::CC9x10y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y6E);
    dp->::ccc::CC9x10y6::~CC9x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y6E(Test__ZN3ccc8CC9x10y6E, "_ZN3ccc8CC9x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y6C1Ev();
extern void _ZN3ccc8CC9x10y6D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y6E[] = {
  NSPAIR(_ZN3ccc8CC9x10y6C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y6E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC9x10y63abcEv();
extern void _ZN3ccc8CC9x10y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y63efgEv,_ZTv0_n12_N3ccc8CC9x10y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y63efgEv,_ZThn4_N3ccc8CC9x10y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y63efgEv,_ZTv0_n12_N3ccc8CC9x10y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y6E[] = {
  {&(_ZTVN3ccc8CC9x10y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y6E[];
static VTBL_ENTRY alt_thunk_names1888[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y63efgEv,_ZTv0_n12_N3ccc8CC9x10y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y63efgEv,_ZThn4_N3ccc8CC9x10y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y6E = {  "_ZN3ccc8CC9x10y6E", // class name
  bases__ZN3ccc8CC9x10y6E, 2,
  &(vtc__ZN3ccc8CC9x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y6E),2, //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  DD9x10y6  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD9x10y63abcEv
  virtual void  efg(); // _ZN3ccc8DD9x10y63efgEv
  ~DD9x10y6(); // tgen
  DD9x10y6(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y6E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x10y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y63abcEv");}
void  ccc::DD9x10y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y63efgEv");}
ccc::DD9x10y6 ::~DD9x10y6(){ note_dtor("_ZN3ccc8DD9x10y6E", this);} // tgen
ccc::DD9x10y6 ::DD9x10y6(){ note_ctor("_ZN3ccc8DD9x10y6E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y6E, buf);
    ::ccc::DD9x10y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y6E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y6E);
    dp->::ccc::DD9x10y6::~DD9x10y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y6E(Test__ZN3ccc8DD9x10y6E, "_ZN3ccc8DD9x10y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y6C1Ev();
extern void _ZN3ccc8DD9x10y6D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y6E[] = {
  NSPAIR(_ZN3ccc8DD9x10y6C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y6E[];
extern void _ZN3ccc8DD9x10y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x10y63abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y63abcEv,_ZTv0_n16_N3ccc8DD9x10y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y63abcEv,_ZThn4_N3ccc8DD9x10y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y63abcEv,_ZTv0_n16_N3ccc8DD9x10y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y6E[] = {
  {&(_ZTVN3ccc8DD9x10y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y6E[];
static VTBL_ENTRY alt_thunk_names1889[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y63abcEv,_ZTv0_n16_N3ccc8DD9x10y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y63abcEv,_ZThn4_N3ccc8DD9x10y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y6E = {  "_ZN3ccc8DD9x10y6E", // class name
  bases__ZN3ccc8DD9x10y6E, 2,
  &(vtc__ZN3ccc8DD9x10y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y6E),3, //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  CC9x10y7  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8CC9x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y73pqrEv
  ~CC9x10y7(); // tgen
  CC9x10y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y7E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y73abcEv");}
void  ccc::CC9x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y73pqrEv");}
ccc::CC9x10y7 ::~CC9x10y7(){ note_dtor("_ZN3ccc8CC9x10y7E", this);} // tgen
ccc::CC9x10y7 ::CC9x10y7(){ note_ctor("_ZN3ccc8CC9x10y7E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y7E, buf);
    ::ccc::CC9x10y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y7E);
    dp->::ccc::CC9x10y7::~CC9x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y7E(Test__ZN3ccc8CC9x10y7E, "_ZN3ccc8CC9x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y7C1Ev();
extern void _ZN3ccc8CC9x10y7D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y7E[] = {
  NSPAIR(_ZN3ccc8CC9x10y7C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y7E[];
extern void _ZN3ccc8CC9x10y73pqrEv();
extern void _ZN3ccc8CC9x10y73abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y73pqrEv,_ZTv0_n16_N3ccc8CC9x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y73pqrEv,_ZThn4_N3ccc8CC9x10y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y73pqrEv,_ZTv0_n16_N3ccc8CC9x10y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y7E[] = {
  {&(_ZTVN3ccc8CC9x10y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x10y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y7E[];
static VTBL_ENTRY alt_thunk_names1890[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y73pqrEv,_ZTv0_n16_N3ccc8CC9x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y73pqrEv,_ZThn4_N3ccc8CC9x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y7E = {  "_ZN3ccc8CC9x10y7E", // class name
  bases__ZN3ccc8CC9x10y7E, 2,
  &(vtc__ZN3ccc8CC9x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y7E),2, //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  DD9x10y7  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc8DD9x10y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x10y73pqrEv
  ~DD9x10y7(); // tgen
  DD9x10y7(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y7E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x10y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y73abcEv");}
void  ccc::DD9x10y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y73pqrEv");}
ccc::DD9x10y7 ::~DD9x10y7(){ note_dtor("_ZN3ccc8DD9x10y7E", this);} // tgen
ccc::DD9x10y7 ::DD9x10y7(){ note_ctor("_ZN3ccc8DD9x10y7E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y7E, buf);
    ::ccc::DD9x10y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y7E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y7E);
    dp->::ccc::DD9x10y7::~DD9x10y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y7E(Test__ZN3ccc8DD9x10y7E, "_ZN3ccc8DD9x10y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y7C1Ev();
extern void _ZN3ccc8DD9x10y7D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y7E[] = {
  NSPAIR(_ZN3ccc8DD9x10y7C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x10y73pqrEv();
extern void _ZN3ccc8DD9x10y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y73pqrEv,_ZTv0_n12_N3ccc8DD9x10y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y73pqrEv,_ZThn4_N3ccc8DD9x10y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y73abcEv,_ZTv0_n16_N3ccc8DD9x10y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y73abcEv,_ZThn4_N3ccc8DD9x10y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y73pqrEv,_ZTv0_n12_N3ccc8DD9x10y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y73abcEv,_ZTv0_n16_N3ccc8DD9x10y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y7E[] = {
  {&(_ZTVN3ccc8DD9x10y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y7E[];
static VTBL_ENTRY alt_thunk_names1891[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y73abcEv,_ZTv0_n16_N3ccc8DD9x10y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y73abcEv,_ZThn4_N3ccc8DD9x10y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y73pqrEv,_ZTv0_n12_N3ccc8DD9x10y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y73pqrEv,_ZThn4_N3ccc8DD9x10y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y7E = {  "_ZN3ccc8DD9x10y7E", // class name
  bases__ZN3ccc8DD9x10y7E, 2,
  &(vtc__ZN3ccc8DD9x10y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y7E),3, //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  CC9x10y8  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x10y83abcEv
  ~CC9x10y8(); // tgen
  CC9x10y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y8E) C1{ VBC2{ v1 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y83efgEv");}
void  ccc::CC9x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x10y83abcEv");}
ccc::CC9x10y8 ::~CC9x10y8(){ note_dtor("_ZN3ccc8CC9x10y8E", this);} // tgen
ccc::CC9x10y8 ::CC9x10y8(){ note_ctor("_ZN3ccc8CC9x10y8E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y8E, buf);
    ::ccc::CC9x10y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y8E);
    dp->::ccc::CC9x10y8::~CC9x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y8E(Test__ZN3ccc8CC9x10y8E, "_ZN3ccc8CC9x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y8C1Ev();
extern void _ZN3ccc8CC9x10y8D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y8E[] = {
  NSPAIR(_ZN3ccc8CC9x10y8C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y8E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc8CC9x10y83abcEv();
extern void _ZN3ccc8CC9x10y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y83efgEv,_ZTv0_n12_N3ccc8CC9x10y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y83efgEv,_ZThn4_N3ccc8CC9x10y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y83efgEv,_ZTv0_n12_N3ccc8CC9x10y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y8E[] = {
  {&(_ZTVN3ccc8CC9x10y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y8E[];
static VTBL_ENTRY alt_thunk_names1892[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y83efgEv,_ZTv0_n12_N3ccc8CC9x10y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y83efgEv,_ZThn4_N3ccc8CC9x10y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y8E = {  "_ZN3ccc8CC9x10y8E", // class name
  bases__ZN3ccc8CC9x10y8E, 2,
  &(vtc__ZN3ccc8CC9x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y8E),2, //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  DD9x10y8  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD9x10y83efgEv
  virtual void  abc(); // _ZN3ccc8DD9x10y83abcEv
  ~DD9x10y8(); // tgen
  DD9x10y8(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y8E) C1{ VBC2{ v1 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x10y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y83efgEv");}
void  ccc::DD9x10y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x10y83abcEv");}
ccc::DD9x10y8 ::~DD9x10y8(){ note_dtor("_ZN3ccc8DD9x10y8E", this);} // tgen
ccc::DD9x10y8 ::DD9x10y8(){ note_ctor("_ZN3ccc8DD9x10y8E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y8E, buf);
    ::ccc::DD9x10y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y8E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y8E);
    dp->::ccc::DD9x10y8::~DD9x10y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y8E(Test__ZN3ccc8DD9x10y8E, "_ZN3ccc8DD9x10y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y8C1Ev();
extern void _ZN3ccc8DD9x10y8D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y8E[] = {
  NSPAIR(_ZN3ccc8DD9x10y8C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y8E[];
extern void _ZN3ccc8DD9x10y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x10y83abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x10y83abcEv,_ZTv0_n16_N3ccc8DD9x10y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y83abcEv,_ZThn4_N3ccc8DD9x10y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x10y83abcEv,_ZTv0_n16_N3ccc8DD9x10y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y8E[] = {
  {&(_ZTVN3ccc8DD9x10y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x10y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y8E[];
static VTBL_ENTRY alt_thunk_names1893[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x10y83abcEv,_ZTv0_n16_N3ccc8DD9x10y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y83abcEv,_ZThn4_N3ccc8DD9x10y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y8E = {  "_ZN3ccc8DD9x10y8E", // class name
  bases__ZN3ccc8DD9x10y8E, 2,
  &(vtc__ZN3ccc8DD9x10y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y8E),3, //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  CC9x10y9  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8CC9x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x10y93pqrEv
  ~CC9x10y9(); // tgen
  CC9x10y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x10y9E) C1{ VBC2{ v1 v2} BC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x10y93efgEv");}
void  ccc::CC9x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x10y93pqrEv");}
ccc::CC9x10y9 ::~CC9x10y9(){ note_dtor("_ZN3ccc8CC9x10y9E", this);} // tgen
ccc::CC9x10y9 ::CC9x10y9(){ note_ctor("_ZN3ccc8CC9x10y9E", this);} // tgen
}
static void Test__ZN3ccc8CC9x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x10y9E, buf);
    ::ccc::CC9x10y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x10y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc8CC9x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x10y9E);
    dp->::ccc::CC9x10y9::~CC9x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x10y9E(Test__ZN3ccc8CC9x10y9E, "_ZN3ccc8CC9x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x10y9C1Ev();
extern void _ZN3ccc8CC9x10y9D1Ev();
Name_Map name_map__ZN3ccc8CC9x10y9E[] = {
  NSPAIR(_ZN3ccc8CC9x10y9C1Ev),
  NSPAIR(_ZN3ccc8CC9x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8CC9x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x10y9E[];
extern void _ZN3ccc8CC9x10y93pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc8CC9x10y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x10y93efgEv,_ZTv0_n12_N3ccc8CC9x10y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y93efgEv,_ZThn4_N3ccc8CC9x10y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x10y93pqrEv,_ZTv0_n16_N3ccc8CC9x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x10y93pqrEv,_ZThn4_N3ccc8CC9x10y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x10y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x10y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x10y93efgEv,_ZTv0_n12_N3ccc8CC9x10y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x10y93pqrEv,_ZTv0_n16_N3ccc8CC9x10y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x10y9E[] = {
  {&(_ZTVN3ccc8CC9x10y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x10y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x10y9E[];
static VTBL_ENTRY alt_thunk_names1894[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x10y93pqrEv,_ZTv0_n16_N3ccc8CC9x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y93pqrEv,_ZThn4_N3ccc8CC9x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x10y93efgEv,_ZTv0_n12_N3ccc8CC9x10y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x10y93efgEv,_ZThn4_N3ccc8CC9x10y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x10y9E = {  "_ZN3ccc8CC9x10y9E", // class name
  bases__ZN3ccc8CC9x10y9E, 2,
  &(vtc__ZN3ccc8CC9x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x10y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x10y9E),2, //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  DD9x10y9  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc8DD9x10y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x10y93pqrEv
  ~DD9x10y9(); // tgen
  DD9x10y9(); // tgen
};
//SIG(1 _ZN3ccc8DD9x10y9E) C1{ VBC2{ v1 v2} VBC3{ v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x10y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x10y93efgEv");}
void  ccc::DD9x10y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x10y93pqrEv");}
ccc::DD9x10y9 ::~DD9x10y9(){ note_dtor("_ZN3ccc8DD9x10y9E", this);} // tgen
ccc::DD9x10y9 ::DD9x10y9(){ note_ctor("_ZN3ccc8DD9x10y9E", this);} // tgen
}
static void Test__ZN3ccc8DD9x10y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x10y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x10y9E, buf);
    ::ccc::DD9x10y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x10y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x10y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x10y9E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc8DD9x10y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x10y9E);
    dp->::ccc::DD9x10y9::~DD9x10y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x10y9E(Test__ZN3ccc8DD9x10y9E, "_ZN3ccc8DD9x10y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x10y9C1Ev();
extern void _ZN3ccc8DD9x10y9D1Ev();
Name_Map name_map__ZN3ccc8DD9x10y9E[] = {
  NSPAIR(_ZN3ccc8DD9x10y9C1Ev),
  NSPAIR(_ZN3ccc8DD9x10y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc8DD9x10y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y9E[];
extern void _ZN3ccc8DD9x10y93efgEv();
extern void _ZN3ccc8DD9x10y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x10y93pqrEv,_ZTv0_n12_N3ccc8DD9x10y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x10y93pqrEv,_ZThn4_N3ccc8DD9x10y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x10y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x10y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x10y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x10y93pqrEv,_ZTv0_n12_N3ccc8DD9x10y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x10y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x10y9E[] = {
  {&(_ZTVN3ccc8DD9x10y9E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x10y9E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x10y9E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x10y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x10y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x10y9E[];
static VTBL_ENTRY alt_thunk_names1895[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x10y93pqrEv,_ZTv0_n12_N3ccc8DD9x10y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x10y93pqrEv,_ZThn4_N3ccc8DD9x10y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x10y9E = {  "_ZN3ccc8DD9x10y9E", // class name
  bases__ZN3ccc8DD9x10y9E, 2,
  &(vtc__ZN3ccc8DD9x10y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x10y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x10y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x10y9E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x10y9E),3, //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  CC9x10y10  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC9x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x10y103abcEv
  ~CC9x10y10(); // tgen
  CC9x10y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y10E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x10y103pqrEv");}
void  ccc::CC9x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x10y103abcEv");}
ccc::CC9x10y10 ::~CC9x10y10(){ note_dtor("_ZN3ccc9CC9x10y10E", this);} // tgen
ccc::CC9x10y10 ::CC9x10y10(){ note_ctor("_ZN3ccc9CC9x10y10E", this);} // tgen
}
static void Test__ZN3ccc9CC9x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x10y10E, buf);
    ::ccc::CC9x10y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x10y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC9x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x10y10E);
    dp->::ccc::CC9x10y10::~CC9x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x10y10E(Test__ZN3ccc9CC9x10y10E, "_ZN3ccc9CC9x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x10y10C1Ev();
extern void _ZN3ccc9CC9x10y10D1Ev();
Name_Map name_map__ZN3ccc9CC9x10y10E[] = {
  NSPAIR(_ZN3ccc9CC9x10y10C1Ev),
  NSPAIR(_ZN3ccc9CC9x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC9x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x10y10E[];
extern void _ZN3ccc9CC9x10y103pqrEv();
extern void _ZN3ccc9CC9x10y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x10y103pqrEv,_ZTv0_n16_N3ccc9CC9x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y103pqrEv,_ZThn4_N3ccc9CC9x10y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x10y103pqrEv,_ZTv0_n16_N3ccc9CC9x10y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x10y10E[] = {
  {&(_ZTVN3ccc9CC9x10y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x10y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x10y10E[];
static VTBL_ENTRY alt_thunk_names1896[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x10y103pqrEv,_ZTv0_n16_N3ccc9CC9x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x10y103pqrEv,_ZThn4_N3ccc9CC9x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x10y10E = {  "_ZN3ccc9CC9x10y10E", // class name
  bases__ZN3ccc9CC9x10y10E, 2,
  &(vtc__ZN3ccc9CC9x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x10y10E),2, //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  DD9x10y10  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD9x10y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD9x10y103abcEv
  ~DD9x10y10(); // tgen
  DD9x10y10(); // tgen
};
//SIG(1 _ZN3ccc9DD9x10y10E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x10y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x10y103pqrEv");}
void  ccc::DD9x10y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x10y103abcEv");}
ccc::DD9x10y10 ::~DD9x10y10(){ note_dtor("_ZN3ccc9DD9x10y10E", this);} // tgen
ccc::DD9x10y10 ::DD9x10y10(){ note_ctor("_ZN3ccc9DD9x10y10E", this);} // tgen
}
static void Test__ZN3ccc9DD9x10y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x10y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x10y10E, buf);
    ::ccc::DD9x10y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x10y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x10y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x10y10E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD9x10y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x10y10E);
    dp->::ccc::DD9x10y10::~DD9x10y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x10y10E(Test__ZN3ccc9DD9x10y10E, "_ZN3ccc9DD9x10y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x10y10C1Ev();
extern void _ZN3ccc9DD9x10y10D1Ev();
Name_Map name_map__ZN3ccc9DD9x10y10E[] = {
  NSPAIR(_ZN3ccc9DD9x10y10C1Ev),
  NSPAIR(_ZN3ccc9DD9x10y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD9x10y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x10y103pqrEv();
extern void _ZN3ccc9DD9x10y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x10y103pqrEv,_ZTv0_n12_N3ccc9DD9x10y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x10y103pqrEv,_ZThn4_N3ccc9DD9x10y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD9x10y103abcEv,_ZTv0_n16_N3ccc9DD9x10y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x10y103abcEv,_ZThn4_N3ccc9DD9x10y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x10y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x10y103pqrEv,_ZTv0_n12_N3ccc9DD9x10y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD9x10y103abcEv,_ZTv0_n16_N3ccc9DD9x10y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x10y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x10y10E[] = {
  {&(_ZTVN3ccc9DD9x10y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x10y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x10y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x10y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x10y10E[];
static VTBL_ENTRY alt_thunk_names1897[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD9x10y103abcEv,_ZTv0_n16_N3ccc9DD9x10y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x10y103abcEv,_ZThn4_N3ccc9DD9x10y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x10y103pqrEv,_ZTv0_n12_N3ccc9DD9x10y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x10y103pqrEv,_ZThn4_N3ccc9DD9x10y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x10y10E = {  "_ZN3ccc9DD9x10y10E", // class name
  bases__ZN3ccc9DD9x10y10E, 2,
  &(vtc__ZN3ccc9DD9x10y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x10y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x10y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x10y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x10y10E),3, //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  CC9x10y11  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC9x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x10y113efgEv
  ~CC9x10y11(); // tgen
  CC9x10y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y11E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x10y113pqrEv");}
void  ccc::CC9x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x10y113efgEv");}
ccc::CC9x10y11 ::~CC9x10y11(){ note_dtor("_ZN3ccc9CC9x10y11E", this);} // tgen
ccc::CC9x10y11 ::CC9x10y11(){ note_ctor("_ZN3ccc9CC9x10y11E", this);} // tgen
}
static void Test__ZN3ccc9CC9x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x10y11E, buf);
    ::ccc::CC9x10y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x10y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC9x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x10y11E);
    dp->::ccc::CC9x10y11::~CC9x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x10y11E(Test__ZN3ccc9CC9x10y11E, "_ZN3ccc9CC9x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x10y11C1Ev();
extern void _ZN3ccc9CC9x10y11D1Ev();
Name_Map name_map__ZN3ccc9CC9x10y11E[] = {
  NSPAIR(_ZN3ccc9CC9x10y11C1Ev),
  NSPAIR(_ZN3ccc9CC9x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC9x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x10y11E[];
extern void _ZN3ccc9CC9x10y113pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC9x10y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x10y113efgEv,_ZTv0_n12_N3ccc9CC9x10y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y113efgEv,_ZThn4_N3ccc9CC9x10y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x10y113pqrEv,_ZTv0_n16_N3ccc9CC9x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y113pqrEv,_ZThn4_N3ccc9CC9x10y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x10y113efgEv,_ZTv0_n12_N3ccc9CC9x10y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x10y113pqrEv,_ZTv0_n16_N3ccc9CC9x10y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x10y11E[] = {
  {&(_ZTVN3ccc9CC9x10y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC9x10y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x10y11E[];
static VTBL_ENTRY alt_thunk_names1898[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x10y113pqrEv,_ZTv0_n16_N3ccc9CC9x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x10y113pqrEv,_ZThn4_N3ccc9CC9x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x10y113efgEv,_ZTv0_n12_N3ccc9CC9x10y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x10y113efgEv,_ZThn4_N3ccc9CC9x10y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x10y11E = {  "_ZN3ccc9CC9x10y11E", // class name
  bases__ZN3ccc9CC9x10y11E, 2,
  &(vtc__ZN3ccc9CC9x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x10y11E),2, //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  DD9x10y11  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD9x10y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD9x10y113efgEv
  ~DD9x10y11(); // tgen
  DD9x10y11(); // tgen
};
//SIG(1 _ZN3ccc9DD9x10y11E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x10y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x10y113pqrEv");}
void  ccc::DD9x10y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x10y113efgEv");}
ccc::DD9x10y11 ::~DD9x10y11(){ note_dtor("_ZN3ccc9DD9x10y11E", this);} // tgen
ccc::DD9x10y11 ::DD9x10y11(){ note_ctor("_ZN3ccc9DD9x10y11E", this);} // tgen
}
static void Test__ZN3ccc9DD9x10y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x10y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x10y11E, buf);
    ::ccc::DD9x10y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x10y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x10y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x10y11E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD9x10y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x10y11E);
    dp->::ccc::DD9x10y11::~DD9x10y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x10y11E(Test__ZN3ccc9DD9x10y11E, "_ZN3ccc9DD9x10y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x10y11C1Ev();
extern void _ZN3ccc9DD9x10y11D1Ev();
Name_Map name_map__ZN3ccc9DD9x10y11E[] = {
  NSPAIR(_ZN3ccc9DD9x10y11C1Ev),
  NSPAIR(_ZN3ccc9DD9x10y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD9x10y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y11E[];
extern void _ZN3ccc9DD9x10y113efgEv();
extern void _ZN3ccc9DD9x10y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x10y113pqrEv,_ZTv0_n12_N3ccc9DD9x10y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x10y113pqrEv,_ZThn4_N3ccc9DD9x10y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x10y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x10y113pqrEv,_ZTv0_n12_N3ccc9DD9x10y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x10y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x10y11E[] = {
  {&(_ZTVN3ccc9DD9x10y11E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y11E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y11E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x10y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x10y11E[];
static VTBL_ENTRY alt_thunk_names1899[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x10y113pqrEv,_ZTv0_n12_N3ccc9DD9x10y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x10y113pqrEv,_ZThn4_N3ccc9DD9x10y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x10y11E = {  "_ZN3ccc9DD9x10y11E", // class name
  bases__ZN3ccc9DD9x10y11E, 2,
  &(vtc__ZN3ccc9DD9x10y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x10y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x10y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x10y11E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x10y11E),3, //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  CC9x10y12  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9CC9x10y123abcEv
  ~CC9x10y12(); // tgen
  CC9x10y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y12E) C1{ VBC2{ v2 v3} BC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::CC9x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x10y123abcEv");}
ccc::CC9x10y12 ::~CC9x10y12(){ note_dtor("_ZN3ccc9CC9x10y12E", this);} // tgen
ccc::CC9x10y12 ::CC9x10y12(){ note_ctor("_ZN3ccc9CC9x10y12E", this);} // tgen
}
static void Test__ZN3ccc9CC9x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x10y12E, buf);
    ::ccc::CC9x10y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x10y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC9x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x10y12E);
    dp->::ccc::CC9x10y12::~CC9x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x10y12E(Test__ZN3ccc9CC9x10y12E, "_ZN3ccc9CC9x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x10y12C1Ev();
extern void _ZN3ccc9CC9x10y12D1Ev();
Name_Map name_map__ZN3ccc9CC9x10y12E[] = {
  NSPAIR(_ZN3ccc9CC9x10y12C1Ev),
  NSPAIR(_ZN3ccc9CC9x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC9x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x10y12E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc9CC9x10y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x10y12E[] = {
  {&(_ZTVN3ccc9CC9x10y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x10y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x10y12E[];
Class_Descriptor cd__ZN3ccc9CC9x10y12E = {  "_ZN3ccc9CC9x10y12E", // class name
  bases__ZN3ccc9CC9x10y12E, 2,
  &(vtc__ZN3ccc9CC9x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x10y12E),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  DD9x10y12  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  abc(); // _ZN3ccc9DD9x10y123abcEv
  ~DD9x10y12(); // tgen
  DD9x10y12(); // tgen
};
//SIG(1 _ZN3ccc9DD9x10y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v1} v1}
}
namespace ccc { 
void  ccc::DD9x10y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x10y123abcEv");}
ccc::DD9x10y12 ::~DD9x10y12(){ note_dtor("_ZN3ccc9DD9x10y12E", this);} // tgen
ccc::DD9x10y12 ::DD9x10y12(){ note_ctor("_ZN3ccc9DD9x10y12E", this);} // tgen
}
static void Test__ZN3ccc9DD9x10y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x10y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x10y12E, buf);
    ::ccc::DD9x10y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x10y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x10y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x10y12E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD9x10y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x10y12E);
    dp->::ccc::DD9x10y12::~DD9x10y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x10y12E(Test__ZN3ccc9DD9x10y12E, "_ZN3ccc9DD9x10y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x10y12C1Ev();
extern void _ZN3ccc9DD9x10y12D1Ev();
Name_Map name_map__ZN3ccc9DD9x10y12E[] = {
  NSPAIR(_ZN3ccc9DD9x10y12C1Ev),
  NSPAIR(_ZN3ccc9DD9x10y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD9x10y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9DD9x10y123abcEv();
extern void _ZN3ccc4BB103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD9x10y123abcEv,_ZTv0_n16_N3ccc9DD9x10y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x10y123abcEv,_ZThn4_N3ccc9DD9x10y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x10y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD9x10y123abcEv,_ZTv0_n16_N3ccc9DD9x10y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x10y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x10y12E[] = {
  {&(_ZTVN3ccc9DD9x10y12E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x10y12E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x10y12E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x10y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x10y12E[];
static VTBL_ENTRY alt_thunk_names1900[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD9x10y123abcEv,_ZTv0_n16_N3ccc9DD9x10y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x10y123abcEv,_ZThn4_N3ccc9DD9x10y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x10y12E = {  "_ZN3ccc9DD9x10y12E", // class name
  bases__ZN3ccc9DD9x10y12E, 2,
  &(vtc__ZN3ccc9DD9x10y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x10y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x10y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x10y12E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x10y12E),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  CC9x10y13  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9CC9x10y133efgEv
  ~CC9x10y13(); // tgen
  CC9x10y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y13E) C1{ VBC2{ v1 v2} BC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::CC9x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x10y133efgEv");}
ccc::CC9x10y13 ::~CC9x10y13(){ note_dtor("_ZN3ccc9CC9x10y13E", this);} // tgen
ccc::CC9x10y13 ::CC9x10y13(){ note_ctor("_ZN3ccc9CC9x10y13E", this);} // tgen
}
static void Test__ZN3ccc9CC9x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x10y13E, buf);
    ::ccc::CC9x10y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x10y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC9x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x10y13E);
    dp->::ccc::CC9x10y13::~CC9x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x10y13E(Test__ZN3ccc9CC9x10y13E, "_ZN3ccc9CC9x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x10y13C1Ev();
extern void _ZN3ccc9CC9x10y13D1Ev();
Name_Map name_map__ZN3ccc9CC9x10y13E[] = {
  NSPAIR(_ZN3ccc9CC9x10y13C1Ev),
  NSPAIR(_ZN3ccc9CC9x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC9x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x10y13E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc9CC9x10y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x10y133efgEv,_ZTv0_n12_N3ccc9CC9x10y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y133efgEv,_ZThn4_N3ccc9CC9x10y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x10y133efgEv,_ZTv0_n12_N3ccc9CC9x10y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x10y13E[] = {
  {&(_ZTVN3ccc9CC9x10y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC9x10y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x10y13E[];
static VTBL_ENTRY alt_thunk_names1901[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x10y133efgEv,_ZTv0_n12_N3ccc9CC9x10y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x10y133efgEv,_ZThn4_N3ccc9CC9x10y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x10y13E = {  "_ZN3ccc9CC9x10y13E", // class name
  bases__ZN3ccc9CC9x10y13E, 2,
  &(vtc__ZN3ccc9CC9x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x10y13E),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  DD9x10y13  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  efg(); // _ZN3ccc9DD9x10y133efgEv
  ~DD9x10y13(); // tgen
  DD9x10y13(); // tgen
};
//SIG(1 _ZN3ccc9DD9x10y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v4} v1}
}
namespace ccc { 
void  ccc::DD9x10y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x10y133efgEv");}
ccc::DD9x10y13 ::~DD9x10y13(){ note_dtor("_ZN3ccc9DD9x10y13E", this);} // tgen
ccc::DD9x10y13 ::DD9x10y13(){ note_ctor("_ZN3ccc9DD9x10y13E", this);} // tgen
}
static void Test__ZN3ccc9DD9x10y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x10y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x10y13E, buf);
    ::ccc::DD9x10y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x10y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x10y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x10y13E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD9x10y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x10y13E);
    dp->::ccc::DD9x10y13::~DD9x10y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x10y13E(Test__ZN3ccc9DD9x10y13E, "_ZN3ccc9DD9x10y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x10y13C1Ev();
extern void _ZN3ccc9DD9x10y13D1Ev();
Name_Map name_map__ZN3ccc9DD9x10y13E[] = {
  NSPAIR(_ZN3ccc9DD9x10y13C1Ev),
  NSPAIR(_ZN3ccc9DD9x10y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD9x10y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y13E[];
extern void _ZN3ccc9DD9x10y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x10y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x10y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x10y13E[] = {
  {&(_ZTVN3ccc9DD9x10y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x10y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x10y13E[];
Class_Descriptor cd__ZN3ccc9DD9x10y13E = {  "_ZN3ccc9DD9x10y13E", // class name
  bases__ZN3ccc9DD9x10y13E, 2,
  &(vtc__ZN3ccc9DD9x10y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x10y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x10y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x10y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x10y13E),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  CC9x10y14  : virtual ::ccc::AA9 , ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9CC9x10y143pqrEv
  ~CC9x10y14(); // tgen
  CC9x10y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC9x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x10y143pqrEv");}
ccc::CC9x10y14 ::~CC9x10y14(){ note_dtor("_ZN3ccc9CC9x10y14E", this);} // tgen
ccc::CC9x10y14 ::CC9x10y14(){ note_ctor("_ZN3ccc9CC9x10y14E", this);} // tgen
}
static void Test__ZN3ccc9CC9x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x10y14E, buf);
    ::ccc::CC9x10y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x10y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC9x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x10y14E);
    dp->::ccc::CC9x10y14::~CC9x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x10y14E(Test__ZN3ccc9CC9x10y14E, "_ZN3ccc9CC9x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x10y14C1Ev();
extern void _ZN3ccc9CC9x10y14D1Ev();
Name_Map name_map__ZN3ccc9CC9x10y14E[] = {
  NSPAIR(_ZN3ccc9CC9x10y14C1Ev),
  NSPAIR(_ZN3ccc9CC9x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC9x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x10y14E[];
extern void _ZN3ccc9CC9x10y143pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x10y143pqrEv,_ZTv0_n16_N3ccc9CC9x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x10y143pqrEv,_ZThn4_N3ccc9CC9x10y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x10y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x10y143pqrEv,_ZTv0_n16_N3ccc9CC9x10y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x10y14E[] = {
  {&(_ZTVN3ccc9CC9x10y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x10y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x10y14E[];
static VTBL_ENTRY alt_thunk_names1902[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x10y143pqrEv,_ZTv0_n16_N3ccc9CC9x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x10y143pqrEv,_ZThn4_N3ccc9CC9x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x10y14E = {  "_ZN3ccc9CC9x10y14E", // class name
  bases__ZN3ccc9CC9x10y14E, 2,
  &(vtc__ZN3ccc9CC9x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x10y14E),2, //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  DD9x10y14  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  virtual void  pqr(); // _ZN3ccc9DD9x10y143pqrEv
  ~DD9x10y14(); // tgen
  DD9x10y14(); // tgen
};
//SIG(1 _ZN3ccc9DD9x10y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD9x10y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x10y143pqrEv");}
ccc::DD9x10y14 ::~DD9x10y14(){ note_dtor("_ZN3ccc9DD9x10y14E", this);} // tgen
ccc::DD9x10y14 ::DD9x10y14(){ note_ctor("_ZN3ccc9DD9x10y14E", this);} // tgen
}
static void Test__ZN3ccc9DD9x10y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x10y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x10y14E, buf);
    ::ccc::DD9x10y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x10y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x10y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x10y14E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD9x10y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x10y14E);
    dp->::ccc::DD9x10y14::~DD9x10y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x10y14E(Test__ZN3ccc9DD9x10y14E, "_ZN3ccc9DD9x10y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x10y14C1Ev();
extern void _ZN3ccc9DD9x10y14D1Ev();
Name_Map name_map__ZN3ccc9DD9x10y14E[] = {
  NSPAIR(_ZN3ccc9DD9x10y14C1Ev),
  NSPAIR(_ZN3ccc9DD9x10y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD9x10y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x10y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x10y143pqrEv,_ZTv0_n12_N3ccc9DD9x10y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x10y143pqrEv,_ZThn4_N3ccc9DD9x10y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x10y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x10y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x10y143pqrEv,_ZTv0_n12_N3ccc9DD9x10y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x10y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x10y14E[] = {
  {&(_ZTVN3ccc9DD9x10y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x10y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x10y14E[];
static VTBL_ENTRY alt_thunk_names1903[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x10y143pqrEv,_ZTv0_n12_N3ccc9DD9x10y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x10y143pqrEv,_ZThn4_N3ccc9DD9x10y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x10y14E = {  "_ZN3ccc9DD9x10y14E", // class name
  bases__ZN3ccc9DD9x10y14E, 2,
  &(vtc__ZN3ccc9DD9x10y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x10y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x10y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x10y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x10y14E),3, //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  CC9x10y15  : virtual ::ccc::AA9 , ::ccc::BB10 {
  ~CC9x10y15(); // tgen
  CC9x10y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x10y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC9x10y15 ::~CC9x10y15(){ note_dtor("_ZN3ccc9CC9x10y15E", this);} // tgen
ccc::CC9x10y15 ::CC9x10y15(){ note_ctor("_ZN3ccc9CC9x10y15E", this);} // tgen
}
static void Test__ZN3ccc9CC9x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x10y15E, buf);
    ::ccc::CC9x10y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x10y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), 0, "_ZN3ccc9CC9x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x10y15E);
    dp->::ccc::CC9x10y15::~CC9x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x10y15E(Test__ZN3ccc9CC9x10y15E, "_ZN3ccc9CC9x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x10y15C1Ev();
extern void _ZN3ccc9CC9x10y15D1Ev();
Name_Map name_map__ZN3ccc9CC9x10y15E[] = {
  NSPAIR(_ZN3ccc9CC9x10y15C1Ev),
  NSPAIR(_ZN3ccc9CC9x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9CC9x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x10y15E[];
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x10y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x10y15E[] = {
  {&(_ZTVN3ccc9CC9x10y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x10y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x10y15E[];
Class_Descriptor cd__ZN3ccc9CC9x10y15E = {  "_ZN3ccc9CC9x10y15E", // class name
  bases__ZN3ccc9CC9x10y15E, 2,
  &(vtc__ZN3ccc9CC9x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x10y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x10y15E),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  DD9x10y15  : virtual ::ccc::AA9 , virtual ::ccc::BB10 {
  ~DD9x10y15(); // tgen
  DD9x10y15(); // tgen
};
//SIG(1 _ZN3ccc9DD9x10y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD9x10y15 ::~DD9x10y15(){ note_dtor("_ZN3ccc9DD9x10y15E", this);} // tgen
ccc::DD9x10y15 ::DD9x10y15(){ note_ctor("_ZN3ccc9DD9x10y15E", this);} // tgen
}
static void Test__ZN3ccc9DD9x10y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x10y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x10y15E, buf);
    ::ccc::DD9x10y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x10y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x10y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x10y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x10y15E");
    check_base_class_offset(lv, (::ccc::BB10*), ABISELECT(8,4), "_ZN3ccc9DD9x10y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x10y15E);
    dp->::ccc::DD9x10y15::~DD9x10y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x10y15E(Test__ZN3ccc9DD9x10y15E, "_ZN3ccc9DD9x10y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x10y15C1Ev();
extern void _ZN3ccc9DD9x10y15D1Ev();
Name_Map name_map__ZN3ccc9DD9x10y15E[] = {
  NSPAIR(_ZN3ccc9DD9x10y15C1Ev),
  NSPAIR(_ZN3ccc9DD9x10y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB10E;
extern VTBL_ENTRY _ZTIN3ccc4BB10E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB10E[];
static Base_Class bases__ZN3ccc9DD9x10y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB10E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB103pqrEv();
extern void _ZN3ccc4BB103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x10y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x10y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x10y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x10y15E[] = {
  {&(_ZTVN3ccc9DD9x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x10y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x10y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x10y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x10y15E[];
Class_Descriptor cd__ZN3ccc9DD9x10y15E = {  "_ZN3ccc9DD9x10y15E", // class name
  bases__ZN3ccc9DD9x10y15E, 2,
  &(vtc__ZN3ccc9DD9x10y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x10y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x10y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x10y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x10y15E),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  CC9x11y0  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y03pqrEv
  ~CC9x11y0(); // tgen
  CC9x11y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y0E) C1{ VBC2{ v2 v3} BC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y03abcEv");}
void  ccc::CC9x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y03efgEv");}
void  ccc::CC9x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y03pqrEv");}
ccc::CC9x11y0 ::~CC9x11y0(){ note_dtor("_ZN3ccc8CC9x11y0E", this);} // tgen
ccc::CC9x11y0 ::CC9x11y0(){ note_ctor("_ZN3ccc8CC9x11y0E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y0E, buf);
    ::ccc::CC9x11y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y0E);
    dp->::ccc::CC9x11y0::~CC9x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y0E(Test__ZN3ccc8CC9x11y0E, "_ZN3ccc8CC9x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y0C1Ev();
extern void _ZN3ccc8CC9x11y0D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y0E[] = {
  NSPAIR(_ZN3ccc8CC9x11y0C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y0E[];
extern void _ZN3ccc8CC9x11y03pqrEv();
extern void _ZN3ccc8CC9x11y03efgEv();
extern void _ZN3ccc8CC9x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y03efgEv,_ZTv0_n12_N3ccc8CC9x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y03efgEv,_ZThn4_N3ccc8CC9x11y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y03pqrEv,_ZTv0_n16_N3ccc8CC9x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y03pqrEv,_ZThn4_N3ccc8CC9x11y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y03efgEv,_ZTv0_n12_N3ccc8CC9x11y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y03pqrEv,_ZTv0_n16_N3ccc8CC9x11y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y0E[] = {
  {&(_ZTVN3ccc8CC9x11y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y0E[];
static VTBL_ENTRY alt_thunk_names1904[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y03pqrEv,_ZTv0_n16_N3ccc8CC9x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y03pqrEv,_ZThn4_N3ccc8CC9x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y03efgEv,_ZTv0_n12_N3ccc8CC9x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y03efgEv,_ZThn4_N3ccc8CC9x11y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y0E = {  "_ZN3ccc8CC9x11y0E", // class name
  bases__ZN3ccc8CC9x11y0E, 2,
  &(vtc__ZN3ccc8CC9x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y0E),2, //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  DD9x11y0  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD9x11y03abcEv
  virtual void  efg(); // _ZN3ccc8DD9x11y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x11y03pqrEv
  ~DD9x11y0(); // tgen
  DD9x11y0(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y0E) C1{ VBC2{ v2 v3} VBC3{ v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x11y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y03abcEv");}
void  ccc::DD9x11y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y03efgEv");}
void  ccc::DD9x11y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y03pqrEv");}
ccc::DD9x11y0 ::~DD9x11y0(){ note_dtor("_ZN3ccc8DD9x11y0E", this);} // tgen
ccc::DD9x11y0 ::DD9x11y0(){ note_ctor("_ZN3ccc8DD9x11y0E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y0E, buf);
    ::ccc::DD9x11y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y0E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y0E);
    dp->::ccc::DD9x11y0::~DD9x11y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y0E(Test__ZN3ccc8DD9x11y0E, "_ZN3ccc8DD9x11y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y0C1Ev();
extern void _ZN3ccc8DD9x11y0D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y0E[] = {
  NSPAIR(_ZN3ccc8DD9x11y0C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y0E[];
extern void _ZN3ccc8DD9x11y03efgEv();
extern void _ZN3ccc8DD9x11y03pqrEv();
extern void _ZN3ccc8DD9x11y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y03pqrEv,_ZTv0_n12_N3ccc8DD9x11y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y03pqrEv,_ZThn4_N3ccc8DD9x11y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y03efgEv,_ZTv0_n16_N3ccc8DD9x11y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y03efgEv,_ZThn4_N3ccc8DD9x11y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y03pqrEv,_ZTv0_n12_N3ccc8DD9x11y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y03efgEv,_ZTv0_n16_N3ccc8DD9x11y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y0E[] = {
  {&(_ZTVN3ccc8DD9x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y0E[];
static VTBL_ENTRY alt_thunk_names1905[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y03efgEv,_ZTv0_n16_N3ccc8DD9x11y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y03efgEv,_ZThn4_N3ccc8DD9x11y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y03pqrEv,_ZTv0_n12_N3ccc8DD9x11y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y03pqrEv,_ZThn4_N3ccc8DD9x11y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y0E = {  "_ZN3ccc8DD9x11y0E", // class name
  bases__ZN3ccc8DD9x11y0E, 2,
  &(vtc__ZN3ccc8DD9x11y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y0E),3, //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  CC9x11y1  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x11y13efgEv
  ~CC9x11y1(); // tgen
  CC9x11y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y1E) C1{ VBC2{ v3 v2} BC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y13abcEv");}
void  ccc::CC9x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y13pqrEv");}
void  ccc::CC9x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y13efgEv");}
ccc::CC9x11y1 ::~CC9x11y1(){ note_dtor("_ZN3ccc8CC9x11y1E", this);} // tgen
ccc::CC9x11y1 ::CC9x11y1(){ note_ctor("_ZN3ccc8CC9x11y1E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y1E, buf);
    ::ccc::CC9x11y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y1E);
    dp->::ccc::CC9x11y1::~CC9x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y1E(Test__ZN3ccc8CC9x11y1E, "_ZN3ccc8CC9x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y1C1Ev();
extern void _ZN3ccc8CC9x11y1D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y1E[] = {
  NSPAIR(_ZN3ccc8CC9x11y1C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y1E[];
extern void _ZN3ccc8CC9x11y13pqrEv();
extern void _ZN3ccc8CC9x11y13efgEv();
extern void _ZN3ccc8CC9x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y13efgEv,_ZTv0_n12_N3ccc8CC9x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y13efgEv,_ZThn4_N3ccc8CC9x11y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y13pqrEv,_ZTv0_n16_N3ccc8CC9x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y13pqrEv,_ZThn4_N3ccc8CC9x11y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y13efgEv,_ZTv0_n12_N3ccc8CC9x11y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y13pqrEv,_ZTv0_n16_N3ccc8CC9x11y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y1E[] = {
  {&(_ZTVN3ccc8CC9x11y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y1E[];
static VTBL_ENTRY alt_thunk_names1906[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y13pqrEv,_ZTv0_n16_N3ccc8CC9x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y13pqrEv,_ZThn4_N3ccc8CC9x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y13efgEv,_ZTv0_n12_N3ccc8CC9x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y13efgEv,_ZThn4_N3ccc8CC9x11y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y1E = {  "_ZN3ccc8CC9x11y1E", // class name
  bases__ZN3ccc8CC9x11y1E, 2,
  &(vtc__ZN3ccc8CC9x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y1E),2, //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  DD9x11y1  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD9x11y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x11y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x11y13efgEv
  ~DD9x11y1(); // tgen
  DD9x11y1(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y1E) C1{ VBC2{ v3 v2} VBC3{ v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x11y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y13abcEv");}
void  ccc::DD9x11y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y13pqrEv");}
void  ccc::DD9x11y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y13efgEv");}
ccc::DD9x11y1 ::~DD9x11y1(){ note_dtor("_ZN3ccc8DD9x11y1E", this);} // tgen
ccc::DD9x11y1 ::DD9x11y1(){ note_ctor("_ZN3ccc8DD9x11y1E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y1E, buf);
    ::ccc::DD9x11y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y1E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y1E);
    dp->::ccc::DD9x11y1::~DD9x11y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y1E(Test__ZN3ccc8DD9x11y1E, "_ZN3ccc8DD9x11y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y1C1Ev();
extern void _ZN3ccc8DD9x11y1D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y1E[] = {
  NSPAIR(_ZN3ccc8DD9x11y1C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y1E[];
extern void _ZN3ccc8DD9x11y13efgEv();
extern void _ZN3ccc8DD9x11y13pqrEv();
extern void _ZN3ccc8DD9x11y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y13pqrEv,_ZTv0_n12_N3ccc8DD9x11y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y13pqrEv,_ZThn4_N3ccc8DD9x11y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y13efgEv,_ZTv0_n16_N3ccc8DD9x11y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y13efgEv,_ZThn4_N3ccc8DD9x11y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y13pqrEv,_ZTv0_n12_N3ccc8DD9x11y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y13efgEv,_ZTv0_n16_N3ccc8DD9x11y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y1E[] = {
  {&(_ZTVN3ccc8DD9x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y1E[];
static VTBL_ENTRY alt_thunk_names1907[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y13efgEv,_ZTv0_n16_N3ccc8DD9x11y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y13efgEv,_ZThn4_N3ccc8DD9x11y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y13pqrEv,_ZTv0_n12_N3ccc8DD9x11y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y13pqrEv,_ZThn4_N3ccc8DD9x11y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y1E = {  "_ZN3ccc8DD9x11y1E", // class name
  bases__ZN3ccc8DD9x11y1E, 2,
  &(vtc__ZN3ccc8DD9x11y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y1E),3, //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  CC9x11y2  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y23pqrEv
  ~CC9x11y2(); // tgen
  CC9x11y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y2E) C1{ VBC2{ v1 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y23efgEv");}
void  ccc::CC9x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y23abcEv");}
void  ccc::CC9x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y23pqrEv");}
ccc::CC9x11y2 ::~CC9x11y2(){ note_dtor("_ZN3ccc8CC9x11y2E", this);} // tgen
ccc::CC9x11y2 ::CC9x11y2(){ note_ctor("_ZN3ccc8CC9x11y2E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y2E, buf);
    ::ccc::CC9x11y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y2E);
    dp->::ccc::CC9x11y2::~CC9x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y2E(Test__ZN3ccc8CC9x11y2E, "_ZN3ccc8CC9x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y2C1Ev();
extern void _ZN3ccc8CC9x11y2D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y2E[] = {
  NSPAIR(_ZN3ccc8CC9x11y2C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y2E[];
extern void _ZN3ccc8CC9x11y23pqrEv();
extern void _ZN3ccc8CC9x11y23efgEv();
extern void _ZN3ccc8CC9x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y23efgEv,_ZTv0_n12_N3ccc8CC9x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y23efgEv,_ZThn4_N3ccc8CC9x11y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y23pqrEv,_ZTv0_n16_N3ccc8CC9x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y23pqrEv,_ZThn4_N3ccc8CC9x11y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y23efgEv,_ZTv0_n12_N3ccc8CC9x11y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y23pqrEv,_ZTv0_n16_N3ccc8CC9x11y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y2E[] = {
  {&(_ZTVN3ccc8CC9x11y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y2E[];
static VTBL_ENTRY alt_thunk_names1908[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y23pqrEv,_ZTv0_n16_N3ccc8CC9x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y23pqrEv,_ZThn4_N3ccc8CC9x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y23efgEv,_ZTv0_n12_N3ccc8CC9x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y23efgEv,_ZThn4_N3ccc8CC9x11y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y2E = {  "_ZN3ccc8CC9x11y2E", // class name
  bases__ZN3ccc8CC9x11y2E, 2,
  &(vtc__ZN3ccc8CC9x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y2E),2, //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  DD9x11y2  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD9x11y23efgEv
  virtual void  abc(); // _ZN3ccc8DD9x11y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x11y23pqrEv
  ~DD9x11y2(); // tgen
  DD9x11y2(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y2E) C1{ VBC2{ v1 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x11y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y23efgEv");}
void  ccc::DD9x11y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y23abcEv");}
void  ccc::DD9x11y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y23pqrEv");}
ccc::DD9x11y2 ::~DD9x11y2(){ note_dtor("_ZN3ccc8DD9x11y2E", this);} // tgen
ccc::DD9x11y2 ::DD9x11y2(){ note_ctor("_ZN3ccc8DD9x11y2E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y2E, buf);
    ::ccc::DD9x11y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y2E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y2E);
    dp->::ccc::DD9x11y2::~DD9x11y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y2E(Test__ZN3ccc8DD9x11y2E, "_ZN3ccc8DD9x11y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y2C1Ev();
extern void _ZN3ccc8DD9x11y2D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y2E[] = {
  NSPAIR(_ZN3ccc8DD9x11y2C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y2E[];
extern void _ZN3ccc8DD9x11y23efgEv();
extern void _ZN3ccc8DD9x11y23pqrEv();
extern void _ZN3ccc8DD9x11y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y23pqrEv,_ZTv0_n12_N3ccc8DD9x11y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y23pqrEv,_ZThn4_N3ccc8DD9x11y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y23efgEv,_ZTv0_n16_N3ccc8DD9x11y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y23efgEv,_ZThn4_N3ccc8DD9x11y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y23pqrEv,_ZTv0_n12_N3ccc8DD9x11y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y23efgEv,_ZTv0_n16_N3ccc8DD9x11y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y2E[] = {
  {&(_ZTVN3ccc8DD9x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y2E[];
static VTBL_ENTRY alt_thunk_names1909[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y23efgEv,_ZTv0_n16_N3ccc8DD9x11y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y23efgEv,_ZThn4_N3ccc8DD9x11y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y23pqrEv,_ZTv0_n12_N3ccc8DD9x11y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y23pqrEv,_ZThn4_N3ccc8DD9x11y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y2E = {  "_ZN3ccc8DD9x11y2E", // class name
  bases__ZN3ccc8DD9x11y2E, 2,
  &(vtc__ZN3ccc8DD9x11y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y2E),3, //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  CC9x11y3  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x11y33abcEv
  ~CC9x11y3(); // tgen
  CC9x11y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y3E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y33efgEv");}
void  ccc::CC9x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y33pqrEv");}
void  ccc::CC9x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y33abcEv");}
ccc::CC9x11y3 ::~CC9x11y3(){ note_dtor("_ZN3ccc8CC9x11y3E", this);} // tgen
ccc::CC9x11y3 ::CC9x11y3(){ note_ctor("_ZN3ccc8CC9x11y3E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y3E, buf);
    ::ccc::CC9x11y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y3E);
    dp->::ccc::CC9x11y3::~CC9x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y3E(Test__ZN3ccc8CC9x11y3E, "_ZN3ccc8CC9x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y3C1Ev();
extern void _ZN3ccc8CC9x11y3D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y3E[] = {
  NSPAIR(_ZN3ccc8CC9x11y3C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y3E[];
extern void _ZN3ccc8CC9x11y33pqrEv();
extern void _ZN3ccc8CC9x11y33efgEv();
extern void _ZN3ccc8CC9x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y33efgEv,_ZTv0_n12_N3ccc8CC9x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y33efgEv,_ZThn4_N3ccc8CC9x11y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y33pqrEv,_ZTv0_n16_N3ccc8CC9x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y33pqrEv,_ZThn4_N3ccc8CC9x11y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y33efgEv,_ZTv0_n12_N3ccc8CC9x11y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y33pqrEv,_ZTv0_n16_N3ccc8CC9x11y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y3E[] = {
  {&(_ZTVN3ccc8CC9x11y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y3E[];
static VTBL_ENTRY alt_thunk_names1910[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y33pqrEv,_ZTv0_n16_N3ccc8CC9x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y33pqrEv,_ZThn4_N3ccc8CC9x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y33efgEv,_ZTv0_n12_N3ccc8CC9x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y33efgEv,_ZThn4_N3ccc8CC9x11y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y3E = {  "_ZN3ccc8CC9x11y3E", // class name
  bases__ZN3ccc8CC9x11y3E, 2,
  &(vtc__ZN3ccc8CC9x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y3E),2, //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  DD9x11y3  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD9x11y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x11y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x11y33abcEv
  ~DD9x11y3(); // tgen
  DD9x11y3(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y3E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x11y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y33efgEv");}
void  ccc::DD9x11y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y33pqrEv");}
void  ccc::DD9x11y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y33abcEv");}
ccc::DD9x11y3 ::~DD9x11y3(){ note_dtor("_ZN3ccc8DD9x11y3E", this);} // tgen
ccc::DD9x11y3 ::DD9x11y3(){ note_ctor("_ZN3ccc8DD9x11y3E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y3E, buf);
    ::ccc::DD9x11y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y3E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y3E);
    dp->::ccc::DD9x11y3::~DD9x11y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y3E(Test__ZN3ccc8DD9x11y3E, "_ZN3ccc8DD9x11y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y3C1Ev();
extern void _ZN3ccc8DD9x11y3D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y3E[] = {
  NSPAIR(_ZN3ccc8DD9x11y3C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y3E[];
extern void _ZN3ccc8DD9x11y33efgEv();
extern void _ZN3ccc8DD9x11y33pqrEv();
extern void _ZN3ccc8DD9x11y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y33pqrEv,_ZTv0_n12_N3ccc8DD9x11y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y33pqrEv,_ZThn4_N3ccc8DD9x11y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y33efgEv,_ZTv0_n16_N3ccc8DD9x11y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y33efgEv,_ZThn4_N3ccc8DD9x11y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y33pqrEv,_ZTv0_n12_N3ccc8DD9x11y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y33efgEv,_ZTv0_n16_N3ccc8DD9x11y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y3E[] = {
  {&(_ZTVN3ccc8DD9x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y3E[];
static VTBL_ENTRY alt_thunk_names1911[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y33efgEv,_ZTv0_n16_N3ccc8DD9x11y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y33efgEv,_ZThn4_N3ccc8DD9x11y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y33pqrEv,_ZTv0_n12_N3ccc8DD9x11y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y33pqrEv,_ZThn4_N3ccc8DD9x11y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y3E = {  "_ZN3ccc8DD9x11y3E", // class name
  bases__ZN3ccc8DD9x11y3E, 2,
  &(vtc__ZN3ccc8DD9x11y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y3E),3, //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  CC9x11y4  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC9x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x11y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x11y43efgEv
  ~CC9x11y4(); // tgen
  CC9x11y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y4E) C1{ VBC2{ v3 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y43pqrEv");}
void  ccc::CC9x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y43abcEv");}
void  ccc::CC9x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y43efgEv");}
ccc::CC9x11y4 ::~CC9x11y4(){ note_dtor("_ZN3ccc8CC9x11y4E", this);} // tgen
ccc::CC9x11y4 ::CC9x11y4(){ note_ctor("_ZN3ccc8CC9x11y4E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y4E, buf);
    ::ccc::CC9x11y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y4E);
    dp->::ccc::CC9x11y4::~CC9x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y4E(Test__ZN3ccc8CC9x11y4E, "_ZN3ccc8CC9x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y4C1Ev();
extern void _ZN3ccc8CC9x11y4D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y4E[] = {
  NSPAIR(_ZN3ccc8CC9x11y4C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y4E[];
extern void _ZN3ccc8CC9x11y43pqrEv();
extern void _ZN3ccc8CC9x11y43efgEv();
extern void _ZN3ccc8CC9x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y43efgEv,_ZTv0_n12_N3ccc8CC9x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y43efgEv,_ZThn4_N3ccc8CC9x11y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y43pqrEv,_ZTv0_n16_N3ccc8CC9x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y43pqrEv,_ZThn4_N3ccc8CC9x11y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y43efgEv,_ZTv0_n12_N3ccc8CC9x11y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y43pqrEv,_ZTv0_n16_N3ccc8CC9x11y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y4E[] = {
  {&(_ZTVN3ccc8CC9x11y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y4E[];
static VTBL_ENTRY alt_thunk_names1912[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y43pqrEv,_ZTv0_n16_N3ccc8CC9x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y43pqrEv,_ZThn4_N3ccc8CC9x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y43efgEv,_ZTv0_n12_N3ccc8CC9x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y43efgEv,_ZThn4_N3ccc8CC9x11y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y4E = {  "_ZN3ccc8CC9x11y4E", // class name
  bases__ZN3ccc8CC9x11y4E, 2,
  &(vtc__ZN3ccc8CC9x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y4E),2, //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  DD9x11y4  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD9x11y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x11y43abcEv
  virtual void  efg(); // _ZN3ccc8DD9x11y43efgEv
  ~DD9x11y4(); // tgen
  DD9x11y4(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y4E) C1{ VBC2{ v3 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x11y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y43pqrEv");}
void  ccc::DD9x11y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y43abcEv");}
void  ccc::DD9x11y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y43efgEv");}
ccc::DD9x11y4 ::~DD9x11y4(){ note_dtor("_ZN3ccc8DD9x11y4E", this);} // tgen
ccc::DD9x11y4 ::DD9x11y4(){ note_ctor("_ZN3ccc8DD9x11y4E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y4E, buf);
    ::ccc::DD9x11y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y4E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y4E);
    dp->::ccc::DD9x11y4::~DD9x11y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y4E(Test__ZN3ccc8DD9x11y4E, "_ZN3ccc8DD9x11y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y4C1Ev();
extern void _ZN3ccc8DD9x11y4D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y4E[] = {
  NSPAIR(_ZN3ccc8DD9x11y4C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y4E[];
extern void _ZN3ccc8DD9x11y43efgEv();
extern void _ZN3ccc8DD9x11y43pqrEv();
extern void _ZN3ccc8DD9x11y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y43pqrEv,_ZTv0_n12_N3ccc8DD9x11y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y43pqrEv,_ZThn4_N3ccc8DD9x11y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y43efgEv,_ZTv0_n16_N3ccc8DD9x11y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y43efgEv,_ZThn4_N3ccc8DD9x11y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y43pqrEv,_ZTv0_n12_N3ccc8DD9x11y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y43efgEv,_ZTv0_n16_N3ccc8DD9x11y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y4E[] = {
  {&(_ZTVN3ccc8DD9x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y4E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y4E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y4E[];
static VTBL_ENTRY alt_thunk_names1913[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y43efgEv,_ZTv0_n16_N3ccc8DD9x11y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y43efgEv,_ZThn4_N3ccc8DD9x11y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y43pqrEv,_ZTv0_n12_N3ccc8DD9x11y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y43pqrEv,_ZThn4_N3ccc8DD9x11y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y4E = {  "_ZN3ccc8DD9x11y4E", // class name
  bases__ZN3ccc8DD9x11y4E, 2,
  &(vtc__ZN3ccc8DD9x11y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y4E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y4E),3, //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  CC9x11y5  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8CC9x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x11y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x11y53abcEv
  ~CC9x11y5(); // tgen
  CC9x11y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y5E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y53pqrEv");}
void  ccc::CC9x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y53efgEv");}
void  ccc::CC9x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y53abcEv");}
ccc::CC9x11y5 ::~CC9x11y5(){ note_dtor("_ZN3ccc8CC9x11y5E", this);} // tgen
ccc::CC9x11y5 ::CC9x11y5(){ note_ctor("_ZN3ccc8CC9x11y5E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y5E, buf);
    ::ccc::CC9x11y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y5E);
    dp->::ccc::CC9x11y5::~CC9x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y5E(Test__ZN3ccc8CC9x11y5E, "_ZN3ccc8CC9x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y5C1Ev();
extern void _ZN3ccc8CC9x11y5D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y5E[] = {
  NSPAIR(_ZN3ccc8CC9x11y5C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y5E[];
extern void _ZN3ccc8CC9x11y53pqrEv();
extern void _ZN3ccc8CC9x11y53efgEv();
extern void _ZN3ccc8CC9x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y53efgEv,_ZTv0_n12_N3ccc8CC9x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y53efgEv,_ZThn4_N3ccc8CC9x11y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y53pqrEv,_ZTv0_n16_N3ccc8CC9x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y53pqrEv,_ZThn4_N3ccc8CC9x11y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y53efgEv,_ZTv0_n12_N3ccc8CC9x11y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y53pqrEv,_ZTv0_n16_N3ccc8CC9x11y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y5E[] = {
  {&(_ZTVN3ccc8CC9x11y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y5E[];
static VTBL_ENTRY alt_thunk_names1914[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y53pqrEv,_ZTv0_n16_N3ccc8CC9x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y53pqrEv,_ZThn4_N3ccc8CC9x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y53efgEv,_ZTv0_n12_N3ccc8CC9x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y53efgEv,_ZThn4_N3ccc8CC9x11y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y5E = {  "_ZN3ccc8CC9x11y5E", // class name
  bases__ZN3ccc8CC9x11y5E, 2,
  &(vtc__ZN3ccc8CC9x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y5E),2, //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  DD9x11y5  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc8DD9x11y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x11y53efgEv
  virtual void  abc(); // _ZN3ccc8DD9x11y53abcEv
  ~DD9x11y5(); // tgen
  DD9x11y5(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y5E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x11y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y53pqrEv");}
void  ccc::DD9x11y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y53efgEv");}
void  ccc::DD9x11y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y53abcEv");}
ccc::DD9x11y5 ::~DD9x11y5(){ note_dtor("_ZN3ccc8DD9x11y5E", this);} // tgen
ccc::DD9x11y5 ::DD9x11y5(){ note_ctor("_ZN3ccc8DD9x11y5E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y5E, buf);
    ::ccc::DD9x11y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y5E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y5E);
    dp->::ccc::DD9x11y5::~DD9x11y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y5E(Test__ZN3ccc8DD9x11y5E, "_ZN3ccc8DD9x11y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y5C1Ev();
extern void _ZN3ccc8DD9x11y5D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y5E[] = {
  NSPAIR(_ZN3ccc8DD9x11y5C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y5E[];
extern void _ZN3ccc8DD9x11y53efgEv();
extern void _ZN3ccc8DD9x11y53pqrEv();
extern void _ZN3ccc8DD9x11y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y53pqrEv,_ZTv0_n12_N3ccc8DD9x11y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y53pqrEv,_ZThn4_N3ccc8DD9x11y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y53efgEv,_ZTv0_n16_N3ccc8DD9x11y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y53efgEv,_ZThn4_N3ccc8DD9x11y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y53pqrEv,_ZTv0_n12_N3ccc8DD9x11y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y53efgEv,_ZTv0_n16_N3ccc8DD9x11y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y5E[] = {
  {&(_ZTVN3ccc8DD9x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y5E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y5E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y5E[];
static VTBL_ENTRY alt_thunk_names1915[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y53efgEv,_ZTv0_n16_N3ccc8DD9x11y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y53efgEv,_ZThn4_N3ccc8DD9x11y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y53pqrEv,_ZTv0_n12_N3ccc8DD9x11y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y53pqrEv,_ZThn4_N3ccc8DD9x11y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y5E = {  "_ZN3ccc8DD9x11y5E", // class name
  bases__ZN3ccc8DD9x11y5E, 2,
  &(vtc__ZN3ccc8DD9x11y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y5E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y5E),3, //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  CC9x11y6  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x11y63efgEv
  ~CC9x11y6(); // tgen
  CC9x11y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y6E) C1{ VBC2{ v2 v3} BC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y63abcEv");}
void  ccc::CC9x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y63efgEv");}
ccc::CC9x11y6 ::~CC9x11y6(){ note_dtor("_ZN3ccc8CC9x11y6E", this);} // tgen
ccc::CC9x11y6 ::CC9x11y6(){ note_ctor("_ZN3ccc8CC9x11y6E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y6E, buf);
    ::ccc::CC9x11y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y6E);
    dp->::ccc::CC9x11y6::~CC9x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y6E(Test__ZN3ccc8CC9x11y6E, "_ZN3ccc8CC9x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y6C1Ev();
extern void _ZN3ccc8CC9x11y6D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y6E[] = {
  NSPAIR(_ZN3ccc8CC9x11y6C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y6E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC9x11y63efgEv();
extern void _ZN3ccc8CC9x11y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y63efgEv,_ZTv0_n12_N3ccc8CC9x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y63efgEv,_ZThn4_N3ccc8CC9x11y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y63efgEv,_ZTv0_n12_N3ccc8CC9x11y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y6E[] = {
  {&(_ZTVN3ccc8CC9x11y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y6E[];
static VTBL_ENTRY alt_thunk_names1916[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y63efgEv,_ZTv0_n12_N3ccc8CC9x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y63efgEv,_ZThn4_N3ccc8CC9x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y6E = {  "_ZN3ccc8CC9x11y6E", // class name
  bases__ZN3ccc8CC9x11y6E, 2,
  &(vtc__ZN3ccc8CC9x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y6E),2, //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  DD9x11y6  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD9x11y63abcEv
  virtual void  efg(); // _ZN3ccc8DD9x11y63efgEv
  ~DD9x11y6(); // tgen
  DD9x11y6(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y6E) C1{ VBC2{ v2 v3} VBC3{ v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x11y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y63abcEv");}
void  ccc::DD9x11y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y63efgEv");}
ccc::DD9x11y6 ::~DD9x11y6(){ note_dtor("_ZN3ccc8DD9x11y6E", this);} // tgen
ccc::DD9x11y6 ::DD9x11y6(){ note_ctor("_ZN3ccc8DD9x11y6E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y6E, buf);
    ::ccc::DD9x11y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y6E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y6E);
    dp->::ccc::DD9x11y6::~DD9x11y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y6E(Test__ZN3ccc8DD9x11y6E, "_ZN3ccc8DD9x11y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y6C1Ev();
extern void _ZN3ccc8DD9x11y6D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y6E[] = {
  NSPAIR(_ZN3ccc8DD9x11y6C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y6E[];
extern void _ZN3ccc8DD9x11y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x11y63abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y63efgEv,_ZTv0_n16_N3ccc8DD9x11y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y63efgEv,_ZThn4_N3ccc8DD9x11y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y63efgEv,_ZTv0_n16_N3ccc8DD9x11y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y6E[] = {
  {&(_ZTVN3ccc8DD9x11y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y6E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y6E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y6E[];
static VTBL_ENTRY alt_thunk_names1917[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y63efgEv,_ZTv0_n16_N3ccc8DD9x11y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y63efgEv,_ZThn4_N3ccc8DD9x11y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y6E = {  "_ZN3ccc8DD9x11y6E", // class name
  bases__ZN3ccc8DD9x11y6E, 2,
  &(vtc__ZN3ccc8DD9x11y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y6E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y6E),3, //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  CC9x11y7  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8CC9x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y73pqrEv
  ~CC9x11y7(); // tgen
  CC9x11y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y7E) C1{ VBC2{ v3 v2} BC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y73abcEv");}
void  ccc::CC9x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y73pqrEv");}
ccc::CC9x11y7 ::~CC9x11y7(){ note_dtor("_ZN3ccc8CC9x11y7E", this);} // tgen
ccc::CC9x11y7 ::CC9x11y7(){ note_ctor("_ZN3ccc8CC9x11y7E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y7E, buf);
    ::ccc::CC9x11y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y7E);
    dp->::ccc::CC9x11y7::~CC9x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y7E(Test__ZN3ccc8CC9x11y7E, "_ZN3ccc8CC9x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y7C1Ev();
extern void _ZN3ccc8CC9x11y7D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y7E[] = {
  NSPAIR(_ZN3ccc8CC9x11y7C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y7E[];
extern void _ZN3ccc8CC9x11y73pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc8CC9x11y73abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y73pqrEv,_ZTv0_n16_N3ccc8CC9x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y73pqrEv,_ZThn4_N3ccc8CC9x11y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y73pqrEv,_ZTv0_n16_N3ccc8CC9x11y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y7E[] = {
  {&(_ZTVN3ccc8CC9x11y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y7E[];
static VTBL_ENTRY alt_thunk_names1918[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y73pqrEv,_ZTv0_n16_N3ccc8CC9x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y73pqrEv,_ZThn4_N3ccc8CC9x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y7E = {  "_ZN3ccc8CC9x11y7E", // class name
  bases__ZN3ccc8CC9x11y7E, 2,
  &(vtc__ZN3ccc8CC9x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y7E),2, //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  DD9x11y7  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc8DD9x11y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x11y73pqrEv
  ~DD9x11y7(); // tgen
  DD9x11y7(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y7E) C1{ VBC2{ v3 v2} VBC3{ v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x11y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y73abcEv");}
void  ccc::DD9x11y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y73pqrEv");}
ccc::DD9x11y7 ::~DD9x11y7(){ note_dtor("_ZN3ccc8DD9x11y7E", this);} // tgen
ccc::DD9x11y7 ::DD9x11y7(){ note_ctor("_ZN3ccc8DD9x11y7E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y7E, buf);
    ::ccc::DD9x11y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y7E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y7E);
    dp->::ccc::DD9x11y7::~DD9x11y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y7E(Test__ZN3ccc8DD9x11y7E, "_ZN3ccc8DD9x11y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y7C1Ev();
extern void _ZN3ccc8DD9x11y7D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y7E[] = {
  NSPAIR(_ZN3ccc8DD9x11y7C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x11y73pqrEv();
extern void _ZN3ccc8DD9x11y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y73pqrEv,_ZTv0_n12_N3ccc8DD9x11y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y73pqrEv,_ZThn4_N3ccc8DD9x11y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y73pqrEv,_ZTv0_n12_N3ccc8DD9x11y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y7E[] = {
  {&(_ZTVN3ccc8DD9x11y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y7E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y7E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y7E[];
static VTBL_ENTRY alt_thunk_names1919[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y73pqrEv,_ZTv0_n12_N3ccc8DD9x11y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y73pqrEv,_ZThn4_N3ccc8DD9x11y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y7E = {  "_ZN3ccc8DD9x11y7E", // class name
  bases__ZN3ccc8DD9x11y7E, 2,
  &(vtc__ZN3ccc8DD9x11y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y7E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y7E),3, //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  CC9x11y8  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x11y83abcEv
  ~CC9x11y8(); // tgen
  CC9x11y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y8E) C1{ VBC2{ v1 v3} BC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y83efgEv");}
void  ccc::CC9x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x11y83abcEv");}
ccc::CC9x11y8 ::~CC9x11y8(){ note_dtor("_ZN3ccc8CC9x11y8E", this);} // tgen
ccc::CC9x11y8 ::CC9x11y8(){ note_ctor("_ZN3ccc8CC9x11y8E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y8E, buf);
    ::ccc::CC9x11y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y8E);
    dp->::ccc::CC9x11y8::~CC9x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y8E(Test__ZN3ccc8CC9x11y8E, "_ZN3ccc8CC9x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y8C1Ev();
extern void _ZN3ccc8CC9x11y8D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y8E[] = {
  NSPAIR(_ZN3ccc8CC9x11y8C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y8E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc8CC9x11y83efgEv();
extern void _ZN3ccc8CC9x11y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y83efgEv,_ZTv0_n12_N3ccc8CC9x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y83efgEv,_ZThn4_N3ccc8CC9x11y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y83efgEv,_ZTv0_n12_N3ccc8CC9x11y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y8E[] = {
  {&(_ZTVN3ccc8CC9x11y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x11y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y8E[];
static VTBL_ENTRY alt_thunk_names1920[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y83efgEv,_ZTv0_n12_N3ccc8CC9x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y83efgEv,_ZThn4_N3ccc8CC9x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y8E = {  "_ZN3ccc8CC9x11y8E", // class name
  bases__ZN3ccc8CC9x11y8E, 2,
  &(vtc__ZN3ccc8CC9x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y8E),2, //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  DD9x11y8  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD9x11y83efgEv
  virtual void  abc(); // _ZN3ccc8DD9x11y83abcEv
  ~DD9x11y8(); // tgen
  DD9x11y8(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y8E) C1{ VBC2{ v1 v3} VBC3{ v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x11y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y83efgEv");}
void  ccc::DD9x11y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x11y83abcEv");}
ccc::DD9x11y8 ::~DD9x11y8(){ note_dtor("_ZN3ccc8DD9x11y8E", this);} // tgen
ccc::DD9x11y8 ::DD9x11y8(){ note_ctor("_ZN3ccc8DD9x11y8E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y8E, buf);
    ::ccc::DD9x11y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y8E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y8E);
    dp->::ccc::DD9x11y8::~DD9x11y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y8E(Test__ZN3ccc8DD9x11y8E, "_ZN3ccc8DD9x11y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y8C1Ev();
extern void _ZN3ccc8DD9x11y8D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y8E[] = {
  NSPAIR(_ZN3ccc8DD9x11y8C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y8E[];
extern void _ZN3ccc8DD9x11y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x11y83abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y83efgEv,_ZTv0_n16_N3ccc8DD9x11y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y83efgEv,_ZThn4_N3ccc8DD9x11y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y83efgEv,_ZTv0_n16_N3ccc8DD9x11y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y8E[] = {
  {&(_ZTVN3ccc8DD9x11y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y8E[6]),  6,15},
  {&(_ZTVN3ccc8DD9x11y8E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y8E[];
static VTBL_ENTRY alt_thunk_names1921[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y83efgEv,_ZTv0_n16_N3ccc8DD9x11y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y83efgEv,_ZThn4_N3ccc8DD9x11y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y8E = {  "_ZN3ccc8DD9x11y8E", // class name
  bases__ZN3ccc8DD9x11y8E, 2,
  &(vtc__ZN3ccc8DD9x11y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y8E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y8E),3, //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  CC9x11y9  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8CC9x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x11y93pqrEv
  ~CC9x11y9(); // tgen
  CC9x11y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x11y9E) C1{ VBC2{ v1 v2} BC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x11y93efgEv");}
void  ccc::CC9x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x11y93pqrEv");}
ccc::CC9x11y9 ::~CC9x11y9(){ note_dtor("_ZN3ccc8CC9x11y9E", this);} // tgen
ccc::CC9x11y9 ::CC9x11y9(){ note_ctor("_ZN3ccc8CC9x11y9E", this);} // tgen
}
static void Test__ZN3ccc8CC9x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x11y9E, buf);
    ::ccc::CC9x11y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x11y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc8CC9x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x11y9E);
    dp->::ccc::CC9x11y9::~CC9x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x11y9E(Test__ZN3ccc8CC9x11y9E, "_ZN3ccc8CC9x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x11y9C1Ev();
extern void _ZN3ccc8CC9x11y9D1Ev();
Name_Map name_map__ZN3ccc8CC9x11y9E[] = {
  NSPAIR(_ZN3ccc8CC9x11y9C1Ev),
  NSPAIR(_ZN3ccc8CC9x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8CC9x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x11y9E[];
extern void _ZN3ccc8CC9x11y93pqrEv();
extern void _ZN3ccc8CC9x11y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x11y93efgEv,_ZTv0_n12_N3ccc8CC9x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y93efgEv,_ZThn4_N3ccc8CC9x11y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x11y93pqrEv,_ZTv0_n16_N3ccc8CC9x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x11y93pqrEv,_ZThn4_N3ccc8CC9x11y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x11y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x11y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x11y93efgEv,_ZTv0_n12_N3ccc8CC9x11y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x11y93pqrEv,_ZTv0_n16_N3ccc8CC9x11y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x11y9E[] = {
  {&(_ZTVN3ccc8CC9x11y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x11y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x11y9E[];
static VTBL_ENTRY alt_thunk_names1922[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x11y93pqrEv,_ZTv0_n16_N3ccc8CC9x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y93pqrEv,_ZThn4_N3ccc8CC9x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x11y93efgEv,_ZTv0_n12_N3ccc8CC9x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x11y93efgEv,_ZThn4_N3ccc8CC9x11y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x11y9E = {  "_ZN3ccc8CC9x11y9E", // class name
  bases__ZN3ccc8CC9x11y9E, 2,
  &(vtc__ZN3ccc8CC9x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x11y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x11y9E),2, //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  DD9x11y9  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc8DD9x11y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x11y93pqrEv
  ~DD9x11y9(); // tgen
  DD9x11y9(); // tgen
};
//SIG(1 _ZN3ccc8DD9x11y9E) C1{ VBC2{ v1 v2} VBC3{ v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x11y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x11y93efgEv");}
void  ccc::DD9x11y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x11y93pqrEv");}
ccc::DD9x11y9 ::~DD9x11y9(){ note_dtor("_ZN3ccc8DD9x11y9E", this);} // tgen
ccc::DD9x11y9 ::DD9x11y9(){ note_ctor("_ZN3ccc8DD9x11y9E", this);} // tgen
}
static void Test__ZN3ccc8DD9x11y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x11y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x11y9E, buf);
    ::ccc::DD9x11y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x11y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x11y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x11y9E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc8DD9x11y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x11y9E);
    dp->::ccc::DD9x11y9::~DD9x11y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x11y9E(Test__ZN3ccc8DD9x11y9E, "_ZN3ccc8DD9x11y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x11y9C1Ev();
extern void _ZN3ccc8DD9x11y9D1Ev();
Name_Map name_map__ZN3ccc8DD9x11y9E[] = {
  NSPAIR(_ZN3ccc8DD9x11y9C1Ev),
  NSPAIR(_ZN3ccc8DD9x11y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc8DD9x11y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y9E[];
extern void _ZN3ccc8DD9x11y93efgEv();
extern void _ZN3ccc8DD9x11y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x11y93pqrEv,_ZTv0_n12_N3ccc8DD9x11y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y93pqrEv,_ZThn4_N3ccc8DD9x11y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD9x11y93efgEv,_ZTv0_n16_N3ccc8DD9x11y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x11y93efgEv,_ZThn4_N3ccc8DD9x11y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x11y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x11y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x11y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x11y93pqrEv,_ZTv0_n12_N3ccc8DD9x11y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD9x11y93efgEv,_ZTv0_n16_N3ccc8DD9x11y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x11y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x11y9E[] = {
  {&(_ZTVN3ccc8DD9x11y9E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x11y9E[6]),  6,14},
  {&(_ZTVN3ccc8DD9x11y9E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x11y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x11y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x11y9E[];
static VTBL_ENTRY alt_thunk_names1923[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD9x11y93efgEv,_ZTv0_n16_N3ccc8DD9x11y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y93efgEv,_ZThn4_N3ccc8DD9x11y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x11y93pqrEv,_ZTv0_n12_N3ccc8DD9x11y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x11y93pqrEv,_ZThn4_N3ccc8DD9x11y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x11y9E = {  "_ZN3ccc8DD9x11y9E", // class name
  bases__ZN3ccc8DD9x11y9E, 2,
  &(vtc__ZN3ccc8DD9x11y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x11y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x11y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x11y9E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x11y9E),3, //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  CC9x11y10  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC9x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x11y103abcEv
  ~CC9x11y10(); // tgen
  CC9x11y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y10E) C1{ VBC2{ v3 v1} BC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x11y103pqrEv");}
void  ccc::CC9x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x11y103abcEv");}
ccc::CC9x11y10 ::~CC9x11y10(){ note_dtor("_ZN3ccc9CC9x11y10E", this);} // tgen
ccc::CC9x11y10 ::CC9x11y10(){ note_ctor("_ZN3ccc9CC9x11y10E", this);} // tgen
}
static void Test__ZN3ccc9CC9x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x11y10E, buf);
    ::ccc::CC9x11y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x11y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC9x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x11y10E);
    dp->::ccc::CC9x11y10::~CC9x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x11y10E(Test__ZN3ccc9CC9x11y10E, "_ZN3ccc9CC9x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x11y10C1Ev();
extern void _ZN3ccc9CC9x11y10D1Ev();
Name_Map name_map__ZN3ccc9CC9x11y10E[] = {
  NSPAIR(_ZN3ccc9CC9x11y10C1Ev),
  NSPAIR(_ZN3ccc9CC9x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC9x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x11y10E[];
extern void _ZN3ccc9CC9x11y103pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC9x11y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x11y103pqrEv,_ZTv0_n16_N3ccc9CC9x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y103pqrEv,_ZThn4_N3ccc9CC9x11y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x11y103pqrEv,_ZTv0_n16_N3ccc9CC9x11y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x11y10E[] = {
  {&(_ZTVN3ccc9CC9x11y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC9x11y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x11y10E[];
static VTBL_ENTRY alt_thunk_names1924[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x11y103pqrEv,_ZTv0_n16_N3ccc9CC9x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x11y103pqrEv,_ZThn4_N3ccc9CC9x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x11y10E = {  "_ZN3ccc9CC9x11y10E", // class name
  bases__ZN3ccc9CC9x11y10E, 2,
  &(vtc__ZN3ccc9CC9x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x11y10E),2, //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  DD9x11y10  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD9x11y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD9x11y103abcEv
  ~DD9x11y10(); // tgen
  DD9x11y10(); // tgen
};
//SIG(1 _ZN3ccc9DD9x11y10E) C1{ VBC2{ v3 v1} VBC3{ v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x11y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x11y103pqrEv");}
void  ccc::DD9x11y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x11y103abcEv");}
ccc::DD9x11y10 ::~DD9x11y10(){ note_dtor("_ZN3ccc9DD9x11y10E", this);} // tgen
ccc::DD9x11y10 ::DD9x11y10(){ note_ctor("_ZN3ccc9DD9x11y10E", this);} // tgen
}
static void Test__ZN3ccc9DD9x11y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x11y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x11y10E, buf);
    ::ccc::DD9x11y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x11y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x11y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x11y10E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD9x11y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x11y10E);
    dp->::ccc::DD9x11y10::~DD9x11y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x11y10E(Test__ZN3ccc9DD9x11y10E, "_ZN3ccc9DD9x11y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x11y10C1Ev();
extern void _ZN3ccc9DD9x11y10D1Ev();
Name_Map name_map__ZN3ccc9DD9x11y10E[] = {
  NSPAIR(_ZN3ccc9DD9x11y10C1Ev),
  NSPAIR(_ZN3ccc9DD9x11y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD9x11y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x11y103pqrEv();
extern void _ZN3ccc9DD9x11y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x11y103pqrEv,_ZTv0_n12_N3ccc9DD9x11y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x11y103pqrEv,_ZThn4_N3ccc9DD9x11y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x11y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x11y103pqrEv,_ZTv0_n12_N3ccc9DD9x11y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x11y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x11y10E[] = {
  {&(_ZTVN3ccc9DD9x11y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x11y10E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x11y10E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x11y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x11y10E[];
static VTBL_ENTRY alt_thunk_names1925[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x11y103pqrEv,_ZTv0_n12_N3ccc9DD9x11y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x11y103pqrEv,_ZThn4_N3ccc9DD9x11y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x11y10E = {  "_ZN3ccc9DD9x11y10E", // class name
  bases__ZN3ccc9DD9x11y10E, 2,
  &(vtc__ZN3ccc9DD9x11y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x11y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x11y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x11y10E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x11y10E),3, //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  CC9x11y11  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC9x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x11y113efgEv
  ~CC9x11y11(); // tgen
  CC9x11y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y11E) C1{ VBC2{ v2 v1} BC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x11y113pqrEv");}
void  ccc::CC9x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x11y113efgEv");}
ccc::CC9x11y11 ::~CC9x11y11(){ note_dtor("_ZN3ccc9CC9x11y11E", this);} // tgen
ccc::CC9x11y11 ::CC9x11y11(){ note_ctor("_ZN3ccc9CC9x11y11E", this);} // tgen
}
static void Test__ZN3ccc9CC9x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x11y11E, buf);
    ::ccc::CC9x11y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x11y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC9x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x11y11E);
    dp->::ccc::CC9x11y11::~CC9x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x11y11E(Test__ZN3ccc9CC9x11y11E, "_ZN3ccc9CC9x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x11y11C1Ev();
extern void _ZN3ccc9CC9x11y11D1Ev();
Name_Map name_map__ZN3ccc9CC9x11y11E[] = {
  NSPAIR(_ZN3ccc9CC9x11y11C1Ev),
  NSPAIR(_ZN3ccc9CC9x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC9x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x11y11E[];
extern void _ZN3ccc9CC9x11y113pqrEv();
extern void _ZN3ccc9CC9x11y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x11y113efgEv,_ZTv0_n12_N3ccc9CC9x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y113efgEv,_ZThn4_N3ccc9CC9x11y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x11y113pqrEv,_ZTv0_n16_N3ccc9CC9x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y113pqrEv,_ZThn4_N3ccc9CC9x11y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x11y113efgEv,_ZTv0_n12_N3ccc9CC9x11y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x11y113pqrEv,_ZTv0_n16_N3ccc9CC9x11y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x11y11E[] = {
  {&(_ZTVN3ccc9CC9x11y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x11y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x11y11E[];
static VTBL_ENTRY alt_thunk_names1926[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x11y113pqrEv,_ZTv0_n16_N3ccc9CC9x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x11y113pqrEv,_ZThn4_N3ccc9CC9x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x11y113efgEv,_ZTv0_n12_N3ccc9CC9x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x11y113efgEv,_ZThn4_N3ccc9CC9x11y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x11y11E = {  "_ZN3ccc9CC9x11y11E", // class name
  bases__ZN3ccc9CC9x11y11E, 2,
  &(vtc__ZN3ccc9CC9x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x11y11E),2, //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  DD9x11y11  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD9x11y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD9x11y113efgEv
  ~DD9x11y11(); // tgen
  DD9x11y11(); // tgen
};
//SIG(1 _ZN3ccc9DD9x11y11E) C1{ VBC2{ v2 v1} VBC3{ v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x11y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x11y113pqrEv");}
void  ccc::DD9x11y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x11y113efgEv");}
ccc::DD9x11y11 ::~DD9x11y11(){ note_dtor("_ZN3ccc9DD9x11y11E", this);} // tgen
ccc::DD9x11y11 ::DD9x11y11(){ note_ctor("_ZN3ccc9DD9x11y11E", this);} // tgen
}
static void Test__ZN3ccc9DD9x11y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x11y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x11y11E, buf);
    ::ccc::DD9x11y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x11y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x11y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x11y11E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD9x11y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x11y11E);
    dp->::ccc::DD9x11y11::~DD9x11y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x11y11E(Test__ZN3ccc9DD9x11y11E, "_ZN3ccc9DD9x11y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x11y11C1Ev();
extern void _ZN3ccc9DD9x11y11D1Ev();
Name_Map name_map__ZN3ccc9DD9x11y11E[] = {
  NSPAIR(_ZN3ccc9DD9x11y11C1Ev),
  NSPAIR(_ZN3ccc9DD9x11y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD9x11y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y11E[];
extern void _ZN3ccc9DD9x11y113efgEv();
extern void _ZN3ccc9DD9x11y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x11y113pqrEv,_ZTv0_n12_N3ccc9DD9x11y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x11y113pqrEv,_ZThn4_N3ccc9DD9x11y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD9x11y113efgEv,_ZTv0_n16_N3ccc9DD9x11y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x11y113efgEv,_ZThn4_N3ccc9DD9x11y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x11y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x11y113pqrEv,_ZTv0_n12_N3ccc9DD9x11y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD9x11y113efgEv,_ZTv0_n16_N3ccc9DD9x11y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x11y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x11y11E[] = {
  {&(_ZTVN3ccc9DD9x11y11E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y11E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y11E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x11y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x11y11E[];
static VTBL_ENTRY alt_thunk_names1927[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD9x11y113efgEv,_ZTv0_n16_N3ccc9DD9x11y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x11y113efgEv,_ZThn4_N3ccc9DD9x11y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x11y113pqrEv,_ZTv0_n12_N3ccc9DD9x11y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x11y113pqrEv,_ZThn4_N3ccc9DD9x11y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x11y11E = {  "_ZN3ccc9DD9x11y11E", // class name
  bases__ZN3ccc9DD9x11y11E, 2,
  &(vtc__ZN3ccc9DD9x11y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x11y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x11y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x11y11E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x11y11E),3, //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  CC9x11y12  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9CC9x11y123abcEv
  ~CC9x11y12(); // tgen
  CC9x11y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y12E) C1{ VBC2{ v2 v3} BC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::CC9x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x11y123abcEv");}
ccc::CC9x11y12 ::~CC9x11y12(){ note_dtor("_ZN3ccc9CC9x11y12E", this);} // tgen
ccc::CC9x11y12 ::CC9x11y12(){ note_ctor("_ZN3ccc9CC9x11y12E", this);} // tgen
}
static void Test__ZN3ccc9CC9x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x11y12E, buf);
    ::ccc::CC9x11y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x11y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC9x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x11y12E);
    dp->::ccc::CC9x11y12::~CC9x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x11y12E(Test__ZN3ccc9CC9x11y12E, "_ZN3ccc9CC9x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x11y12C1Ev();
extern void _ZN3ccc9CC9x11y12D1Ev();
Name_Map name_map__ZN3ccc9CC9x11y12E[] = {
  NSPAIR(_ZN3ccc9CC9x11y12C1Ev),
  NSPAIR(_ZN3ccc9CC9x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC9x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x11y12E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc9CC9x11y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x11y12E[] = {
  {&(_ZTVN3ccc9CC9x11y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC9x11y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x11y12E[];
Class_Descriptor cd__ZN3ccc9CC9x11y12E = {  "_ZN3ccc9CC9x11y12E", // class name
  bases__ZN3ccc9CC9x11y12E, 2,
  &(vtc__ZN3ccc9CC9x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x11y12E),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  DD9x11y12  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  abc(); // _ZN3ccc9DD9x11y123abcEv
  ~DD9x11y12(); // tgen
  DD9x11y12(); // tgen
};
//SIG(1 _ZN3ccc9DD9x11y12E) C1{ VBC2{ v2 v3} VBC3{ v4 v5} v1}
}
namespace ccc { 
void  ccc::DD9x11y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x11y123abcEv");}
ccc::DD9x11y12 ::~DD9x11y12(){ note_dtor("_ZN3ccc9DD9x11y12E", this);} // tgen
ccc::DD9x11y12 ::DD9x11y12(){ note_ctor("_ZN3ccc9DD9x11y12E", this);} // tgen
}
static void Test__ZN3ccc9DD9x11y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x11y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x11y12E, buf);
    ::ccc::DD9x11y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x11y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x11y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x11y12E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD9x11y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x11y12E);
    dp->::ccc::DD9x11y12::~DD9x11y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x11y12E(Test__ZN3ccc9DD9x11y12E, "_ZN3ccc9DD9x11y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x11y12C1Ev();
extern void _ZN3ccc9DD9x11y12D1Ev();
Name_Map name_map__ZN3ccc9DD9x11y12E[] = {
  NSPAIR(_ZN3ccc9DD9x11y12C1Ev),
  NSPAIR(_ZN3ccc9DD9x11y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD9x11y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9DD9x11y123abcEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x11y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x11y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x11y12E[] = {
  {&(_ZTVN3ccc9DD9x11y12E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x11y12E[6]),  6,15},
  {&(_ZTVN3ccc9DD9x11y12E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x11y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x11y12E[];
Class_Descriptor cd__ZN3ccc9DD9x11y12E = {  "_ZN3ccc9DD9x11y12E", // class name
  bases__ZN3ccc9DD9x11y12E, 2,
  &(vtc__ZN3ccc9DD9x11y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x11y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x11y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x11y12E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x11y12E),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  CC9x11y13  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9CC9x11y133efgEv
  ~CC9x11y13(); // tgen
  CC9x11y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y13E) C1{ VBC2{ v1 v2} BC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::CC9x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x11y133efgEv");}
ccc::CC9x11y13 ::~CC9x11y13(){ note_dtor("_ZN3ccc9CC9x11y13E", this);} // tgen
ccc::CC9x11y13 ::CC9x11y13(){ note_ctor("_ZN3ccc9CC9x11y13E", this);} // tgen
}
static void Test__ZN3ccc9CC9x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x11y13E, buf);
    ::ccc::CC9x11y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x11y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC9x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x11y13E);
    dp->::ccc::CC9x11y13::~CC9x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x11y13E(Test__ZN3ccc9CC9x11y13E, "_ZN3ccc9CC9x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x11y13C1Ev();
extern void _ZN3ccc9CC9x11y13D1Ev();
Name_Map name_map__ZN3ccc9CC9x11y13E[] = {
  NSPAIR(_ZN3ccc9CC9x11y13C1Ev),
  NSPAIR(_ZN3ccc9CC9x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC9x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x11y13E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc9CC9x11y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x11y133efgEv,_ZTv0_n12_N3ccc9CC9x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y133efgEv,_ZThn4_N3ccc9CC9x11y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x11y133efgEv,_ZTv0_n12_N3ccc9CC9x11y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x11y13E[] = {
  {&(_ZTVN3ccc9CC9x11y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x11y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x11y13E[];
static VTBL_ENTRY alt_thunk_names1928[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x11y133efgEv,_ZTv0_n12_N3ccc9CC9x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x11y133efgEv,_ZThn4_N3ccc9CC9x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x11y13E = {  "_ZN3ccc9CC9x11y13E", // class name
  bases__ZN3ccc9CC9x11y13E, 2,
  &(vtc__ZN3ccc9CC9x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x11y13E),2, //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  DD9x11y13  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  efg(); // _ZN3ccc9DD9x11y133efgEv
  ~DD9x11y13(); // tgen
  DD9x11y13(); // tgen
};
//SIG(1 _ZN3ccc9DD9x11y13E) C1{ VBC2{ v1 v2} VBC3{ v3 v1} v1}
}
namespace ccc { 
void  ccc::DD9x11y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x11y133efgEv");}
ccc::DD9x11y13 ::~DD9x11y13(){ note_dtor("_ZN3ccc9DD9x11y13E", this);} // tgen
ccc::DD9x11y13 ::DD9x11y13(){ note_ctor("_ZN3ccc9DD9x11y13E", this);} // tgen
}
static void Test__ZN3ccc9DD9x11y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x11y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x11y13E, buf);
    ::ccc::DD9x11y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x11y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x11y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x11y13E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD9x11y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x11y13E);
    dp->::ccc::DD9x11y13::~DD9x11y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x11y13E(Test__ZN3ccc9DD9x11y13E, "_ZN3ccc9DD9x11y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x11y13C1Ev();
extern void _ZN3ccc9DD9x11y13D1Ev();
Name_Map name_map__ZN3ccc9DD9x11y13E[] = {
  NSPAIR(_ZN3ccc9DD9x11y13C1Ev),
  NSPAIR(_ZN3ccc9DD9x11y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD9x11y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y13E[];
extern void _ZN3ccc9DD9x11y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD9x11y133efgEv,_ZTv0_n16_N3ccc9DD9x11y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x11y133efgEv,_ZThn4_N3ccc9DD9x11y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x11y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD9x11y133efgEv,_ZTv0_n16_N3ccc9DD9x11y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x11y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x11y13E[] = {
  {&(_ZTVN3ccc9DD9x11y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y13E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y13E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x11y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x11y13E[];
static VTBL_ENTRY alt_thunk_names1929[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD9x11y133efgEv,_ZTv0_n16_N3ccc9DD9x11y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x11y133efgEv,_ZThn4_N3ccc9DD9x11y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x11y13E = {  "_ZN3ccc9DD9x11y13E", // class name
  bases__ZN3ccc9DD9x11y13E, 2,
  &(vtc__ZN3ccc9DD9x11y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x11y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x11y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x11y13E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x11y13E),3, //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  CC9x11y14  : virtual ::ccc::AA9 , ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9CC9x11y143pqrEv
  ~CC9x11y14(); // tgen
  CC9x11y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y14E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::CC9x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x11y143pqrEv");}
ccc::CC9x11y14 ::~CC9x11y14(){ note_dtor("_ZN3ccc9CC9x11y14E", this);} // tgen
ccc::CC9x11y14 ::CC9x11y14(){ note_ctor("_ZN3ccc9CC9x11y14E", this);} // tgen
}
static void Test__ZN3ccc9CC9x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x11y14E, buf);
    ::ccc::CC9x11y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x11y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC9x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x11y14E);
    dp->::ccc::CC9x11y14::~CC9x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x11y14E(Test__ZN3ccc9CC9x11y14E, "_ZN3ccc9CC9x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x11y14C1Ev();
extern void _ZN3ccc9CC9x11y14D1Ev();
Name_Map name_map__ZN3ccc9CC9x11y14E[] = {
  NSPAIR(_ZN3ccc9CC9x11y14C1Ev),
  NSPAIR(_ZN3ccc9CC9x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC9x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x11y14E[];
extern void _ZN3ccc9CC9x11y143pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x11y143pqrEv,_ZTv0_n16_N3ccc9CC9x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x11y143pqrEv,_ZThn4_N3ccc9CC9x11y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x11y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x11y143pqrEv,_ZTv0_n16_N3ccc9CC9x11y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x11y14E[] = {
  {&(_ZTVN3ccc9CC9x11y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x11y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x11y14E[];
static VTBL_ENTRY alt_thunk_names1930[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x11y143pqrEv,_ZTv0_n16_N3ccc9CC9x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x11y143pqrEv,_ZThn4_N3ccc9CC9x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x11y14E = {  "_ZN3ccc9CC9x11y14E", // class name
  bases__ZN3ccc9CC9x11y14E, 2,
  &(vtc__ZN3ccc9CC9x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x11y14E),2, //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  DD9x11y14  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  virtual void  pqr(); // _ZN3ccc9DD9x11y143pqrEv
  ~DD9x11y14(); // tgen
  DD9x11y14(); // tgen
};
//SIG(1 _ZN3ccc9DD9x11y14E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1}
}
namespace ccc { 
void  ccc::DD9x11y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x11y143pqrEv");}
ccc::DD9x11y14 ::~DD9x11y14(){ note_dtor("_ZN3ccc9DD9x11y14E", this);} // tgen
ccc::DD9x11y14 ::DD9x11y14(){ note_ctor("_ZN3ccc9DD9x11y14E", this);} // tgen
}
static void Test__ZN3ccc9DD9x11y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x11y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x11y14E, buf);
    ::ccc::DD9x11y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x11y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x11y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x11y14E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD9x11y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x11y14E);
    dp->::ccc::DD9x11y14::~DD9x11y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x11y14E(Test__ZN3ccc9DD9x11y14E, "_ZN3ccc9DD9x11y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x11y14C1Ev();
extern void _ZN3ccc9DD9x11y14D1Ev();
Name_Map name_map__ZN3ccc9DD9x11y14E[] = {
  NSPAIR(_ZN3ccc9DD9x11y14C1Ev),
  NSPAIR(_ZN3ccc9DD9x11y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD9x11y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x11y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x11y143pqrEv,_ZTv0_n12_N3ccc9DD9x11y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x11y143pqrEv,_ZThn4_N3ccc9DD9x11y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x11y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x11y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x11y143pqrEv,_ZTv0_n12_N3ccc9DD9x11y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x11y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x11y14E[] = {
  {&(_ZTVN3ccc9DD9x11y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y14E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y14E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x11y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x11y14E[];
static VTBL_ENTRY alt_thunk_names1931[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x11y143pqrEv,_ZTv0_n12_N3ccc9DD9x11y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x11y143pqrEv,_ZThn4_N3ccc9DD9x11y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x11y14E = {  "_ZN3ccc9DD9x11y14E", // class name
  bases__ZN3ccc9DD9x11y14E, 2,
  &(vtc__ZN3ccc9DD9x11y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x11y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x11y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x11y14E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x11y14E),3, //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  CC9x11y15  : virtual ::ccc::AA9 , ::ccc::BB11 {
  ~CC9x11y15(); // tgen
  CC9x11y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x11y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4}}
}
namespace ccc { 
ccc::CC9x11y15 ::~CC9x11y15(){ note_dtor("_ZN3ccc9CC9x11y15E", this);} // tgen
ccc::CC9x11y15 ::CC9x11y15(){ note_ctor("_ZN3ccc9CC9x11y15E", this);} // tgen
}
static void Test__ZN3ccc9CC9x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x11y15E, buf);
    ::ccc::CC9x11y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x11y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), 0, "_ZN3ccc9CC9x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x11y15E);
    dp->::ccc::CC9x11y15::~CC9x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x11y15E(Test__ZN3ccc9CC9x11y15E, "_ZN3ccc9CC9x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x11y15C1Ev();
extern void _ZN3ccc9CC9x11y15D1Ev();
Name_Map name_map__ZN3ccc9CC9x11y15E[] = {
  NSPAIR(_ZN3ccc9CC9x11y15C1Ev),
  NSPAIR(_ZN3ccc9CC9x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9CC9x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x11y15E[];
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x11y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x11y15E[] = {
  {&(_ZTVN3ccc9CC9x11y15E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x11y15E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x11y15E[];
Class_Descriptor cd__ZN3ccc9CC9x11y15E = {  "_ZN3ccc9CC9x11y15E", // class name
  bases__ZN3ccc9CC9x11y15E, 2,
  &(vtc__ZN3ccc9CC9x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x11y15E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x11y15E),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  DD9x11y15  : virtual ::ccc::AA9 , virtual ::ccc::BB11 {
  ~DD9x11y15(); // tgen
  DD9x11y15(); // tgen
};
//SIG(1 _ZN3ccc9DD9x11y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4}}
}
namespace ccc { 
ccc::DD9x11y15 ::~DD9x11y15(){ note_dtor("_ZN3ccc9DD9x11y15E", this);} // tgen
ccc::DD9x11y15 ::DD9x11y15(){ note_ctor("_ZN3ccc9DD9x11y15E", this);} // tgen
}
static void Test__ZN3ccc9DD9x11y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x11y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x11y15E, buf);
    ::ccc::DD9x11y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x11y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x11y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x11y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x11y15E");
    check_base_class_offset(lv, (::ccc::BB11*), ABISELECT(8,4), "_ZN3ccc9DD9x11y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x11y15E);
    dp->::ccc::DD9x11y15::~DD9x11y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x11y15E(Test__ZN3ccc9DD9x11y15E, "_ZN3ccc9DD9x11y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x11y15C1Ev();
extern void _ZN3ccc9DD9x11y15D1Ev();
Name_Map name_map__ZN3ccc9DD9x11y15E[] = {
  NSPAIR(_ZN3ccc9DD9x11y15C1Ev),
  NSPAIR(_ZN3ccc9DD9x11y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB11E;
extern VTBL_ENTRY _ZTIN3ccc4BB11E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB11E[];
static Base_Class bases__ZN3ccc9DD9x11y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB11E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB113pqrEv();
extern void _ZN3ccc4BB113efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x11y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x11y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4BB113efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x11y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x11y15E[] = {
  {&(_ZTVN3ccc9DD9x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y15E[6]),  6,14},
  {&(_ZTVN3ccc9DD9x11y15E[12]),  12,14},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x11y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x11y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x11y15E[];
Class_Descriptor cd__ZN3ccc9DD9x11y15E = {  "_ZN3ccc9DD9x11y15E", // class name
  bases__ZN3ccc9DD9x11y15E, 2,
  &(vtc__ZN3ccc9DD9x11y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x11y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x11y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x11y15E),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x11y15E),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  CC9x12y0  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y03pqrEv
  ~CC9x12y0(); // tgen
  CC9x12y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y0E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y03abcEv");}
void  ccc::CC9x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y03efgEv");}
void  ccc::CC9x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y03pqrEv");}
ccc::CC9x12y0 ::~CC9x12y0(){ note_dtor("_ZN3ccc8CC9x12y0E", this);} // tgen
ccc::CC9x12y0 ::CC9x12y0(){ note_ctor("_ZN3ccc8CC9x12y0E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y0E, buf);
    ::ccc::CC9x12y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y0E);
    dp->::ccc::CC9x12y0::~CC9x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y0E(Test__ZN3ccc8CC9x12y0E, "_ZN3ccc8CC9x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y0C1Ev();
extern void _ZN3ccc8CC9x12y0D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y0E[] = {
  NSPAIR(_ZN3ccc8CC9x12y0C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y0E[];
extern void _ZN3ccc8CC9x12y03abcEv();
extern void _ZN3ccc8CC9x12y03efgEv();
extern void _ZN3ccc8CC9x12y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y03efgEv,_ZTv0_n12_N3ccc8CC9x12y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y03efgEv,_ZThn4_N3ccc8CC9x12y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y03pqrEv,_ZTv0_n16_N3ccc8CC9x12y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y03pqrEv,_ZThn4_N3ccc8CC9x12y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y03efgEv,_ZTv0_n12_N3ccc8CC9x12y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y03pqrEv,_ZTv0_n16_N3ccc8CC9x12y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y0E[] = {
  {&(_ZTVN3ccc8CC9x12y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y0E[];
static VTBL_ENTRY alt_thunk_names1932[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y03pqrEv,_ZTv0_n16_N3ccc8CC9x12y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y03pqrEv,_ZThn4_N3ccc8CC9x12y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y03efgEv,_ZTv0_n12_N3ccc8CC9x12y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y03efgEv,_ZThn4_N3ccc8CC9x12y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y0E = {  "_ZN3ccc8CC9x12y0E", // class name
  bases__ZN3ccc8CC9x12y0E, 2,
  &(vtc__ZN3ccc8CC9x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y0E),2, //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  DD9x12y0  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD9x12y03abcEv
  virtual void  efg(); // _ZN3ccc8DD9x12y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x12y03pqrEv
  ~DD9x12y0(); // tgen
  DD9x12y0(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y0E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x12y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y03abcEv");}
void  ccc::DD9x12y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y03efgEv");}
void  ccc::DD9x12y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y03pqrEv");}
ccc::DD9x12y0 ::~DD9x12y0(){ note_dtor("_ZN3ccc8DD9x12y0E", this);} // tgen
ccc::DD9x12y0 ::DD9x12y0(){ note_ctor("_ZN3ccc8DD9x12y0E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y0E, buf);
    ::ccc::DD9x12y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y0E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y0E);
    dp->::ccc::DD9x12y0::~DD9x12y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y0E(Test__ZN3ccc8DD9x12y0E, "_ZN3ccc8DD9x12y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y0C1Ev();
extern void _ZN3ccc8DD9x12y0D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y0E[] = {
  NSPAIR(_ZN3ccc8DD9x12y0C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y0E[];
extern void _ZN3ccc8DD9x12y03efgEv();
extern void _ZN3ccc8DD9x12y03pqrEv();
extern void _ZN3ccc8DD9x12y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y03abcEv,_ZTv0_n12_N3ccc8DD9x12y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y03abcEv,_ZThn4_N3ccc8DD9x12y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y03abcEv,_ZTv0_n12_N3ccc8DD9x12y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y0E[] = {
  {&(_ZTVN3ccc8DD9x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y0E[];
static VTBL_ENTRY alt_thunk_names1933[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y03abcEv,_ZTv0_n12_N3ccc8DD9x12y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y03abcEv,_ZThn4_N3ccc8DD9x12y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y0E = {  "_ZN3ccc8DD9x12y0E", // class name
  bases__ZN3ccc8DD9x12y0E, 2,
  &(vtc__ZN3ccc8DD9x12y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y0E),3, //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  CC9x12y1  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x12y13efgEv
  ~CC9x12y1(); // tgen
  CC9x12y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y1E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y13abcEv");}
void  ccc::CC9x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y13pqrEv");}
void  ccc::CC9x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y13efgEv");}
ccc::CC9x12y1 ::~CC9x12y1(){ note_dtor("_ZN3ccc8CC9x12y1E", this);} // tgen
ccc::CC9x12y1 ::CC9x12y1(){ note_ctor("_ZN3ccc8CC9x12y1E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y1E, buf);
    ::ccc::CC9x12y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y1E);
    dp->::ccc::CC9x12y1::~CC9x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y1E(Test__ZN3ccc8CC9x12y1E, "_ZN3ccc8CC9x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y1C1Ev();
extern void _ZN3ccc8CC9x12y1D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y1E[] = {
  NSPAIR(_ZN3ccc8CC9x12y1C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y1E[];
extern void _ZN3ccc8CC9x12y13abcEv();
extern void _ZN3ccc8CC9x12y13pqrEv();
extern void _ZN3ccc8CC9x12y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y13efgEv,_ZTv0_n12_N3ccc8CC9x12y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y13efgEv,_ZThn4_N3ccc8CC9x12y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y13pqrEv,_ZTv0_n16_N3ccc8CC9x12y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y13pqrEv,_ZThn4_N3ccc8CC9x12y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y13efgEv,_ZTv0_n12_N3ccc8CC9x12y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y13pqrEv,_ZTv0_n16_N3ccc8CC9x12y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y1E[] = {
  {&(_ZTVN3ccc8CC9x12y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y1E[];
static VTBL_ENTRY alt_thunk_names1934[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y13pqrEv,_ZTv0_n16_N3ccc8CC9x12y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y13pqrEv,_ZThn4_N3ccc8CC9x12y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y13efgEv,_ZTv0_n12_N3ccc8CC9x12y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y13efgEv,_ZThn4_N3ccc8CC9x12y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y1E = {  "_ZN3ccc8CC9x12y1E", // class name
  bases__ZN3ccc8CC9x12y1E, 2,
  &(vtc__ZN3ccc8CC9x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y1E),2, //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  DD9x12y1  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD9x12y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x12y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x12y13efgEv
  ~DD9x12y1(); // tgen
  DD9x12y1(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y1E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x12y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y13abcEv");}
void  ccc::DD9x12y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y13pqrEv");}
void  ccc::DD9x12y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y13efgEv");}
ccc::DD9x12y1 ::~DD9x12y1(){ note_dtor("_ZN3ccc8DD9x12y1E", this);} // tgen
ccc::DD9x12y1 ::DD9x12y1(){ note_ctor("_ZN3ccc8DD9x12y1E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y1E, buf);
    ::ccc::DD9x12y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y1E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y1E);
    dp->::ccc::DD9x12y1::~DD9x12y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y1E(Test__ZN3ccc8DD9x12y1E, "_ZN3ccc8DD9x12y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y1C1Ev();
extern void _ZN3ccc8DD9x12y1D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y1E[] = {
  NSPAIR(_ZN3ccc8DD9x12y1C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y1E[];
extern void _ZN3ccc8DD9x12y13efgEv();
extern void _ZN3ccc8DD9x12y13pqrEv();
extern void _ZN3ccc8DD9x12y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y13abcEv,_ZTv0_n12_N3ccc8DD9x12y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y13abcEv,_ZThn4_N3ccc8DD9x12y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y13abcEv,_ZTv0_n12_N3ccc8DD9x12y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y1E[] = {
  {&(_ZTVN3ccc8DD9x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y1E[];
static VTBL_ENTRY alt_thunk_names1935[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y13abcEv,_ZTv0_n12_N3ccc8DD9x12y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y13abcEv,_ZThn4_N3ccc8DD9x12y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y1E = {  "_ZN3ccc8DD9x12y1E", // class name
  bases__ZN3ccc8DD9x12y1E, 2,
  &(vtc__ZN3ccc8DD9x12y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y1E),3, //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  CC9x12y2  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y23pqrEv
  ~CC9x12y2(); // tgen
  CC9x12y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y2E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y23efgEv");}
void  ccc::CC9x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y23abcEv");}
void  ccc::CC9x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y23pqrEv");}
ccc::CC9x12y2 ::~CC9x12y2(){ note_dtor("_ZN3ccc8CC9x12y2E", this);} // tgen
ccc::CC9x12y2 ::CC9x12y2(){ note_ctor("_ZN3ccc8CC9x12y2E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y2E, buf);
    ::ccc::CC9x12y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y2E);
    dp->::ccc::CC9x12y2::~CC9x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y2E(Test__ZN3ccc8CC9x12y2E, "_ZN3ccc8CC9x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y2C1Ev();
extern void _ZN3ccc8CC9x12y2D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y2E[] = {
  NSPAIR(_ZN3ccc8CC9x12y2C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y2E[];
extern void _ZN3ccc8CC9x12y23abcEv();
extern void _ZN3ccc8CC9x12y23efgEv();
extern void _ZN3ccc8CC9x12y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y23efgEv,_ZTv0_n12_N3ccc8CC9x12y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y23efgEv,_ZThn4_N3ccc8CC9x12y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y23pqrEv,_ZTv0_n16_N3ccc8CC9x12y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y23pqrEv,_ZThn4_N3ccc8CC9x12y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y23efgEv,_ZTv0_n12_N3ccc8CC9x12y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y23pqrEv,_ZTv0_n16_N3ccc8CC9x12y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y2E[] = {
  {&(_ZTVN3ccc8CC9x12y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y2E[];
static VTBL_ENTRY alt_thunk_names1936[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y23pqrEv,_ZTv0_n16_N3ccc8CC9x12y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y23pqrEv,_ZThn4_N3ccc8CC9x12y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y23efgEv,_ZTv0_n12_N3ccc8CC9x12y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y23efgEv,_ZThn4_N3ccc8CC9x12y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y2E = {  "_ZN3ccc8CC9x12y2E", // class name
  bases__ZN3ccc8CC9x12y2E, 2,
  &(vtc__ZN3ccc8CC9x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y2E),2, //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  DD9x12y2  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD9x12y23efgEv
  virtual void  abc(); // _ZN3ccc8DD9x12y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x12y23pqrEv
  ~DD9x12y2(); // tgen
  DD9x12y2(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y2E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x12y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y23efgEv");}
void  ccc::DD9x12y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y23abcEv");}
void  ccc::DD9x12y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y23pqrEv");}
ccc::DD9x12y2 ::~DD9x12y2(){ note_dtor("_ZN3ccc8DD9x12y2E", this);} // tgen
ccc::DD9x12y2 ::DD9x12y2(){ note_ctor("_ZN3ccc8DD9x12y2E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y2E, buf);
    ::ccc::DD9x12y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y2E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y2E);
    dp->::ccc::DD9x12y2::~DD9x12y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y2E(Test__ZN3ccc8DD9x12y2E, "_ZN3ccc8DD9x12y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y2C1Ev();
extern void _ZN3ccc8DD9x12y2D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y2E[] = {
  NSPAIR(_ZN3ccc8DD9x12y2C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y2E[];
extern void _ZN3ccc8DD9x12y23efgEv();
extern void _ZN3ccc8DD9x12y23pqrEv();
extern void _ZN3ccc8DD9x12y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y23abcEv,_ZTv0_n12_N3ccc8DD9x12y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y23abcEv,_ZThn4_N3ccc8DD9x12y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y23abcEv,_ZTv0_n12_N3ccc8DD9x12y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y2E[] = {
  {&(_ZTVN3ccc8DD9x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y2E[];
static VTBL_ENTRY alt_thunk_names1937[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y23abcEv,_ZTv0_n12_N3ccc8DD9x12y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y23abcEv,_ZThn4_N3ccc8DD9x12y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y2E = {  "_ZN3ccc8DD9x12y2E", // class name
  bases__ZN3ccc8DD9x12y2E, 2,
  &(vtc__ZN3ccc8DD9x12y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y2E),3, //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  CC9x12y3  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x12y33abcEv
  ~CC9x12y3(); // tgen
  CC9x12y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y3E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y33efgEv");}
void  ccc::CC9x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y33pqrEv");}
void  ccc::CC9x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y33abcEv");}
ccc::CC9x12y3 ::~CC9x12y3(){ note_dtor("_ZN3ccc8CC9x12y3E", this);} // tgen
ccc::CC9x12y3 ::CC9x12y3(){ note_ctor("_ZN3ccc8CC9x12y3E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y3E, buf);
    ::ccc::CC9x12y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y3E);
    dp->::ccc::CC9x12y3::~CC9x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y3E(Test__ZN3ccc8CC9x12y3E, "_ZN3ccc8CC9x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y3C1Ev();
extern void _ZN3ccc8CC9x12y3D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y3E[] = {
  NSPAIR(_ZN3ccc8CC9x12y3C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y3E[];
extern void _ZN3ccc8CC9x12y33abcEv();
extern void _ZN3ccc8CC9x12y33efgEv();
extern void _ZN3ccc8CC9x12y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y33efgEv,_ZTv0_n12_N3ccc8CC9x12y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y33efgEv,_ZThn4_N3ccc8CC9x12y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y33pqrEv,_ZTv0_n16_N3ccc8CC9x12y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y33pqrEv,_ZThn4_N3ccc8CC9x12y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y33efgEv,_ZTv0_n12_N3ccc8CC9x12y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y33pqrEv,_ZTv0_n16_N3ccc8CC9x12y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y3E[] = {
  {&(_ZTVN3ccc8CC9x12y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y3E[];
static VTBL_ENTRY alt_thunk_names1938[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y33pqrEv,_ZTv0_n16_N3ccc8CC9x12y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y33pqrEv,_ZThn4_N3ccc8CC9x12y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y33efgEv,_ZTv0_n12_N3ccc8CC9x12y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y33efgEv,_ZThn4_N3ccc8CC9x12y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y3E = {  "_ZN3ccc8CC9x12y3E", // class name
  bases__ZN3ccc8CC9x12y3E, 2,
  &(vtc__ZN3ccc8CC9x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y3E),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  DD9x12y3  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD9x12y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x12y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x12y33abcEv
  ~DD9x12y3(); // tgen
  DD9x12y3(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y3E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x12y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y33efgEv");}
void  ccc::DD9x12y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y33pqrEv");}
void  ccc::DD9x12y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y33abcEv");}
ccc::DD9x12y3 ::~DD9x12y3(){ note_dtor("_ZN3ccc8DD9x12y3E", this);} // tgen
ccc::DD9x12y3 ::DD9x12y3(){ note_ctor("_ZN3ccc8DD9x12y3E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y3E, buf);
    ::ccc::DD9x12y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y3E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y3E);
    dp->::ccc::DD9x12y3::~DD9x12y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y3E(Test__ZN3ccc8DD9x12y3E, "_ZN3ccc8DD9x12y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y3C1Ev();
extern void _ZN3ccc8DD9x12y3D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y3E[] = {
  NSPAIR(_ZN3ccc8DD9x12y3C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y3E[];
extern void _ZN3ccc8DD9x12y33efgEv();
extern void _ZN3ccc8DD9x12y33pqrEv();
extern void _ZN3ccc8DD9x12y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y33abcEv,_ZTv0_n12_N3ccc8DD9x12y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y33abcEv,_ZThn4_N3ccc8DD9x12y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y33abcEv,_ZTv0_n12_N3ccc8DD9x12y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y3E[] = {
  {&(_ZTVN3ccc8DD9x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y3E[];
static VTBL_ENTRY alt_thunk_names1939[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y33abcEv,_ZTv0_n12_N3ccc8DD9x12y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y33abcEv,_ZThn4_N3ccc8DD9x12y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y3E = {  "_ZN3ccc8DD9x12y3E", // class name
  bases__ZN3ccc8DD9x12y3E, 2,
  &(vtc__ZN3ccc8DD9x12y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y3E),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  CC9x12y4  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC9x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x12y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x12y43efgEv
  ~CC9x12y4(); // tgen
  CC9x12y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y4E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y43pqrEv");}
void  ccc::CC9x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y43abcEv");}
void  ccc::CC9x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y43efgEv");}
ccc::CC9x12y4 ::~CC9x12y4(){ note_dtor("_ZN3ccc8CC9x12y4E", this);} // tgen
ccc::CC9x12y4 ::CC9x12y4(){ note_ctor("_ZN3ccc8CC9x12y4E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y4E, buf);
    ::ccc::CC9x12y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y4E);
    dp->::ccc::CC9x12y4::~CC9x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y4E(Test__ZN3ccc8CC9x12y4E, "_ZN3ccc8CC9x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y4C1Ev();
extern void _ZN3ccc8CC9x12y4D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y4E[] = {
  NSPAIR(_ZN3ccc8CC9x12y4C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y4E[];
extern void _ZN3ccc8CC9x12y43abcEv();
extern void _ZN3ccc8CC9x12y43pqrEv();
extern void _ZN3ccc8CC9x12y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y43efgEv,_ZTv0_n12_N3ccc8CC9x12y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y43efgEv,_ZThn4_N3ccc8CC9x12y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y43pqrEv,_ZTv0_n16_N3ccc8CC9x12y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y43pqrEv,_ZThn4_N3ccc8CC9x12y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y43efgEv,_ZTv0_n12_N3ccc8CC9x12y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y43pqrEv,_ZTv0_n16_N3ccc8CC9x12y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y4E[] = {
  {&(_ZTVN3ccc8CC9x12y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y4E[];
static VTBL_ENTRY alt_thunk_names1940[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y43pqrEv,_ZTv0_n16_N3ccc8CC9x12y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y43pqrEv,_ZThn4_N3ccc8CC9x12y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y43efgEv,_ZTv0_n12_N3ccc8CC9x12y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y43efgEv,_ZThn4_N3ccc8CC9x12y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y4E = {  "_ZN3ccc8CC9x12y4E", // class name
  bases__ZN3ccc8CC9x12y4E, 2,
  &(vtc__ZN3ccc8CC9x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y4E),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  DD9x12y4  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD9x12y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x12y43abcEv
  virtual void  efg(); // _ZN3ccc8DD9x12y43efgEv
  ~DD9x12y4(); // tgen
  DD9x12y4(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y4E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x12y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y43pqrEv");}
void  ccc::DD9x12y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y43abcEv");}
void  ccc::DD9x12y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y43efgEv");}
ccc::DD9x12y4 ::~DD9x12y4(){ note_dtor("_ZN3ccc8DD9x12y4E", this);} // tgen
ccc::DD9x12y4 ::DD9x12y4(){ note_ctor("_ZN3ccc8DD9x12y4E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y4E, buf);
    ::ccc::DD9x12y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y4E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y4E);
    dp->::ccc::DD9x12y4::~DD9x12y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y4E(Test__ZN3ccc8DD9x12y4E, "_ZN3ccc8DD9x12y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y4C1Ev();
extern void _ZN3ccc8DD9x12y4D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y4E[] = {
  NSPAIR(_ZN3ccc8DD9x12y4C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y4E[];
extern void _ZN3ccc8DD9x12y43efgEv();
extern void _ZN3ccc8DD9x12y43pqrEv();
extern void _ZN3ccc8DD9x12y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y43abcEv,_ZTv0_n12_N3ccc8DD9x12y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y43abcEv,_ZThn4_N3ccc8DD9x12y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y43abcEv,_ZTv0_n12_N3ccc8DD9x12y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y4E[] = {
  {&(_ZTVN3ccc8DD9x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y4E[];
static VTBL_ENTRY alt_thunk_names1941[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y43abcEv,_ZTv0_n12_N3ccc8DD9x12y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y43abcEv,_ZThn4_N3ccc8DD9x12y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y4E = {  "_ZN3ccc8DD9x12y4E", // class name
  bases__ZN3ccc8DD9x12y4E, 2,
  &(vtc__ZN3ccc8DD9x12y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y4E),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  CC9x12y5  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8CC9x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x12y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x12y53abcEv
  ~CC9x12y5(); // tgen
  CC9x12y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y5E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y53pqrEv");}
void  ccc::CC9x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y53efgEv");}
void  ccc::CC9x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y53abcEv");}
ccc::CC9x12y5 ::~CC9x12y5(){ note_dtor("_ZN3ccc8CC9x12y5E", this);} // tgen
ccc::CC9x12y5 ::CC9x12y5(){ note_ctor("_ZN3ccc8CC9x12y5E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y5E, buf);
    ::ccc::CC9x12y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y5E);
    dp->::ccc::CC9x12y5::~CC9x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y5E(Test__ZN3ccc8CC9x12y5E, "_ZN3ccc8CC9x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y5C1Ev();
extern void _ZN3ccc8CC9x12y5D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y5E[] = {
  NSPAIR(_ZN3ccc8CC9x12y5C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y5E[];
extern void _ZN3ccc8CC9x12y53abcEv();
extern void _ZN3ccc8CC9x12y53pqrEv();
extern void _ZN3ccc8CC9x12y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y53efgEv,_ZTv0_n12_N3ccc8CC9x12y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y53efgEv,_ZThn4_N3ccc8CC9x12y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y53pqrEv,_ZTv0_n16_N3ccc8CC9x12y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y53pqrEv,_ZThn4_N3ccc8CC9x12y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y53efgEv,_ZTv0_n12_N3ccc8CC9x12y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y53pqrEv,_ZTv0_n16_N3ccc8CC9x12y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y5E[] = {
  {&(_ZTVN3ccc8CC9x12y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y5E[];
static VTBL_ENTRY alt_thunk_names1942[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y53pqrEv,_ZTv0_n16_N3ccc8CC9x12y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y53pqrEv,_ZThn4_N3ccc8CC9x12y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y53efgEv,_ZTv0_n12_N3ccc8CC9x12y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y53efgEv,_ZThn4_N3ccc8CC9x12y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y5E = {  "_ZN3ccc8CC9x12y5E", // class name
  bases__ZN3ccc8CC9x12y5E, 2,
  &(vtc__ZN3ccc8CC9x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y5E),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  DD9x12y5  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc8DD9x12y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x12y53efgEv
  virtual void  abc(); // _ZN3ccc8DD9x12y53abcEv
  ~DD9x12y5(); // tgen
  DD9x12y5(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y5E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x12y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y53pqrEv");}
void  ccc::DD9x12y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y53efgEv");}
void  ccc::DD9x12y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y53abcEv");}
ccc::DD9x12y5 ::~DD9x12y5(){ note_dtor("_ZN3ccc8DD9x12y5E", this);} // tgen
ccc::DD9x12y5 ::DD9x12y5(){ note_ctor("_ZN3ccc8DD9x12y5E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y5E, buf);
    ::ccc::DD9x12y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y5E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y5E);
    dp->::ccc::DD9x12y5::~DD9x12y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y5E(Test__ZN3ccc8DD9x12y5E, "_ZN3ccc8DD9x12y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y5C1Ev();
extern void _ZN3ccc8DD9x12y5D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y5E[] = {
  NSPAIR(_ZN3ccc8DD9x12y5C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y5E[];
extern void _ZN3ccc8DD9x12y53efgEv();
extern void _ZN3ccc8DD9x12y53pqrEv();
extern void _ZN3ccc8DD9x12y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y53abcEv,_ZTv0_n12_N3ccc8DD9x12y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y53abcEv,_ZThn4_N3ccc8DD9x12y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y53abcEv,_ZTv0_n12_N3ccc8DD9x12y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y5E[] = {
  {&(_ZTVN3ccc8DD9x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y5E[];
static VTBL_ENTRY alt_thunk_names1943[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y53abcEv,_ZTv0_n12_N3ccc8DD9x12y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y53abcEv,_ZThn4_N3ccc8DD9x12y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y5E = {  "_ZN3ccc8DD9x12y5E", // class name
  bases__ZN3ccc8DD9x12y5E, 2,
  &(vtc__ZN3ccc8DD9x12y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y5E),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  CC9x12y6  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x12y63efgEv
  ~CC9x12y6(); // tgen
  CC9x12y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y6E) C1{ VBC2{ v2 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y63abcEv");}
void  ccc::CC9x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y63efgEv");}
ccc::CC9x12y6 ::~CC9x12y6(){ note_dtor("_ZN3ccc8CC9x12y6E", this);} // tgen
ccc::CC9x12y6 ::CC9x12y6(){ note_ctor("_ZN3ccc8CC9x12y6E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y6E, buf);
    ::ccc::CC9x12y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y6E);
    dp->::ccc::CC9x12y6::~CC9x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y6E(Test__ZN3ccc8CC9x12y6E, "_ZN3ccc8CC9x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y6C1Ev();
extern void _ZN3ccc8CC9x12y6D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y6E[] = {
  NSPAIR(_ZN3ccc8CC9x12y6C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y6E[];
extern void _ZN3ccc8CC9x12y63abcEv();
extern void _ZN3ccc8CC9x12y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y63efgEv,_ZTv0_n12_N3ccc8CC9x12y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y63efgEv,_ZThn4_N3ccc8CC9x12y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y63efgEv,_ZTv0_n12_N3ccc8CC9x12y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y6E[] = {
  {&(_ZTVN3ccc8CC9x12y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x12y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y6E[];
static VTBL_ENTRY alt_thunk_names1944[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y63efgEv,_ZTv0_n12_N3ccc8CC9x12y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y63efgEv,_ZThn4_N3ccc8CC9x12y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y6E = {  "_ZN3ccc8CC9x12y6E", // class name
  bases__ZN3ccc8CC9x12y6E, 2,
  &(vtc__ZN3ccc8CC9x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y6E),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  DD9x12y6  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD9x12y63abcEv
  virtual void  efg(); // _ZN3ccc8DD9x12y63efgEv
  ~DD9x12y6(); // tgen
  DD9x12y6(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y6E) C1{ VBC2{ v2 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x12y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y63abcEv");}
void  ccc::DD9x12y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y63efgEv");}
ccc::DD9x12y6 ::~DD9x12y6(){ note_dtor("_ZN3ccc8DD9x12y6E", this);} // tgen
ccc::DD9x12y6 ::DD9x12y6(){ note_ctor("_ZN3ccc8DD9x12y6E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y6E, buf);
    ::ccc::DD9x12y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y6E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y6E);
    dp->::ccc::DD9x12y6::~DD9x12y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y6E(Test__ZN3ccc8DD9x12y6E, "_ZN3ccc8DD9x12y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y6C1Ev();
extern void _ZN3ccc8DD9x12y6D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y6E[] = {
  NSPAIR(_ZN3ccc8DD9x12y6C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y6E[];
extern void _ZN3ccc8DD9x12y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x12y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y63abcEv,_ZTv0_n12_N3ccc8DD9x12y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y63abcEv,_ZThn4_N3ccc8DD9x12y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y63abcEv,_ZTv0_n12_N3ccc8DD9x12y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y6E[] = {
  {&(_ZTVN3ccc8DD9x12y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y6E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y6E[];
static VTBL_ENTRY alt_thunk_names1945[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y63abcEv,_ZTv0_n12_N3ccc8DD9x12y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y63abcEv,_ZThn4_N3ccc8DD9x12y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y6E = {  "_ZN3ccc8DD9x12y6E", // class name
  bases__ZN3ccc8DD9x12y6E, 2,
  &(vtc__ZN3ccc8DD9x12y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y6E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y6E),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  CC9x12y7  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8CC9x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y73pqrEv
  ~CC9x12y7(); // tgen
  CC9x12y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y7E) C1{ VBC2{ v3 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y73abcEv");}
void  ccc::CC9x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y73pqrEv");}
ccc::CC9x12y7 ::~CC9x12y7(){ note_dtor("_ZN3ccc8CC9x12y7E", this);} // tgen
ccc::CC9x12y7 ::CC9x12y7(){ note_ctor("_ZN3ccc8CC9x12y7E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y7E, buf);
    ::ccc::CC9x12y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y7E);
    dp->::ccc::CC9x12y7::~CC9x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y7E(Test__ZN3ccc8CC9x12y7E, "_ZN3ccc8CC9x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y7C1Ev();
extern void _ZN3ccc8CC9x12y7D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y7E[] = {
  NSPAIR(_ZN3ccc8CC9x12y7C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y7E[];
extern void _ZN3ccc8CC9x12y73abcEv();
extern void _ZN3ccc8CC9x12y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y73pqrEv,_ZTv0_n16_N3ccc8CC9x12y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y73pqrEv,_ZThn4_N3ccc8CC9x12y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y73pqrEv,_ZTv0_n16_N3ccc8CC9x12y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y7E[] = {
  {&(_ZTVN3ccc8CC9x12y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x12y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y7E[];
static VTBL_ENTRY alt_thunk_names1946[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y73pqrEv,_ZTv0_n16_N3ccc8CC9x12y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y73pqrEv,_ZThn4_N3ccc8CC9x12y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y7E = {  "_ZN3ccc8CC9x12y7E", // class name
  bases__ZN3ccc8CC9x12y7E, 2,
  &(vtc__ZN3ccc8CC9x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y7E),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  DD9x12y7  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc8DD9x12y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x12y73pqrEv
  ~DD9x12y7(); // tgen
  DD9x12y7(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y7E) C1{ VBC2{ v3 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x12y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y73abcEv");}
void  ccc::DD9x12y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y73pqrEv");}
ccc::DD9x12y7 ::~DD9x12y7(){ note_dtor("_ZN3ccc8DD9x12y7E", this);} // tgen
ccc::DD9x12y7 ::DD9x12y7(){ note_ctor("_ZN3ccc8DD9x12y7E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y7E, buf);
    ::ccc::DD9x12y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y7E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y7E);
    dp->::ccc::DD9x12y7::~DD9x12y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y7E(Test__ZN3ccc8DD9x12y7E, "_ZN3ccc8DD9x12y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y7C1Ev();
extern void _ZN3ccc8DD9x12y7D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y7E[] = {
  NSPAIR(_ZN3ccc8DD9x12y7C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x12y73pqrEv();
extern void _ZN3ccc8DD9x12y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y73abcEv,_ZTv0_n12_N3ccc8DD9x12y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y73abcEv,_ZThn4_N3ccc8DD9x12y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y73abcEv,_ZTv0_n12_N3ccc8DD9x12y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y7E[] = {
  {&(_ZTVN3ccc8DD9x12y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y7E[];
static VTBL_ENTRY alt_thunk_names1947[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y73abcEv,_ZTv0_n12_N3ccc8DD9x12y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y73abcEv,_ZThn4_N3ccc8DD9x12y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y7E = {  "_ZN3ccc8DD9x12y7E", // class name
  bases__ZN3ccc8DD9x12y7E, 2,
  &(vtc__ZN3ccc8DD9x12y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y7E),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  CC9x12y8  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x12y83abcEv
  ~CC9x12y8(); // tgen
  CC9x12y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y8E) C1{ VBC2{ v1 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y83efgEv");}
void  ccc::CC9x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x12y83abcEv");}
ccc::CC9x12y8 ::~CC9x12y8(){ note_dtor("_ZN3ccc8CC9x12y8E", this);} // tgen
ccc::CC9x12y8 ::CC9x12y8(){ note_ctor("_ZN3ccc8CC9x12y8E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y8E, buf);
    ::ccc::CC9x12y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y8E);
    dp->::ccc::CC9x12y8::~CC9x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y8E(Test__ZN3ccc8CC9x12y8E, "_ZN3ccc8CC9x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y8C1Ev();
extern void _ZN3ccc8CC9x12y8D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y8E[] = {
  NSPAIR(_ZN3ccc8CC9x12y8C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y8E[];
extern void _ZN3ccc8CC9x12y83abcEv();
extern void _ZN3ccc8CC9x12y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y83efgEv,_ZTv0_n12_N3ccc8CC9x12y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y83efgEv,_ZThn4_N3ccc8CC9x12y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y83efgEv,_ZTv0_n12_N3ccc8CC9x12y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y8E[] = {
  {&(_ZTVN3ccc8CC9x12y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x12y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y8E[];
static VTBL_ENTRY alt_thunk_names1948[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y83efgEv,_ZTv0_n12_N3ccc8CC9x12y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y83efgEv,_ZThn4_N3ccc8CC9x12y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y8E = {  "_ZN3ccc8CC9x12y8E", // class name
  bases__ZN3ccc8CC9x12y8E, 2,
  &(vtc__ZN3ccc8CC9x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y8E),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  DD9x12y8  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD9x12y83efgEv
  virtual void  abc(); // _ZN3ccc8DD9x12y83abcEv
  ~DD9x12y8(); // tgen
  DD9x12y8(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y8E) C1{ VBC2{ v1 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x12y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y83efgEv");}
void  ccc::DD9x12y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x12y83abcEv");}
ccc::DD9x12y8 ::~DD9x12y8(){ note_dtor("_ZN3ccc8DD9x12y8E", this);} // tgen
ccc::DD9x12y8 ::DD9x12y8(){ note_ctor("_ZN3ccc8DD9x12y8E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y8E, buf);
    ::ccc::DD9x12y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y8E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y8E);
    dp->::ccc::DD9x12y8::~DD9x12y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y8E(Test__ZN3ccc8DD9x12y8E, "_ZN3ccc8DD9x12y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y8C1Ev();
extern void _ZN3ccc8DD9x12y8D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y8E[] = {
  NSPAIR(_ZN3ccc8DD9x12y8C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y8E[];
extern void _ZN3ccc8DD9x12y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x12y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x12y83abcEv,_ZTv0_n12_N3ccc8DD9x12y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x12y83abcEv,_ZThn4_N3ccc8DD9x12y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x12y83abcEv,_ZTv0_n12_N3ccc8DD9x12y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y8E[] = {
  {&(_ZTVN3ccc8DD9x12y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x12y8E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y8E[];
static VTBL_ENTRY alt_thunk_names1949[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x12y83abcEv,_ZTv0_n12_N3ccc8DD9x12y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x12y83abcEv,_ZThn4_N3ccc8DD9x12y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x12y8E = {  "_ZN3ccc8DD9x12y8E", // class name
  bases__ZN3ccc8DD9x12y8E, 2,
  &(vtc__ZN3ccc8DD9x12y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y8E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y8E),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  CC9x12y9  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8CC9x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x12y93pqrEv
  ~CC9x12y9(); // tgen
  CC9x12y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x12y9E) C1{ VBC2{ v1 v2} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x12y93efgEv");}
void  ccc::CC9x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x12y93pqrEv");}
ccc::CC9x12y9 ::~CC9x12y9(){ note_dtor("_ZN3ccc8CC9x12y9E", this);} // tgen
ccc::CC9x12y9 ::CC9x12y9(){ note_ctor("_ZN3ccc8CC9x12y9E", this);} // tgen
}
static void Test__ZN3ccc8CC9x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x12y9E, buf);
    ::ccc::CC9x12y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x12y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc8CC9x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x12y9E);
    dp->::ccc::CC9x12y9::~CC9x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x12y9E(Test__ZN3ccc8CC9x12y9E, "_ZN3ccc8CC9x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x12y9C1Ev();
extern void _ZN3ccc8CC9x12y9D1Ev();
Name_Map name_map__ZN3ccc8CC9x12y9E[] = {
  NSPAIR(_ZN3ccc8CC9x12y9C1Ev),
  NSPAIR(_ZN3ccc8CC9x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8CC9x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x12y9E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc8CC9x12y93efgEv();
extern void _ZN3ccc8CC9x12y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x12y93efgEv,_ZTv0_n12_N3ccc8CC9x12y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y93efgEv,_ZThn4_N3ccc8CC9x12y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x12y93pqrEv,_ZTv0_n16_N3ccc8CC9x12y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x12y93pqrEv,_ZThn4_N3ccc8CC9x12y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x12y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x12y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x12y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x12y93efgEv,_ZTv0_n12_N3ccc8CC9x12y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x12y93pqrEv,_ZTv0_n16_N3ccc8CC9x12y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x12y9E[] = {
  {&(_ZTVN3ccc8CC9x12y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x12y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x12y9E[];
static VTBL_ENTRY alt_thunk_names1950[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x12y93pqrEv,_ZTv0_n16_N3ccc8CC9x12y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y93pqrEv,_ZThn4_N3ccc8CC9x12y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x12y93efgEv,_ZTv0_n12_N3ccc8CC9x12y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x12y93efgEv,_ZThn4_N3ccc8CC9x12y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x12y9E = {  "_ZN3ccc8CC9x12y9E", // class name
  bases__ZN3ccc8CC9x12y9E, 2,
  &(vtc__ZN3ccc8CC9x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x12y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x12y9E),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  DD9x12y9  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc8DD9x12y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x12y93pqrEv
  ~DD9x12y9(); // tgen
  DD9x12y9(); // tgen
};
//SIG(1 _ZN3ccc8DD9x12y9E) C1{ VBC2{ v1 v2} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x12y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x12y93efgEv");}
void  ccc::DD9x12y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x12y93pqrEv");}
ccc::DD9x12y9 ::~DD9x12y9(){ note_dtor("_ZN3ccc8DD9x12y9E", this);} // tgen
ccc::DD9x12y9 ::DD9x12y9(){ note_ctor("_ZN3ccc8DD9x12y9E", this);} // tgen
}
static void Test__ZN3ccc8DD9x12y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x12y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x12y9E, buf);
    ::ccc::DD9x12y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x12y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x12y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x12y9E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc8DD9x12y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x12y9E);
    dp->::ccc::DD9x12y9::~DD9x12y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x12y9E(Test__ZN3ccc8DD9x12y9E, "_ZN3ccc8DD9x12y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x12y9C1Ev();
extern void _ZN3ccc8DD9x12y9D1Ev();
Name_Map name_map__ZN3ccc8DD9x12y9E[] = {
  NSPAIR(_ZN3ccc8DD9x12y9C1Ev),
  NSPAIR(_ZN3ccc8DD9x12y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc8DD9x12y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y9E[];
extern void _ZN3ccc8DD9x12y93efgEv();
extern void _ZN3ccc8DD9x12y93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x12y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x12y93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x12y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x12y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x12y9E[] = {
  {&(_ZTVN3ccc8DD9x12y9E[6]),  6,12},
  {&(_ZTVN3ccc8DD9x12y9E[6]),  6,12},
  {&(_ZTVN3ccc8DD9x12y9E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x12y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x12y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x12y9E[];
Class_Descriptor cd__ZN3ccc8DD9x12y9E = {  "_ZN3ccc8DD9x12y9E", // class name
  bases__ZN3ccc8DD9x12y9E, 2,
  &(vtc__ZN3ccc8DD9x12y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x12y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x12y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x12y9E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x12y9E),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  CC9x12y10  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC9x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x12y103abcEv
  ~CC9x12y10(); // tgen
  CC9x12y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y10E) C1{ VBC2{ v3 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x12y103pqrEv");}
void  ccc::CC9x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x12y103abcEv");}
ccc::CC9x12y10 ::~CC9x12y10(){ note_dtor("_ZN3ccc9CC9x12y10E", this);} // tgen
ccc::CC9x12y10 ::CC9x12y10(){ note_ctor("_ZN3ccc9CC9x12y10E", this);} // tgen
}
static void Test__ZN3ccc9CC9x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x12y10E, buf);
    ::ccc::CC9x12y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x12y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC9x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x12y10E);
    dp->::ccc::CC9x12y10::~CC9x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x12y10E(Test__ZN3ccc9CC9x12y10E, "_ZN3ccc9CC9x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x12y10C1Ev();
extern void _ZN3ccc9CC9x12y10D1Ev();
Name_Map name_map__ZN3ccc9CC9x12y10E[] = {
  NSPAIR(_ZN3ccc9CC9x12y10C1Ev),
  NSPAIR(_ZN3ccc9CC9x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC9x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x12y10E[];
extern void _ZN3ccc9CC9x12y103abcEv();
extern void _ZN3ccc9CC9x12y103pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x12y103pqrEv,_ZTv0_n16_N3ccc9CC9x12y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y103pqrEv,_ZThn4_N3ccc9CC9x12y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y103pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x12y103pqrEv,_ZTv0_n16_N3ccc9CC9x12y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x12y10E[] = {
  {&(_ZTVN3ccc9CC9x12y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x12y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x12y10E[];
static VTBL_ENTRY alt_thunk_names1951[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x12y103pqrEv,_ZTv0_n16_N3ccc9CC9x12y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x12y103pqrEv,_ZThn4_N3ccc9CC9x12y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x12y10E = {  "_ZN3ccc9CC9x12y10E", // class name
  bases__ZN3ccc9CC9x12y10E, 2,
  &(vtc__ZN3ccc9CC9x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x12y10E),2, //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  DD9x12y10  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD9x12y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD9x12y103abcEv
  ~DD9x12y10(); // tgen
  DD9x12y10(); // tgen
};
//SIG(1 _ZN3ccc9DD9x12y10E) C1{ VBC2{ v3 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x12y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x12y103pqrEv");}
void  ccc::DD9x12y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x12y103abcEv");}
ccc::DD9x12y10 ::~DD9x12y10(){ note_dtor("_ZN3ccc9DD9x12y10E", this);} // tgen
ccc::DD9x12y10 ::DD9x12y10(){ note_ctor("_ZN3ccc9DD9x12y10E", this);} // tgen
}
static void Test__ZN3ccc9DD9x12y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x12y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x12y10E, buf);
    ::ccc::DD9x12y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x12y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x12y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x12y10E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD9x12y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x12y10E);
    dp->::ccc::DD9x12y10::~DD9x12y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x12y10E(Test__ZN3ccc9DD9x12y10E, "_ZN3ccc9DD9x12y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x12y10C1Ev();
extern void _ZN3ccc9DD9x12y10D1Ev();
Name_Map name_map__ZN3ccc9DD9x12y10E[] = {
  NSPAIR(_ZN3ccc9DD9x12y10C1Ev),
  NSPAIR(_ZN3ccc9DD9x12y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD9x12y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x12y103pqrEv();
extern void _ZN3ccc9DD9x12y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x12y103abcEv,_ZTv0_n12_N3ccc9DD9x12y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x12y103abcEv,_ZThn4_N3ccc9DD9x12y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x12y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x12y103abcEv,_ZTv0_n12_N3ccc9DD9x12y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x12y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x12y10E[] = {
  {&(_ZTVN3ccc9DD9x12y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x12y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x12y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x12y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x12y10E[];
static VTBL_ENTRY alt_thunk_names1952[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x12y103abcEv,_ZTv0_n12_N3ccc9DD9x12y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x12y103abcEv,_ZThn4_N3ccc9DD9x12y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x12y10E = {  "_ZN3ccc9DD9x12y10E", // class name
  bases__ZN3ccc9DD9x12y10E, 2,
  &(vtc__ZN3ccc9DD9x12y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x12y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x12y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x12y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x12y10E),3, //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  CC9x12y11  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC9x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x12y113efgEv
  ~CC9x12y11(); // tgen
  CC9x12y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y11E) C1{ VBC2{ v2 v1} BC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::CC9x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x12y113pqrEv");}
void  ccc::CC9x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x12y113efgEv");}
ccc::CC9x12y11 ::~CC9x12y11(){ note_dtor("_ZN3ccc9CC9x12y11E", this);} // tgen
ccc::CC9x12y11 ::CC9x12y11(){ note_ctor("_ZN3ccc9CC9x12y11E", this);} // tgen
}
static void Test__ZN3ccc9CC9x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x12y11E, buf);
    ::ccc::CC9x12y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x12y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC9x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x12y11E);
    dp->::ccc::CC9x12y11::~CC9x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x12y11E(Test__ZN3ccc9CC9x12y11E, "_ZN3ccc9CC9x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x12y11C1Ev();
extern void _ZN3ccc9CC9x12y11D1Ev();
Name_Map name_map__ZN3ccc9CC9x12y11E[] = {
  NSPAIR(_ZN3ccc9CC9x12y11C1Ev),
  NSPAIR(_ZN3ccc9CC9x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC9x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x12y11E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC9x12y113pqrEv();
extern void _ZN3ccc9CC9x12y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x12y113efgEv,_ZTv0_n12_N3ccc9CC9x12y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y113efgEv,_ZThn4_N3ccc9CC9x12y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x12y113pqrEv,_ZTv0_n16_N3ccc9CC9x12y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y113pqrEv,_ZThn4_N3ccc9CC9x12y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x12y113efgEv,_ZTv0_n12_N3ccc9CC9x12y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x12y113pqrEv,_ZTv0_n16_N3ccc9CC9x12y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x12y11E[] = {
  {&(_ZTVN3ccc9CC9x12y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC9x12y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x12y11E[];
static VTBL_ENTRY alt_thunk_names1953[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x12y113pqrEv,_ZTv0_n16_N3ccc9CC9x12y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x12y113pqrEv,_ZThn4_N3ccc9CC9x12y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x12y113efgEv,_ZTv0_n12_N3ccc9CC9x12y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x12y113efgEv,_ZThn4_N3ccc9CC9x12y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x12y11E = {  "_ZN3ccc9CC9x12y11E", // class name
  bases__ZN3ccc9CC9x12y11E, 2,
  &(vtc__ZN3ccc9CC9x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x12y11E),2, //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  DD9x12y11  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD9x12y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD9x12y113efgEv
  ~DD9x12y11(); // tgen
  DD9x12y11(); // tgen
};
//SIG(1 _ZN3ccc9DD9x12y11E) C1{ VBC2{ v2 v1} VBC3{ v3} v1 v2}
}
namespace ccc { 
void  ccc::DD9x12y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x12y113pqrEv");}
void  ccc::DD9x12y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x12y113efgEv");}
ccc::DD9x12y11 ::~DD9x12y11(){ note_dtor("_ZN3ccc9DD9x12y11E", this);} // tgen
ccc::DD9x12y11 ::DD9x12y11(){ note_ctor("_ZN3ccc9DD9x12y11E", this);} // tgen
}
static void Test__ZN3ccc9DD9x12y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x12y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x12y11E, buf);
    ::ccc::DD9x12y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x12y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x12y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x12y11E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD9x12y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x12y11E);
    dp->::ccc::DD9x12y11::~DD9x12y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x12y11E(Test__ZN3ccc9DD9x12y11E, "_ZN3ccc9DD9x12y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x12y11C1Ev();
extern void _ZN3ccc9DD9x12y11D1Ev();
Name_Map name_map__ZN3ccc9DD9x12y11E[] = {
  NSPAIR(_ZN3ccc9DD9x12y11C1Ev),
  NSPAIR(_ZN3ccc9DD9x12y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD9x12y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y11E[];
extern void _ZN3ccc9DD9x12y113efgEv();
extern void _ZN3ccc9DD9x12y113pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x12y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y113pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x12y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x12y11E[] = {
  {&(_ZTVN3ccc9DD9x12y11E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y11E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y11E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x12y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x12y11E[];
Class_Descriptor cd__ZN3ccc9DD9x12y11E = {  "_ZN3ccc9DD9x12y11E", // class name
  bases__ZN3ccc9DD9x12y11E, 2,
  &(vtc__ZN3ccc9DD9x12y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x12y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x12y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x12y11E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x12y11E),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  CC9x12y12  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9CC9x12y123abcEv
  ~CC9x12y12(); // tgen
  CC9x12y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y12E) C1{ VBC2{ v2 v3} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC9x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x12y123abcEv");}
ccc::CC9x12y12 ::~CC9x12y12(){ note_dtor("_ZN3ccc9CC9x12y12E", this);} // tgen
ccc::CC9x12y12 ::CC9x12y12(){ note_ctor("_ZN3ccc9CC9x12y12E", this);} // tgen
}
static void Test__ZN3ccc9CC9x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x12y12E, buf);
    ::ccc::CC9x12y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x12y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC9x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x12y12E);
    dp->::ccc::CC9x12y12::~CC9x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x12y12E(Test__ZN3ccc9CC9x12y12E, "_ZN3ccc9CC9x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x12y12C1Ev();
extern void _ZN3ccc9CC9x12y12D1Ev();
Name_Map name_map__ZN3ccc9CC9x12y12E[] = {
  NSPAIR(_ZN3ccc9CC9x12y12C1Ev),
  NSPAIR(_ZN3ccc9CC9x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC9x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x12y12E[];
extern void _ZN3ccc9CC9x12y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x12y12E[] = {
  {&(_ZTVN3ccc9CC9x12y12E[3]),  3,10},
  {&(_ZTVN3ccc9CC9x12y12E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x12y12E[];
Class_Descriptor cd__ZN3ccc9CC9x12y12E = {  "_ZN3ccc9CC9x12y12E", // class name
  bases__ZN3ccc9CC9x12y12E, 2,
  &(vtc__ZN3ccc9CC9x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y12E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x12y12E),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  DD9x12y12  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  abc(); // _ZN3ccc9DD9x12y123abcEv
  ~DD9x12y12(); // tgen
  DD9x12y12(); // tgen
};
//SIG(1 _ZN3ccc9DD9x12y12E) C1{ VBC2{ v2 v3} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD9x12y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x12y123abcEv");}
ccc::DD9x12y12 ::~DD9x12y12(){ note_dtor("_ZN3ccc9DD9x12y12E", this);} // tgen
ccc::DD9x12y12 ::DD9x12y12(){ note_ctor("_ZN3ccc9DD9x12y12E", this);} // tgen
}
static void Test__ZN3ccc9DD9x12y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x12y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x12y12E, buf);
    ::ccc::DD9x12y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x12y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x12y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x12y12E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD9x12y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x12y12E);
    dp->::ccc::DD9x12y12::~DD9x12y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x12y12E(Test__ZN3ccc9DD9x12y12E, "_ZN3ccc9DD9x12y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x12y12C1Ev();
extern void _ZN3ccc9DD9x12y12D1Ev();
Name_Map name_map__ZN3ccc9DD9x12y12E[] = {
  NSPAIR(_ZN3ccc9DD9x12y12C1Ev),
  NSPAIR(_ZN3ccc9DD9x12y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD9x12y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9DD9x12y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x12y123abcEv,_ZTv0_n12_N3ccc9DD9x12y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x12y123abcEv,_ZThn4_N3ccc9DD9x12y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x12y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y123abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x12y123abcEv,_ZTv0_n12_N3ccc9DD9x12y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x12y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x12y12E[] = {
  {&(_ZTVN3ccc9DD9x12y12E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x12y12E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x12y12E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x12y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x12y12E[];
static VTBL_ENTRY alt_thunk_names1954[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x12y123abcEv,_ZTv0_n12_N3ccc9DD9x12y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x12y123abcEv,_ZThn4_N3ccc9DD9x12y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x12y12E = {  "_ZN3ccc9DD9x12y12E", // class name
  bases__ZN3ccc9DD9x12y12E, 2,
  &(vtc__ZN3ccc9DD9x12y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x12y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x12y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x12y12E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x12y12E),3, //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  CC9x12y13  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9CC9x12y133efgEv
  ~CC9x12y13(); // tgen
  CC9x12y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y13E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC9x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x12y133efgEv");}
ccc::CC9x12y13 ::~CC9x12y13(){ note_dtor("_ZN3ccc9CC9x12y13E", this);} // tgen
ccc::CC9x12y13 ::CC9x12y13(){ note_ctor("_ZN3ccc9CC9x12y13E", this);} // tgen
}
static void Test__ZN3ccc9CC9x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x12y13E, buf);
    ::ccc::CC9x12y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x12y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC9x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x12y13E);
    dp->::ccc::CC9x12y13::~CC9x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x12y13E(Test__ZN3ccc9CC9x12y13E, "_ZN3ccc9CC9x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x12y13C1Ev();
extern void _ZN3ccc9CC9x12y13D1Ev();
Name_Map name_map__ZN3ccc9CC9x12y13E[] = {
  NSPAIR(_ZN3ccc9CC9x12y13C1Ev),
  NSPAIR(_ZN3ccc9CC9x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC9x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x12y13E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC9x12y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x12y133efgEv,_ZTv0_n12_N3ccc9CC9x12y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y133efgEv,_ZThn4_N3ccc9CC9x12y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x12y133efgEv,_ZTv0_n12_N3ccc9CC9x12y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x12y13E[] = {
  {&(_ZTVN3ccc9CC9x12y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x12y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x12y13E[];
static VTBL_ENTRY alt_thunk_names1955[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x12y133efgEv,_ZTv0_n12_N3ccc9CC9x12y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x12y133efgEv,_ZThn4_N3ccc9CC9x12y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x12y13E = {  "_ZN3ccc9CC9x12y13E", // class name
  bases__ZN3ccc9CC9x12y13E, 2,
  &(vtc__ZN3ccc9CC9x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x12y13E),2, //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  DD9x12y13  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  efg(); // _ZN3ccc9DD9x12y133efgEv
  ~DD9x12y13(); // tgen
  DD9x12y13(); // tgen
};
//SIG(1 _ZN3ccc9DD9x12y13E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD9x12y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x12y133efgEv");}
ccc::DD9x12y13 ::~DD9x12y13(){ note_dtor("_ZN3ccc9DD9x12y13E", this);} // tgen
ccc::DD9x12y13 ::DD9x12y13(){ note_ctor("_ZN3ccc9DD9x12y13E", this);} // tgen
}
static void Test__ZN3ccc9DD9x12y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x12y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x12y13E, buf);
    ::ccc::DD9x12y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x12y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x12y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x12y13E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD9x12y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x12y13E);
    dp->::ccc::DD9x12y13::~DD9x12y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x12y13E(Test__ZN3ccc9DD9x12y13E, "_ZN3ccc9DD9x12y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x12y13C1Ev();
extern void _ZN3ccc9DD9x12y13D1Ev();
Name_Map name_map__ZN3ccc9DD9x12y13E[] = {
  NSPAIR(_ZN3ccc9DD9x12y13C1Ev),
  NSPAIR(_ZN3ccc9DD9x12y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD9x12y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y13E[];
extern void _ZN3ccc9DD9x12y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x12y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x12y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x12y13E[] = {
  {&(_ZTVN3ccc9DD9x12y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x12y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x12y13E[];
Class_Descriptor cd__ZN3ccc9DD9x12y13E = {  "_ZN3ccc9DD9x12y13E", // class name
  bases__ZN3ccc9DD9x12y13E, 2,
  &(vtc__ZN3ccc9DD9x12y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x12y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x12y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x12y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x12y13E),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  CC9x12y14  : virtual ::ccc::AA9 , ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9CC9x12y143pqrEv
  ~CC9x12y14(); // tgen
  CC9x12y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y14E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC9x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x12y143pqrEv");}
ccc::CC9x12y14 ::~CC9x12y14(){ note_dtor("_ZN3ccc9CC9x12y14E", this);} // tgen
ccc::CC9x12y14 ::CC9x12y14(){ note_ctor("_ZN3ccc9CC9x12y14E", this);} // tgen
}
static void Test__ZN3ccc9CC9x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x12y14E, buf);
    ::ccc::CC9x12y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x12y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC9x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x12y14E);
    dp->::ccc::CC9x12y14::~CC9x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x12y14E(Test__ZN3ccc9CC9x12y14E, "_ZN3ccc9CC9x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x12y14C1Ev();
extern void _ZN3ccc9CC9x12y14D1Ev();
Name_Map name_map__ZN3ccc9CC9x12y14E[] = {
  NSPAIR(_ZN3ccc9CC9x12y14C1Ev),
  NSPAIR(_ZN3ccc9CC9x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC9x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x12y14E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc9CC9x12y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x12y143pqrEv,_ZTv0_n16_N3ccc9CC9x12y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x12y143pqrEv,_ZThn4_N3ccc9CC9x12y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x12y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x12y143pqrEv,_ZTv0_n16_N3ccc9CC9x12y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x12y14E[] = {
  {&(_ZTVN3ccc9CC9x12y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x12y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x12y14E[];
static VTBL_ENTRY alt_thunk_names1956[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x12y143pqrEv,_ZTv0_n16_N3ccc9CC9x12y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x12y143pqrEv,_ZThn4_N3ccc9CC9x12y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x12y14E = {  "_ZN3ccc9CC9x12y14E", // class name
  bases__ZN3ccc9CC9x12y14E, 2,
  &(vtc__ZN3ccc9CC9x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x12y14E),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  DD9x12y14  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  virtual void  pqr(); // _ZN3ccc9DD9x12y143pqrEv
  ~DD9x12y14(); // tgen
  DD9x12y14(); // tgen
};
//SIG(1 _ZN3ccc9DD9x12y14E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD9x12y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x12y143pqrEv");}
ccc::DD9x12y14 ::~DD9x12y14(){ note_dtor("_ZN3ccc9DD9x12y14E", this);} // tgen
ccc::DD9x12y14 ::DD9x12y14(){ note_ctor("_ZN3ccc9DD9x12y14E", this);} // tgen
}
static void Test__ZN3ccc9DD9x12y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x12y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x12y14E, buf);
    ::ccc::DD9x12y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x12y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x12y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x12y14E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD9x12y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x12y14E);
    dp->::ccc::DD9x12y14::~DD9x12y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x12y14E(Test__ZN3ccc9DD9x12y14E, "_ZN3ccc9DD9x12y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x12y14C1Ev();
extern void _ZN3ccc9DD9x12y14D1Ev();
Name_Map name_map__ZN3ccc9DD9x12y14E[] = {
  NSPAIR(_ZN3ccc9DD9x12y14C1Ev),
  NSPAIR(_ZN3ccc9DD9x12y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD9x12y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x12y143pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x12y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x12y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x12y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x12y14E[] = {
  {&(_ZTVN3ccc9DD9x12y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y14E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x12y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x12y14E[];
Class_Descriptor cd__ZN3ccc9DD9x12y14E = {  "_ZN3ccc9DD9x12y14E", // class name
  bases__ZN3ccc9DD9x12y14E, 2,
  &(vtc__ZN3ccc9DD9x12y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x12y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x12y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x12y14E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x12y14E),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  CC9x12y15  : virtual ::ccc::AA9 , ::ccc::BB12 {
  ~CC9x12y15(); // tgen
  CC9x12y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x12y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC9x12y15 ::~CC9x12y15(){ note_dtor("_ZN3ccc9CC9x12y15E", this);} // tgen
ccc::CC9x12y15 ::CC9x12y15(){ note_ctor("_ZN3ccc9CC9x12y15E", this);} // tgen
}
static void Test__ZN3ccc9CC9x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x12y15E, buf);
    ::ccc::CC9x12y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x12y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), 0, "_ZN3ccc9CC9x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x12y15E);
    dp->::ccc::CC9x12y15::~CC9x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x12y15E(Test__ZN3ccc9CC9x12y15E, "_ZN3ccc9CC9x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x12y15C1Ev();
extern void _ZN3ccc9CC9x12y15D1Ev();
Name_Map name_map__ZN3ccc9CC9x12y15E[] = {
  NSPAIR(_ZN3ccc9CC9x12y15C1Ev),
  NSPAIR(_ZN3ccc9CC9x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9CC9x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x12y15E[];
extern void _ZN3ccc4BB123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x12y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x12y15E[] = {
  {&(_ZTVN3ccc9CC9x12y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC9x12y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x12y15E[];
Class_Descriptor cd__ZN3ccc9CC9x12y15E = {  "_ZN3ccc9CC9x12y15E", // class name
  bases__ZN3ccc9CC9x12y15E, 2,
  &(vtc__ZN3ccc9CC9x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x12y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x12y15E),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  DD9x12y15  : virtual ::ccc::AA9 , virtual ::ccc::BB12 {
  ~DD9x12y15(); // tgen
  DD9x12y15(); // tgen
};
//SIG(1 _ZN3ccc9DD9x12y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD9x12y15 ::~DD9x12y15(){ note_dtor("_ZN3ccc9DD9x12y15E", this);} // tgen
ccc::DD9x12y15 ::DD9x12y15(){ note_ctor("_ZN3ccc9DD9x12y15E", this);} // tgen
}
static void Test__ZN3ccc9DD9x12y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x12y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x12y15E, buf);
    ::ccc::DD9x12y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x12y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x12y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x12y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x12y15E");
    check_base_class_offset(lv, (::ccc::BB12*), ABISELECT(8,4), "_ZN3ccc9DD9x12y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x12y15E);
    dp->::ccc::DD9x12y15::~DD9x12y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x12y15E(Test__ZN3ccc9DD9x12y15E, "_ZN3ccc9DD9x12y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x12y15C1Ev();
extern void _ZN3ccc9DD9x12y15D1Ev();
Name_Map name_map__ZN3ccc9DD9x12y15E[] = {
  NSPAIR(_ZN3ccc9DD9x12y15C1Ev),
  NSPAIR(_ZN3ccc9DD9x12y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB12E;
extern VTBL_ENTRY _ZTIN3ccc4BB12E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB12E[];
static Base_Class bases__ZN3ccc9DD9x12y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB12E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x12y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x12y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x12y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x12y15E[] = {
  {&(_ZTVN3ccc9DD9x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x12y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x12y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x12y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x12y15E[];
Class_Descriptor cd__ZN3ccc9DD9x12y15E = {  "_ZN3ccc9DD9x12y15E", // class name
  bases__ZN3ccc9DD9x12y15E, 2,
  &(vtc__ZN3ccc9DD9x12y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x12y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x12y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x12y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x12y15E),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  CC9x13y0  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y03pqrEv
  ~CC9x13y0(); // tgen
  CC9x13y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y0E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y03abcEv");}
void  ccc::CC9x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y03efgEv");}
void  ccc::CC9x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y03pqrEv");}
ccc::CC9x13y0 ::~CC9x13y0(){ note_dtor("_ZN3ccc8CC9x13y0E", this);} // tgen
ccc::CC9x13y0 ::CC9x13y0(){ note_ctor("_ZN3ccc8CC9x13y0E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y0E, buf);
    ::ccc::CC9x13y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y0E);
    dp->::ccc::CC9x13y0::~CC9x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y0E(Test__ZN3ccc8CC9x13y0E, "_ZN3ccc8CC9x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y0C1Ev();
extern void _ZN3ccc8CC9x13y0D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y0E[] = {
  NSPAIR(_ZN3ccc8CC9x13y0C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y0E[];
extern void _ZN3ccc8CC9x13y03efgEv();
extern void _ZN3ccc8CC9x13y03abcEv();
extern void _ZN3ccc8CC9x13y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y03efgEv,_ZTv0_n12_N3ccc8CC9x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y03efgEv,_ZThn4_N3ccc8CC9x13y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y03pqrEv,_ZTv0_n16_N3ccc8CC9x13y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y03pqrEv,_ZThn4_N3ccc8CC9x13y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y03efgEv,_ZTv0_n12_N3ccc8CC9x13y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y03pqrEv,_ZTv0_n16_N3ccc8CC9x13y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y0E[] = {
  {&(_ZTVN3ccc8CC9x13y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y0E[];
static VTBL_ENTRY alt_thunk_names1957[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y03pqrEv,_ZTv0_n16_N3ccc8CC9x13y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y03pqrEv,_ZThn4_N3ccc8CC9x13y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y03efgEv,_ZTv0_n12_N3ccc8CC9x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y03efgEv,_ZThn4_N3ccc8CC9x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y0E = {  "_ZN3ccc8CC9x13y0E", // class name
  bases__ZN3ccc8CC9x13y0E, 2,
  &(vtc__ZN3ccc8CC9x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y0E),2, //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  DD9x13y0  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD9x13y03abcEv
  virtual void  efg(); // _ZN3ccc8DD9x13y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x13y03pqrEv
  ~DD9x13y0(); // tgen
  DD9x13y0(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y0E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x13y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y03abcEv");}
void  ccc::DD9x13y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y03efgEv");}
void  ccc::DD9x13y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y03pqrEv");}
ccc::DD9x13y0 ::~DD9x13y0(){ note_dtor("_ZN3ccc8DD9x13y0E", this);} // tgen
ccc::DD9x13y0 ::DD9x13y0(){ note_ctor("_ZN3ccc8DD9x13y0E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y0E, buf);
    ::ccc::DD9x13y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y0E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y0E);
    dp->::ccc::DD9x13y0::~DD9x13y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y0E(Test__ZN3ccc8DD9x13y0E, "_ZN3ccc8DD9x13y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y0C1Ev();
extern void _ZN3ccc8DD9x13y0D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y0E[] = {
  NSPAIR(_ZN3ccc8DD9x13y0C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y0E[];
extern void _ZN3ccc8DD9x13y03efgEv();
extern void _ZN3ccc8DD9x13y03pqrEv();
extern void _ZN3ccc8DD9x13y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y03efgEv,_ZTv0_n12_N3ccc8DD9x13y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y03efgEv,_ZThn4_N3ccc8DD9x13y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y03efgEv,_ZTv0_n12_N3ccc8DD9x13y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y0E[] = {
  {&(_ZTVN3ccc8DD9x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y0E[];
static VTBL_ENTRY alt_thunk_names1958[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y03efgEv,_ZTv0_n12_N3ccc8DD9x13y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y03efgEv,_ZThn4_N3ccc8DD9x13y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y0E = {  "_ZN3ccc8DD9x13y0E", // class name
  bases__ZN3ccc8DD9x13y0E, 2,
  &(vtc__ZN3ccc8DD9x13y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y0E),3, //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  CC9x13y1  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x13y13efgEv
  ~CC9x13y1(); // tgen
  CC9x13y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y1E) C1{ VBC2{ v3 v2} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y13abcEv");}
void  ccc::CC9x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y13pqrEv");}
void  ccc::CC9x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y13efgEv");}
ccc::CC9x13y1 ::~CC9x13y1(){ note_dtor("_ZN3ccc8CC9x13y1E", this);} // tgen
ccc::CC9x13y1 ::CC9x13y1(){ note_ctor("_ZN3ccc8CC9x13y1E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y1E, buf);
    ::ccc::CC9x13y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y1E);
    dp->::ccc::CC9x13y1::~CC9x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y1E(Test__ZN3ccc8CC9x13y1E, "_ZN3ccc8CC9x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y1C1Ev();
extern void _ZN3ccc8CC9x13y1D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y1E[] = {
  NSPAIR(_ZN3ccc8CC9x13y1C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y1E[];
extern void _ZN3ccc8CC9x13y13efgEv();
extern void _ZN3ccc8CC9x13y13abcEv();
extern void _ZN3ccc8CC9x13y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y13efgEv,_ZTv0_n12_N3ccc8CC9x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y13efgEv,_ZThn4_N3ccc8CC9x13y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y13pqrEv,_ZTv0_n16_N3ccc8CC9x13y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y13pqrEv,_ZThn4_N3ccc8CC9x13y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y13efgEv,_ZTv0_n12_N3ccc8CC9x13y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y13pqrEv,_ZTv0_n16_N3ccc8CC9x13y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y1E[] = {
  {&(_ZTVN3ccc8CC9x13y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y1E[];
static VTBL_ENTRY alt_thunk_names1959[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y13pqrEv,_ZTv0_n16_N3ccc8CC9x13y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y13pqrEv,_ZThn4_N3ccc8CC9x13y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y13efgEv,_ZTv0_n12_N3ccc8CC9x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y13efgEv,_ZThn4_N3ccc8CC9x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y1E = {  "_ZN3ccc8CC9x13y1E", // class name
  bases__ZN3ccc8CC9x13y1E, 2,
  &(vtc__ZN3ccc8CC9x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y1E),2, //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  DD9x13y1  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD9x13y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x13y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x13y13efgEv
  ~DD9x13y1(); // tgen
  DD9x13y1(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y1E) C1{ VBC2{ v3 v2} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x13y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y13abcEv");}
void  ccc::DD9x13y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y13pqrEv");}
void  ccc::DD9x13y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y13efgEv");}
ccc::DD9x13y1 ::~DD9x13y1(){ note_dtor("_ZN3ccc8DD9x13y1E", this);} // tgen
ccc::DD9x13y1 ::DD9x13y1(){ note_ctor("_ZN3ccc8DD9x13y1E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y1E, buf);
    ::ccc::DD9x13y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y1E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y1E);
    dp->::ccc::DD9x13y1::~DD9x13y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y1E(Test__ZN3ccc8DD9x13y1E, "_ZN3ccc8DD9x13y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y1C1Ev();
extern void _ZN3ccc8DD9x13y1D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y1E[] = {
  NSPAIR(_ZN3ccc8DD9x13y1C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y1E[];
extern void _ZN3ccc8DD9x13y13efgEv();
extern void _ZN3ccc8DD9x13y13pqrEv();
extern void _ZN3ccc8DD9x13y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y13efgEv,_ZTv0_n12_N3ccc8DD9x13y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y13efgEv,_ZThn4_N3ccc8DD9x13y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y13efgEv,_ZTv0_n12_N3ccc8DD9x13y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y1E[] = {
  {&(_ZTVN3ccc8DD9x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y1E[];
static VTBL_ENTRY alt_thunk_names1960[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y13efgEv,_ZTv0_n12_N3ccc8DD9x13y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y13efgEv,_ZThn4_N3ccc8DD9x13y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y1E = {  "_ZN3ccc8DD9x13y1E", // class name
  bases__ZN3ccc8DD9x13y1E, 2,
  &(vtc__ZN3ccc8DD9x13y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y1E),3, //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  CC9x13y2  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y23pqrEv
  ~CC9x13y2(); // tgen
  CC9x13y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y2E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y23efgEv");}
void  ccc::CC9x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y23abcEv");}
void  ccc::CC9x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y23pqrEv");}
ccc::CC9x13y2 ::~CC9x13y2(){ note_dtor("_ZN3ccc8CC9x13y2E", this);} // tgen
ccc::CC9x13y2 ::CC9x13y2(){ note_ctor("_ZN3ccc8CC9x13y2E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y2E, buf);
    ::ccc::CC9x13y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y2E);
    dp->::ccc::CC9x13y2::~CC9x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y2E(Test__ZN3ccc8CC9x13y2E, "_ZN3ccc8CC9x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y2C1Ev();
extern void _ZN3ccc8CC9x13y2D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y2E[] = {
  NSPAIR(_ZN3ccc8CC9x13y2C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y2E[];
extern void _ZN3ccc8CC9x13y23efgEv();
extern void _ZN3ccc8CC9x13y23abcEv();
extern void _ZN3ccc8CC9x13y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y23efgEv,_ZTv0_n12_N3ccc8CC9x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y23efgEv,_ZThn4_N3ccc8CC9x13y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y23pqrEv,_ZTv0_n16_N3ccc8CC9x13y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y23pqrEv,_ZThn4_N3ccc8CC9x13y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y23efgEv,_ZTv0_n12_N3ccc8CC9x13y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y23pqrEv,_ZTv0_n16_N3ccc8CC9x13y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y2E[] = {
  {&(_ZTVN3ccc8CC9x13y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y2E[];
static VTBL_ENTRY alt_thunk_names1961[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y23pqrEv,_ZTv0_n16_N3ccc8CC9x13y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y23pqrEv,_ZThn4_N3ccc8CC9x13y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y23efgEv,_ZTv0_n12_N3ccc8CC9x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y23efgEv,_ZThn4_N3ccc8CC9x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y2E = {  "_ZN3ccc8CC9x13y2E", // class name
  bases__ZN3ccc8CC9x13y2E, 2,
  &(vtc__ZN3ccc8CC9x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y2E),2, //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  DD9x13y2  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD9x13y23efgEv
  virtual void  abc(); // _ZN3ccc8DD9x13y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x13y23pqrEv
  ~DD9x13y2(); // tgen
  DD9x13y2(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y2E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x13y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y23efgEv");}
void  ccc::DD9x13y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y23abcEv");}
void  ccc::DD9x13y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y23pqrEv");}
ccc::DD9x13y2 ::~DD9x13y2(){ note_dtor("_ZN3ccc8DD9x13y2E", this);} // tgen
ccc::DD9x13y2 ::DD9x13y2(){ note_ctor("_ZN3ccc8DD9x13y2E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y2E, buf);
    ::ccc::DD9x13y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y2E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y2E);
    dp->::ccc::DD9x13y2::~DD9x13y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y2E(Test__ZN3ccc8DD9x13y2E, "_ZN3ccc8DD9x13y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y2C1Ev();
extern void _ZN3ccc8DD9x13y2D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y2E[] = {
  NSPAIR(_ZN3ccc8DD9x13y2C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y2E[];
extern void _ZN3ccc8DD9x13y23efgEv();
extern void _ZN3ccc8DD9x13y23pqrEv();
extern void _ZN3ccc8DD9x13y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y23efgEv,_ZTv0_n12_N3ccc8DD9x13y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y23efgEv,_ZThn4_N3ccc8DD9x13y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y23efgEv,_ZTv0_n12_N3ccc8DD9x13y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y2E[] = {
  {&(_ZTVN3ccc8DD9x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y2E[];
static VTBL_ENTRY alt_thunk_names1962[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y23efgEv,_ZTv0_n12_N3ccc8DD9x13y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y23efgEv,_ZThn4_N3ccc8DD9x13y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y2E = {  "_ZN3ccc8DD9x13y2E", // class name
  bases__ZN3ccc8DD9x13y2E, 2,
  &(vtc__ZN3ccc8DD9x13y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y2E),3, //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  CC9x13y3  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x13y33abcEv
  ~CC9x13y3(); // tgen
  CC9x13y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y3E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y33efgEv");}
void  ccc::CC9x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y33pqrEv");}
void  ccc::CC9x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y33abcEv");}
ccc::CC9x13y3 ::~CC9x13y3(){ note_dtor("_ZN3ccc8CC9x13y3E", this);} // tgen
ccc::CC9x13y3 ::CC9x13y3(){ note_ctor("_ZN3ccc8CC9x13y3E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y3E, buf);
    ::ccc::CC9x13y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y3E);
    dp->::ccc::CC9x13y3::~CC9x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y3E(Test__ZN3ccc8CC9x13y3E, "_ZN3ccc8CC9x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y3C1Ev();
extern void _ZN3ccc8CC9x13y3D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y3E[] = {
  NSPAIR(_ZN3ccc8CC9x13y3C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y3E[];
extern void _ZN3ccc8CC9x13y33efgEv();
extern void _ZN3ccc8CC9x13y33pqrEv();
extern void _ZN3ccc8CC9x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y33efgEv,_ZTv0_n12_N3ccc8CC9x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y33efgEv,_ZThn4_N3ccc8CC9x13y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y33pqrEv,_ZTv0_n16_N3ccc8CC9x13y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y33pqrEv,_ZThn4_N3ccc8CC9x13y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y33efgEv,_ZTv0_n12_N3ccc8CC9x13y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y33pqrEv,_ZTv0_n16_N3ccc8CC9x13y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y3E[] = {
  {&(_ZTVN3ccc8CC9x13y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y3E[];
static VTBL_ENTRY alt_thunk_names1963[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y33pqrEv,_ZTv0_n16_N3ccc8CC9x13y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y33pqrEv,_ZThn4_N3ccc8CC9x13y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y33efgEv,_ZTv0_n12_N3ccc8CC9x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y33efgEv,_ZThn4_N3ccc8CC9x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y3E = {  "_ZN3ccc8CC9x13y3E", // class name
  bases__ZN3ccc8CC9x13y3E, 2,
  &(vtc__ZN3ccc8CC9x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y3E),2, //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  DD9x13y3  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD9x13y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x13y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x13y33abcEv
  ~DD9x13y3(); // tgen
  DD9x13y3(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y3E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x13y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y33efgEv");}
void  ccc::DD9x13y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y33pqrEv");}
void  ccc::DD9x13y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y33abcEv");}
ccc::DD9x13y3 ::~DD9x13y3(){ note_dtor("_ZN3ccc8DD9x13y3E", this);} // tgen
ccc::DD9x13y3 ::DD9x13y3(){ note_ctor("_ZN3ccc8DD9x13y3E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y3E, buf);
    ::ccc::DD9x13y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y3E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y3E);
    dp->::ccc::DD9x13y3::~DD9x13y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y3E(Test__ZN3ccc8DD9x13y3E, "_ZN3ccc8DD9x13y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y3C1Ev();
extern void _ZN3ccc8DD9x13y3D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y3E[] = {
  NSPAIR(_ZN3ccc8DD9x13y3C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y3E[];
extern void _ZN3ccc8DD9x13y33efgEv();
extern void _ZN3ccc8DD9x13y33pqrEv();
extern void _ZN3ccc8DD9x13y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y33efgEv,_ZTv0_n12_N3ccc8DD9x13y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y33efgEv,_ZThn4_N3ccc8DD9x13y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y33efgEv,_ZTv0_n12_N3ccc8DD9x13y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y3E[] = {
  {&(_ZTVN3ccc8DD9x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y3E[];
static VTBL_ENTRY alt_thunk_names1964[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y33efgEv,_ZTv0_n12_N3ccc8DD9x13y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y33efgEv,_ZThn4_N3ccc8DD9x13y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y3E = {  "_ZN3ccc8DD9x13y3E", // class name
  bases__ZN3ccc8DD9x13y3E, 2,
  &(vtc__ZN3ccc8DD9x13y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y3E),3, //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  CC9x13y4  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC9x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x13y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x13y43efgEv
  ~CC9x13y4(); // tgen
  CC9x13y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y4E) C1{ VBC2{ v3 v1} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y43pqrEv");}
void  ccc::CC9x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y43abcEv");}
void  ccc::CC9x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y43efgEv");}
ccc::CC9x13y4 ::~CC9x13y4(){ note_dtor("_ZN3ccc8CC9x13y4E", this);} // tgen
ccc::CC9x13y4 ::CC9x13y4(){ note_ctor("_ZN3ccc8CC9x13y4E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y4E, buf);
    ::ccc::CC9x13y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y4E);
    dp->::ccc::CC9x13y4::~CC9x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y4E(Test__ZN3ccc8CC9x13y4E, "_ZN3ccc8CC9x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y4C1Ev();
extern void _ZN3ccc8CC9x13y4D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y4E[] = {
  NSPAIR(_ZN3ccc8CC9x13y4C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y4E[];
extern void _ZN3ccc8CC9x13y43efgEv();
extern void _ZN3ccc8CC9x13y43pqrEv();
extern void _ZN3ccc8CC9x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y43efgEv,_ZTv0_n12_N3ccc8CC9x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y43efgEv,_ZThn4_N3ccc8CC9x13y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y43pqrEv,_ZTv0_n16_N3ccc8CC9x13y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y43pqrEv,_ZThn4_N3ccc8CC9x13y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y43efgEv,_ZTv0_n12_N3ccc8CC9x13y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y43pqrEv,_ZTv0_n16_N3ccc8CC9x13y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y4E[] = {
  {&(_ZTVN3ccc8CC9x13y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y4E[];
static VTBL_ENTRY alt_thunk_names1965[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y43pqrEv,_ZTv0_n16_N3ccc8CC9x13y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y43pqrEv,_ZThn4_N3ccc8CC9x13y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y43efgEv,_ZTv0_n12_N3ccc8CC9x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y43efgEv,_ZThn4_N3ccc8CC9x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y4E = {  "_ZN3ccc8CC9x13y4E", // class name
  bases__ZN3ccc8CC9x13y4E, 2,
  &(vtc__ZN3ccc8CC9x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y4E),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  DD9x13y4  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD9x13y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x13y43abcEv
  virtual void  efg(); // _ZN3ccc8DD9x13y43efgEv
  ~DD9x13y4(); // tgen
  DD9x13y4(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y4E) C1{ VBC2{ v3 v1} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x13y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y43pqrEv");}
void  ccc::DD9x13y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y43abcEv");}
void  ccc::DD9x13y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y43efgEv");}
ccc::DD9x13y4 ::~DD9x13y4(){ note_dtor("_ZN3ccc8DD9x13y4E", this);} // tgen
ccc::DD9x13y4 ::DD9x13y4(){ note_ctor("_ZN3ccc8DD9x13y4E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y4E, buf);
    ::ccc::DD9x13y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y4E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y4E);
    dp->::ccc::DD9x13y4::~DD9x13y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y4E(Test__ZN3ccc8DD9x13y4E, "_ZN3ccc8DD9x13y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y4C1Ev();
extern void _ZN3ccc8DD9x13y4D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y4E[] = {
  NSPAIR(_ZN3ccc8DD9x13y4C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y4E[];
extern void _ZN3ccc8DD9x13y43efgEv();
extern void _ZN3ccc8DD9x13y43pqrEv();
extern void _ZN3ccc8DD9x13y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y43efgEv,_ZTv0_n12_N3ccc8DD9x13y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y43efgEv,_ZThn4_N3ccc8DD9x13y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y43efgEv,_ZTv0_n12_N3ccc8DD9x13y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y4E[] = {
  {&(_ZTVN3ccc8DD9x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y4E[];
static VTBL_ENTRY alt_thunk_names1966[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y43efgEv,_ZTv0_n12_N3ccc8DD9x13y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y43efgEv,_ZThn4_N3ccc8DD9x13y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y4E = {  "_ZN3ccc8DD9x13y4E", // class name
  bases__ZN3ccc8DD9x13y4E, 2,
  &(vtc__ZN3ccc8DD9x13y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y4E),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  CC9x13y5  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8CC9x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x13y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x13y53abcEv
  ~CC9x13y5(); // tgen
  CC9x13y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y5E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y53pqrEv");}
void  ccc::CC9x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y53efgEv");}
void  ccc::CC9x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y53abcEv");}
ccc::CC9x13y5 ::~CC9x13y5(){ note_dtor("_ZN3ccc8CC9x13y5E", this);} // tgen
ccc::CC9x13y5 ::CC9x13y5(){ note_ctor("_ZN3ccc8CC9x13y5E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y5E, buf);
    ::ccc::CC9x13y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y5E);
    dp->::ccc::CC9x13y5::~CC9x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y5E(Test__ZN3ccc8CC9x13y5E, "_ZN3ccc8CC9x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y5C1Ev();
extern void _ZN3ccc8CC9x13y5D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y5E[] = {
  NSPAIR(_ZN3ccc8CC9x13y5C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y5E[];
extern void _ZN3ccc8CC9x13y53efgEv();
extern void _ZN3ccc8CC9x13y53pqrEv();
extern void _ZN3ccc8CC9x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y53efgEv,_ZTv0_n12_N3ccc8CC9x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y53efgEv,_ZThn4_N3ccc8CC9x13y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y53pqrEv,_ZTv0_n16_N3ccc8CC9x13y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y53pqrEv,_ZThn4_N3ccc8CC9x13y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y53efgEv,_ZTv0_n12_N3ccc8CC9x13y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y53pqrEv,_ZTv0_n16_N3ccc8CC9x13y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y5E[] = {
  {&(_ZTVN3ccc8CC9x13y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y5E[];
static VTBL_ENTRY alt_thunk_names1967[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y53pqrEv,_ZTv0_n16_N3ccc8CC9x13y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y53pqrEv,_ZThn4_N3ccc8CC9x13y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y53efgEv,_ZTv0_n12_N3ccc8CC9x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y53efgEv,_ZThn4_N3ccc8CC9x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y5E = {  "_ZN3ccc8CC9x13y5E", // class name
  bases__ZN3ccc8CC9x13y5E, 2,
  &(vtc__ZN3ccc8CC9x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y5E),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  DD9x13y5  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc8DD9x13y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x13y53efgEv
  virtual void  abc(); // _ZN3ccc8DD9x13y53abcEv
  ~DD9x13y5(); // tgen
  DD9x13y5(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y5E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x13y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y53pqrEv");}
void  ccc::DD9x13y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y53efgEv");}
void  ccc::DD9x13y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y53abcEv");}
ccc::DD9x13y5 ::~DD9x13y5(){ note_dtor("_ZN3ccc8DD9x13y5E", this);} // tgen
ccc::DD9x13y5 ::DD9x13y5(){ note_ctor("_ZN3ccc8DD9x13y5E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y5E, buf);
    ::ccc::DD9x13y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y5E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y5E);
    dp->::ccc::DD9x13y5::~DD9x13y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y5E(Test__ZN3ccc8DD9x13y5E, "_ZN3ccc8DD9x13y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y5C1Ev();
extern void _ZN3ccc8DD9x13y5D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y5E[] = {
  NSPAIR(_ZN3ccc8DD9x13y5C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y5E[];
extern void _ZN3ccc8DD9x13y53efgEv();
extern void _ZN3ccc8DD9x13y53pqrEv();
extern void _ZN3ccc8DD9x13y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y53efgEv,_ZTv0_n12_N3ccc8DD9x13y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y53efgEv,_ZThn4_N3ccc8DD9x13y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y53efgEv,_ZTv0_n12_N3ccc8DD9x13y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y5E[] = {
  {&(_ZTVN3ccc8DD9x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y5E[];
static VTBL_ENTRY alt_thunk_names1968[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y53efgEv,_ZTv0_n12_N3ccc8DD9x13y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y53efgEv,_ZThn4_N3ccc8DD9x13y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y5E = {  "_ZN3ccc8DD9x13y5E", // class name
  bases__ZN3ccc8DD9x13y5E, 2,
  &(vtc__ZN3ccc8DD9x13y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y5E),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  CC9x13y6  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x13y63efgEv
  ~CC9x13y6(); // tgen
  CC9x13y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y6E) C1{ VBC2{ v2 v3} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y63abcEv");}
void  ccc::CC9x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y63efgEv");}
ccc::CC9x13y6 ::~CC9x13y6(){ note_dtor("_ZN3ccc8CC9x13y6E", this);} // tgen
ccc::CC9x13y6 ::CC9x13y6(){ note_ctor("_ZN3ccc8CC9x13y6E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y6E, buf);
    ::ccc::CC9x13y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y6E);
    dp->::ccc::CC9x13y6::~CC9x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y6E(Test__ZN3ccc8CC9x13y6E, "_ZN3ccc8CC9x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y6C1Ev();
extern void _ZN3ccc8CC9x13y6D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y6E[] = {
  NSPAIR(_ZN3ccc8CC9x13y6C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y6E[];
extern void _ZN3ccc8CC9x13y63efgEv();
extern void _ZN3ccc8CC9x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y63efgEv,_ZTv0_n12_N3ccc8CC9x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y63efgEv,_ZThn4_N3ccc8CC9x13y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y63abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y63efgEv,_ZTv0_n12_N3ccc8CC9x13y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y6E[] = {
  {&(_ZTVN3ccc8CC9x13y6E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x13y6E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y6E[];
static VTBL_ENTRY alt_thunk_names1969[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y63efgEv,_ZTv0_n12_N3ccc8CC9x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y63efgEv,_ZThn4_N3ccc8CC9x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y6E = {  "_ZN3ccc8CC9x13y6E", // class name
  bases__ZN3ccc8CC9x13y6E, 2,
  &(vtc__ZN3ccc8CC9x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y6E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y6E),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  DD9x13y6  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD9x13y63abcEv
  virtual void  efg(); // _ZN3ccc8DD9x13y63efgEv
  ~DD9x13y6(); // tgen
  DD9x13y6(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y6E) C1{ VBC2{ v2 v3} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x13y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y63abcEv");}
void  ccc::DD9x13y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y63efgEv");}
ccc::DD9x13y6 ::~DD9x13y6(){ note_dtor("_ZN3ccc8DD9x13y6E", this);} // tgen
ccc::DD9x13y6 ::DD9x13y6(){ note_ctor("_ZN3ccc8DD9x13y6E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y6E, buf);
    ::ccc::DD9x13y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y6E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y6E);
    dp->::ccc::DD9x13y6::~DD9x13y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y6E(Test__ZN3ccc8DD9x13y6E, "_ZN3ccc8DD9x13y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y6C1Ev();
extern void _ZN3ccc8DD9x13y6D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y6E[] = {
  NSPAIR(_ZN3ccc8DD9x13y6C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y6E[];
extern void _ZN3ccc8DD9x13y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x13y63abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y63efgEv,_ZTv0_n12_N3ccc8DD9x13y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y63efgEv,_ZThn4_N3ccc8DD9x13y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y63abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y63efgEv,_ZTv0_n12_N3ccc8DD9x13y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y6E[] = {
  {&(_ZTVN3ccc8DD9x13y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y6E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y6E[];
static VTBL_ENTRY alt_thunk_names1970[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y63efgEv,_ZTv0_n12_N3ccc8DD9x13y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y63efgEv,_ZThn4_N3ccc8DD9x13y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y6E = {  "_ZN3ccc8DD9x13y6E", // class name
  bases__ZN3ccc8DD9x13y6E, 2,
  &(vtc__ZN3ccc8DD9x13y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y6E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y6E),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  CC9x13y7  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8CC9x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y73pqrEv
  ~CC9x13y7(); // tgen
  CC9x13y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y7E) C1{ VBC2{ v3 v2} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y73abcEv");}
void  ccc::CC9x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y73pqrEv");}
ccc::CC9x13y7 ::~CC9x13y7(){ note_dtor("_ZN3ccc8CC9x13y7E", this);} // tgen
ccc::CC9x13y7 ::CC9x13y7(){ note_ctor("_ZN3ccc8CC9x13y7E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y7E, buf);
    ::ccc::CC9x13y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y7E);
    dp->::ccc::CC9x13y7::~CC9x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y7E(Test__ZN3ccc8CC9x13y7E, "_ZN3ccc8CC9x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y7C1Ev();
extern void _ZN3ccc8CC9x13y7D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y7E[] = {
  NSPAIR(_ZN3ccc8CC9x13y7C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y7E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc8CC9x13y73abcEv();
extern void _ZN3ccc8CC9x13y73pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y73pqrEv,_ZTv0_n16_N3ccc8CC9x13y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y73pqrEv,_ZThn4_N3ccc8CC9x13y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y73pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y73pqrEv,_ZTv0_n16_N3ccc8CC9x13y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y7E[] = {
  {&(_ZTVN3ccc8CC9x13y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x13y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y7E[];
static VTBL_ENTRY alt_thunk_names1971[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y73pqrEv,_ZTv0_n16_N3ccc8CC9x13y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y73pqrEv,_ZThn4_N3ccc8CC9x13y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y7E = {  "_ZN3ccc8CC9x13y7E", // class name
  bases__ZN3ccc8CC9x13y7E, 2,
  &(vtc__ZN3ccc8CC9x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y7E),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  DD9x13y7  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc8DD9x13y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x13y73pqrEv
  ~DD9x13y7(); // tgen
  DD9x13y7(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y7E) C1{ VBC2{ v3 v2} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x13y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y73abcEv");}
void  ccc::DD9x13y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y73pqrEv");}
ccc::DD9x13y7 ::~DD9x13y7(){ note_dtor("_ZN3ccc8DD9x13y7E", this);} // tgen
ccc::DD9x13y7 ::DD9x13y7(){ note_ctor("_ZN3ccc8DD9x13y7E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y7E, buf);
    ::ccc::DD9x13y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y7E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y7E);
    dp->::ccc::DD9x13y7::~DD9x13y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y7E(Test__ZN3ccc8DD9x13y7E, "_ZN3ccc8DD9x13y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y7C1Ev();
extern void _ZN3ccc8DD9x13y7D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y7E[] = {
  NSPAIR(_ZN3ccc8DD9x13y7C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x13y73pqrEv();
extern void _ZN3ccc8DD9x13y73abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y73abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y7E[] = {
  {&(_ZTVN3ccc8DD9x13y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y7E[];
Class_Descriptor cd__ZN3ccc8DD9x13y7E = {  "_ZN3ccc8DD9x13y7E", // class name
  bases__ZN3ccc8DD9x13y7E, 2,
  &(vtc__ZN3ccc8DD9x13y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y7E),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  CC9x13y8  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x13y83abcEv
  ~CC9x13y8(); // tgen
  CC9x13y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y8E) C1{ VBC2{ v1 v3} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y83efgEv");}
void  ccc::CC9x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x13y83abcEv");}
ccc::CC9x13y8 ::~CC9x13y8(){ note_dtor("_ZN3ccc8CC9x13y8E", this);} // tgen
ccc::CC9x13y8 ::CC9x13y8(){ note_ctor("_ZN3ccc8CC9x13y8E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y8E, buf);
    ::ccc::CC9x13y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y8E);
    dp->::ccc::CC9x13y8::~CC9x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y8E(Test__ZN3ccc8CC9x13y8E, "_ZN3ccc8CC9x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y8C1Ev();
extern void _ZN3ccc8CC9x13y8D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y8E[] = {
  NSPAIR(_ZN3ccc8CC9x13y8C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y8E[];
extern void _ZN3ccc8CC9x13y83efgEv();
extern void _ZN3ccc8CC9x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y83efgEv,_ZTv0_n12_N3ccc8CC9x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y83efgEv,_ZThn4_N3ccc8CC9x13y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y83efgEv,_ZTv0_n12_N3ccc8CC9x13y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y8E[] = {
  {&(_ZTVN3ccc8CC9x13y8E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x13y8E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y8E[];
static VTBL_ENTRY alt_thunk_names1972[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y83efgEv,_ZTv0_n12_N3ccc8CC9x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y83efgEv,_ZThn4_N3ccc8CC9x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y8E = {  "_ZN3ccc8CC9x13y8E", // class name
  bases__ZN3ccc8CC9x13y8E, 2,
  &(vtc__ZN3ccc8CC9x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y8E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y8E),2, //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  DD9x13y8  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD9x13y83efgEv
  virtual void  abc(); // _ZN3ccc8DD9x13y83abcEv
  ~DD9x13y8(); // tgen
  DD9x13y8(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y8E) C1{ VBC2{ v1 v3} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x13y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y83efgEv");}
void  ccc::DD9x13y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x13y83abcEv");}
ccc::DD9x13y8 ::~DD9x13y8(){ note_dtor("_ZN3ccc8DD9x13y8E", this);} // tgen
ccc::DD9x13y8 ::DD9x13y8(){ note_ctor("_ZN3ccc8DD9x13y8E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y8E, buf);
    ::ccc::DD9x13y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y8E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y8E);
    dp->::ccc::DD9x13y8::~DD9x13y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y8E(Test__ZN3ccc8DD9x13y8E, "_ZN3ccc8DD9x13y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y8C1Ev();
extern void _ZN3ccc8DD9x13y8D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y8E[] = {
  NSPAIR(_ZN3ccc8DD9x13y8C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y8E[];
extern void _ZN3ccc8DD9x13y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x13y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y83efgEv,_ZTv0_n12_N3ccc8DD9x13y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y83efgEv,_ZThn4_N3ccc8DD9x13y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y83abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y83efgEv,_ZTv0_n12_N3ccc8DD9x13y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y8E[] = {
  {&(_ZTVN3ccc8DD9x13y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x13y8E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y8E[];
static VTBL_ENTRY alt_thunk_names1973[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y83efgEv,_ZTv0_n12_N3ccc8DD9x13y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y83efgEv,_ZThn4_N3ccc8DD9x13y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y8E = {  "_ZN3ccc8DD9x13y8E", // class name
  bases__ZN3ccc8DD9x13y8E, 2,
  &(vtc__ZN3ccc8DD9x13y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y8E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y8E),3, //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  CC9x13y9  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8CC9x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x13y93pqrEv
  ~CC9x13y9(); // tgen
  CC9x13y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x13y9E) C1{ VBC2{ v1 v2} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x13y93efgEv");}
void  ccc::CC9x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x13y93pqrEv");}
ccc::CC9x13y9 ::~CC9x13y9(){ note_dtor("_ZN3ccc8CC9x13y9E", this);} // tgen
ccc::CC9x13y9 ::CC9x13y9(){ note_ctor("_ZN3ccc8CC9x13y9E", this);} // tgen
}
static void Test__ZN3ccc8CC9x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x13y9E, buf);
    ::ccc::CC9x13y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x13y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc8CC9x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x13y9E);
    dp->::ccc::CC9x13y9::~CC9x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x13y9E(Test__ZN3ccc8CC9x13y9E, "_ZN3ccc8CC9x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x13y9C1Ev();
extern void _ZN3ccc8CC9x13y9D1Ev();
Name_Map name_map__ZN3ccc8CC9x13y9E[] = {
  NSPAIR(_ZN3ccc8CC9x13y9C1Ev),
  NSPAIR(_ZN3ccc8CC9x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8CC9x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x13y9E[];
extern void _ZN3ccc8CC9x13y93efgEv();
extern void _ZN3ccc8CC9x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x13y93efgEv,_ZTv0_n12_N3ccc8CC9x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y93efgEv,_ZThn4_N3ccc8CC9x13y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x13y93pqrEv,_ZTv0_n16_N3ccc8CC9x13y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x13y93pqrEv,_ZThn4_N3ccc8CC9x13y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x13y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x13y93efgEv,_ZTv0_n12_N3ccc8CC9x13y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x13y93pqrEv,_ZTv0_n16_N3ccc8CC9x13y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x13y9E[] = {
  {&(_ZTVN3ccc8CC9x13y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x13y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x13y9E[];
static VTBL_ENTRY alt_thunk_names1974[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x13y93pqrEv,_ZTv0_n16_N3ccc8CC9x13y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y93pqrEv,_ZThn4_N3ccc8CC9x13y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x13y93efgEv,_ZTv0_n12_N3ccc8CC9x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x13y93efgEv,_ZThn4_N3ccc8CC9x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x13y9E = {  "_ZN3ccc8CC9x13y9E", // class name
  bases__ZN3ccc8CC9x13y9E, 2,
  &(vtc__ZN3ccc8CC9x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x13y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x13y9E),2, //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  DD9x13y9  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc8DD9x13y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x13y93pqrEv
  ~DD9x13y9(); // tgen
  DD9x13y9(); // tgen
};
//SIG(1 _ZN3ccc8DD9x13y9E) C1{ VBC2{ v1 v2} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x13y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x13y93efgEv");}
void  ccc::DD9x13y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x13y93pqrEv");}
ccc::DD9x13y9 ::~DD9x13y9(){ note_dtor("_ZN3ccc8DD9x13y9E", this);} // tgen
ccc::DD9x13y9 ::DD9x13y9(){ note_ctor("_ZN3ccc8DD9x13y9E", this);} // tgen
}
static void Test__ZN3ccc8DD9x13y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x13y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x13y9E, buf);
    ::ccc::DD9x13y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x13y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x13y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x13y9E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc8DD9x13y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x13y9E);
    dp->::ccc::DD9x13y9::~DD9x13y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x13y9E(Test__ZN3ccc8DD9x13y9E, "_ZN3ccc8DD9x13y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x13y9C1Ev();
extern void _ZN3ccc8DD9x13y9D1Ev();
Name_Map name_map__ZN3ccc8DD9x13y9E[] = {
  NSPAIR(_ZN3ccc8DD9x13y9C1Ev),
  NSPAIR(_ZN3ccc8DD9x13y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc8DD9x13y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y9E[];
extern void _ZN3ccc8DD9x13y93efgEv();
extern void _ZN3ccc8DD9x13y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x13y93efgEv,_ZTv0_n12_N3ccc8DD9x13y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x13y93efgEv,_ZThn4_N3ccc8DD9x13y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x13y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x13y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x13y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x13y93efgEv,_ZTv0_n12_N3ccc8DD9x13y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x13y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x13y9E[] = {
  {&(_ZTVN3ccc8DD9x13y9E[6]),  6,12},
  {&(_ZTVN3ccc8DD9x13y9E[6]),  6,12},
  {&(_ZTVN3ccc8DD9x13y9E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x13y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x13y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x13y9E[];
static VTBL_ENTRY alt_thunk_names1975[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x13y93efgEv,_ZTv0_n12_N3ccc8DD9x13y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x13y93efgEv,_ZThn4_N3ccc8DD9x13y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x13y9E = {  "_ZN3ccc8DD9x13y9E", // class name
  bases__ZN3ccc8DD9x13y9E, 2,
  &(vtc__ZN3ccc8DD9x13y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x13y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x13y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x13y9E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x13y9E),3, //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  CC9x13y10  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC9x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x13y103abcEv
  ~CC9x13y10(); // tgen
  CC9x13y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y10E) C1{ VBC2{ v3 v1} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x13y103pqrEv");}
void  ccc::CC9x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x13y103abcEv");}
ccc::CC9x13y10 ::~CC9x13y10(){ note_dtor("_ZN3ccc9CC9x13y10E", this);} // tgen
ccc::CC9x13y10 ::CC9x13y10(){ note_ctor("_ZN3ccc9CC9x13y10E", this);} // tgen
}
static void Test__ZN3ccc9CC9x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x13y10E, buf);
    ::ccc::CC9x13y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x13y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC9x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x13y10E);
    dp->::ccc::CC9x13y10::~CC9x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x13y10E(Test__ZN3ccc9CC9x13y10E, "_ZN3ccc9CC9x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x13y10C1Ev();
extern void _ZN3ccc9CC9x13y10D1Ev();
Name_Map name_map__ZN3ccc9CC9x13y10E[] = {
  NSPAIR(_ZN3ccc9CC9x13y10C1Ev),
  NSPAIR(_ZN3ccc9CC9x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC9x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x13y10E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC9x13y103pqrEv();
extern void _ZN3ccc9CC9x13y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x13y103pqrEv,_ZTv0_n16_N3ccc9CC9x13y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y103pqrEv,_ZThn4_N3ccc9CC9x13y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x13y103pqrEv,_ZTv0_n16_N3ccc9CC9x13y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x13y10E[] = {
  {&(_ZTVN3ccc9CC9x13y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC9x13y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x13y10E[];
static VTBL_ENTRY alt_thunk_names1976[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x13y103pqrEv,_ZTv0_n16_N3ccc9CC9x13y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x13y103pqrEv,_ZThn4_N3ccc9CC9x13y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x13y10E = {  "_ZN3ccc9CC9x13y10E", // class name
  bases__ZN3ccc9CC9x13y10E, 2,
  &(vtc__ZN3ccc9CC9x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x13y10E),2, //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  DD9x13y10  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD9x13y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD9x13y103abcEv
  ~DD9x13y10(); // tgen
  DD9x13y10(); // tgen
};
//SIG(1 _ZN3ccc9DD9x13y10E) C1{ VBC2{ v3 v1} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x13y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x13y103pqrEv");}
void  ccc::DD9x13y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x13y103abcEv");}
ccc::DD9x13y10 ::~DD9x13y10(){ note_dtor("_ZN3ccc9DD9x13y10E", this);} // tgen
ccc::DD9x13y10 ::DD9x13y10(){ note_ctor("_ZN3ccc9DD9x13y10E", this);} // tgen
}
static void Test__ZN3ccc9DD9x13y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x13y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x13y10E, buf);
    ::ccc::DD9x13y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x13y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x13y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x13y10E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD9x13y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x13y10E);
    dp->::ccc::DD9x13y10::~DD9x13y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x13y10E(Test__ZN3ccc9DD9x13y10E, "_ZN3ccc9DD9x13y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x13y10C1Ev();
extern void _ZN3ccc9DD9x13y10D1Ev();
Name_Map name_map__ZN3ccc9DD9x13y10E[] = {
  NSPAIR(_ZN3ccc9DD9x13y10C1Ev),
  NSPAIR(_ZN3ccc9DD9x13y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD9x13y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x13y103pqrEv();
extern void _ZN3ccc9DD9x13y103abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x13y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y103abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x13y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x13y10E[] = {
  {&(_ZTVN3ccc9DD9x13y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x13y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x13y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x13y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x13y10E[];
Class_Descriptor cd__ZN3ccc9DD9x13y10E = {  "_ZN3ccc9DD9x13y10E", // class name
  bases__ZN3ccc9DD9x13y10E, 2,
  &(vtc__ZN3ccc9DD9x13y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x13y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x13y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x13y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x13y10E),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  CC9x13y11  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC9x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x13y113efgEv
  ~CC9x13y11(); // tgen
  CC9x13y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y11E) C1{ VBC2{ v2 v1} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x13y113pqrEv");}
void  ccc::CC9x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x13y113efgEv");}
ccc::CC9x13y11 ::~CC9x13y11(){ note_dtor("_ZN3ccc9CC9x13y11E", this);} // tgen
ccc::CC9x13y11 ::CC9x13y11(){ note_ctor("_ZN3ccc9CC9x13y11E", this);} // tgen
}
static void Test__ZN3ccc9CC9x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x13y11E, buf);
    ::ccc::CC9x13y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x13y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC9x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x13y11E);
    dp->::ccc::CC9x13y11::~CC9x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x13y11E(Test__ZN3ccc9CC9x13y11E, "_ZN3ccc9CC9x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x13y11C1Ev();
extern void _ZN3ccc9CC9x13y11D1Ev();
Name_Map name_map__ZN3ccc9CC9x13y11E[] = {
  NSPAIR(_ZN3ccc9CC9x13y11C1Ev),
  NSPAIR(_ZN3ccc9CC9x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC9x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x13y11E[];
extern void _ZN3ccc9CC9x13y113efgEv();
extern void _ZN3ccc9CC9x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x13y113efgEv,_ZTv0_n12_N3ccc9CC9x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y113efgEv,_ZThn4_N3ccc9CC9x13y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x13y113pqrEv,_ZTv0_n16_N3ccc9CC9x13y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y113pqrEv,_ZThn4_N3ccc9CC9x13y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x13y113efgEv,_ZTv0_n12_N3ccc9CC9x13y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x13y113pqrEv,_ZTv0_n16_N3ccc9CC9x13y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x13y11E[] = {
  {&(_ZTVN3ccc9CC9x13y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x13y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x13y11E[];
static VTBL_ENTRY alt_thunk_names1977[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x13y113pqrEv,_ZTv0_n16_N3ccc9CC9x13y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x13y113pqrEv,_ZThn4_N3ccc9CC9x13y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x13y113efgEv,_ZTv0_n12_N3ccc9CC9x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x13y113efgEv,_ZThn4_N3ccc9CC9x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x13y11E = {  "_ZN3ccc9CC9x13y11E", // class name
  bases__ZN3ccc9CC9x13y11E, 2,
  &(vtc__ZN3ccc9CC9x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x13y11E),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  DD9x13y11  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD9x13y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD9x13y113efgEv
  ~DD9x13y11(); // tgen
  DD9x13y11(); // tgen
};
//SIG(1 _ZN3ccc9DD9x13y11E) C1{ VBC2{ v2 v1} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x13y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x13y113pqrEv");}
void  ccc::DD9x13y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x13y113efgEv");}
ccc::DD9x13y11 ::~DD9x13y11(){ note_dtor("_ZN3ccc9DD9x13y11E", this);} // tgen
ccc::DD9x13y11 ::DD9x13y11(){ note_ctor("_ZN3ccc9DD9x13y11E", this);} // tgen
}
static void Test__ZN3ccc9DD9x13y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x13y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x13y11E, buf);
    ::ccc::DD9x13y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x13y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x13y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x13y11E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD9x13y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x13y11E);
    dp->::ccc::DD9x13y11::~DD9x13y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x13y11E(Test__ZN3ccc9DD9x13y11E, "_ZN3ccc9DD9x13y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x13y11C1Ev();
extern void _ZN3ccc9DD9x13y11D1Ev();
Name_Map name_map__ZN3ccc9DD9x13y11E[] = {
  NSPAIR(_ZN3ccc9DD9x13y11C1Ev),
  NSPAIR(_ZN3ccc9DD9x13y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD9x13y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y11E[];
extern void _ZN3ccc9DD9x13y113efgEv();
extern void _ZN3ccc9DD9x13y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x13y113efgEv,_ZTv0_n12_N3ccc9DD9x13y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x13y113efgEv,_ZThn4_N3ccc9DD9x13y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x13y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x13y113efgEv,_ZTv0_n12_N3ccc9DD9x13y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x13y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x13y11E[] = {
  {&(_ZTVN3ccc9DD9x13y11E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y11E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y11E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x13y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x13y11E[];
static VTBL_ENTRY alt_thunk_names1978[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x13y113efgEv,_ZTv0_n12_N3ccc9DD9x13y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x13y113efgEv,_ZThn4_N3ccc9DD9x13y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x13y11E = {  "_ZN3ccc9DD9x13y11E", // class name
  bases__ZN3ccc9DD9x13y11E, 2,
  &(vtc__ZN3ccc9DD9x13y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x13y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x13y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x13y11E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x13y11E),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  CC9x13y12  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9CC9x13y123abcEv
  ~CC9x13y12(); // tgen
  CC9x13y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y12E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC9x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x13y123abcEv");}
ccc::CC9x13y12 ::~CC9x13y12(){ note_dtor("_ZN3ccc9CC9x13y12E", this);} // tgen
ccc::CC9x13y12 ::CC9x13y12(){ note_ctor("_ZN3ccc9CC9x13y12E", this);} // tgen
}
static void Test__ZN3ccc9CC9x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x13y12E, buf);
    ::ccc::CC9x13y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x13y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC9x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x13y12E);
    dp->::ccc::CC9x13y12::~CC9x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x13y12E(Test__ZN3ccc9CC9x13y12E, "_ZN3ccc9CC9x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x13y12C1Ev();
extern void _ZN3ccc9CC9x13y12D1Ev();
Name_Map name_map__ZN3ccc9CC9x13y12E[] = {
  NSPAIR(_ZN3ccc9CC9x13y12C1Ev),
  NSPAIR(_ZN3ccc9CC9x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC9x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x13y12E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC9x13y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x13y12E[] = {
  {&(_ZTVN3ccc9CC9x13y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x13y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x13y12E[];
Class_Descriptor cd__ZN3ccc9CC9x13y12E = {  "_ZN3ccc9CC9x13y12E", // class name
  bases__ZN3ccc9CC9x13y12E, 2,
  &(vtc__ZN3ccc9CC9x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x13y12E),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  DD9x13y12  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  abc(); // _ZN3ccc9DD9x13y123abcEv
  ~DD9x13y12(); // tgen
  DD9x13y12(); // tgen
};
//SIG(1 _ZN3ccc9DD9x13y12E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD9x13y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x13y123abcEv");}
ccc::DD9x13y12 ::~DD9x13y12(){ note_dtor("_ZN3ccc9DD9x13y12E", this);} // tgen
ccc::DD9x13y12 ::DD9x13y12(){ note_ctor("_ZN3ccc9DD9x13y12E", this);} // tgen
}
static void Test__ZN3ccc9DD9x13y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x13y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x13y12E, buf);
    ::ccc::DD9x13y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x13y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x13y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x13y12E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD9x13y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x13y12E);
    dp->::ccc::DD9x13y12::~DD9x13y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x13y12E(Test__ZN3ccc9DD9x13y12E, "_ZN3ccc9DD9x13y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x13y12C1Ev();
extern void _ZN3ccc9DD9x13y12D1Ev();
Name_Map name_map__ZN3ccc9DD9x13y12E[] = {
  NSPAIR(_ZN3ccc9DD9x13y12C1Ev),
  NSPAIR(_ZN3ccc9DD9x13y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD9x13y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9DD9x13y123abcEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x13y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x13y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x13y12E[] = {
  {&(_ZTVN3ccc9DD9x13y12E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x13y12E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x13y12E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x13y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x13y12E[];
Class_Descriptor cd__ZN3ccc9DD9x13y12E = {  "_ZN3ccc9DD9x13y12E", // class name
  bases__ZN3ccc9DD9x13y12E, 2,
  &(vtc__ZN3ccc9DD9x13y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x13y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x13y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x13y12E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x13y12E),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  CC9x13y13  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9CC9x13y133efgEv
  ~CC9x13y13(); // tgen
  CC9x13y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y13E) C1{ VBC2{ v1 v2} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC9x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x13y133efgEv");}
ccc::CC9x13y13 ::~CC9x13y13(){ note_dtor("_ZN3ccc9CC9x13y13E", this);} // tgen
ccc::CC9x13y13 ::CC9x13y13(){ note_ctor("_ZN3ccc9CC9x13y13E", this);} // tgen
}
static void Test__ZN3ccc9CC9x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x13y13E, buf);
    ::ccc::CC9x13y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x13y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC9x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x13y13E);
    dp->::ccc::CC9x13y13::~CC9x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x13y13E(Test__ZN3ccc9CC9x13y13E, "_ZN3ccc9CC9x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x13y13C1Ev();
extern void _ZN3ccc9CC9x13y13D1Ev();
Name_Map name_map__ZN3ccc9CC9x13y13E[] = {
  NSPAIR(_ZN3ccc9CC9x13y13C1Ev),
  NSPAIR(_ZN3ccc9CC9x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC9x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x13y13E[];
extern void _ZN3ccc9CC9x13y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x13y133efgEv,_ZTv0_n12_N3ccc9CC9x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y133efgEv,_ZThn4_N3ccc9CC9x13y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x13y133efgEv,_ZTv0_n12_N3ccc9CC9x13y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x13y13E[] = {
  {&(_ZTVN3ccc9CC9x13y13E[3]),  3,10},
  {&(_ZTVN3ccc9CC9x13y13E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x13y13E[];
static VTBL_ENTRY alt_thunk_names1979[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x13y133efgEv,_ZTv0_n12_N3ccc9CC9x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x13y133efgEv,_ZThn4_N3ccc9CC9x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x13y13E = {  "_ZN3ccc9CC9x13y13E", // class name
  bases__ZN3ccc9CC9x13y13E, 2,
  &(vtc__ZN3ccc9CC9x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y13E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x13y13E),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  DD9x13y13  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  efg(); // _ZN3ccc9DD9x13y133efgEv
  ~DD9x13y13(); // tgen
  DD9x13y13(); // tgen
};
//SIG(1 _ZN3ccc9DD9x13y13E) C1{ VBC2{ v1 v2} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD9x13y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x13y133efgEv");}
ccc::DD9x13y13 ::~DD9x13y13(){ note_dtor("_ZN3ccc9DD9x13y13E", this);} // tgen
ccc::DD9x13y13 ::DD9x13y13(){ note_ctor("_ZN3ccc9DD9x13y13E", this);} // tgen
}
static void Test__ZN3ccc9DD9x13y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x13y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x13y13E, buf);
    ::ccc::DD9x13y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x13y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x13y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x13y13E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD9x13y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x13y13E);
    dp->::ccc::DD9x13y13::~DD9x13y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x13y13E(Test__ZN3ccc9DD9x13y13E, "_ZN3ccc9DD9x13y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x13y13C1Ev();
extern void _ZN3ccc9DD9x13y13D1Ev();
Name_Map name_map__ZN3ccc9DD9x13y13E[] = {
  NSPAIR(_ZN3ccc9DD9x13y13C1Ev),
  NSPAIR(_ZN3ccc9DD9x13y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD9x13y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y13E[];
extern void _ZN3ccc9DD9x13y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x13y133efgEv,_ZTv0_n12_N3ccc9DD9x13y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x13y133efgEv,_ZThn4_N3ccc9DD9x13y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x13y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x13y133efgEv,_ZTv0_n12_N3ccc9DD9x13y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x13y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x13y13E[] = {
  {&(_ZTVN3ccc9DD9x13y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x13y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x13y13E[];
static VTBL_ENTRY alt_thunk_names1980[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x13y133efgEv,_ZTv0_n12_N3ccc9DD9x13y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x13y133efgEv,_ZThn4_N3ccc9DD9x13y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x13y13E = {  "_ZN3ccc9DD9x13y13E", // class name
  bases__ZN3ccc9DD9x13y13E, 2,
  &(vtc__ZN3ccc9DD9x13y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x13y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x13y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x13y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x13y13E),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  CC9x13y14  : virtual ::ccc::AA9 , ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9CC9x13y143pqrEv
  ~CC9x13y14(); // tgen
  CC9x13y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y14E) C1{ VBC2{ v2 v1} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC9x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x13y143pqrEv");}
ccc::CC9x13y14 ::~CC9x13y14(){ note_dtor("_ZN3ccc9CC9x13y14E", this);} // tgen
ccc::CC9x13y14 ::CC9x13y14(){ note_ctor("_ZN3ccc9CC9x13y14E", this);} // tgen
}
static void Test__ZN3ccc9CC9x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x13y14E, buf);
    ::ccc::CC9x13y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x13y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC9x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x13y14E);
    dp->::ccc::CC9x13y14::~CC9x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x13y14E(Test__ZN3ccc9CC9x13y14E, "_ZN3ccc9CC9x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x13y14C1Ev();
extern void _ZN3ccc9CC9x13y14D1Ev();
Name_Map name_map__ZN3ccc9CC9x13y14E[] = {
  NSPAIR(_ZN3ccc9CC9x13y14C1Ev),
  NSPAIR(_ZN3ccc9CC9x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC9x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x13y14E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc9CC9x13y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x13y143pqrEv,_ZTv0_n16_N3ccc9CC9x13y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x13y143pqrEv,_ZThn4_N3ccc9CC9x13y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x13y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x13y143pqrEv,_ZTv0_n16_N3ccc9CC9x13y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x13y14E[] = {
  {&(_ZTVN3ccc9CC9x13y14E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x13y14E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x13y14E[];
static VTBL_ENTRY alt_thunk_names1981[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x13y143pqrEv,_ZTv0_n16_N3ccc9CC9x13y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x13y143pqrEv,_ZThn4_N3ccc9CC9x13y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x13y14E = {  "_ZN3ccc9CC9x13y14E", // class name
  bases__ZN3ccc9CC9x13y14E, 2,
  &(vtc__ZN3ccc9CC9x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y14E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x13y14E),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  DD9x13y14  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  virtual void  pqr(); // _ZN3ccc9DD9x13y143pqrEv
  ~DD9x13y14(); // tgen
  DD9x13y14(); // tgen
};
//SIG(1 _ZN3ccc9DD9x13y14E) C1{ VBC2{ v2 v1} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD9x13y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x13y143pqrEv");}
ccc::DD9x13y14 ::~DD9x13y14(){ note_dtor("_ZN3ccc9DD9x13y14E", this);} // tgen
ccc::DD9x13y14 ::DD9x13y14(){ note_ctor("_ZN3ccc9DD9x13y14E", this);} // tgen
}
static void Test__ZN3ccc9DD9x13y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x13y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x13y14E, buf);
    ::ccc::DD9x13y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x13y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x13y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x13y14E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD9x13y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x13y14E);
    dp->::ccc::DD9x13y14::~DD9x13y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x13y14E(Test__ZN3ccc9DD9x13y14E, "_ZN3ccc9DD9x13y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x13y14C1Ev();
extern void _ZN3ccc9DD9x13y14D1Ev();
Name_Map name_map__ZN3ccc9DD9x13y14E[] = {
  NSPAIR(_ZN3ccc9DD9x13y14C1Ev),
  NSPAIR(_ZN3ccc9DD9x13y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD9x13y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x13y143pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x13y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x13y143pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x13y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x13y14E[] = {
  {&(_ZTVN3ccc9DD9x13y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y14E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x13y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x13y14E[];
Class_Descriptor cd__ZN3ccc9DD9x13y14E = {  "_ZN3ccc9DD9x13y14E", // class name
  bases__ZN3ccc9DD9x13y14E, 2,
  &(vtc__ZN3ccc9DD9x13y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x13y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x13y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x13y14E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x13y14E),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  CC9x13y15  : virtual ::ccc::AA9 , ::ccc::BB13 {
  ~CC9x13y15(); // tgen
  CC9x13y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x13y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC9x13y15 ::~CC9x13y15(){ note_dtor("_ZN3ccc9CC9x13y15E", this);} // tgen
ccc::CC9x13y15 ::CC9x13y15(){ note_ctor("_ZN3ccc9CC9x13y15E", this);} // tgen
}
static void Test__ZN3ccc9CC9x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x13y15E, buf);
    ::ccc::CC9x13y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x13y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), 0, "_ZN3ccc9CC9x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x13y15E);
    dp->::ccc::CC9x13y15::~CC9x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x13y15E(Test__ZN3ccc9CC9x13y15E, "_ZN3ccc9CC9x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x13y15C1Ev();
extern void _ZN3ccc9CC9x13y15D1Ev();
Name_Map name_map__ZN3ccc9CC9x13y15E[] = {
  NSPAIR(_ZN3ccc9CC9x13y15C1Ev),
  NSPAIR(_ZN3ccc9CC9x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9CC9x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x13y15E[];
extern void _ZN3ccc4BB133efgEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x13y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x13y15E[] = {
  {&(_ZTVN3ccc9CC9x13y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC9x13y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x13y15E[];
Class_Descriptor cd__ZN3ccc9CC9x13y15E = {  "_ZN3ccc9CC9x13y15E", // class name
  bases__ZN3ccc9CC9x13y15E, 2,
  &(vtc__ZN3ccc9CC9x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x13y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x13y15E),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  DD9x13y15  : virtual ::ccc::AA9 , virtual ::ccc::BB13 {
  ~DD9x13y15(); // tgen
  DD9x13y15(); // tgen
};
//SIG(1 _ZN3ccc9DD9x13y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD9x13y15 ::~DD9x13y15(){ note_dtor("_ZN3ccc9DD9x13y15E", this);} // tgen
ccc::DD9x13y15 ::DD9x13y15(){ note_ctor("_ZN3ccc9DD9x13y15E", this);} // tgen
}
static void Test__ZN3ccc9DD9x13y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x13y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x13y15E, buf);
    ::ccc::DD9x13y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x13y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x13y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x13y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x13y15E");
    check_base_class_offset(lv, (::ccc::BB13*), ABISELECT(8,4), "_ZN3ccc9DD9x13y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x13y15E);
    dp->::ccc::DD9x13y15::~DD9x13y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x13y15E(Test__ZN3ccc9DD9x13y15E, "_ZN3ccc9DD9x13y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x13y15C1Ev();
extern void _ZN3ccc9DD9x13y15D1Ev();
Name_Map name_map__ZN3ccc9DD9x13y15E[] = {
  NSPAIR(_ZN3ccc9DD9x13y15C1Ev),
  NSPAIR(_ZN3ccc9DD9x13y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB13E;
extern VTBL_ENTRY _ZTIN3ccc4BB13E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB13E[];
static Base_Class bases__ZN3ccc9DD9x13y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB13E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB133efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x13y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x13y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB133efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x13y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x13y15E[] = {
  {&(_ZTVN3ccc9DD9x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x13y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x13y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x13y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x13y15E[];
Class_Descriptor cd__ZN3ccc9DD9x13y15E = {  "_ZN3ccc9DD9x13y15E", // class name
  bases__ZN3ccc9DD9x13y15E, 2,
  &(vtc__ZN3ccc9DD9x13y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x13y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x13y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x13y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x13y15E),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  CC9x14y0  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y03pqrEv
  ~CC9x14y0(); // tgen
  CC9x14y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y0E) C1{ VBC2{ v2 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y03abcEv");}
void  ccc::CC9x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y03efgEv");}
void  ccc::CC9x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y03pqrEv");}
ccc::CC9x14y0 ::~CC9x14y0(){ note_dtor("_ZN3ccc8CC9x14y0E", this);} // tgen
ccc::CC9x14y0 ::CC9x14y0(){ note_ctor("_ZN3ccc8CC9x14y0E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y0E, buf);
    ::ccc::CC9x14y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y0E);
    dp->::ccc::CC9x14y0::~CC9x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y0E(Test__ZN3ccc8CC9x14y0E, "_ZN3ccc8CC9x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y0C1Ev();
extern void _ZN3ccc8CC9x14y0D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y0E[] = {
  NSPAIR(_ZN3ccc8CC9x14y0C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y0E[];
extern void _ZN3ccc8CC9x14y03pqrEv();
extern void _ZN3ccc8CC9x14y03abcEv();
extern void _ZN3ccc8CC9x14y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y03efgEv,_ZTv0_n12_N3ccc8CC9x14y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y03efgEv,_ZThn4_N3ccc8CC9x14y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y03pqrEv,_ZTv0_n16_N3ccc8CC9x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y03pqrEv,_ZThn4_N3ccc8CC9x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y03efgEv,_ZTv0_n12_N3ccc8CC9x14y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y03pqrEv,_ZTv0_n16_N3ccc8CC9x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y0E[] = {
  {&(_ZTVN3ccc8CC9x14y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y0E[];
static VTBL_ENTRY alt_thunk_names1982[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y03pqrEv,_ZTv0_n16_N3ccc8CC9x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y03pqrEv,_ZThn4_N3ccc8CC9x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y03efgEv,_ZTv0_n12_N3ccc8CC9x14y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y03efgEv,_ZThn4_N3ccc8CC9x14y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y0E = {  "_ZN3ccc8CC9x14y0E", // class name
  bases__ZN3ccc8CC9x14y0E, 2,
  &(vtc__ZN3ccc8CC9x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y0E),2, //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  DD9x14y0  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD9x14y03abcEv
  virtual void  efg(); // _ZN3ccc8DD9x14y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x14y03pqrEv
  ~DD9x14y0(); // tgen
  DD9x14y0(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y0E) C1{ VBC2{ v2 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x14y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y03abcEv");}
void  ccc::DD9x14y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y03efgEv");}
void  ccc::DD9x14y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y03pqrEv");}
ccc::DD9x14y0 ::~DD9x14y0(){ note_dtor("_ZN3ccc8DD9x14y0E", this);} // tgen
ccc::DD9x14y0 ::DD9x14y0(){ note_ctor("_ZN3ccc8DD9x14y0E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y0E, buf);
    ::ccc::DD9x14y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y0E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y0E);
    dp->::ccc::DD9x14y0::~DD9x14y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y0E(Test__ZN3ccc8DD9x14y0E, "_ZN3ccc8DD9x14y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y0C1Ev();
extern void _ZN3ccc8DD9x14y0D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y0E[] = {
  NSPAIR(_ZN3ccc8DD9x14y0C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y0E[];
extern void _ZN3ccc8DD9x14y03efgEv();
extern void _ZN3ccc8DD9x14y03pqrEv();
extern void _ZN3ccc8DD9x14y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y03pqrEv,_ZTv0_n12_N3ccc8DD9x14y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y03pqrEv,_ZThn4_N3ccc8DD9x14y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y03pqrEv,_ZTv0_n12_N3ccc8DD9x14y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y0E[] = {
  {&(_ZTVN3ccc8DD9x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y0E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y0E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y0E[];
static VTBL_ENTRY alt_thunk_names1983[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y03pqrEv,_ZTv0_n12_N3ccc8DD9x14y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y03pqrEv,_ZThn4_N3ccc8DD9x14y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y0E = {  "_ZN3ccc8DD9x14y0E", // class name
  bases__ZN3ccc8DD9x14y0E, 2,
  &(vtc__ZN3ccc8DD9x14y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y0E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y0E),3, //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  CC9x14y1  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x14y13efgEv
  ~CC9x14y1(); // tgen
  CC9x14y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y1E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y13abcEv");}
void  ccc::CC9x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y13pqrEv");}
void  ccc::CC9x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y13efgEv");}
ccc::CC9x14y1 ::~CC9x14y1(){ note_dtor("_ZN3ccc8CC9x14y1E", this);} // tgen
ccc::CC9x14y1 ::CC9x14y1(){ note_ctor("_ZN3ccc8CC9x14y1E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y1E, buf);
    ::ccc::CC9x14y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y1E);
    dp->::ccc::CC9x14y1::~CC9x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y1E(Test__ZN3ccc8CC9x14y1E, "_ZN3ccc8CC9x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y1C1Ev();
extern void _ZN3ccc8CC9x14y1D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y1E[] = {
  NSPAIR(_ZN3ccc8CC9x14y1C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y1E[];
extern void _ZN3ccc8CC9x14y13pqrEv();
extern void _ZN3ccc8CC9x14y13abcEv();
extern void _ZN3ccc8CC9x14y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y13efgEv,_ZTv0_n12_N3ccc8CC9x14y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y13efgEv,_ZThn4_N3ccc8CC9x14y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y13pqrEv,_ZTv0_n16_N3ccc8CC9x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y13pqrEv,_ZThn4_N3ccc8CC9x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y13efgEv,_ZTv0_n12_N3ccc8CC9x14y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y13pqrEv,_ZTv0_n16_N3ccc8CC9x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y1E[] = {
  {&(_ZTVN3ccc8CC9x14y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y1E[];
static VTBL_ENTRY alt_thunk_names1984[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y13pqrEv,_ZTv0_n16_N3ccc8CC9x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y13pqrEv,_ZThn4_N3ccc8CC9x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y13efgEv,_ZTv0_n12_N3ccc8CC9x14y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y13efgEv,_ZThn4_N3ccc8CC9x14y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y1E = {  "_ZN3ccc8CC9x14y1E", // class name
  bases__ZN3ccc8CC9x14y1E, 2,
  &(vtc__ZN3ccc8CC9x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y1E),2, //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  DD9x14y1  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD9x14y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x14y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x14y13efgEv
  ~DD9x14y1(); // tgen
  DD9x14y1(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y1E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x14y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y13abcEv");}
void  ccc::DD9x14y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y13pqrEv");}
void  ccc::DD9x14y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y13efgEv");}
ccc::DD9x14y1 ::~DD9x14y1(){ note_dtor("_ZN3ccc8DD9x14y1E", this);} // tgen
ccc::DD9x14y1 ::DD9x14y1(){ note_ctor("_ZN3ccc8DD9x14y1E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y1E, buf);
    ::ccc::DD9x14y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y1E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y1E);
    dp->::ccc::DD9x14y1::~DD9x14y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y1E(Test__ZN3ccc8DD9x14y1E, "_ZN3ccc8DD9x14y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y1C1Ev();
extern void _ZN3ccc8DD9x14y1D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y1E[] = {
  NSPAIR(_ZN3ccc8DD9x14y1C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y1E[];
extern void _ZN3ccc8DD9x14y13efgEv();
extern void _ZN3ccc8DD9x14y13pqrEv();
extern void _ZN3ccc8DD9x14y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y13pqrEv,_ZTv0_n12_N3ccc8DD9x14y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y13pqrEv,_ZThn4_N3ccc8DD9x14y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y13pqrEv,_ZTv0_n12_N3ccc8DD9x14y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y1E[] = {
  {&(_ZTVN3ccc8DD9x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y1E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y1E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y1E[];
static VTBL_ENTRY alt_thunk_names1985[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y13pqrEv,_ZTv0_n12_N3ccc8DD9x14y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y13pqrEv,_ZThn4_N3ccc8DD9x14y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y1E = {  "_ZN3ccc8DD9x14y1E", // class name
  bases__ZN3ccc8DD9x14y1E, 2,
  &(vtc__ZN3ccc8DD9x14y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y1E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y1E),3, //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  CC9x14y2  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y23pqrEv
  ~CC9x14y2(); // tgen
  CC9x14y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y2E) C1{ VBC2{ v1 v3} BC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y23efgEv");}
void  ccc::CC9x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y23abcEv");}
void  ccc::CC9x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y23pqrEv");}
ccc::CC9x14y2 ::~CC9x14y2(){ note_dtor("_ZN3ccc8CC9x14y2E", this);} // tgen
ccc::CC9x14y2 ::CC9x14y2(){ note_ctor("_ZN3ccc8CC9x14y2E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y2E, buf);
    ::ccc::CC9x14y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y2E);
    dp->::ccc::CC9x14y2::~CC9x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y2E(Test__ZN3ccc8CC9x14y2E, "_ZN3ccc8CC9x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y2C1Ev();
extern void _ZN3ccc8CC9x14y2D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y2E[] = {
  NSPAIR(_ZN3ccc8CC9x14y2C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y2E[];
extern void _ZN3ccc8CC9x14y23pqrEv();
extern void _ZN3ccc8CC9x14y23efgEv();
extern void _ZN3ccc8CC9x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y23efgEv,_ZTv0_n12_N3ccc8CC9x14y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y23efgEv,_ZThn4_N3ccc8CC9x14y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y23pqrEv,_ZTv0_n16_N3ccc8CC9x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y23pqrEv,_ZThn4_N3ccc8CC9x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y23efgEv,_ZTv0_n12_N3ccc8CC9x14y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y23pqrEv,_ZTv0_n16_N3ccc8CC9x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y2E[] = {
  {&(_ZTVN3ccc8CC9x14y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y2E[];
static VTBL_ENTRY alt_thunk_names1986[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y23pqrEv,_ZTv0_n16_N3ccc8CC9x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y23pqrEv,_ZThn4_N3ccc8CC9x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y23efgEv,_ZTv0_n12_N3ccc8CC9x14y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y23efgEv,_ZThn4_N3ccc8CC9x14y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y2E = {  "_ZN3ccc8CC9x14y2E", // class name
  bases__ZN3ccc8CC9x14y2E, 2,
  &(vtc__ZN3ccc8CC9x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y2E),2, //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  DD9x14y2  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD9x14y23efgEv
  virtual void  abc(); // _ZN3ccc8DD9x14y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x14y23pqrEv
  ~DD9x14y2(); // tgen
  DD9x14y2(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y2E) C1{ VBC2{ v1 v3} VBC3{ v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x14y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y23efgEv");}
void  ccc::DD9x14y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y23abcEv");}
void  ccc::DD9x14y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y23pqrEv");}
ccc::DD9x14y2 ::~DD9x14y2(){ note_dtor("_ZN3ccc8DD9x14y2E", this);} // tgen
ccc::DD9x14y2 ::DD9x14y2(){ note_ctor("_ZN3ccc8DD9x14y2E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y2E, buf);
    ::ccc::DD9x14y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y2E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y2E);
    dp->::ccc::DD9x14y2::~DD9x14y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y2E(Test__ZN3ccc8DD9x14y2E, "_ZN3ccc8DD9x14y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y2C1Ev();
extern void _ZN3ccc8DD9x14y2D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y2E[] = {
  NSPAIR(_ZN3ccc8DD9x14y2C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y2E[];
extern void _ZN3ccc8DD9x14y23efgEv();
extern void _ZN3ccc8DD9x14y23pqrEv();
extern void _ZN3ccc8DD9x14y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y23pqrEv,_ZTv0_n12_N3ccc8DD9x14y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y23pqrEv,_ZThn4_N3ccc8DD9x14y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y23pqrEv,_ZTv0_n12_N3ccc8DD9x14y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y2E[] = {
  {&(_ZTVN3ccc8DD9x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y2E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y2E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y2E[];
static VTBL_ENTRY alt_thunk_names1987[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y23pqrEv,_ZTv0_n12_N3ccc8DD9x14y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y23pqrEv,_ZThn4_N3ccc8DD9x14y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y2E = {  "_ZN3ccc8DD9x14y2E", // class name
  bases__ZN3ccc8DD9x14y2E, 2,
  &(vtc__ZN3ccc8DD9x14y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y2E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y2E),3, //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  CC9x14y3  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x14y33abcEv
  ~CC9x14y3(); // tgen
  CC9x14y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y3E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y33efgEv");}
void  ccc::CC9x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y33pqrEv");}
void  ccc::CC9x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y33abcEv");}
ccc::CC9x14y3 ::~CC9x14y3(){ note_dtor("_ZN3ccc8CC9x14y3E", this);} // tgen
ccc::CC9x14y3 ::CC9x14y3(){ note_ctor("_ZN3ccc8CC9x14y3E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y3E, buf);
    ::ccc::CC9x14y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y3E);
    dp->::ccc::CC9x14y3::~CC9x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y3E(Test__ZN3ccc8CC9x14y3E, "_ZN3ccc8CC9x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y3C1Ev();
extern void _ZN3ccc8CC9x14y3D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y3E[] = {
  NSPAIR(_ZN3ccc8CC9x14y3C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y3E[];
extern void _ZN3ccc8CC9x14y33pqrEv();
extern void _ZN3ccc8CC9x14y33efgEv();
extern void _ZN3ccc8CC9x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y33efgEv,_ZTv0_n12_N3ccc8CC9x14y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y33efgEv,_ZThn4_N3ccc8CC9x14y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y33pqrEv,_ZTv0_n16_N3ccc8CC9x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y33pqrEv,_ZThn4_N3ccc8CC9x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y33efgEv,_ZTv0_n12_N3ccc8CC9x14y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y33pqrEv,_ZTv0_n16_N3ccc8CC9x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y3E[] = {
  {&(_ZTVN3ccc8CC9x14y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y3E[];
static VTBL_ENTRY alt_thunk_names1988[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y33pqrEv,_ZTv0_n16_N3ccc8CC9x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y33pqrEv,_ZThn4_N3ccc8CC9x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y33efgEv,_ZTv0_n12_N3ccc8CC9x14y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y33efgEv,_ZThn4_N3ccc8CC9x14y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y3E = {  "_ZN3ccc8CC9x14y3E", // class name
  bases__ZN3ccc8CC9x14y3E, 2,
  &(vtc__ZN3ccc8CC9x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y3E),2, //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  DD9x14y3  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD9x14y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x14y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x14y33abcEv
  ~DD9x14y3(); // tgen
  DD9x14y3(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y3E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x14y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y33efgEv");}
void  ccc::DD9x14y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y33pqrEv");}
void  ccc::DD9x14y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y33abcEv");}
ccc::DD9x14y3 ::~DD9x14y3(){ note_dtor("_ZN3ccc8DD9x14y3E", this);} // tgen
ccc::DD9x14y3 ::DD9x14y3(){ note_ctor("_ZN3ccc8DD9x14y3E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y3E, buf);
    ::ccc::DD9x14y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y3E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y3E);
    dp->::ccc::DD9x14y3::~DD9x14y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y3E(Test__ZN3ccc8DD9x14y3E, "_ZN3ccc8DD9x14y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y3C1Ev();
extern void _ZN3ccc8DD9x14y3D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y3E[] = {
  NSPAIR(_ZN3ccc8DD9x14y3C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y3E[];
extern void _ZN3ccc8DD9x14y33efgEv();
extern void _ZN3ccc8DD9x14y33pqrEv();
extern void _ZN3ccc8DD9x14y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y33pqrEv,_ZTv0_n12_N3ccc8DD9x14y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y33pqrEv,_ZThn4_N3ccc8DD9x14y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y33pqrEv,_ZTv0_n12_N3ccc8DD9x14y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y3E[] = {
  {&(_ZTVN3ccc8DD9x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y3E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y3E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y3E[];
static VTBL_ENTRY alt_thunk_names1989[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y33pqrEv,_ZTv0_n12_N3ccc8DD9x14y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y33pqrEv,_ZThn4_N3ccc8DD9x14y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y3E = {  "_ZN3ccc8DD9x14y3E", // class name
  bases__ZN3ccc8DD9x14y3E, 2,
  &(vtc__ZN3ccc8DD9x14y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y3E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y3E),3, //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  CC9x14y4  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC9x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x14y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x14y43efgEv
  ~CC9x14y4(); // tgen
  CC9x14y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y4E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y43pqrEv");}
void  ccc::CC9x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y43abcEv");}
void  ccc::CC9x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y43efgEv");}
ccc::CC9x14y4 ::~CC9x14y4(){ note_dtor("_ZN3ccc8CC9x14y4E", this);} // tgen
ccc::CC9x14y4 ::CC9x14y4(){ note_ctor("_ZN3ccc8CC9x14y4E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y4E, buf);
    ::ccc::CC9x14y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y4E);
    dp->::ccc::CC9x14y4::~CC9x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y4E(Test__ZN3ccc8CC9x14y4E, "_ZN3ccc8CC9x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y4C1Ev();
extern void _ZN3ccc8CC9x14y4D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y4E[] = {
  NSPAIR(_ZN3ccc8CC9x14y4C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y4E[];
extern void _ZN3ccc8CC9x14y43pqrEv();
extern void _ZN3ccc8CC9x14y43abcEv();
extern void _ZN3ccc8CC9x14y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y43efgEv,_ZTv0_n12_N3ccc8CC9x14y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y43efgEv,_ZThn4_N3ccc8CC9x14y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y43pqrEv,_ZTv0_n16_N3ccc8CC9x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y43pqrEv,_ZThn4_N3ccc8CC9x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y43efgEv,_ZTv0_n12_N3ccc8CC9x14y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y43pqrEv,_ZTv0_n16_N3ccc8CC9x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y4E[] = {
  {&(_ZTVN3ccc8CC9x14y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y4E[];
static VTBL_ENTRY alt_thunk_names1990[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y43pqrEv,_ZTv0_n16_N3ccc8CC9x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y43pqrEv,_ZThn4_N3ccc8CC9x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y43efgEv,_ZTv0_n12_N3ccc8CC9x14y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y43efgEv,_ZThn4_N3ccc8CC9x14y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y4E = {  "_ZN3ccc8CC9x14y4E", // class name
  bases__ZN3ccc8CC9x14y4E, 2,
  &(vtc__ZN3ccc8CC9x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y4E),2, //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  DD9x14y4  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD9x14y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x14y43abcEv
  virtual void  efg(); // _ZN3ccc8DD9x14y43efgEv
  ~DD9x14y4(); // tgen
  DD9x14y4(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y4E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x14y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y43pqrEv");}
void  ccc::DD9x14y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y43abcEv");}
void  ccc::DD9x14y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y43efgEv");}
ccc::DD9x14y4 ::~DD9x14y4(){ note_dtor("_ZN3ccc8DD9x14y4E", this);} // tgen
ccc::DD9x14y4 ::DD9x14y4(){ note_ctor("_ZN3ccc8DD9x14y4E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y4E, buf);
    ::ccc::DD9x14y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y4E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y4E);
    dp->::ccc::DD9x14y4::~DD9x14y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y4E(Test__ZN3ccc8DD9x14y4E, "_ZN3ccc8DD9x14y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y4C1Ev();
extern void _ZN3ccc8DD9x14y4D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y4E[] = {
  NSPAIR(_ZN3ccc8DD9x14y4C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y4E[];
extern void _ZN3ccc8DD9x14y43efgEv();
extern void _ZN3ccc8DD9x14y43pqrEv();
extern void _ZN3ccc8DD9x14y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y43pqrEv,_ZTv0_n12_N3ccc8DD9x14y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y43pqrEv,_ZThn4_N3ccc8DD9x14y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y43pqrEv,_ZTv0_n12_N3ccc8DD9x14y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y4E[] = {
  {&(_ZTVN3ccc8DD9x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y4E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y4E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y4E[];
static VTBL_ENTRY alt_thunk_names1991[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y43pqrEv,_ZTv0_n12_N3ccc8DD9x14y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y43pqrEv,_ZThn4_N3ccc8DD9x14y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y4E = {  "_ZN3ccc8DD9x14y4E", // class name
  bases__ZN3ccc8DD9x14y4E, 2,
  &(vtc__ZN3ccc8DD9x14y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y4E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y4E),3, //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  CC9x14y5  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8CC9x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x14y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x14y53abcEv
  ~CC9x14y5(); // tgen
  CC9x14y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y5E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y53pqrEv");}
void  ccc::CC9x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y53efgEv");}
void  ccc::CC9x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y53abcEv");}
ccc::CC9x14y5 ::~CC9x14y5(){ note_dtor("_ZN3ccc8CC9x14y5E", this);} // tgen
ccc::CC9x14y5 ::CC9x14y5(){ note_ctor("_ZN3ccc8CC9x14y5E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y5E, buf);
    ::ccc::CC9x14y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y5E);
    dp->::ccc::CC9x14y5::~CC9x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y5E(Test__ZN3ccc8CC9x14y5E, "_ZN3ccc8CC9x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y5C1Ev();
extern void _ZN3ccc8CC9x14y5D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y5E[] = {
  NSPAIR(_ZN3ccc8CC9x14y5C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y5E[];
extern void _ZN3ccc8CC9x14y53pqrEv();
extern void _ZN3ccc8CC9x14y53efgEv();
extern void _ZN3ccc8CC9x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y53efgEv,_ZTv0_n12_N3ccc8CC9x14y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y53efgEv,_ZThn4_N3ccc8CC9x14y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y53pqrEv,_ZTv0_n16_N3ccc8CC9x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y53pqrEv,_ZThn4_N3ccc8CC9x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y53efgEv,_ZTv0_n12_N3ccc8CC9x14y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y53pqrEv,_ZTv0_n16_N3ccc8CC9x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y5E[] = {
  {&(_ZTVN3ccc8CC9x14y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y5E[];
static VTBL_ENTRY alt_thunk_names1992[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y53pqrEv,_ZTv0_n16_N3ccc8CC9x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y53pqrEv,_ZThn4_N3ccc8CC9x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y53efgEv,_ZTv0_n12_N3ccc8CC9x14y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y53efgEv,_ZThn4_N3ccc8CC9x14y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y5E = {  "_ZN3ccc8CC9x14y5E", // class name
  bases__ZN3ccc8CC9x14y5E, 2,
  &(vtc__ZN3ccc8CC9x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y5E),2, //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  DD9x14y5  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc8DD9x14y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x14y53efgEv
  virtual void  abc(); // _ZN3ccc8DD9x14y53abcEv
  ~DD9x14y5(); // tgen
  DD9x14y5(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y5E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x14y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y53pqrEv");}
void  ccc::DD9x14y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y53efgEv");}
void  ccc::DD9x14y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y53abcEv");}
ccc::DD9x14y5 ::~DD9x14y5(){ note_dtor("_ZN3ccc8DD9x14y5E", this);} // tgen
ccc::DD9x14y5 ::DD9x14y5(){ note_ctor("_ZN3ccc8DD9x14y5E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y5E, buf);
    ::ccc::DD9x14y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y5E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y5E);
    dp->::ccc::DD9x14y5::~DD9x14y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y5E(Test__ZN3ccc8DD9x14y5E, "_ZN3ccc8DD9x14y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y5C1Ev();
extern void _ZN3ccc8DD9x14y5D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y5E[] = {
  NSPAIR(_ZN3ccc8DD9x14y5C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y5E[];
extern void _ZN3ccc8DD9x14y53efgEv();
extern void _ZN3ccc8DD9x14y53pqrEv();
extern void _ZN3ccc8DD9x14y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y53pqrEv,_ZTv0_n12_N3ccc8DD9x14y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y53pqrEv,_ZThn4_N3ccc8DD9x14y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y53pqrEv,_ZTv0_n12_N3ccc8DD9x14y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y5E[] = {
  {&(_ZTVN3ccc8DD9x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y5E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y5E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y5E[];
static VTBL_ENTRY alt_thunk_names1993[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y53pqrEv,_ZTv0_n12_N3ccc8DD9x14y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y53pqrEv,_ZThn4_N3ccc8DD9x14y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y5E = {  "_ZN3ccc8DD9x14y5E", // class name
  bases__ZN3ccc8DD9x14y5E, 2,
  &(vtc__ZN3ccc8DD9x14y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y5E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y5E),3, //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  CC9x14y6  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x14y63efgEv
  ~CC9x14y6(); // tgen
  CC9x14y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y6E) C1{ VBC2{ v2 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y63abcEv");}
void  ccc::CC9x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y63efgEv");}
ccc::CC9x14y6 ::~CC9x14y6(){ note_dtor("_ZN3ccc8CC9x14y6E", this);} // tgen
ccc::CC9x14y6 ::CC9x14y6(){ note_ctor("_ZN3ccc8CC9x14y6E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y6E, buf);
    ::ccc::CC9x14y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y6E);
    dp->::ccc::CC9x14y6::~CC9x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y6E(Test__ZN3ccc8CC9x14y6E, "_ZN3ccc8CC9x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y6C1Ev();
extern void _ZN3ccc8CC9x14y6D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y6E[] = {
  NSPAIR(_ZN3ccc8CC9x14y6C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y6E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC9x14y63abcEv();
extern void _ZN3ccc8CC9x14y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y63efgEv,_ZTv0_n12_N3ccc8CC9x14y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y63efgEv,_ZThn4_N3ccc8CC9x14y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y63efgEv,_ZTv0_n12_N3ccc8CC9x14y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y6E[] = {
  {&(_ZTVN3ccc8CC9x14y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y6E[];
static VTBL_ENTRY alt_thunk_names1994[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y63efgEv,_ZTv0_n12_N3ccc8CC9x14y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y63efgEv,_ZThn4_N3ccc8CC9x14y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y6E = {  "_ZN3ccc8CC9x14y6E", // class name
  bases__ZN3ccc8CC9x14y6E, 2,
  &(vtc__ZN3ccc8CC9x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y6E),2, //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  DD9x14y6  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD9x14y63abcEv
  virtual void  efg(); // _ZN3ccc8DD9x14y63efgEv
  ~DD9x14y6(); // tgen
  DD9x14y6(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y6E) C1{ VBC2{ v2 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x14y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y63abcEv");}
void  ccc::DD9x14y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y63efgEv");}
ccc::DD9x14y6 ::~DD9x14y6(){ note_dtor("_ZN3ccc8DD9x14y6E", this);} // tgen
ccc::DD9x14y6 ::DD9x14y6(){ note_ctor("_ZN3ccc8DD9x14y6E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y6E, buf);
    ::ccc::DD9x14y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y6E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y6E);
    dp->::ccc::DD9x14y6::~DD9x14y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y6E(Test__ZN3ccc8DD9x14y6E, "_ZN3ccc8DD9x14y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y6C1Ev();
extern void _ZN3ccc8DD9x14y6D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y6E[] = {
  NSPAIR(_ZN3ccc8DD9x14y6C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y6E[];
extern void _ZN3ccc8DD9x14y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x14y63abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y63abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y6E[] = {
  {&(_ZTVN3ccc8DD9x14y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y6E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y6E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y6E[];
Class_Descriptor cd__ZN3ccc8DD9x14y6E = {  "_ZN3ccc8DD9x14y6E", // class name
  bases__ZN3ccc8DD9x14y6E, 2,
  &(vtc__ZN3ccc8DD9x14y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y6E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y6E),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  CC9x14y7  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8CC9x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y73pqrEv
  ~CC9x14y7(); // tgen
  CC9x14y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y7E) C1{ VBC2{ v3 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y73abcEv");}
void  ccc::CC9x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y73pqrEv");}
ccc::CC9x14y7 ::~CC9x14y7(){ note_dtor("_ZN3ccc8CC9x14y7E", this);} // tgen
ccc::CC9x14y7 ::CC9x14y7(){ note_ctor("_ZN3ccc8CC9x14y7E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y7E, buf);
    ::ccc::CC9x14y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y7E);
    dp->::ccc::CC9x14y7::~CC9x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y7E(Test__ZN3ccc8CC9x14y7E, "_ZN3ccc8CC9x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y7C1Ev();
extern void _ZN3ccc8CC9x14y7D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y7E[] = {
  NSPAIR(_ZN3ccc8CC9x14y7C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y7E[];
extern void _ZN3ccc8CC9x14y73pqrEv();
extern void _ZN3ccc8CC9x14y73abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y73pqrEv,_ZTv0_n16_N3ccc8CC9x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y73pqrEv,_ZThn4_N3ccc8CC9x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y73pqrEv,_ZTv0_n16_N3ccc8CC9x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y7E[] = {
  {&(_ZTVN3ccc8CC9x14y7E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x14y7E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y7E[];
static VTBL_ENTRY alt_thunk_names1995[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y73pqrEv,_ZTv0_n16_N3ccc8CC9x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y73pqrEv,_ZThn4_N3ccc8CC9x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y7E = {  "_ZN3ccc8CC9x14y7E", // class name
  bases__ZN3ccc8CC9x14y7E, 2,
  &(vtc__ZN3ccc8CC9x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y7E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y7E),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  DD9x14y7  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc8DD9x14y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x14y73pqrEv
  ~DD9x14y7(); // tgen
  DD9x14y7(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y7E) C1{ VBC2{ v3 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x14y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y73abcEv");}
void  ccc::DD9x14y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y73pqrEv");}
ccc::DD9x14y7 ::~DD9x14y7(){ note_dtor("_ZN3ccc8DD9x14y7E", this);} // tgen
ccc::DD9x14y7 ::DD9x14y7(){ note_ctor("_ZN3ccc8DD9x14y7E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y7E, buf);
    ::ccc::DD9x14y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y7E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y7E);
    dp->::ccc::DD9x14y7::~DD9x14y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y7E(Test__ZN3ccc8DD9x14y7E, "_ZN3ccc8DD9x14y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y7C1Ev();
extern void _ZN3ccc8DD9x14y7D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y7E[] = {
  NSPAIR(_ZN3ccc8DD9x14y7C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x14y73pqrEv();
extern void _ZN3ccc8DD9x14y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y73pqrEv,_ZTv0_n12_N3ccc8DD9x14y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y73pqrEv,_ZThn4_N3ccc8DD9x14y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y73pqrEv,_ZTv0_n12_N3ccc8DD9x14y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y7E[] = {
  {&(_ZTVN3ccc8DD9x14y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y7E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y7E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y7E[];
static VTBL_ENTRY alt_thunk_names1996[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y73pqrEv,_ZTv0_n12_N3ccc8DD9x14y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y73pqrEv,_ZThn4_N3ccc8DD9x14y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y7E = {  "_ZN3ccc8DD9x14y7E", // class name
  bases__ZN3ccc8DD9x14y7E, 2,
  &(vtc__ZN3ccc8DD9x14y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y7E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y7E),3, //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  CC9x14y8  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x14y83abcEv
  ~CC9x14y8(); // tgen
  CC9x14y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y8E) C1{ VBC2{ v1 v3} BC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::CC9x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y83efgEv");}
void  ccc::CC9x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x14y83abcEv");}
ccc::CC9x14y8 ::~CC9x14y8(){ note_dtor("_ZN3ccc8CC9x14y8E", this);} // tgen
ccc::CC9x14y8 ::CC9x14y8(){ note_ctor("_ZN3ccc8CC9x14y8E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y8E, buf);
    ::ccc::CC9x14y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y8E);
    dp->::ccc::CC9x14y8::~CC9x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y8E(Test__ZN3ccc8CC9x14y8E, "_ZN3ccc8CC9x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y8C1Ev();
extern void _ZN3ccc8CC9x14y8D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y8E[] = {
  NSPAIR(_ZN3ccc8CC9x14y8C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y8E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc8CC9x14y83efgEv();
extern void _ZN3ccc8CC9x14y83abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y83efgEv,_ZTv0_n12_N3ccc8CC9x14y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y83efgEv,_ZThn4_N3ccc8CC9x14y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y83efgEv,_ZTv0_n12_N3ccc8CC9x14y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y8E[] = {
  {&(_ZTVN3ccc8CC9x14y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC9x14y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y8E[];
static VTBL_ENTRY alt_thunk_names1997[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y83efgEv,_ZTv0_n12_N3ccc8CC9x14y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y83efgEv,_ZThn4_N3ccc8CC9x14y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y8E = {  "_ZN3ccc8CC9x14y8E", // class name
  bases__ZN3ccc8CC9x14y8E, 2,
  &(vtc__ZN3ccc8CC9x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y8E),2, //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  DD9x14y8  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD9x14y83efgEv
  virtual void  abc(); // _ZN3ccc8DD9x14y83abcEv
  ~DD9x14y8(); // tgen
  DD9x14y8(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y8E) C1{ VBC2{ v1 v3} VBC3{ v4} v1 v2}
}
namespace ccc { 
void  ccc::DD9x14y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y83efgEv");}
void  ccc::DD9x14y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x14y83abcEv");}
ccc::DD9x14y8 ::~DD9x14y8(){ note_dtor("_ZN3ccc8DD9x14y8E", this);} // tgen
ccc::DD9x14y8 ::DD9x14y8(){ note_ctor("_ZN3ccc8DD9x14y8E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y8E, buf);
    ::ccc::DD9x14y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y8E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y8E);
    dp->::ccc::DD9x14y8::~DD9x14y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y8E(Test__ZN3ccc8DD9x14y8E, "_ZN3ccc8DD9x14y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y8C1Ev();
extern void _ZN3ccc8DD9x14y8D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y8E[] = {
  NSPAIR(_ZN3ccc8DD9x14y8C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y8E[];
extern void _ZN3ccc8DD9x14y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x14y83abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y83abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y8E[] = {
  {&(_ZTVN3ccc8DD9x14y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y8E[6]),  6,13},
  {&(_ZTVN3ccc8DD9x14y8E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y8E[];
Class_Descriptor cd__ZN3ccc8DD9x14y8E = {  "_ZN3ccc8DD9x14y8E", // class name
  bases__ZN3ccc8DD9x14y8E, 2,
  &(vtc__ZN3ccc8DD9x14y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y8E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y8E),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  CC9x14y9  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8CC9x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x14y93pqrEv
  ~CC9x14y9(); // tgen
  CC9x14y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x14y9E) C1{ VBC2{ v1 v2} BC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::CC9x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x14y93efgEv");}
void  ccc::CC9x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x14y93pqrEv");}
ccc::CC9x14y9 ::~CC9x14y9(){ note_dtor("_ZN3ccc8CC9x14y9E", this);} // tgen
ccc::CC9x14y9 ::CC9x14y9(){ note_ctor("_ZN3ccc8CC9x14y9E", this);} // tgen
}
static void Test__ZN3ccc8CC9x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC9x14y9E, buf);
    ::ccc::CC9x14y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC9x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x14y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc8CC9x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc8CC9x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x14y9E);
    dp->::ccc::CC9x14y9::~CC9x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x14y9E(Test__ZN3ccc8CC9x14y9E, "_ZN3ccc8CC9x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC9x14y9C1Ev();
extern void _ZN3ccc8CC9x14y9D1Ev();
Name_Map name_map__ZN3ccc8CC9x14y9E[] = {
  NSPAIR(_ZN3ccc8CC9x14y9C1Ev),
  NSPAIR(_ZN3ccc8CC9x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8CC9x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x14y9E[];
extern void _ZN3ccc8CC9x14y93pqrEv();
extern void _ZN3ccc8CC9x14y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC9x14y93efgEv,_ZTv0_n12_N3ccc8CC9x14y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y93efgEv,_ZThn4_N3ccc8CC9x14y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC9x14y93pqrEv,_ZTv0_n16_N3ccc8CC9x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC9x14y93pqrEv,_ZThn4_N3ccc8CC9x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC9x14y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x14y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC9x14y93efgEv,_ZTv0_n12_N3ccc8CC9x14y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC9x14y93pqrEv,_ZTv0_n16_N3ccc8CC9x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x14y9E[] = {
  {&(_ZTVN3ccc8CC9x14y9E[3]),  3,11},
  {&(_ZTVN3ccc8CC9x14y9E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x14y9E[];
static VTBL_ENTRY alt_thunk_names1998[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC9x14y93pqrEv,_ZTv0_n16_N3ccc8CC9x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y93pqrEv,_ZThn4_N3ccc8CC9x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC9x14y93efgEv,_ZTv0_n12_N3ccc8CC9x14y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC9x14y93efgEv,_ZThn4_N3ccc8CC9x14y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC9x14y9E = {  "_ZN3ccc8CC9x14y9E", // class name
  bases__ZN3ccc8CC9x14y9E, 2,
  &(vtc__ZN3ccc8CC9x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC9x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x14y9E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x14y9E),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  DD9x14y9  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc8DD9x14y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x14y93pqrEv
  ~DD9x14y9(); // tgen
  DD9x14y9(); // tgen
};
//SIG(1 _ZN3ccc8DD9x14y9E) C1{ VBC2{ v1 v2} VBC3{ v2} v1 v2}
}
namespace ccc { 
void  ccc::DD9x14y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x14y93efgEv");}
void  ccc::DD9x14y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x14y93pqrEv");}
ccc::DD9x14y9 ::~DD9x14y9(){ note_dtor("_ZN3ccc8DD9x14y9E", this);} // tgen
ccc::DD9x14y9 ::DD9x14y9(){ note_ctor("_ZN3ccc8DD9x14y9E", this);} // tgen
}
static void Test__ZN3ccc8DD9x14y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x14y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD9x14y9E, buf);
    ::ccc::DD9x14y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD9x14y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x14y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x14y9E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc8DD9x14y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x14y9E);
    dp->::ccc::DD9x14y9::~DD9x14y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x14y9E(Test__ZN3ccc8DD9x14y9E, "_ZN3ccc8DD9x14y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD9x14y9C1Ev();
extern void _ZN3ccc8DD9x14y9D1Ev();
Name_Map name_map__ZN3ccc8DD9x14y9E[] = {
  NSPAIR(_ZN3ccc8DD9x14y9C1Ev),
  NSPAIR(_ZN3ccc8DD9x14y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc8DD9x14y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y9E[];
extern void _ZN3ccc8DD9x14y93efgEv();
extern void _ZN3ccc8DD9x14y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD9x14y93pqrEv,_ZTv0_n12_N3ccc8DD9x14y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD9x14y93pqrEv,_ZThn4_N3ccc8DD9x14y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD9x14y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x14y93pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x14y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD9x14y93pqrEv,_ZTv0_n12_N3ccc8DD9x14y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x14y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x14y9E[] = {
  {&(_ZTVN3ccc8DD9x14y9E[6]),  6,12},
  {&(_ZTVN3ccc8DD9x14y9E[6]),  6,12},
  {&(_ZTVN3ccc8DD9x14y9E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x14y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x14y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x14y9E[];
static VTBL_ENTRY alt_thunk_names1999[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD9x14y93pqrEv,_ZTv0_n12_N3ccc8DD9x14y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD9x14y93pqrEv,_ZThn4_N3ccc8DD9x14y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD9x14y9E = {  "_ZN3ccc8DD9x14y9E", // class name
  bases__ZN3ccc8DD9x14y9E, 2,
  &(vtc__ZN3ccc8DD9x14y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x14y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD9x14y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x14y9E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x14y9E),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  CC9x14y10  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC9x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x14y103abcEv
  ~CC9x14y10(); // tgen
  CC9x14y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y10E) C1{ VBC2{ v3 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x14y103pqrEv");}
void  ccc::CC9x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x14y103abcEv");}
ccc::CC9x14y10 ::~CC9x14y10(){ note_dtor("_ZN3ccc9CC9x14y10E", this);} // tgen
ccc::CC9x14y10 ::CC9x14y10(){ note_ctor("_ZN3ccc9CC9x14y10E", this);} // tgen
}
static void Test__ZN3ccc9CC9x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x14y10E, buf);
    ::ccc::CC9x14y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x14y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC9x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x14y10E);
    dp->::ccc::CC9x14y10::~CC9x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x14y10E(Test__ZN3ccc9CC9x14y10E, "_ZN3ccc9CC9x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x14y10C1Ev();
extern void _ZN3ccc9CC9x14y10D1Ev();
Name_Map name_map__ZN3ccc9CC9x14y10E[] = {
  NSPAIR(_ZN3ccc9CC9x14y10C1Ev),
  NSPAIR(_ZN3ccc9CC9x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC9x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x14y10E[];
extern void _ZN3ccc9CC9x14y103pqrEv();
extern void _ZN3ccc9CC9x14y103abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x14y103pqrEv,_ZTv0_n16_N3ccc9CC9x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y103pqrEv,_ZThn4_N3ccc9CC9x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x14y103pqrEv,_ZTv0_n16_N3ccc9CC9x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x14y10E[] = {
  {&(_ZTVN3ccc9CC9x14y10E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x14y10E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x14y10E[];
static VTBL_ENTRY alt_thunk_names2000[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x14y103pqrEv,_ZTv0_n16_N3ccc9CC9x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x14y103pqrEv,_ZThn4_N3ccc9CC9x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x14y10E = {  "_ZN3ccc9CC9x14y10E", // class name
  bases__ZN3ccc9CC9x14y10E, 2,
  &(vtc__ZN3ccc9CC9x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y10E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x14y10E),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  DD9x14y10  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD9x14y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD9x14y103abcEv
  ~DD9x14y10(); // tgen
  DD9x14y10(); // tgen
};
//SIG(1 _ZN3ccc9DD9x14y10E) C1{ VBC2{ v3 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x14y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x14y103pqrEv");}
void  ccc::DD9x14y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x14y103abcEv");}
ccc::DD9x14y10 ::~DD9x14y10(){ note_dtor("_ZN3ccc9DD9x14y10E", this);} // tgen
ccc::DD9x14y10 ::DD9x14y10(){ note_ctor("_ZN3ccc9DD9x14y10E", this);} // tgen
}
static void Test__ZN3ccc9DD9x14y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x14y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x14y10E, buf);
    ::ccc::DD9x14y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x14y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x14y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x14y10E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD9x14y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x14y10E);
    dp->::ccc::DD9x14y10::~DD9x14y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x14y10E(Test__ZN3ccc9DD9x14y10E, "_ZN3ccc9DD9x14y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x14y10C1Ev();
extern void _ZN3ccc9DD9x14y10D1Ev();
Name_Map name_map__ZN3ccc9DD9x14y10E[] = {
  NSPAIR(_ZN3ccc9DD9x14y10C1Ev),
  NSPAIR(_ZN3ccc9DD9x14y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD9x14y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x14y103pqrEv();
extern void _ZN3ccc9DD9x14y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x14y103pqrEv,_ZTv0_n12_N3ccc9DD9x14y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x14y103pqrEv,_ZThn4_N3ccc9DD9x14y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x14y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x14y103pqrEv,_ZTv0_n12_N3ccc9DD9x14y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x14y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x14y10E[] = {
  {&(_ZTVN3ccc9DD9x14y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x14y10E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x14y10E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x14y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x14y10E[];
static VTBL_ENTRY alt_thunk_names2001[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x14y103pqrEv,_ZTv0_n12_N3ccc9DD9x14y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x14y103pqrEv,_ZThn4_N3ccc9DD9x14y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x14y10E = {  "_ZN3ccc9DD9x14y10E", // class name
  bases__ZN3ccc9DD9x14y10E, 2,
  &(vtc__ZN3ccc9DD9x14y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x14y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x14y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x14y10E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x14y10E),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  CC9x14y11  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC9x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x14y113efgEv
  ~CC9x14y11(); // tgen
  CC9x14y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y11E) C1{ VBC2{ v2 v1} BC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::CC9x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x14y113pqrEv");}
void  ccc::CC9x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x14y113efgEv");}
ccc::CC9x14y11 ::~CC9x14y11(){ note_dtor("_ZN3ccc9CC9x14y11E", this);} // tgen
ccc::CC9x14y11 ::CC9x14y11(){ note_ctor("_ZN3ccc9CC9x14y11E", this);} // tgen
}
static void Test__ZN3ccc9CC9x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x14y11E, buf);
    ::ccc::CC9x14y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x14y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC9x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x14y11E);
    dp->::ccc::CC9x14y11::~CC9x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x14y11E(Test__ZN3ccc9CC9x14y11E, "_ZN3ccc9CC9x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x14y11C1Ev();
extern void _ZN3ccc9CC9x14y11D1Ev();
Name_Map name_map__ZN3ccc9CC9x14y11E[] = {
  NSPAIR(_ZN3ccc9CC9x14y11C1Ev),
  NSPAIR(_ZN3ccc9CC9x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC9x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x14y11E[];
extern void _ZN3ccc9CC9x14y113pqrEv();
extern void _ZN3ccc9CC9x14y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x14y113efgEv,_ZTv0_n12_N3ccc9CC9x14y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y113efgEv,_ZThn4_N3ccc9CC9x14y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x14y113pqrEv,_ZTv0_n16_N3ccc9CC9x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y113pqrEv,_ZThn4_N3ccc9CC9x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x14y113efgEv,_ZTv0_n12_N3ccc9CC9x14y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x14y113pqrEv,_ZTv0_n16_N3ccc9CC9x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x14y11E[] = {
  {&(_ZTVN3ccc9CC9x14y11E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x14y11E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x14y11E[];
static VTBL_ENTRY alt_thunk_names2002[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x14y113pqrEv,_ZTv0_n16_N3ccc9CC9x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x14y113pqrEv,_ZThn4_N3ccc9CC9x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x14y113efgEv,_ZTv0_n12_N3ccc9CC9x14y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x14y113efgEv,_ZThn4_N3ccc9CC9x14y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x14y11E = {  "_ZN3ccc9CC9x14y11E", // class name
  bases__ZN3ccc9CC9x14y11E, 2,
  &(vtc__ZN3ccc9CC9x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y11E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x14y11E),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  DD9x14y11  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD9x14y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD9x14y113efgEv
  ~DD9x14y11(); // tgen
  DD9x14y11(); // tgen
};
//SIG(1 _ZN3ccc9DD9x14y11E) C1{ VBC2{ v2 v1} VBC3{ v1} v1 v2}
}
namespace ccc { 
void  ccc::DD9x14y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x14y113pqrEv");}
void  ccc::DD9x14y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x14y113efgEv");}
ccc::DD9x14y11 ::~DD9x14y11(){ note_dtor("_ZN3ccc9DD9x14y11E", this);} // tgen
ccc::DD9x14y11 ::DD9x14y11(){ note_ctor("_ZN3ccc9DD9x14y11E", this);} // tgen
}
static void Test__ZN3ccc9DD9x14y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x14y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x14y11E, buf);
    ::ccc::DD9x14y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x14y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x14y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x14y11E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD9x14y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x14y11E);
    dp->::ccc::DD9x14y11::~DD9x14y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x14y11E(Test__ZN3ccc9DD9x14y11E, "_ZN3ccc9DD9x14y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x14y11C1Ev();
extern void _ZN3ccc9DD9x14y11D1Ev();
Name_Map name_map__ZN3ccc9DD9x14y11E[] = {
  NSPAIR(_ZN3ccc9DD9x14y11C1Ev),
  NSPAIR(_ZN3ccc9DD9x14y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD9x14y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y11E[];
extern void _ZN3ccc9DD9x14y113efgEv();
extern void _ZN3ccc9DD9x14y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x14y113pqrEv,_ZTv0_n12_N3ccc9DD9x14y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x14y113pqrEv,_ZThn4_N3ccc9DD9x14y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x14y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y113pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x14y113pqrEv,_ZTv0_n12_N3ccc9DD9x14y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x14y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x14y11E[] = {
  {&(_ZTVN3ccc9DD9x14y11E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y11E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y11E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x14y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x14y11E[];
static VTBL_ENTRY alt_thunk_names2003[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x14y113pqrEv,_ZTv0_n12_N3ccc9DD9x14y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x14y113pqrEv,_ZThn4_N3ccc9DD9x14y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x14y11E = {  "_ZN3ccc9DD9x14y11E", // class name
  bases__ZN3ccc9DD9x14y11E, 2,
  &(vtc__ZN3ccc9DD9x14y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x14y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x14y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x14y11E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x14y11E),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  CC9x14y12  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9CC9x14y123abcEv
  ~CC9x14y12(); // tgen
  CC9x14y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y12E) C1{ VBC2{ v2 v3} BC3{ v4} v1}
}
namespace ccc { 
void  ccc::CC9x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x14y123abcEv");}
ccc::CC9x14y12 ::~CC9x14y12(){ note_dtor("_ZN3ccc9CC9x14y12E", this);} // tgen
ccc::CC9x14y12 ::CC9x14y12(){ note_ctor("_ZN3ccc9CC9x14y12E", this);} // tgen
}
static void Test__ZN3ccc9CC9x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x14y12E, buf);
    ::ccc::CC9x14y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x14y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC9x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x14y12E);
    dp->::ccc::CC9x14y12::~CC9x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x14y12E(Test__ZN3ccc9CC9x14y12E, "_ZN3ccc9CC9x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x14y12C1Ev();
extern void _ZN3ccc9CC9x14y12D1Ev();
Name_Map name_map__ZN3ccc9CC9x14y12E[] = {
  NSPAIR(_ZN3ccc9CC9x14y12C1Ev),
  NSPAIR(_ZN3ccc9CC9x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC9x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x14y12E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC9x14y123abcEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x14y12E[] = {
  {&(_ZTVN3ccc9CC9x14y12E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x14y12E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x14y12E[];
Class_Descriptor cd__ZN3ccc9CC9x14y12E = {  "_ZN3ccc9CC9x14y12E", // class name
  bases__ZN3ccc9CC9x14y12E, 2,
  &(vtc__ZN3ccc9CC9x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y12E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x14y12E),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  DD9x14y12  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  abc(); // _ZN3ccc9DD9x14y123abcEv
  ~DD9x14y12(); // tgen
  DD9x14y12(); // tgen
};
//SIG(1 _ZN3ccc9DD9x14y12E) C1{ VBC2{ v2 v3} VBC3{ v4} v1}
}
namespace ccc { 
void  ccc::DD9x14y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x14y123abcEv");}
ccc::DD9x14y12 ::~DD9x14y12(){ note_dtor("_ZN3ccc9DD9x14y12E", this);} // tgen
ccc::DD9x14y12 ::DD9x14y12(){ note_ctor("_ZN3ccc9DD9x14y12E", this);} // tgen
}
static void Test__ZN3ccc9DD9x14y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x14y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x14y12E, buf);
    ::ccc::DD9x14y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x14y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x14y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x14y12E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD9x14y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x14y12E);
    dp->::ccc::DD9x14y12::~DD9x14y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x14y12E(Test__ZN3ccc9DD9x14y12E, "_ZN3ccc9DD9x14y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x14y12C1Ev();
extern void _ZN3ccc9DD9x14y12D1Ev();
Name_Map name_map__ZN3ccc9DD9x14y12E[] = {
  NSPAIR(_ZN3ccc9DD9x14y12C1Ev),
  NSPAIR(_ZN3ccc9DD9x14y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD9x14y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9DD9x14y123abcEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x14y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y123abcEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x14y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x14y12E[] = {
  {&(_ZTVN3ccc9DD9x14y12E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x14y12E[6]),  6,13},
  {&(_ZTVN3ccc9DD9x14y12E[12]),  12,13},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x14y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x14y12E[];
Class_Descriptor cd__ZN3ccc9DD9x14y12E = {  "_ZN3ccc9DD9x14y12E", // class name
  bases__ZN3ccc9DD9x14y12E, 2,
  &(vtc__ZN3ccc9DD9x14y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x14y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x14y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x14y12E),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x14y12E),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  CC9x14y13  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9CC9x14y133efgEv
  ~CC9x14y13(); // tgen
  CC9x14y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y13E) C1{ VBC2{ v1 v2} BC3{ v3} v1}
}
namespace ccc { 
void  ccc::CC9x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x14y133efgEv");}
ccc::CC9x14y13 ::~CC9x14y13(){ note_dtor("_ZN3ccc9CC9x14y13E", this);} // tgen
ccc::CC9x14y13 ::CC9x14y13(){ note_ctor("_ZN3ccc9CC9x14y13E", this);} // tgen
}
static void Test__ZN3ccc9CC9x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x14y13E, buf);
    ::ccc::CC9x14y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x14y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC9x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x14y13E);
    dp->::ccc::CC9x14y13::~CC9x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x14y13E(Test__ZN3ccc9CC9x14y13E, "_ZN3ccc9CC9x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x14y13C1Ev();
extern void _ZN3ccc9CC9x14y13D1Ev();
Name_Map name_map__ZN3ccc9CC9x14y13E[] = {
  NSPAIR(_ZN3ccc9CC9x14y13C1Ev),
  NSPAIR(_ZN3ccc9CC9x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC9x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x14y13E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc9CC9x14y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC9x14y133efgEv,_ZTv0_n12_N3ccc9CC9x14y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y133efgEv,_ZThn4_N3ccc9CC9x14y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y133efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC9x14y133efgEv,_ZTv0_n12_N3ccc9CC9x14y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x14y13E[] = {
  {&(_ZTVN3ccc9CC9x14y13E[3]),  3,11},
  {&(_ZTVN3ccc9CC9x14y13E[9]),  9,11},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x14y13E[];
static VTBL_ENTRY alt_thunk_names2004[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC9x14y133efgEv,_ZTv0_n12_N3ccc9CC9x14y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x14y133efgEv,_ZThn4_N3ccc9CC9x14y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x14y13E = {  "_ZN3ccc9CC9x14y13E", // class name
  bases__ZN3ccc9CC9x14y13E, 2,
  &(vtc__ZN3ccc9CC9x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y13E),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x14y13E),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  DD9x14y13  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  efg(); // _ZN3ccc9DD9x14y133efgEv
  ~DD9x14y13(); // tgen
  DD9x14y13(); // tgen
};
//SIG(1 _ZN3ccc9DD9x14y13E) C1{ VBC2{ v1 v2} VBC3{ v3} v1}
}
namespace ccc { 
void  ccc::DD9x14y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x14y133efgEv");}
ccc::DD9x14y13 ::~DD9x14y13(){ note_dtor("_ZN3ccc9DD9x14y13E", this);} // tgen
ccc::DD9x14y13 ::DD9x14y13(){ note_ctor("_ZN3ccc9DD9x14y13E", this);} // tgen
}
static void Test__ZN3ccc9DD9x14y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x14y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x14y13E, buf);
    ::ccc::DD9x14y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x14y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x14y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x14y13E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD9x14y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x14y13E);
    dp->::ccc::DD9x14y13::~DD9x14y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x14y13E(Test__ZN3ccc9DD9x14y13E, "_ZN3ccc9DD9x14y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x14y13C1Ev();
extern void _ZN3ccc9DD9x14y13D1Ev();
Name_Map name_map__ZN3ccc9DD9x14y13E[] = {
  NSPAIR(_ZN3ccc9DD9x14y13C1Ev),
  NSPAIR(_ZN3ccc9DD9x14y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD9x14y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y13E[];
extern void _ZN3ccc9DD9x14y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x14y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x14y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x14y13E[] = {
  {&(_ZTVN3ccc9DD9x14y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y13E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y13E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x14y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x14y13E[];
Class_Descriptor cd__ZN3ccc9DD9x14y13E = {  "_ZN3ccc9DD9x14y13E", // class name
  bases__ZN3ccc9DD9x14y13E, 2,
  &(vtc__ZN3ccc9DD9x14y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x14y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x14y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x14y13E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x14y13E),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  CC9x14y14  : virtual ::ccc::AA9 , ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9CC9x14y143pqrEv
  ~CC9x14y14(); // tgen
  CC9x14y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y14E) C1{ VBC2{ v2 v1} BC3{ v1} v1}
}
namespace ccc { 
void  ccc::CC9x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x14y143pqrEv");}
ccc::CC9x14y14 ::~CC9x14y14(){ note_dtor("_ZN3ccc9CC9x14y14E", this);} // tgen
ccc::CC9x14y14 ::CC9x14y14(){ note_ctor("_ZN3ccc9CC9x14y14E", this);} // tgen
}
static void Test__ZN3ccc9CC9x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x14y14E, buf);
    ::ccc::CC9x14y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x14y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC9x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x14y14E);
    dp->::ccc::CC9x14y14::~CC9x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x14y14E(Test__ZN3ccc9CC9x14y14E, "_ZN3ccc9CC9x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x14y14C1Ev();
extern void _ZN3ccc9CC9x14y14D1Ev();
Name_Map name_map__ZN3ccc9CC9x14y14E[] = {
  NSPAIR(_ZN3ccc9CC9x14y14C1Ev),
  NSPAIR(_ZN3ccc9CC9x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC9x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x14y14E[];
extern void _ZN3ccc9CC9x14y143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC9x14y143pqrEv,_ZTv0_n16_N3ccc9CC9x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC9x14y143pqrEv,_ZThn4_N3ccc9CC9x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x14y143pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC9x14y143pqrEv,_ZTv0_n16_N3ccc9CC9x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x14y14E[] = {
  {&(_ZTVN3ccc9CC9x14y14E[3]),  3,10},
  {&(_ZTVN3ccc9CC9x14y14E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x14y14E[];
static VTBL_ENTRY alt_thunk_names2005[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC9x14y143pqrEv,_ZTv0_n16_N3ccc9CC9x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC9x14y143pqrEv,_ZThn4_N3ccc9CC9x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC9x14y14E = {  "_ZN3ccc9CC9x14y14E", // class name
  bases__ZN3ccc9CC9x14y14E, 2,
  &(vtc__ZN3ccc9CC9x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y14E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x14y14E),2, //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  DD9x14y14  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  virtual void  pqr(); // _ZN3ccc9DD9x14y143pqrEv
  ~DD9x14y14(); // tgen
  DD9x14y14(); // tgen
};
//SIG(1 _ZN3ccc9DD9x14y14E) C1{ VBC2{ v2 v1} VBC3{ v1} v1}
}
namespace ccc { 
void  ccc::DD9x14y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x14y143pqrEv");}
ccc::DD9x14y14 ::~DD9x14y14(){ note_dtor("_ZN3ccc9DD9x14y14E", this);} // tgen
ccc::DD9x14y14 ::DD9x14y14(){ note_ctor("_ZN3ccc9DD9x14y14E", this);} // tgen
}
static void Test__ZN3ccc9DD9x14y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x14y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x14y14E, buf);
    ::ccc::DD9x14y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x14y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x14y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x14y14E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD9x14y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x14y14E);
    dp->::ccc::DD9x14y14::~DD9x14y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x14y14E(Test__ZN3ccc9DD9x14y14E, "_ZN3ccc9DD9x14y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x14y14C1Ev();
extern void _ZN3ccc9DD9x14y14D1Ev();
Name_Map name_map__ZN3ccc9DD9x14y14E[] = {
  NSPAIR(_ZN3ccc9DD9x14y14C1Ev),
  NSPAIR(_ZN3ccc9DD9x14y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD9x14y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x14y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD9x14y143pqrEv,_ZTv0_n12_N3ccc9DD9x14y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD9x14y143pqrEv,_ZThn4_N3ccc9DD9x14y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD9x14y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x14y143pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD9x14y143pqrEv,_ZTv0_n12_N3ccc9DD9x14y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x14y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x14y14E[] = {
  {&(_ZTVN3ccc9DD9x14y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y14E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y14E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x14y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x14y14E[];
static VTBL_ENTRY alt_thunk_names2006[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD9x14y143pqrEv,_ZTv0_n12_N3ccc9DD9x14y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD9x14y143pqrEv,_ZThn4_N3ccc9DD9x14y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD9x14y14E = {  "_ZN3ccc9DD9x14y14E", // class name
  bases__ZN3ccc9DD9x14y14E, 2,
  &(vtc__ZN3ccc9DD9x14y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x14y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x14y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x14y14E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x14y14E),3, //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  CC9x14y15  : virtual ::ccc::AA9 , ::ccc::BB14 {
  ~CC9x14y15(); // tgen
  CC9x14y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x14y15E) C1{ VBC2{ v1 v2} BC3{ v3}}
}
namespace ccc { 
ccc::CC9x14y15 ::~CC9x14y15(){ note_dtor("_ZN3ccc9CC9x14y15E", this);} // tgen
ccc::CC9x14y15 ::CC9x14y15(){ note_ctor("_ZN3ccc9CC9x14y15E", this);} // tgen
}
static void Test__ZN3ccc9CC9x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC9x14y15E, buf);
    ::ccc::CC9x14y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC9x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x14y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), ABISELECT(8,4), "_ZN3ccc9CC9x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), 0, "_ZN3ccc9CC9x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x14y15E);
    dp->::ccc::CC9x14y15::~CC9x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x14y15E(Test__ZN3ccc9CC9x14y15E, "_ZN3ccc9CC9x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC9x14y15C1Ev();
extern void _ZN3ccc9CC9x14y15D1Ev();
Name_Map name_map__ZN3ccc9CC9x14y15E[] = {
  NSPAIR(_ZN3ccc9CC9x14y15C1Ev),
  NSPAIR(_ZN3ccc9CC9x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9CC9x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    ABISELECT(8,4), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x14y15E[];
extern void _ZN3ccc4BB143pqrEv();
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x14y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x14y15E[] = {
  {&(_ZTVN3ccc9CC9x14y15E[3]),  3,10},
  {&(_ZTVN3ccc9CC9x14y15E[8]),  8,10},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x14y15E[];
Class_Descriptor cd__ZN3ccc9CC9x14y15E = {  "_ZN3ccc9CC9x14y15E", // class name
  bases__ZN3ccc9CC9x14y15E, 2,
  &(vtc__ZN3ccc9CC9x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC9x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x14y15E),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x14y15E),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  DD9x14y15  : virtual ::ccc::AA9 , virtual ::ccc::BB14 {
  ~DD9x14y15(); // tgen
  DD9x14y15(); // tgen
};
//SIG(1 _ZN3ccc9DD9x14y15E) C1{ VBC2{ v1 v2} VBC3{ v3}}
}
namespace ccc { 
ccc::DD9x14y15 ::~DD9x14y15(){ note_dtor("_ZN3ccc9DD9x14y15E", this);} // tgen
ccc::DD9x14y15 ::DD9x14y15(){ note_ctor("_ZN3ccc9DD9x14y15E", this);} // tgen
}
static void Test__ZN3ccc9DD9x14y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x14y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD9x14y15E, buf);
    ::ccc::DD9x14y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x14y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD9x14y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x14y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x14y15E");
    check_base_class_offset(lv, (::ccc::BB14*), ABISELECT(8,4), "_ZN3ccc9DD9x14y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x14y15E);
    dp->::ccc::DD9x14y15::~DD9x14y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x14y15E(Test__ZN3ccc9DD9x14y15E, "_ZN3ccc9DD9x14y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD9x14y15C1Ev();
extern void _ZN3ccc9DD9x14y15D1Ev();
Name_Map name_map__ZN3ccc9DD9x14y15E[] = {
  NSPAIR(_ZN3ccc9DD9x14y15C1Ev),
  NSPAIR(_ZN3ccc9DD9x14y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB14E;
extern VTBL_ENTRY _ZTIN3ccc4BB14E[];
extern  VTBL_ENTRY _ZTVN3ccc4BB14E[];
static Base_Class bases__ZN3ccc9DD9x14y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc4BB14E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc4BB143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x14y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x14y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4BB143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x14y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x14y15E[] = {
  {&(_ZTVN3ccc9DD9x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y15E[6]),  6,12},
  {&(_ZTVN3ccc9DD9x14y15E[11]),  11,12},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x14y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x14y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x14y15E[];
Class_Descriptor cd__ZN3ccc9DD9x14y15E = {  "_ZN3ccc9DD9x14y15E", // class name
  bases__ZN3ccc9DD9x14y15E, 2,
  &(vtc__ZN3ccc9DD9x14y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x14y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD9x14y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x14y15E),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x14y15E),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  CC9x15y0  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y03abcEv
  virtual void  efg(); // _ZN3ccc8CC9x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y03pqrEv
  ~CC9x15y0(); // tgen
  CC9x15y0(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y0E) C1{ VBC2{ v2 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y03abcEv");}
void  ccc::CC9x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y03efgEv");}
void  ccc::CC9x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y03pqrEv");}
ccc::CC9x15y0 ::~CC9x15y0(){ note_dtor("_ZN3ccc8CC9x15y0E", this);} // tgen
ccc::CC9x15y0 ::CC9x15y0(){ note_ctor("_ZN3ccc8CC9x15y0E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y0E, buf);
    ::ccc::CC9x15y0 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y0E);
    dp->::ccc::CC9x15y0::~CC9x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y0E(Test__ZN3ccc8CC9x15y0E, "_ZN3ccc8CC9x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y0C1Ev();
extern void _ZN3ccc8CC9x15y0D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y0E[] = {
  NSPAIR(_ZN3ccc8CC9x15y0C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y0E[];
extern void _ZN3ccc8CC9x15y03efgEv();
extern void _ZN3ccc8CC9x15y03pqrEv();
extern void _ZN3ccc8CC9x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y0E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y0E[] = {
  {&(_ZTVN3ccc8CC9x15y0E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y0E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y0E[];
Class_Descriptor cd__ZN3ccc8CC9x15y0E = {  "_ZN3ccc8CC9x15y0E", // class name
  bases__ZN3ccc8CC9x15y0E, 2,
  &(vtc__ZN3ccc8CC9x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y0E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y0  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD9x15y03abcEv
  virtual void  efg(); // _ZN3ccc8DD9x15y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x15y03pqrEv
  ~DD9x15y0(); // tgen
  DD9x15y0(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y0E) C1{ VBC2{ v2 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x15y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y03abcEv");}
void  ccc::DD9x15y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y03efgEv");}
void  ccc::DD9x15y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y03pqrEv");}
ccc::DD9x15y0 ::~DD9x15y0(){ note_dtor("_ZN3ccc8DD9x15y0E", this);} // tgen
ccc::DD9x15y0 ::DD9x15y0(){ note_ctor("_ZN3ccc8DD9x15y0E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y0E, buf);
    ::ccc::DD9x15y0 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y0E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y0E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y0E);
    dp->::ccc::DD9x15y0::~DD9x15y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y0E(Test__ZN3ccc8DD9x15y0E, "_ZN3ccc8DD9x15y0E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y0C1Ev();
extern void _ZN3ccc8DD9x15y0D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y0E[] = {
  NSPAIR(_ZN3ccc8DD9x15y0C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y0E[];
extern void _ZN3ccc8DD9x15y03efgEv();
extern void _ZN3ccc8DD9x15y03pqrEv();
extern void _ZN3ccc8DD9x15y03abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y0E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y03abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y0E[] = {
  {&(_ZTVN3ccc8DD9x15y0E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y0E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y0E[];
Class_Descriptor cd__ZN3ccc8DD9x15y0E = {  "_ZN3ccc8DD9x15y0E", // class name
  bases__ZN3ccc8DD9x15y0E, 2,
  &(vtc__ZN3ccc8DD9x15y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y0E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y0E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y0E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y1  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x15y13efgEv
  ~CC9x15y1(); // tgen
  CC9x15y1(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y1E) C1{ VBC2{ v3 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y13abcEv");}
void  ccc::CC9x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y13pqrEv");}
void  ccc::CC9x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y13efgEv");}
ccc::CC9x15y1 ::~CC9x15y1(){ note_dtor("_ZN3ccc8CC9x15y1E", this);} // tgen
ccc::CC9x15y1 ::CC9x15y1(){ note_ctor("_ZN3ccc8CC9x15y1E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y1E, buf);
    ::ccc::CC9x15y1 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y1E);
    dp->::ccc::CC9x15y1::~CC9x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y1E(Test__ZN3ccc8CC9x15y1E, "_ZN3ccc8CC9x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y1C1Ev();
extern void _ZN3ccc8CC9x15y1D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y1E[] = {
  NSPAIR(_ZN3ccc8CC9x15y1C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y1E[];
extern void _ZN3ccc8CC9x15y13efgEv();
extern void _ZN3ccc8CC9x15y13pqrEv();
extern void _ZN3ccc8CC9x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y1E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y1E[] = {
  {&(_ZTVN3ccc8CC9x15y1E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y1E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y1E[];
Class_Descriptor cd__ZN3ccc8CC9x15y1E = {  "_ZN3ccc8CC9x15y1E", // class name
  bases__ZN3ccc8CC9x15y1E, 2,
  &(vtc__ZN3ccc8CC9x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y1E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y1  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD9x15y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x15y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x15y13efgEv
  ~DD9x15y1(); // tgen
  DD9x15y1(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y1E) C1{ VBC2{ v3 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x15y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y13abcEv");}
void  ccc::DD9x15y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y13pqrEv");}
void  ccc::DD9x15y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y13efgEv");}
ccc::DD9x15y1 ::~DD9x15y1(){ note_dtor("_ZN3ccc8DD9x15y1E", this);} // tgen
ccc::DD9x15y1 ::DD9x15y1(){ note_ctor("_ZN3ccc8DD9x15y1E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y1E, buf);
    ::ccc::DD9x15y1 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y1E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y1E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y1E);
    dp->::ccc::DD9x15y1::~DD9x15y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y1E(Test__ZN3ccc8DD9x15y1E, "_ZN3ccc8DD9x15y1E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y1C1Ev();
extern void _ZN3ccc8DD9x15y1D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y1E[] = {
  NSPAIR(_ZN3ccc8DD9x15y1C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y1E[];
extern void _ZN3ccc8DD9x15y13efgEv();
extern void _ZN3ccc8DD9x15y13pqrEv();
extern void _ZN3ccc8DD9x15y13abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y1E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y13abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y1E[] = {
  {&(_ZTVN3ccc8DD9x15y1E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y1E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y1E[];
Class_Descriptor cd__ZN3ccc8DD9x15y1E = {  "_ZN3ccc8DD9x15y1E", // class name
  bases__ZN3ccc8DD9x15y1E, 2,
  &(vtc__ZN3ccc8DD9x15y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y1E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y1E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y1E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y2  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y23efgEv
  virtual void  abc(); // _ZN3ccc8CC9x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y23pqrEv
  ~CC9x15y2(); // tgen
  CC9x15y2(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y2E) C1{ VBC2{ v1 v3} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y23efgEv");}
void  ccc::CC9x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y23abcEv");}
void  ccc::CC9x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y23pqrEv");}
ccc::CC9x15y2 ::~CC9x15y2(){ note_dtor("_ZN3ccc8CC9x15y2E", this);} // tgen
ccc::CC9x15y2 ::CC9x15y2(){ note_ctor("_ZN3ccc8CC9x15y2E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y2E, buf);
    ::ccc::CC9x15y2 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y2E);
    dp->::ccc::CC9x15y2::~CC9x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y2E(Test__ZN3ccc8CC9x15y2E, "_ZN3ccc8CC9x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y2C1Ev();
extern void _ZN3ccc8CC9x15y2D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y2E[] = {
  NSPAIR(_ZN3ccc8CC9x15y2C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y2E[];
extern void _ZN3ccc8CC9x15y23efgEv();
extern void _ZN3ccc8CC9x15y23pqrEv();
extern void _ZN3ccc8CC9x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y2E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y2E[] = {
  {&(_ZTVN3ccc8CC9x15y2E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y2E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y2E[];
Class_Descriptor cd__ZN3ccc8CC9x15y2E = {  "_ZN3ccc8CC9x15y2E", // class name
  bases__ZN3ccc8CC9x15y2E, 2,
  &(vtc__ZN3ccc8CC9x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y2E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y2  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD9x15y23efgEv
  virtual void  abc(); // _ZN3ccc8DD9x15y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x15y23pqrEv
  ~DD9x15y2(); // tgen
  DD9x15y2(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y2E) C1{ VBC2{ v1 v3} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x15y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y23efgEv");}
void  ccc::DD9x15y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y23abcEv");}
void  ccc::DD9x15y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y23pqrEv");}
ccc::DD9x15y2 ::~DD9x15y2(){ note_dtor("_ZN3ccc8DD9x15y2E", this);} // tgen
ccc::DD9x15y2 ::DD9x15y2(){ note_ctor("_ZN3ccc8DD9x15y2E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y2E, buf);
    ::ccc::DD9x15y2 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y2E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y2E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y2E);
    dp->::ccc::DD9x15y2::~DD9x15y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y2E(Test__ZN3ccc8DD9x15y2E, "_ZN3ccc8DD9x15y2E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y2C1Ev();
extern void _ZN3ccc8DD9x15y2D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y2E[] = {
  NSPAIR(_ZN3ccc8DD9x15y2C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y2E[];
extern void _ZN3ccc8DD9x15y23efgEv();
extern void _ZN3ccc8DD9x15y23pqrEv();
extern void _ZN3ccc8DD9x15y23abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y2E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y23abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y2E[] = {
  {&(_ZTVN3ccc8DD9x15y2E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y2E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y2E[];
Class_Descriptor cd__ZN3ccc8DD9x15y2E = {  "_ZN3ccc8DD9x15y2E", // class name
  bases__ZN3ccc8DD9x15y2E, 2,
  &(vtc__ZN3ccc8DD9x15y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y2E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y2E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y2E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y3  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x15y33abcEv
  ~CC9x15y3(); // tgen
  CC9x15y3(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y3E) C1{ VBC2{ v1 v2} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y33efgEv");}
void  ccc::CC9x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y33pqrEv");}
void  ccc::CC9x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y33abcEv");}
ccc::CC9x15y3 ::~CC9x15y3(){ note_dtor("_ZN3ccc8CC9x15y3E", this);} // tgen
ccc::CC9x15y3 ::CC9x15y3(){ note_ctor("_ZN3ccc8CC9x15y3E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y3E, buf);
    ::ccc::CC9x15y3 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y3E);
    dp->::ccc::CC9x15y3::~CC9x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y3E(Test__ZN3ccc8CC9x15y3E, "_ZN3ccc8CC9x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y3C1Ev();
extern void _ZN3ccc8CC9x15y3D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y3E[] = {
  NSPAIR(_ZN3ccc8CC9x15y3C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y3E[];
extern void _ZN3ccc8CC9x15y33efgEv();
extern void _ZN3ccc8CC9x15y33pqrEv();
extern void _ZN3ccc8CC9x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y3E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y3E[] = {
  {&(_ZTVN3ccc8CC9x15y3E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y3E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y3E[];
Class_Descriptor cd__ZN3ccc8CC9x15y3E = {  "_ZN3ccc8CC9x15y3E", // class name
  bases__ZN3ccc8CC9x15y3E, 2,
  &(vtc__ZN3ccc8CC9x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y3E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y3  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD9x15y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x15y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x15y33abcEv
  ~DD9x15y3(); // tgen
  DD9x15y3(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y3E) C1{ VBC2{ v1 v2} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x15y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y33efgEv");}
void  ccc::DD9x15y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y33pqrEv");}
void  ccc::DD9x15y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y33abcEv");}
ccc::DD9x15y3 ::~DD9x15y3(){ note_dtor("_ZN3ccc8DD9x15y3E", this);} // tgen
ccc::DD9x15y3 ::DD9x15y3(){ note_ctor("_ZN3ccc8DD9x15y3E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y3E, buf);
    ::ccc::DD9x15y3 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y3E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y3E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y3E);
    dp->::ccc::DD9x15y3::~DD9x15y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y3E(Test__ZN3ccc8DD9x15y3E, "_ZN3ccc8DD9x15y3E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y3C1Ev();
extern void _ZN3ccc8DD9x15y3D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y3E[] = {
  NSPAIR(_ZN3ccc8DD9x15y3C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y3E[];
extern void _ZN3ccc8DD9x15y33efgEv();
extern void _ZN3ccc8DD9x15y33pqrEv();
extern void _ZN3ccc8DD9x15y33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y3E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y3E[] = {
  {&(_ZTVN3ccc8DD9x15y3E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y3E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y3E[];
Class_Descriptor cd__ZN3ccc8DD9x15y3E = {  "_ZN3ccc8DD9x15y3E", // class name
  bases__ZN3ccc8DD9x15y3E, 2,
  &(vtc__ZN3ccc8DD9x15y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y3E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y3E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y3E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y4  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC9x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC9x15y43abcEv
  virtual void  efg(); // _ZN3ccc8CC9x15y43efgEv
  ~CC9x15y4(); // tgen
  CC9x15y4(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y4E) C1{ VBC2{ v3 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y43pqrEv");}
void  ccc::CC9x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y43abcEv");}
void  ccc::CC9x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y43efgEv");}
ccc::CC9x15y4 ::~CC9x15y4(){ note_dtor("_ZN3ccc8CC9x15y4E", this);} // tgen
ccc::CC9x15y4 ::CC9x15y4(){ note_ctor("_ZN3ccc8CC9x15y4E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y4E, buf);
    ::ccc::CC9x15y4 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y4E);
    dp->::ccc::CC9x15y4::~CC9x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y4E(Test__ZN3ccc8CC9x15y4E, "_ZN3ccc8CC9x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y4C1Ev();
extern void _ZN3ccc8CC9x15y4D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y4E[] = {
  NSPAIR(_ZN3ccc8CC9x15y4C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y4E[];
extern void _ZN3ccc8CC9x15y43efgEv();
extern void _ZN3ccc8CC9x15y43pqrEv();
extern void _ZN3ccc8CC9x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y4E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y4E[] = {
  {&(_ZTVN3ccc8CC9x15y4E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y4E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y4E[];
Class_Descriptor cd__ZN3ccc8CC9x15y4E = {  "_ZN3ccc8CC9x15y4E", // class name
  bases__ZN3ccc8CC9x15y4E, 2,
  &(vtc__ZN3ccc8CC9x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y4E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y4  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD9x15y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD9x15y43abcEv
  virtual void  efg(); // _ZN3ccc8DD9x15y43efgEv
  ~DD9x15y4(); // tgen
  DD9x15y4(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y4E) C1{ VBC2{ v3 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x15y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y43pqrEv");}
void  ccc::DD9x15y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y43abcEv");}
void  ccc::DD9x15y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y43efgEv");}
ccc::DD9x15y4 ::~DD9x15y4(){ note_dtor("_ZN3ccc8DD9x15y4E", this);} // tgen
ccc::DD9x15y4 ::DD9x15y4(){ note_ctor("_ZN3ccc8DD9x15y4E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y4E, buf);
    ::ccc::DD9x15y4 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y4E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y4E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y4E);
    dp->::ccc::DD9x15y4::~DD9x15y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y4E(Test__ZN3ccc8DD9x15y4E, "_ZN3ccc8DD9x15y4E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y4C1Ev();
extern void _ZN3ccc8DD9x15y4D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y4E[] = {
  NSPAIR(_ZN3ccc8DD9x15y4C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y4E[];
extern void _ZN3ccc8DD9x15y43efgEv();
extern void _ZN3ccc8DD9x15y43pqrEv();
extern void _ZN3ccc8DD9x15y43abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y4E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y43abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y4E[] = {
  {&(_ZTVN3ccc8DD9x15y4E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y4E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y4E[];
Class_Descriptor cd__ZN3ccc8DD9x15y4E = {  "_ZN3ccc8DD9x15y4E", // class name
  bases__ZN3ccc8DD9x15y4E, 2,
  &(vtc__ZN3ccc8DD9x15y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y4E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y4E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y4E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y5  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8CC9x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC9x15y53efgEv
  virtual void  abc(); // _ZN3ccc8CC9x15y53abcEv
  ~CC9x15y5(); // tgen
  CC9x15y5(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y5E) C1{ VBC2{ v2 v1} BC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC9x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y53pqrEv");}
void  ccc::CC9x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y53efgEv");}
void  ccc::CC9x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y53abcEv");}
ccc::CC9x15y5 ::~CC9x15y5(){ note_dtor("_ZN3ccc8CC9x15y5E", this);} // tgen
ccc::CC9x15y5 ::CC9x15y5(){ note_ctor("_ZN3ccc8CC9x15y5E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y5E, buf);
    ::ccc::CC9x15y5 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y5E);
    dp->::ccc::CC9x15y5::~CC9x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y5E(Test__ZN3ccc8CC9x15y5E, "_ZN3ccc8CC9x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y5C1Ev();
extern void _ZN3ccc8CC9x15y5D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y5E[] = {
  NSPAIR(_ZN3ccc8CC9x15y5C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y5E[];
extern void _ZN3ccc8CC9x15y53efgEv();
extern void _ZN3ccc8CC9x15y53pqrEv();
extern void _ZN3ccc8CC9x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y5E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y5E[] = {
  {&(_ZTVN3ccc8CC9x15y5E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y5E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y5E[];
Class_Descriptor cd__ZN3ccc8CC9x15y5E = {  "_ZN3ccc8CC9x15y5E", // class name
  bases__ZN3ccc8CC9x15y5E, 2,
  &(vtc__ZN3ccc8CC9x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y5E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y5  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc8DD9x15y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD9x15y53efgEv
  virtual void  abc(); // _ZN3ccc8DD9x15y53abcEv
  ~DD9x15y5(); // tgen
  DD9x15y5(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y5E) C1{ VBC2{ v2 v1} VBC3{} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD9x15y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y53pqrEv");}
void  ccc::DD9x15y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y53efgEv");}
void  ccc::DD9x15y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y53abcEv");}
ccc::DD9x15y5 ::~DD9x15y5(){ note_dtor("_ZN3ccc8DD9x15y5E", this);} // tgen
ccc::DD9x15y5 ::DD9x15y5(){ note_ctor("_ZN3ccc8DD9x15y5E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y5E, buf);
    ::ccc::DD9x15y5 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y5E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y5E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y5E);
    dp->::ccc::DD9x15y5::~DD9x15y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y5E(Test__ZN3ccc8DD9x15y5E, "_ZN3ccc8DD9x15y5E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y5C1Ev();
extern void _ZN3ccc8DD9x15y5D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y5E[] = {
  NSPAIR(_ZN3ccc8DD9x15y5C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y5E[];
extern void _ZN3ccc8DD9x15y53efgEv();
extern void _ZN3ccc8DD9x15y53pqrEv();
extern void _ZN3ccc8DD9x15y53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y5E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y5E[] = {
  {&(_ZTVN3ccc8DD9x15y5E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y5E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y5E[];
Class_Descriptor cd__ZN3ccc8DD9x15y5E = {  "_ZN3ccc8DD9x15y5E", // class name
  bases__ZN3ccc8DD9x15y5E, 2,
  &(vtc__ZN3ccc8DD9x15y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y5E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y5E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y5E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y6  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y63abcEv
  virtual void  efg(); // _ZN3ccc8CC9x15y63efgEv
  ~CC9x15y6(); // tgen
  CC9x15y6(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y6E) C1{ VBC2{ v2 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC9x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y63abcEv");}
void  ccc::CC9x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y63efgEv");}
ccc::CC9x15y6 ::~CC9x15y6(){ note_dtor("_ZN3ccc8CC9x15y6E", this);} // tgen
ccc::CC9x15y6 ::CC9x15y6(){ note_ctor("_ZN3ccc8CC9x15y6E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y6E, buf);
    ::ccc::CC9x15y6 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y6E);
    dp->::ccc::CC9x15y6::~CC9x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y6E(Test__ZN3ccc8CC9x15y6E, "_ZN3ccc8CC9x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y6C1Ev();
extern void _ZN3ccc8CC9x15y6D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y6E[] = {
  NSPAIR(_ZN3ccc8CC9x15y6C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y6E[];
extern void _ZN3ccc8CC9x15y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y6E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y6E[] = {
  {&(_ZTVN3ccc8CC9x15y6E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y6E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y6E[];
Class_Descriptor cd__ZN3ccc8CC9x15y6E = {  "_ZN3ccc8CC9x15y6E", // class name
  bases__ZN3ccc8CC9x15y6E, 2,
  &(vtc__ZN3ccc8CC9x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y6E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y6  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD9x15y63abcEv
  virtual void  efg(); // _ZN3ccc8DD9x15y63efgEv
  ~DD9x15y6(); // tgen
  DD9x15y6(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y6E) C1{ VBC2{ v2 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD9x15y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y63abcEv");}
void  ccc::DD9x15y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y63efgEv");}
ccc::DD9x15y6 ::~DD9x15y6(){ note_dtor("_ZN3ccc8DD9x15y6E", this);} // tgen
ccc::DD9x15y6 ::DD9x15y6(){ note_ctor("_ZN3ccc8DD9x15y6E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y6E, buf);
    ::ccc::DD9x15y6 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y6E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y6E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y6E);
    dp->::ccc::DD9x15y6::~DD9x15y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y6E(Test__ZN3ccc8DD9x15y6E, "_ZN3ccc8DD9x15y6E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y6C1Ev();
extern void _ZN3ccc8DD9x15y6D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y6E[] = {
  NSPAIR(_ZN3ccc8DD9x15y6C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y6E[];
extern void _ZN3ccc8DD9x15y63efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x15y63abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y6E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y63abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y6E[] = {
  {&(_ZTVN3ccc8DD9x15y6E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y6E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y6E[];
Class_Descriptor cd__ZN3ccc8DD9x15y6E = {  "_ZN3ccc8DD9x15y6E", // class name
  bases__ZN3ccc8DD9x15y6E, 2,
  &(vtc__ZN3ccc8DD9x15y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y6E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y6E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y6E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y7  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8CC9x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y73pqrEv
  ~CC9x15y7(); // tgen
  CC9x15y7(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y7E) C1{ VBC2{ v3 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC9x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y73abcEv");}
void  ccc::CC9x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y73pqrEv");}
ccc::CC9x15y7 ::~CC9x15y7(){ note_dtor("_ZN3ccc8CC9x15y7E", this);} // tgen
ccc::CC9x15y7 ::CC9x15y7(){ note_ctor("_ZN3ccc8CC9x15y7E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y7E, buf);
    ::ccc::CC9x15y7 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y7E);
    dp->::ccc::CC9x15y7::~CC9x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y7E(Test__ZN3ccc8CC9x15y7E, "_ZN3ccc8CC9x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y7C1Ev();
extern void _ZN3ccc8CC9x15y7D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y7E[] = {
  NSPAIR(_ZN3ccc8CC9x15y7C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8CC9x15y73pqrEv();
extern void _ZN3ccc8CC9x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y7E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y7E[] = {
  {&(_ZTVN3ccc8CC9x15y7E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y7E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y7E[];
Class_Descriptor cd__ZN3ccc8CC9x15y7E = {  "_ZN3ccc8CC9x15y7E", // class name
  bases__ZN3ccc8CC9x15y7E, 2,
  &(vtc__ZN3ccc8CC9x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y7E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y7  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc8DD9x15y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD9x15y73pqrEv
  ~DD9x15y7(); // tgen
  DD9x15y7(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y7E) C1{ VBC2{ v3 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD9x15y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y73abcEv");}
void  ccc::DD9x15y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y73pqrEv");}
ccc::DD9x15y7 ::~DD9x15y7(){ note_dtor("_ZN3ccc8DD9x15y7E", this);} // tgen
ccc::DD9x15y7 ::DD9x15y7(){ note_ctor("_ZN3ccc8DD9x15y7E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y7E, buf);
    ::ccc::DD9x15y7 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y7E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y7E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y7E);
    dp->::ccc::DD9x15y7::~DD9x15y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y7E(Test__ZN3ccc8DD9x15y7E, "_ZN3ccc8DD9x15y7E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y7C1Ev();
extern void _ZN3ccc8DD9x15y7D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y7E[] = {
  NSPAIR(_ZN3ccc8DD9x15y7C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y7E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc8DD9x15y73pqrEv();
extern void _ZN3ccc8DD9x15y73abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y7E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y73abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y7E[] = {
  {&(_ZTVN3ccc8DD9x15y7E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y7E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y7E[];
Class_Descriptor cd__ZN3ccc8DD9x15y7E = {  "_ZN3ccc8DD9x15y7E", // class name
  bases__ZN3ccc8DD9x15y7E, 2,
  &(vtc__ZN3ccc8DD9x15y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y7E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y7E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y7E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y8  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y83efgEv
  virtual void  abc(); // _ZN3ccc8CC9x15y83abcEv
  ~CC9x15y8(); // tgen
  CC9x15y8(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y8E) C1{ VBC2{ v1 v3} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC9x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y83efgEv");}
void  ccc::CC9x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC9x15y83abcEv");}
ccc::CC9x15y8 ::~CC9x15y8(){ note_dtor("_ZN3ccc8CC9x15y8E", this);} // tgen
ccc::CC9x15y8 ::CC9x15y8(){ note_ctor("_ZN3ccc8CC9x15y8E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y8E, buf);
    ::ccc::CC9x15y8 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y8E);
    dp->::ccc::CC9x15y8::~CC9x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y8E(Test__ZN3ccc8CC9x15y8E, "_ZN3ccc8CC9x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y8C1Ev();
extern void _ZN3ccc8CC9x15y8D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y8E[] = {
  NSPAIR(_ZN3ccc8CC9x15y8C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y8E[];
extern void _ZN3ccc8CC9x15y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8CC9x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y8E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y8E[] = {
  {&(_ZTVN3ccc8CC9x15y8E[5]),  5,8},
  {&(_ZTVN3ccc8CC9x15y8E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y8E[];
Class_Descriptor cd__ZN3ccc8CC9x15y8E = {  "_ZN3ccc8CC9x15y8E", // class name
  bases__ZN3ccc8CC9x15y8E, 2,
  &(vtc__ZN3ccc8CC9x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y8E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y8  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD9x15y83efgEv
  virtual void  abc(); // _ZN3ccc8DD9x15y83abcEv
  ~DD9x15y8(); // tgen
  DD9x15y8(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y8E) C1{ VBC2{ v1 v3} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD9x15y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y83efgEv");}
void  ccc::DD9x15y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD9x15y83abcEv");}
ccc::DD9x15y8 ::~DD9x15y8(){ note_dtor("_ZN3ccc8DD9x15y8E", this);} // tgen
ccc::DD9x15y8 ::DD9x15y8(){ note_ctor("_ZN3ccc8DD9x15y8E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y8E, buf);
    ::ccc::DD9x15y8 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y8E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y8E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y8E);
    dp->::ccc::DD9x15y8::~DD9x15y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y8E(Test__ZN3ccc8DD9x15y8E, "_ZN3ccc8DD9x15y8E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y8C1Ev();
extern void _ZN3ccc8DD9x15y8D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y8E[] = {
  NSPAIR(_ZN3ccc8DD9x15y8C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y8E[];
extern void _ZN3ccc8DD9x15y83efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc8DD9x15y83abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y8E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y83abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y8E[] = {
  {&(_ZTVN3ccc8DD9x15y8E[6]),  6,9},
  {&(_ZTVN3ccc8DD9x15y8E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y8E[];
Class_Descriptor cd__ZN3ccc8DD9x15y8E = {  "_ZN3ccc8DD9x15y8E", // class name
  bases__ZN3ccc8DD9x15y8E, 2,
  &(vtc__ZN3ccc8DD9x15y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y8E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y8E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y8E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y9  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8CC9x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC9x15y93pqrEv
  ~CC9x15y9(); // tgen
  CC9x15y9(); // tgen
};
//SIG(1 _ZN3ccc8CC9x15y9E) C1{ VBC2{ v1 v2} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC9x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC9x15y93efgEv");}
void  ccc::CC9x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC9x15y93pqrEv");}
ccc::CC9x15y9 ::~CC9x15y9(){ note_dtor("_ZN3ccc8CC9x15y9E", this);} // tgen
ccc::CC9x15y9 ::CC9x15y9(){ note_ctor("_ZN3ccc8CC9x15y9E", this);} // tgen
}
static void Test__ZN3ccc8CC9x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC9x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8CC9x15y9E, buf);
    ::ccc::CC9x15y9 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8CC9x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC9x15y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8CC9x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8CC9x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC9x15y9E);
    dp->::ccc::CC9x15y9::~CC9x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC9x15y9E(Test__ZN3ccc8CC9x15y9E, "_ZN3ccc8CC9x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8CC9x15y9C1Ev();
extern void _ZN3ccc8CC9x15y9D1Ev();
Name_Map name_map__ZN3ccc8CC9x15y9E[] = {
  NSPAIR(_ZN3ccc8CC9x15y9C1Ev),
  NSPAIR(_ZN3ccc8CC9x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8CC9x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC9x15y9E[];
extern void _ZN3ccc8CC9x15y93efgEv();
extern void _ZN3ccc8CC9x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC9x15y9E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC9x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC9x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC9x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC9x15y9E[] = {
  {&(_ZTVN3ccc8CC9x15y9E[5]),  5,7},
  {&(_ZTVN3ccc8CC9x15y9E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc8CC9x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC9x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC9x15y9E[];
Class_Descriptor cd__ZN3ccc8CC9x15y9E = {  "_ZN3ccc8CC9x15y9E", // class name
  bases__ZN3ccc8CC9x15y9E, 2,
  &(vtc__ZN3ccc8CC9x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC9x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8CC9x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC9x15y9E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC9x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y9  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc8DD9x15y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD9x15y93pqrEv
  ~DD9x15y9(); // tgen
  DD9x15y9(); // tgen
};
//SIG(1 _ZN3ccc8DD9x15y9E) C1{ VBC2{ v1 v2} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD9x15y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD9x15y93efgEv");}
void  ccc::DD9x15y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD9x15y93pqrEv");}
ccc::DD9x15y9 ::~DD9x15y9(){ note_dtor("_ZN3ccc8DD9x15y9E", this);} // tgen
ccc::DD9x15y9 ::DD9x15y9(){ note_ctor("_ZN3ccc8DD9x15y9E", this);} // tgen
}
static void Test__ZN3ccc8DD9x15y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD9x15y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc8DD9x15y9E, buf);
    ::ccc::DD9x15y9 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc8DD9x15y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD9x15y9E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc8DD9x15y9E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc8DD9x15y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD9x15y9E);
    dp->::ccc::DD9x15y9::~DD9x15y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD9x15y9E(Test__ZN3ccc8DD9x15y9E, "_ZN3ccc8DD9x15y9E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc8DD9x15y9C1Ev();
extern void _ZN3ccc8DD9x15y9D1Ev();
Name_Map name_map__ZN3ccc8DD9x15y9E[] = {
  NSPAIR(_ZN3ccc8DD9x15y9C1Ev),
  NSPAIR(_ZN3ccc8DD9x15y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc8DD9x15y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8DD9x15y9E[];
extern void _ZN3ccc8DD9x15y93efgEv();
extern void _ZN3ccc8DD9x15y93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD9x15y9E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD9x15y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8DD9x15y93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD9x15y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD9x15y9E[] = {
  {&(_ZTVN3ccc8DD9x15y9E[6]),  6,8},
  {&(_ZTVN3ccc8DD9x15y9E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc8DD9x15y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD9x15y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD9x15y9E[];
Class_Descriptor cd__ZN3ccc8DD9x15y9E = {  "_ZN3ccc8DD9x15y9E", // class name
  bases__ZN3ccc8DD9x15y9E, 2,
  &(vtc__ZN3ccc8DD9x15y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD9x15y9E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc8DD9x15y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD9x15y9E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD9x15y9E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y10  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC9x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC9x15y103abcEv
  ~CC9x15y10(); // tgen
  CC9x15y10(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y10E) C1{ VBC2{ v3 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC9x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x15y103pqrEv");}
void  ccc::CC9x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x15y103abcEv");}
ccc::CC9x15y10 ::~CC9x15y10(){ note_dtor("_ZN3ccc9CC9x15y10E", this);} // tgen
ccc::CC9x15y10 ::CC9x15y10(){ note_ctor("_ZN3ccc9CC9x15y10E", this);} // tgen
}
static void Test__ZN3ccc9CC9x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC9x15y10E, buf);
    ::ccc::CC9x15y10 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC9x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x15y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9CC9x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC9x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x15y10E);
    dp->::ccc::CC9x15y10::~CC9x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x15y10E(Test__ZN3ccc9CC9x15y10E, "_ZN3ccc9CC9x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC9x15y10C1Ev();
extern void _ZN3ccc9CC9x15y10D1Ev();
Name_Map name_map__ZN3ccc9CC9x15y10E[] = {
  NSPAIR(_ZN3ccc9CC9x15y10C1Ev),
  NSPAIR(_ZN3ccc9CC9x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC9x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x15y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x15y103pqrEv();
extern void _ZN3ccc9CC9x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x15y10E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x15y10E[] = {
  {&(_ZTVN3ccc9CC9x15y10E[5]),  5,8},
  {&(_ZTVN3ccc9CC9x15y10E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x15y10E[];
Class_Descriptor cd__ZN3ccc9CC9x15y10E = {  "_ZN3ccc9CC9x15y10E", // class name
  bases__ZN3ccc9CC9x15y10E, 2,
  &(vtc__ZN3ccc9CC9x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y10E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y10  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD9x15y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD9x15y103abcEv
  ~DD9x15y10(); // tgen
  DD9x15y10(); // tgen
};
//SIG(1 _ZN3ccc9DD9x15y10E) C1{ VBC2{ v3 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD9x15y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x15y103pqrEv");}
void  ccc::DD9x15y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x15y103abcEv");}
ccc::DD9x15y10 ::~DD9x15y10(){ note_dtor("_ZN3ccc9DD9x15y10E", this);} // tgen
ccc::DD9x15y10 ::DD9x15y10(){ note_ctor("_ZN3ccc9DD9x15y10E", this);} // tgen
}
static void Test__ZN3ccc9DD9x15y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x15y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD9x15y10E, buf);
    ::ccc::DD9x15y10 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD9x15y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x15y10E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x15y10E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD9x15y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x15y10E);
    dp->::ccc::DD9x15y10::~DD9x15y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x15y10E(Test__ZN3ccc9DD9x15y10E, "_ZN3ccc9DD9x15y10E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD9x15y10C1Ev();
extern void _ZN3ccc9DD9x15y10D1Ev();
Name_Map name_map__ZN3ccc9DD9x15y10E[] = {
  NSPAIR(_ZN3ccc9DD9x15y10C1Ev),
  NSPAIR(_ZN3ccc9DD9x15y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD9x15y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD9x15y10E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x15y103pqrEv();
extern void _ZN3ccc9DD9x15y103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x15y10E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x15y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x15y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x15y10E[] = {
  {&(_ZTVN3ccc9DD9x15y10E[6]),  6,9},
  {&(_ZTVN3ccc9DD9x15y10E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x15y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x15y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x15y10E[];
Class_Descriptor cd__ZN3ccc9DD9x15y10E = {  "_ZN3ccc9DD9x15y10E", // class name
  bases__ZN3ccc9DD9x15y10E, 2,
  &(vtc__ZN3ccc9DD9x15y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x15y10E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD9x15y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x15y10E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x15y10E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y11  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC9x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC9x15y113efgEv
  ~CC9x15y11(); // tgen
  CC9x15y11(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y11E) C1{ VBC2{ v2 v1} BC3{} v1 v2}
}
namespace ccc { 
void  ccc::CC9x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x15y113pqrEv");}
void  ccc::CC9x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x15y113efgEv");}
ccc::CC9x15y11 ::~CC9x15y11(){ note_dtor("_ZN3ccc9CC9x15y11E", this);} // tgen
ccc::CC9x15y11 ::CC9x15y11(){ note_ctor("_ZN3ccc9CC9x15y11E", this);} // tgen
}
static void Test__ZN3ccc9CC9x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC9x15y11E, buf);
    ::ccc::CC9x15y11 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC9x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x15y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9CC9x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC9x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x15y11E);
    dp->::ccc::CC9x15y11::~CC9x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x15y11E(Test__ZN3ccc9CC9x15y11E, "_ZN3ccc9CC9x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC9x15y11C1Ev();
extern void _ZN3ccc9CC9x15y11D1Ev();
Name_Map name_map__ZN3ccc9CC9x15y11E[] = {
  NSPAIR(_ZN3ccc9CC9x15y11C1Ev),
  NSPAIR(_ZN3ccc9CC9x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC9x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x15y11E[];
extern void _ZN3ccc9CC9x15y113efgEv();
extern void _ZN3ccc9CC9x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x15y11E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x15y11E[] = {
  {&(_ZTVN3ccc9CC9x15y11E[5]),  5,7},
  {&(_ZTVN3ccc9CC9x15y11E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x15y11E[];
Class_Descriptor cd__ZN3ccc9CC9x15y11E = {  "_ZN3ccc9CC9x15y11E", // class name
  bases__ZN3ccc9CC9x15y11E, 2,
  &(vtc__ZN3ccc9CC9x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y11E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y11  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD9x15y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD9x15y113efgEv
  ~DD9x15y11(); // tgen
  DD9x15y11(); // tgen
};
//SIG(1 _ZN3ccc9DD9x15y11E) C1{ VBC2{ v2 v1} VBC3{} v1 v2}
}
namespace ccc { 
void  ccc::DD9x15y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x15y113pqrEv");}
void  ccc::DD9x15y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x15y113efgEv");}
ccc::DD9x15y11 ::~DD9x15y11(){ note_dtor("_ZN3ccc9DD9x15y11E", this);} // tgen
ccc::DD9x15y11 ::DD9x15y11(){ note_ctor("_ZN3ccc9DD9x15y11E", this);} // tgen
}
static void Test__ZN3ccc9DD9x15y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x15y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD9x15y11E, buf);
    ::ccc::DD9x15y11 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD9x15y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x15y11E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x15y11E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD9x15y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x15y11E);
    dp->::ccc::DD9x15y11::~DD9x15y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x15y11E(Test__ZN3ccc9DD9x15y11E, "_ZN3ccc9DD9x15y11E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD9x15y11C1Ev();
extern void _ZN3ccc9DD9x15y11D1Ev();
Name_Map name_map__ZN3ccc9DD9x15y11E[] = {
  NSPAIR(_ZN3ccc9DD9x15y11C1Ev),
  NSPAIR(_ZN3ccc9DD9x15y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD9x15y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD9x15y11E[];
extern void _ZN3ccc9DD9x15y113efgEv();
extern void _ZN3ccc9DD9x15y113pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x15y11E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x15y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y113pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x15y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x15y11E[] = {
  {&(_ZTVN3ccc9DD9x15y11E[6]),  6,8},
  {&(_ZTVN3ccc9DD9x15y11E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x15y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x15y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x15y11E[];
Class_Descriptor cd__ZN3ccc9DD9x15y11E = {  "_ZN3ccc9DD9x15y11E", // class name
  bases__ZN3ccc9DD9x15y11E, 2,
  &(vtc__ZN3ccc9DD9x15y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x15y11E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD9x15y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x15y11E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x15y11E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y12  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9CC9x15y123abcEv
  ~CC9x15y12(); // tgen
  CC9x15y12(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y12E) C1{ VBC2{ v2 v3} BC3{} v1}
}
namespace ccc { 
void  ccc::CC9x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC9x15y123abcEv");}
ccc::CC9x15y12 ::~CC9x15y12(){ note_dtor("_ZN3ccc9CC9x15y12E", this);} // tgen
ccc::CC9x15y12 ::CC9x15y12(){ note_ctor("_ZN3ccc9CC9x15y12E", this);} // tgen
}
static void Test__ZN3ccc9CC9x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC9x15y12E, buf);
    ::ccc::CC9x15y12 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC9x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x15y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9CC9x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC9x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x15y12E);
    dp->::ccc::CC9x15y12::~CC9x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x15y12E(Test__ZN3ccc9CC9x15y12E, "_ZN3ccc9CC9x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC9x15y12C1Ev();
extern void _ZN3ccc9CC9x15y12D1Ev();
Name_Map name_map__ZN3ccc9CC9x15y12E[] = {
  NSPAIR(_ZN3ccc9CC9x15y12C1Ev),
  NSPAIR(_ZN3ccc9CC9x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC9x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x15y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9CC9x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x15y12E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x15y12E[] = {
  {&(_ZTVN3ccc9CC9x15y12E[5]),  5,8},
  {&(_ZTVN3ccc9CC9x15y12E[5]),  5,8},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x15y12E[];
Class_Descriptor cd__ZN3ccc9CC9x15y12E = {  "_ZN3ccc9CC9x15y12E", // class name
  bases__ZN3ccc9CC9x15y12E, 2,
  &(vtc__ZN3ccc9CC9x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y12E),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y12  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  abc(); // _ZN3ccc9DD9x15y123abcEv
  ~DD9x15y12(); // tgen
  DD9x15y12(); // tgen
};
//SIG(1 _ZN3ccc9DD9x15y12E) C1{ VBC2{ v2 v3} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD9x15y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD9x15y123abcEv");}
ccc::DD9x15y12 ::~DD9x15y12(){ note_dtor("_ZN3ccc9DD9x15y12E", this);} // tgen
ccc::DD9x15y12 ::DD9x15y12(){ note_ctor("_ZN3ccc9DD9x15y12E", this);} // tgen
}
static void Test__ZN3ccc9DD9x15y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x15y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD9x15y12E, buf);
    ::ccc::DD9x15y12 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD9x15y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x15y12E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x15y12E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD9x15y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x15y12E);
    dp->::ccc::DD9x15y12::~DD9x15y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x15y12E(Test__ZN3ccc9DD9x15y12E, "_ZN3ccc9DD9x15y12E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD9x15y12C1Ev();
extern void _ZN3ccc9DD9x15y12D1Ev();
Name_Map name_map__ZN3ccc9DD9x15y12E[] = {
  NSPAIR(_ZN3ccc9DD9x15y12C1Ev),
  NSPAIR(_ZN3ccc9DD9x15y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD9x15y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD9x15y12E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
extern void _ZN3ccc9DD9x15y123abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x15y12E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x15y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y123abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x15y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x15y12E[] = {
  {&(_ZTVN3ccc9DD9x15y12E[6]),  6,9},
  {&(_ZTVN3ccc9DD9x15y12E[6]),  6,9},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x15y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x15y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x15y12E[];
Class_Descriptor cd__ZN3ccc9DD9x15y12E = {  "_ZN3ccc9DD9x15y12E", // class name
  bases__ZN3ccc9DD9x15y12E, 2,
  &(vtc__ZN3ccc9DD9x15y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x15y12E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD9x15y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x15y12E),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x15y12E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y13  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9CC9x15y133efgEv
  ~CC9x15y13(); // tgen
  CC9x15y13(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y13E) C1{ VBC2{ v1 v2} BC3{} v1}
}
namespace ccc { 
void  ccc::CC9x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC9x15y133efgEv");}
ccc::CC9x15y13 ::~CC9x15y13(){ note_dtor("_ZN3ccc9CC9x15y13E", this);} // tgen
ccc::CC9x15y13 ::CC9x15y13(){ note_ctor("_ZN3ccc9CC9x15y13E", this);} // tgen
}
static void Test__ZN3ccc9CC9x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC9x15y13E, buf);
    ::ccc::CC9x15y13 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC9x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x15y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9CC9x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC9x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x15y13E);
    dp->::ccc::CC9x15y13::~CC9x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x15y13E(Test__ZN3ccc9CC9x15y13E, "_ZN3ccc9CC9x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC9x15y13C1Ev();
extern void _ZN3ccc9CC9x15y13D1Ev();
Name_Map name_map__ZN3ccc9CC9x15y13E[] = {
  NSPAIR(_ZN3ccc9CC9x15y13C1Ev),
  NSPAIR(_ZN3ccc9CC9x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC9x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x15y13E[];
extern void _ZN3ccc9CC9x15y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x15y13E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x15y13E[] = {
  {&(_ZTVN3ccc9CC9x15y13E[5]),  5,7},
  {&(_ZTVN3ccc9CC9x15y13E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x15y13E[];
Class_Descriptor cd__ZN3ccc9CC9x15y13E = {  "_ZN3ccc9CC9x15y13E", // class name
  bases__ZN3ccc9CC9x15y13E, 2,
  &(vtc__ZN3ccc9CC9x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y13E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y13  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  efg(); // _ZN3ccc9DD9x15y133efgEv
  ~DD9x15y13(); // tgen
  DD9x15y13(); // tgen
};
//SIG(1 _ZN3ccc9DD9x15y13E) C1{ VBC2{ v1 v2} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD9x15y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD9x15y133efgEv");}
ccc::DD9x15y13 ::~DD9x15y13(){ note_dtor("_ZN3ccc9DD9x15y13E", this);} // tgen
ccc::DD9x15y13 ::DD9x15y13(){ note_ctor("_ZN3ccc9DD9x15y13E", this);} // tgen
}
static void Test__ZN3ccc9DD9x15y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x15y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD9x15y13E, buf);
    ::ccc::DD9x15y13 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD9x15y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x15y13E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x15y13E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD9x15y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x15y13E);
    dp->::ccc::DD9x15y13::~DD9x15y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x15y13E(Test__ZN3ccc9DD9x15y13E, "_ZN3ccc9DD9x15y13E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD9x15y13C1Ev();
extern void _ZN3ccc9DD9x15y13D1Ev();
Name_Map name_map__ZN3ccc9DD9x15y13E[] = {
  NSPAIR(_ZN3ccc9DD9x15y13C1Ev),
  NSPAIR(_ZN3ccc9DD9x15y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD9x15y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD9x15y13E[];
extern void _ZN3ccc9DD9x15y133efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x15y13E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x15y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x15y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x15y13E[] = {
  {&(_ZTVN3ccc9DD9x15y13E[6]),  6,8},
  {&(_ZTVN3ccc9DD9x15y13E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x15y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x15y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x15y13E[];
Class_Descriptor cd__ZN3ccc9DD9x15y13E = {  "_ZN3ccc9DD9x15y13E", // class name
  bases__ZN3ccc9DD9x15y13E, 2,
  &(vtc__ZN3ccc9DD9x15y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x15y13E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD9x15y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x15y13E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x15y13E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y14  : virtual ::ccc::AA9 , ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9CC9x15y143pqrEv
  ~CC9x15y14(); // tgen
  CC9x15y14(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y14E) C1{ VBC2{ v2 v1} BC3{} v1}
}
namespace ccc { 
void  ccc::CC9x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC9x15y143pqrEv");}
ccc::CC9x15y14 ::~CC9x15y14(){ note_dtor("_ZN3ccc9CC9x15y14E", this);} // tgen
ccc::CC9x15y14 ::CC9x15y14(){ note_ctor("_ZN3ccc9CC9x15y14E", this);} // tgen
}
static void Test__ZN3ccc9CC9x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC9x15y14E, buf);
    ::ccc::CC9x15y14 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC9x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x15y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9CC9x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC9x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x15y14E);
    dp->::ccc::CC9x15y14::~CC9x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x15y14E(Test__ZN3ccc9CC9x15y14E, "_ZN3ccc9CC9x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC9x15y14C1Ev();
extern void _ZN3ccc9CC9x15y14D1Ev();
Name_Map name_map__ZN3ccc9CC9x15y14E[] = {
  NSPAIR(_ZN3ccc9CC9x15y14C1Ev),
  NSPAIR(_ZN3ccc9CC9x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC9x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x15y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9CC9x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x15y14E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC9x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x15y14E[] = {
  {&(_ZTVN3ccc9CC9x15y14E[5]),  5,7},
  {&(_ZTVN3ccc9CC9x15y14E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x15y14E[];
Class_Descriptor cd__ZN3ccc9CC9x15y14E = {  "_ZN3ccc9CC9x15y14E", // class name
  bases__ZN3ccc9CC9x15y14E, 2,
  &(vtc__ZN3ccc9CC9x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y14E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y14  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  virtual void  pqr(); // _ZN3ccc9DD9x15y143pqrEv
  ~DD9x15y14(); // tgen
  DD9x15y14(); // tgen
};
//SIG(1 _ZN3ccc9DD9x15y14E) C1{ VBC2{ v2 v1} VBC3{} v1}
}
namespace ccc { 
void  ccc::DD9x15y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD9x15y143pqrEv");}
ccc::DD9x15y14 ::~DD9x15y14(){ note_dtor("_ZN3ccc9DD9x15y14E", this);} // tgen
ccc::DD9x15y14 ::DD9x15y14(){ note_ctor("_ZN3ccc9DD9x15y14E", this);} // tgen
}
static void Test__ZN3ccc9DD9x15y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x15y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD9x15y14E, buf);
    ::ccc::DD9x15y14 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD9x15y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x15y14E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x15y14E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD9x15y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x15y14E);
    dp->::ccc::DD9x15y14::~DD9x15y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x15y14E(Test__ZN3ccc9DD9x15y14E, "_ZN3ccc9DD9x15y14E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD9x15y14C1Ev();
extern void _ZN3ccc9DD9x15y14D1Ev();
Name_Map name_map__ZN3ccc9DD9x15y14E[] = {
  NSPAIR(_ZN3ccc9DD9x15y14C1Ev),
  NSPAIR(_ZN3ccc9DD9x15y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD9x15y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD9x15y14E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc9DD9x15y143pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x15y14E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x15y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc9DD9x15y143pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x15y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x15y14E[] = {
  {&(_ZTVN3ccc9DD9x15y14E[6]),  6,8},
  {&(_ZTVN3ccc9DD9x15y14E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x15y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x15y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x15y14E[];
Class_Descriptor cd__ZN3ccc9DD9x15y14E = {  "_ZN3ccc9DD9x15y14E", // class name
  bases__ZN3ccc9DD9x15y14E, 2,
  &(vtc__ZN3ccc9DD9x15y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x15y14E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD9x15y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x15y14E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x15y14E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC9x15y15  : virtual ::ccc::AA9 , ::ccc::BB15 {
  ~CC9x15y15(); // tgen
  CC9x15y15(); // tgen
};
//SIG(1 _ZN3ccc9CC9x15y15E) C1{ VBC2{ v1 v2} BC3{}}
}
namespace ccc { 
ccc::CC9x15y15 ::~CC9x15y15(){ note_dtor("_ZN3ccc9CC9x15y15E", this);} // tgen
ccc::CC9x15y15 ::CC9x15y15(){ note_ctor("_ZN3ccc9CC9x15y15E", this);} // tgen
}
static void Test__ZN3ccc9CC9x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC9x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9CC9x15y15E, buf);
    ::ccc::CC9x15y15 *dp, &lv = *(dp=new (buf) ::ccc::CC9x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9CC9x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC9x15y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9CC9x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9CC9x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC9x15y15E);
    dp->::ccc::CC9x15y15::~CC9x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC9x15y15E(Test__ZN3ccc9CC9x15y15E, "_ZN3ccc9CC9x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9CC9x15y15C1Ev();
extern void _ZN3ccc9CC9x15y15D1Ev();
Name_Map name_map__ZN3ccc9CC9x15y15E[] = {
  NSPAIR(_ZN3ccc9CC9x15y15C1Ev),
  NSPAIR(_ZN3ccc9CC9x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9CC9x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC9x15y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC9x15y15E[] = {
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC9x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC9x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC9x15y15E[] = {
  {&(_ZTVN3ccc9CC9x15y15E[5]),  5,7},
  {&(_ZTVN3ccc9CC9x15y15E[5]),  5,7},
};
extern VTBL_ENTRY _ZTIN3ccc9CC9x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC9x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC9x15y15E[];
Class_Descriptor cd__ZN3ccc9CC9x15y15E = {  "_ZN3ccc9CC9x15y15E", // class name
  bases__ZN3ccc9CC9x15y15E, 2,
  &(vtc__ZN3ccc9CC9x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC9x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9CC9x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC9x15y15E),7, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC9x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  DD9x15y15  : virtual ::ccc::AA9 , virtual ::ccc::BB15 {
  ~DD9x15y15(); // tgen
  DD9x15y15(); // tgen
};
//SIG(1 _ZN3ccc9DD9x15y15E) C1{ VBC2{ v1 v2} VBC3{}}
}
namespace ccc { 
ccc::DD9x15y15 ::~DD9x15y15(){ note_dtor("_ZN3ccc9DD9x15y15E", this);} // tgen
ccc::DD9x15y15 ::DD9x15y15(){ note_ctor("_ZN3ccc9DD9x15y15E", this);} // tgen
}
static void Test__ZN3ccc9DD9x15y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD9x15y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[2];
    init_test(&cd__ZN3ccc9DD9x15y15E, buf);
    ::ccc::DD9x15y15 *dp, &lv = *(dp=new (buf) ::ccc::DD9x15y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(8,4), "sizeof(_ZN3ccc9DD9x15y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD9x15y15E)");
    check_base_class_offset(lv, (::ccc::AA9*), 0, "_ZN3ccc9DD9x15y15E");
    check_base_class_offset(lv, (::ccc::BB15*), 0, "_ZN3ccc9DD9x15y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD9x15y15E);
    dp->::ccc::DD9x15y15::~DD9x15y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD9x15y15E(Test__ZN3ccc9DD9x15y15E, "_ZN3ccc9DD9x15y15E", ABISELECT(8,4));

#else // __cplusplus

extern void _ZN3ccc9DD9x15y15C1Ev();
extern void _ZN3ccc9DD9x15y15D1Ev();
Name_Map name_map__ZN3ccc9DD9x15y15E[] = {
  NSPAIR(_ZN3ccc9DD9x15y15C1Ev),
  NSPAIR(_ZN3ccc9DD9x15y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc3AA9E;
extern VTBL_ENTRY _ZTIN3ccc3AA9E[];
extern  VTBL_ENTRY _ZTVN3ccc3AA9E[];
extern Class_Descriptor cd__ZN3ccc4BB15E;
extern VTBL_ENTRY _ZTIN3ccc4BB15E[];
static Base_Class bases__ZN3ccc9DD9x15y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc3AA9E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9DD9x15y15E[];
extern void _ZN3ccc3AA93efgEv();
extern void _ZN3ccc3AA93pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD9x15y15E[] = {
  0,
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD9x15y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3AA93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3AA93pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD9x15y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD9x15y15E[] = {
  {&(_ZTVN3ccc9DD9x15y15E[6]),  6,8},
  {&(_ZTVN3ccc9DD9x15y15E[6]),  6,8},
};
extern VTBL_ENTRY _ZTIN3ccc9DD9x15y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD9x15y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD9x15y15E[];
Class_Descriptor cd__ZN3ccc9DD9x15y15E = {  "_ZN3ccc9DD9x15y15E", // class name
  bases__ZN3ccc9DD9x15y15E, 2,
  &(vtc__ZN3ccc9DD9x15y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD9x15y15E[0]), // expected_vtt_contents
  ABISELECT(8,4), // object size
  NSPAIRA(_ZTIN3ccc9DD9x15y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD9x15y15E),8, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD9x15y15E),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace ccc { 
struct  CC10x0y0  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y03pqrEv
  ~CC10x0y0(); // tgen
  CC10x0y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y0E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y03abcEv");}
void  ccc::CC10x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y03efgEv");}
void  ccc::CC10x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y03pqrEv");}
ccc::CC10x0y0 ::~CC10x0y0(){ note_dtor("_ZN3ccc8CC10x0y0E", this);} // tgen
ccc::CC10x0y0 ::CC10x0y0(){ note_ctor("_ZN3ccc8CC10x0y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y0E, buf);
    ::ccc::CC10x0y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y0E);
    dp->::ccc::CC10x0y0::~CC10x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y0E(Test__ZN3ccc8CC10x0y0E, "_ZN3ccc8CC10x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y0C1Ev();
extern void _ZN3ccc8CC10x0y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y0E[] = {
  NSPAIR(_ZN3ccc8CC10x0y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y0E[];
extern void _ZN3ccc8CC10x0y03abcEv();
extern void _ZN3ccc8CC10x0y03efgEv();
extern void _ZN3ccc8CC10x0y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y03pqrEv,_ZTv0_n12_N3ccc8CC10x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y03pqrEv,_ZThn4_N3ccc8CC10x0y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y03abcEv,_ZTv0_n16_N3ccc8CC10x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y03abcEv,_ZThn4_N3ccc8CC10x0y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y03pqrEv,_ZTv0_n12_N3ccc8CC10x0y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y03abcEv,_ZTv0_n16_N3ccc8CC10x0y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y0E[] = {
  {&(_ZTVN3ccc8CC10x0y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y0E[];
static VTBL_ENTRY alt_thunk_names2007[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y03abcEv,_ZTv0_n16_N3ccc8CC10x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y03abcEv,_ZThn4_N3ccc8CC10x0y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y03pqrEv,_ZTv0_n12_N3ccc8CC10x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y03pqrEv,_ZThn4_N3ccc8CC10x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y0E = {  "_ZN3ccc8CC10x0y0E", // class name
  bases__ZN3ccc8CC10x0y0E, 2,
  &(vtc__ZN3ccc8CC10x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y0E),2, //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  DD10x0y0  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD10x0y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x0y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x0y03pqrEv
  ~DD10x0y0(); // tgen
  DD10x0y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y0E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x0y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y03abcEv");}
void  ccc::DD10x0y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y03efgEv");}
void  ccc::DD10x0y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y03pqrEv");}
ccc::DD10x0y0 ::~DD10x0y0(){ note_dtor("_ZN3ccc8DD10x0y0E", this);} // tgen
ccc::DD10x0y0 ::DD10x0y0(){ note_ctor("_ZN3ccc8DD10x0y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y0E, buf);
    ::ccc::DD10x0y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y0E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y0E);
    dp->::ccc::DD10x0y0::~DD10x0y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y0E(Test__ZN3ccc8DD10x0y0E, "_ZN3ccc8DD10x0y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y0C1Ev();
extern void _ZN3ccc8DD10x0y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y0E[] = {
  NSPAIR(_ZN3ccc8DD10x0y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y0E[];
extern void _ZN3ccc8DD10x0y03pqrEv();
extern void _ZN3ccc8DD10x0y03abcEv();
extern void _ZN3ccc8DD10x0y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y03abcEv,_ZTv0_n12_N3ccc8DD10x0y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y03abcEv,_ZThn4_N3ccc8DD10x0y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y03efgEv,_ZTv0_n16_N3ccc8DD10x0y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y03efgEv,_ZThn4_N3ccc8DD10x0y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y03pqrEv,_ZTv0_n20_N3ccc8DD10x0y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y03pqrEv,_ZThn4_N3ccc8DD10x0y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y03abcEv,_ZTv0_n12_N3ccc8DD10x0y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y03efgEv,_ZTv0_n16_N3ccc8DD10x0y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y03pqrEv,_ZTv0_n20_N3ccc8DD10x0y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y0E[] = {
  {&(_ZTVN3ccc8DD10x0y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y0E[];
static VTBL_ENTRY alt_thunk_names2008[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y03pqrEv,_ZTv0_n20_N3ccc8DD10x0y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y03pqrEv,_ZThn4_N3ccc8DD10x0y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y03efgEv,_ZTv0_n16_N3ccc8DD10x0y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y03efgEv,_ZThn4_N3ccc8DD10x0y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y03abcEv,_ZTv0_n12_N3ccc8DD10x0y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y03abcEv,_ZThn4_N3ccc8DD10x0y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y0E = {  "_ZN3ccc8DD10x0y0E", // class name
  bases__ZN3ccc8DD10x0y0E, 2,
  &(vtc__ZN3ccc8DD10x0y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y0E),3, //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  CC10x0y1  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x0y13efgEv
  ~CC10x0y1(); // tgen
  CC10x0y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y1E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y13abcEv");}
void  ccc::CC10x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y13pqrEv");}
void  ccc::CC10x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y13efgEv");}
ccc::CC10x0y1 ::~CC10x0y1(){ note_dtor("_ZN3ccc8CC10x0y1E", this);} // tgen
ccc::CC10x0y1 ::CC10x0y1(){ note_ctor("_ZN3ccc8CC10x0y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y1E, buf);
    ::ccc::CC10x0y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y1E);
    dp->::ccc::CC10x0y1::~CC10x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y1E(Test__ZN3ccc8CC10x0y1E, "_ZN3ccc8CC10x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y1C1Ev();
extern void _ZN3ccc8CC10x0y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y1E[] = {
  NSPAIR(_ZN3ccc8CC10x0y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y1E[];
extern void _ZN3ccc8CC10x0y13abcEv();
extern void _ZN3ccc8CC10x0y13efgEv();
extern void _ZN3ccc8CC10x0y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y13pqrEv,_ZTv0_n12_N3ccc8CC10x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y13pqrEv,_ZThn4_N3ccc8CC10x0y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y13abcEv,_ZTv0_n16_N3ccc8CC10x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y13abcEv,_ZThn4_N3ccc8CC10x0y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y13pqrEv,_ZTv0_n12_N3ccc8CC10x0y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y13abcEv,_ZTv0_n16_N3ccc8CC10x0y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y1E[] = {
  {&(_ZTVN3ccc8CC10x0y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y1E[];
static VTBL_ENTRY alt_thunk_names2009[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y13abcEv,_ZTv0_n16_N3ccc8CC10x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y13abcEv,_ZThn4_N3ccc8CC10x0y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y13pqrEv,_ZTv0_n12_N3ccc8CC10x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y13pqrEv,_ZThn4_N3ccc8CC10x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y1E = {  "_ZN3ccc8CC10x0y1E", // class name
  bases__ZN3ccc8CC10x0y1E, 2,
  &(vtc__ZN3ccc8CC10x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y1E),2, //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  DD10x0y1  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD10x0y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x0y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x0y13efgEv
  ~DD10x0y1(); // tgen
  DD10x0y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y1E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x0y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y13abcEv");}
void  ccc::DD10x0y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y13pqrEv");}
void  ccc::DD10x0y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y13efgEv");}
ccc::DD10x0y1 ::~DD10x0y1(){ note_dtor("_ZN3ccc8DD10x0y1E", this);} // tgen
ccc::DD10x0y1 ::DD10x0y1(){ note_ctor("_ZN3ccc8DD10x0y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y1E, buf);
    ::ccc::DD10x0y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y1E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y1E);
    dp->::ccc::DD10x0y1::~DD10x0y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y1E(Test__ZN3ccc8DD10x0y1E, "_ZN3ccc8DD10x0y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y1C1Ev();
extern void _ZN3ccc8DD10x0y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y1E[] = {
  NSPAIR(_ZN3ccc8DD10x0y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y1E[];
extern void _ZN3ccc8DD10x0y13pqrEv();
extern void _ZN3ccc8DD10x0y13abcEv();
extern void _ZN3ccc8DD10x0y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y13abcEv,_ZTv0_n12_N3ccc8DD10x0y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y13abcEv,_ZThn4_N3ccc8DD10x0y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y13efgEv,_ZTv0_n16_N3ccc8DD10x0y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y13efgEv,_ZThn4_N3ccc8DD10x0y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y13pqrEv,_ZTv0_n20_N3ccc8DD10x0y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y13pqrEv,_ZThn4_N3ccc8DD10x0y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y13abcEv,_ZTv0_n12_N3ccc8DD10x0y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y13efgEv,_ZTv0_n16_N3ccc8DD10x0y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y13pqrEv,_ZTv0_n20_N3ccc8DD10x0y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y1E[] = {
  {&(_ZTVN3ccc8DD10x0y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y1E[];
static VTBL_ENTRY alt_thunk_names2010[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y13pqrEv,_ZTv0_n20_N3ccc8DD10x0y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y13pqrEv,_ZThn4_N3ccc8DD10x0y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y13efgEv,_ZTv0_n16_N3ccc8DD10x0y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y13efgEv,_ZThn4_N3ccc8DD10x0y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y13abcEv,_ZTv0_n12_N3ccc8DD10x0y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y13abcEv,_ZThn4_N3ccc8DD10x0y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y1E = {  "_ZN3ccc8DD10x0y1E", // class name
  bases__ZN3ccc8DD10x0y1E, 2,
  &(vtc__ZN3ccc8DD10x0y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y1E),3, //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  CC10x0y2  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y23pqrEv
  ~CC10x0y2(); // tgen
  CC10x0y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y2E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y23efgEv");}
void  ccc::CC10x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y23abcEv");}
void  ccc::CC10x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y23pqrEv");}
ccc::CC10x0y2 ::~CC10x0y2(){ note_dtor("_ZN3ccc8CC10x0y2E", this);} // tgen
ccc::CC10x0y2 ::CC10x0y2(){ note_ctor("_ZN3ccc8CC10x0y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y2E, buf);
    ::ccc::CC10x0y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y2E);
    dp->::ccc::CC10x0y2::~CC10x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y2E(Test__ZN3ccc8CC10x0y2E, "_ZN3ccc8CC10x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y2C1Ev();
extern void _ZN3ccc8CC10x0y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y2E[] = {
  NSPAIR(_ZN3ccc8CC10x0y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y2E[];
extern void _ZN3ccc8CC10x0y23abcEv();
extern void _ZN3ccc8CC10x0y23efgEv();
extern void _ZN3ccc8CC10x0y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y23pqrEv,_ZTv0_n12_N3ccc8CC10x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y23pqrEv,_ZThn4_N3ccc8CC10x0y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y23abcEv,_ZTv0_n16_N3ccc8CC10x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y23abcEv,_ZThn4_N3ccc8CC10x0y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y23pqrEv,_ZTv0_n12_N3ccc8CC10x0y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y23abcEv,_ZTv0_n16_N3ccc8CC10x0y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y2E[] = {
  {&(_ZTVN3ccc8CC10x0y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y2E[];
static VTBL_ENTRY alt_thunk_names2011[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y23abcEv,_ZTv0_n16_N3ccc8CC10x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y23abcEv,_ZThn4_N3ccc8CC10x0y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y23pqrEv,_ZTv0_n12_N3ccc8CC10x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y23pqrEv,_ZThn4_N3ccc8CC10x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y2E = {  "_ZN3ccc8CC10x0y2E", // class name
  bases__ZN3ccc8CC10x0y2E, 2,
  &(vtc__ZN3ccc8CC10x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y2E),2, //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  DD10x0y2  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD10x0y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x0y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x0y23pqrEv
  ~DD10x0y2(); // tgen
  DD10x0y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y2E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x0y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y23efgEv");}
void  ccc::DD10x0y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y23abcEv");}
void  ccc::DD10x0y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y23pqrEv");}
ccc::DD10x0y2 ::~DD10x0y2(){ note_dtor("_ZN3ccc8DD10x0y2E", this);} // tgen
ccc::DD10x0y2 ::DD10x0y2(){ note_ctor("_ZN3ccc8DD10x0y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y2E, buf);
    ::ccc::DD10x0y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y2E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y2E);
    dp->::ccc::DD10x0y2::~DD10x0y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y2E(Test__ZN3ccc8DD10x0y2E, "_ZN3ccc8DD10x0y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y2C1Ev();
extern void _ZN3ccc8DD10x0y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y2E[] = {
  NSPAIR(_ZN3ccc8DD10x0y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y2E[];
extern void _ZN3ccc8DD10x0y23pqrEv();
extern void _ZN3ccc8DD10x0y23abcEv();
extern void _ZN3ccc8DD10x0y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y23abcEv,_ZTv0_n12_N3ccc8DD10x0y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y23abcEv,_ZThn4_N3ccc8DD10x0y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y23efgEv,_ZTv0_n16_N3ccc8DD10x0y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y23efgEv,_ZThn4_N3ccc8DD10x0y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y23pqrEv,_ZTv0_n20_N3ccc8DD10x0y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y23pqrEv,_ZThn4_N3ccc8DD10x0y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y23abcEv,_ZTv0_n12_N3ccc8DD10x0y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y23efgEv,_ZTv0_n16_N3ccc8DD10x0y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y23pqrEv,_ZTv0_n20_N3ccc8DD10x0y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y2E[] = {
  {&(_ZTVN3ccc8DD10x0y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y2E[];
static VTBL_ENTRY alt_thunk_names2012[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y23pqrEv,_ZTv0_n20_N3ccc8DD10x0y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y23pqrEv,_ZThn4_N3ccc8DD10x0y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y23efgEv,_ZTv0_n16_N3ccc8DD10x0y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y23efgEv,_ZThn4_N3ccc8DD10x0y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y23abcEv,_ZTv0_n12_N3ccc8DD10x0y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y23abcEv,_ZThn4_N3ccc8DD10x0y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y2E = {  "_ZN3ccc8DD10x0y2E", // class name
  bases__ZN3ccc8DD10x0y2E, 2,
  &(vtc__ZN3ccc8DD10x0y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y2E),3, //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  CC10x0y3  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x0y33abcEv
  ~CC10x0y3(); // tgen
  CC10x0y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y3E) C1{ VBC2{ v2 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y33efgEv");}
void  ccc::CC10x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y33pqrEv");}
void  ccc::CC10x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y33abcEv");}
ccc::CC10x0y3 ::~CC10x0y3(){ note_dtor("_ZN3ccc8CC10x0y3E", this);} // tgen
ccc::CC10x0y3 ::CC10x0y3(){ note_ctor("_ZN3ccc8CC10x0y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y3E, buf);
    ::ccc::CC10x0y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y3E);
    dp->::ccc::CC10x0y3::~CC10x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y3E(Test__ZN3ccc8CC10x0y3E, "_ZN3ccc8CC10x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y3C1Ev();
extern void _ZN3ccc8CC10x0y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y3E[] = {
  NSPAIR(_ZN3ccc8CC10x0y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y3E[];
extern void _ZN3ccc8CC10x0y33abcEv();
extern void _ZN3ccc8CC10x0y33efgEv();
extern void _ZN3ccc8CC10x0y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y33pqrEv,_ZTv0_n12_N3ccc8CC10x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y33pqrEv,_ZThn4_N3ccc8CC10x0y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y33abcEv,_ZTv0_n16_N3ccc8CC10x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y33abcEv,_ZThn4_N3ccc8CC10x0y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y33pqrEv,_ZTv0_n12_N3ccc8CC10x0y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y33abcEv,_ZTv0_n16_N3ccc8CC10x0y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y3E[] = {
  {&(_ZTVN3ccc8CC10x0y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y3E[];
static VTBL_ENTRY alt_thunk_names2013[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y33abcEv,_ZTv0_n16_N3ccc8CC10x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y33abcEv,_ZThn4_N3ccc8CC10x0y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y33pqrEv,_ZTv0_n12_N3ccc8CC10x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y33pqrEv,_ZThn4_N3ccc8CC10x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y3E = {  "_ZN3ccc8CC10x0y3E", // class name
  bases__ZN3ccc8CC10x0y3E, 2,
  &(vtc__ZN3ccc8CC10x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y3E),2, //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  DD10x0y3  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD10x0y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x0y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x0y33abcEv
  ~DD10x0y3(); // tgen
  DD10x0y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y3E) C1{ VBC2{ v2 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x0y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y33efgEv");}
void  ccc::DD10x0y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y33pqrEv");}
void  ccc::DD10x0y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y33abcEv");}
ccc::DD10x0y3 ::~DD10x0y3(){ note_dtor("_ZN3ccc8DD10x0y3E", this);} // tgen
ccc::DD10x0y3 ::DD10x0y3(){ note_ctor("_ZN3ccc8DD10x0y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y3E, buf);
    ::ccc::DD10x0y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y3E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y3E);
    dp->::ccc::DD10x0y3::~DD10x0y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y3E(Test__ZN3ccc8DD10x0y3E, "_ZN3ccc8DD10x0y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y3C1Ev();
extern void _ZN3ccc8DD10x0y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y3E[] = {
  NSPAIR(_ZN3ccc8DD10x0y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y3E[];
extern void _ZN3ccc8DD10x0y33pqrEv();
extern void _ZN3ccc8DD10x0y33abcEv();
extern void _ZN3ccc8DD10x0y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y33abcEv,_ZTv0_n12_N3ccc8DD10x0y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y33abcEv,_ZThn4_N3ccc8DD10x0y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y33efgEv,_ZTv0_n16_N3ccc8DD10x0y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y33efgEv,_ZThn4_N3ccc8DD10x0y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y33pqrEv,_ZTv0_n20_N3ccc8DD10x0y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y33pqrEv,_ZThn4_N3ccc8DD10x0y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y33abcEv,_ZTv0_n12_N3ccc8DD10x0y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y33efgEv,_ZTv0_n16_N3ccc8DD10x0y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y33pqrEv,_ZTv0_n20_N3ccc8DD10x0y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y3E[] = {
  {&(_ZTVN3ccc8DD10x0y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y3E[];
static VTBL_ENTRY alt_thunk_names2014[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y33pqrEv,_ZTv0_n20_N3ccc8DD10x0y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y33pqrEv,_ZThn4_N3ccc8DD10x0y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y33efgEv,_ZTv0_n16_N3ccc8DD10x0y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y33efgEv,_ZThn4_N3ccc8DD10x0y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y33abcEv,_ZTv0_n12_N3ccc8DD10x0y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y33abcEv,_ZThn4_N3ccc8DD10x0y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y3E = {  "_ZN3ccc8DD10x0y3E", // class name
  bases__ZN3ccc8DD10x0y3E, 2,
  &(vtc__ZN3ccc8DD10x0y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y3E),3, //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  CC10x0y4  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC10x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x0y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x0y43efgEv
  ~CC10x0y4(); // tgen
  CC10x0y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y4E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y43pqrEv");}
void  ccc::CC10x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y43abcEv");}
void  ccc::CC10x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y43efgEv");}
ccc::CC10x0y4 ::~CC10x0y4(){ note_dtor("_ZN3ccc8CC10x0y4E", this);} // tgen
ccc::CC10x0y4 ::CC10x0y4(){ note_ctor("_ZN3ccc8CC10x0y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y4E, buf);
    ::ccc::CC10x0y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y4E);
    dp->::ccc::CC10x0y4::~CC10x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y4E(Test__ZN3ccc8CC10x0y4E, "_ZN3ccc8CC10x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y4C1Ev();
extern void _ZN3ccc8CC10x0y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y4E[] = {
  NSPAIR(_ZN3ccc8CC10x0y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y4E[];
extern void _ZN3ccc8CC10x0y43abcEv();
extern void _ZN3ccc8CC10x0y43efgEv();
extern void _ZN3ccc8CC10x0y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y43pqrEv,_ZTv0_n12_N3ccc8CC10x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y43pqrEv,_ZThn4_N3ccc8CC10x0y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y43abcEv,_ZTv0_n16_N3ccc8CC10x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y43abcEv,_ZThn4_N3ccc8CC10x0y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y43pqrEv,_ZTv0_n12_N3ccc8CC10x0y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y43abcEv,_ZTv0_n16_N3ccc8CC10x0y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y4E[] = {
  {&(_ZTVN3ccc8CC10x0y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y4E[];
static VTBL_ENTRY alt_thunk_names2015[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y43abcEv,_ZTv0_n16_N3ccc8CC10x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y43abcEv,_ZThn4_N3ccc8CC10x0y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y43pqrEv,_ZTv0_n12_N3ccc8CC10x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y43pqrEv,_ZThn4_N3ccc8CC10x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y4E = {  "_ZN3ccc8CC10x0y4E", // class name
  bases__ZN3ccc8CC10x0y4E, 2,
  &(vtc__ZN3ccc8CC10x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y4E),2, //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  DD10x0y4  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD10x0y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x0y43abcEv
  virtual void  efg(); // _ZN3ccc8DD10x0y43efgEv
  ~DD10x0y4(); // tgen
  DD10x0y4(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y4E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x0y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y43pqrEv");}
void  ccc::DD10x0y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y43abcEv");}
void  ccc::DD10x0y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y43efgEv");}
ccc::DD10x0y4 ::~DD10x0y4(){ note_dtor("_ZN3ccc8DD10x0y4E", this);} // tgen
ccc::DD10x0y4 ::DD10x0y4(){ note_ctor("_ZN3ccc8DD10x0y4E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y4E, buf);
    ::ccc::DD10x0y4 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y4E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y4E);
    dp->::ccc::DD10x0y4::~DD10x0y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y4E(Test__ZN3ccc8DD10x0y4E, "_ZN3ccc8DD10x0y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y4C1Ev();
extern void _ZN3ccc8DD10x0y4D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y4E[] = {
  NSPAIR(_ZN3ccc8DD10x0y4C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y4E[];
extern void _ZN3ccc8DD10x0y43pqrEv();
extern void _ZN3ccc8DD10x0y43abcEv();
extern void _ZN3ccc8DD10x0y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y43abcEv,_ZTv0_n12_N3ccc8DD10x0y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y43abcEv,_ZThn4_N3ccc8DD10x0y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y43efgEv,_ZTv0_n16_N3ccc8DD10x0y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y43efgEv,_ZThn4_N3ccc8DD10x0y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y43pqrEv,_ZTv0_n20_N3ccc8DD10x0y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y43pqrEv,_ZThn4_N3ccc8DD10x0y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y43abcEv,_ZTv0_n12_N3ccc8DD10x0y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y43efgEv,_ZTv0_n16_N3ccc8DD10x0y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y43pqrEv,_ZTv0_n20_N3ccc8DD10x0y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y4E[] = {
  {&(_ZTVN3ccc8DD10x0y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y4E[];
static VTBL_ENTRY alt_thunk_names2016[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y43pqrEv,_ZTv0_n20_N3ccc8DD10x0y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y43pqrEv,_ZThn4_N3ccc8DD10x0y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y43efgEv,_ZTv0_n16_N3ccc8DD10x0y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y43efgEv,_ZThn4_N3ccc8DD10x0y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y43abcEv,_ZTv0_n12_N3ccc8DD10x0y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y43abcEv,_ZThn4_N3ccc8DD10x0y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y4E = {  "_ZN3ccc8DD10x0y4E", // class name
  bases__ZN3ccc8DD10x0y4E, 2,
  &(vtc__ZN3ccc8DD10x0y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y4E),3, //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  CC10x0y5  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8CC10x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x0y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x0y53abcEv
  ~CC10x0y5(); // tgen
  CC10x0y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y5E) C1{ VBC2{ v1 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y53pqrEv");}
void  ccc::CC10x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y53efgEv");}
void  ccc::CC10x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y53abcEv");}
ccc::CC10x0y5 ::~CC10x0y5(){ note_dtor("_ZN3ccc8CC10x0y5E", this);} // tgen
ccc::CC10x0y5 ::CC10x0y5(){ note_ctor("_ZN3ccc8CC10x0y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y5E, buf);
    ::ccc::CC10x0y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y5E);
    dp->::ccc::CC10x0y5::~CC10x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y5E(Test__ZN3ccc8CC10x0y5E, "_ZN3ccc8CC10x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y5C1Ev();
extern void _ZN3ccc8CC10x0y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y5E[] = {
  NSPAIR(_ZN3ccc8CC10x0y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y5E[];
extern void _ZN3ccc8CC10x0y53abcEv();
extern void _ZN3ccc8CC10x0y53efgEv();
extern void _ZN3ccc8CC10x0y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y53pqrEv,_ZTv0_n12_N3ccc8CC10x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y53pqrEv,_ZThn4_N3ccc8CC10x0y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y53abcEv,_ZTv0_n16_N3ccc8CC10x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y53abcEv,_ZThn4_N3ccc8CC10x0y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y53pqrEv,_ZTv0_n12_N3ccc8CC10x0y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y53abcEv,_ZTv0_n16_N3ccc8CC10x0y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y5E[] = {
  {&(_ZTVN3ccc8CC10x0y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y5E[];
static VTBL_ENTRY alt_thunk_names2017[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y53abcEv,_ZTv0_n16_N3ccc8CC10x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y53abcEv,_ZThn4_N3ccc8CC10x0y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y53pqrEv,_ZTv0_n12_N3ccc8CC10x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y53pqrEv,_ZThn4_N3ccc8CC10x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y5E = {  "_ZN3ccc8CC10x0y5E", // class name
  bases__ZN3ccc8CC10x0y5E, 2,
  &(vtc__ZN3ccc8CC10x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y5E),2, //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  DD10x0y5  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc8DD10x0y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x0y53efgEv
  virtual void  abc(); // _ZN3ccc8DD10x0y53abcEv
  ~DD10x0y5(); // tgen
  DD10x0y5(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y5E) C1{ VBC2{ v1 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x0y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y53pqrEv");}
void  ccc::DD10x0y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y53efgEv");}
void  ccc::DD10x0y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y53abcEv");}
ccc::DD10x0y5 ::~DD10x0y5(){ note_dtor("_ZN3ccc8DD10x0y5E", this);} // tgen
ccc::DD10x0y5 ::DD10x0y5(){ note_ctor("_ZN3ccc8DD10x0y5E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y5E, buf);
    ::ccc::DD10x0y5 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y5E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y5E);
    dp->::ccc::DD10x0y5::~DD10x0y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y5E(Test__ZN3ccc8DD10x0y5E, "_ZN3ccc8DD10x0y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y5C1Ev();
extern void _ZN3ccc8DD10x0y5D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y5E[] = {
  NSPAIR(_ZN3ccc8DD10x0y5C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y5E[];
extern void _ZN3ccc8DD10x0y53pqrEv();
extern void _ZN3ccc8DD10x0y53abcEv();
extern void _ZN3ccc8DD10x0y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y53abcEv,_ZTv0_n12_N3ccc8DD10x0y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y53abcEv,_ZThn4_N3ccc8DD10x0y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y53efgEv,_ZTv0_n16_N3ccc8DD10x0y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y53efgEv,_ZThn4_N3ccc8DD10x0y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y53pqrEv,_ZTv0_n20_N3ccc8DD10x0y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y53pqrEv,_ZThn4_N3ccc8DD10x0y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y53abcEv,_ZTv0_n12_N3ccc8DD10x0y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y53efgEv,_ZTv0_n16_N3ccc8DD10x0y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y53pqrEv,_ZTv0_n20_N3ccc8DD10x0y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y5E[] = {
  {&(_ZTVN3ccc8DD10x0y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y5E[];
static VTBL_ENTRY alt_thunk_names2018[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y53pqrEv,_ZTv0_n20_N3ccc8DD10x0y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y53pqrEv,_ZThn4_N3ccc8DD10x0y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y53efgEv,_ZTv0_n16_N3ccc8DD10x0y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y53efgEv,_ZThn4_N3ccc8DD10x0y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y53abcEv,_ZTv0_n12_N3ccc8DD10x0y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y53abcEv,_ZThn4_N3ccc8DD10x0y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y5E = {  "_ZN3ccc8DD10x0y5E", // class name
  bases__ZN3ccc8DD10x0y5E, 2,
  &(vtc__ZN3ccc8DD10x0y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y5E),3, //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  CC10x0y6  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x0y63efgEv
  ~CC10x0y6(); // tgen
  CC10x0y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y6E) C1{ VBC2{ v3 v1} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y63abcEv");}
void  ccc::CC10x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y63efgEv");}
ccc::CC10x0y6 ::~CC10x0y6(){ note_dtor("_ZN3ccc8CC10x0y6E", this);} // tgen
ccc::CC10x0y6 ::CC10x0y6(){ note_ctor("_ZN3ccc8CC10x0y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y6E, buf);
    ::ccc::CC10x0y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y6E);
    dp->::ccc::CC10x0y6::~CC10x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y6E(Test__ZN3ccc8CC10x0y6E, "_ZN3ccc8CC10x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y6C1Ev();
extern void _ZN3ccc8CC10x0y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y6E[] = {
  NSPAIR(_ZN3ccc8CC10x0y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y6E[];
extern void _ZN3ccc8CC10x0y63abcEv();
extern void _ZN3ccc8CC10x0y63efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y63abcEv,_ZTv0_n16_N3ccc8CC10x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y63abcEv,_ZThn4_N3ccc8CC10x0y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y63abcEv,_ZTv0_n16_N3ccc8CC10x0y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y6E[] = {
  {&(_ZTVN3ccc8CC10x0y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y6E[];
static VTBL_ENTRY alt_thunk_names2019[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y63abcEv,_ZTv0_n16_N3ccc8CC10x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y63abcEv,_ZThn4_N3ccc8CC10x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y6E = {  "_ZN3ccc8CC10x0y6E", // class name
  bases__ZN3ccc8CC10x0y6E, 2,
  &(vtc__ZN3ccc8CC10x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y6E),2, //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  DD10x0y6  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD10x0y63abcEv
  virtual void  efg(); // _ZN3ccc8DD10x0y63efgEv
  ~DD10x0y6(); // tgen
  DD10x0y6(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y6E) C1{ VBC2{ v3 v1} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x0y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y63abcEv");}
void  ccc::DD10x0y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y63efgEv");}
ccc::DD10x0y6 ::~DD10x0y6(){ note_dtor("_ZN3ccc8DD10x0y6E", this);} // tgen
ccc::DD10x0y6 ::DD10x0y6(){ note_ctor("_ZN3ccc8DD10x0y6E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y6E, buf);
    ::ccc::DD10x0y6 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y6E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y6E);
    dp->::ccc::DD10x0y6::~DD10x0y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y6E(Test__ZN3ccc8DD10x0y6E, "_ZN3ccc8DD10x0y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y6C1Ev();
extern void _ZN3ccc8DD10x0y6D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y6E[] = {
  NSPAIR(_ZN3ccc8DD10x0y6C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x0y63abcEv();
extern void _ZN3ccc8DD10x0y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y63abcEv,_ZTv0_n12_N3ccc8DD10x0y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y63abcEv,_ZThn4_N3ccc8DD10x0y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y63efgEv,_ZTv0_n16_N3ccc8DD10x0y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y63efgEv,_ZThn4_N3ccc8DD10x0y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y63abcEv,_ZTv0_n12_N3ccc8DD10x0y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y63efgEv,_ZTv0_n16_N3ccc8DD10x0y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y6E[] = {
  {&(_ZTVN3ccc8DD10x0y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y6E[];
static VTBL_ENTRY alt_thunk_names2020[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y63efgEv,_ZTv0_n16_N3ccc8DD10x0y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y63efgEv,_ZThn4_N3ccc8DD10x0y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y63abcEv,_ZTv0_n12_N3ccc8DD10x0y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y63abcEv,_ZThn4_N3ccc8DD10x0y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y6E = {  "_ZN3ccc8DD10x0y6E", // class name
  bases__ZN3ccc8DD10x0y6E, 2,
  &(vtc__ZN3ccc8DD10x0y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y6E),3, //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  CC10x0y7  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8CC10x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y73pqrEv
  ~CC10x0y7(); // tgen
  CC10x0y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y7E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y73abcEv");}
void  ccc::CC10x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y73pqrEv");}
ccc::CC10x0y7 ::~CC10x0y7(){ note_dtor("_ZN3ccc8CC10x0y7E", this);} // tgen
ccc::CC10x0y7 ::CC10x0y7(){ note_ctor("_ZN3ccc8CC10x0y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y7E, buf);
    ::ccc::CC10x0y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y7E);
    dp->::ccc::CC10x0y7::~CC10x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y7E(Test__ZN3ccc8CC10x0y7E, "_ZN3ccc8CC10x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y7C1Ev();
extern void _ZN3ccc8CC10x0y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y7E[] = {
  NSPAIR(_ZN3ccc8CC10x0y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y7E[];
extern void _ZN3ccc8CC10x0y73abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc8CC10x0y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y73pqrEv,_ZTv0_n12_N3ccc8CC10x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y73pqrEv,_ZThn4_N3ccc8CC10x0y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y73abcEv,_ZTv0_n16_N3ccc8CC10x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y73abcEv,_ZThn4_N3ccc8CC10x0y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y73pqrEv,_ZTv0_n12_N3ccc8CC10x0y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y73abcEv,_ZTv0_n16_N3ccc8CC10x0y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y7E[] = {
  {&(_ZTVN3ccc8CC10x0y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y7E[];
static VTBL_ENTRY alt_thunk_names2021[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y73abcEv,_ZTv0_n16_N3ccc8CC10x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y73abcEv,_ZThn4_N3ccc8CC10x0y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y73pqrEv,_ZTv0_n12_N3ccc8CC10x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y73pqrEv,_ZThn4_N3ccc8CC10x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y7E = {  "_ZN3ccc8CC10x0y7E", // class name
  bases__ZN3ccc8CC10x0y7E, 2,
  &(vtc__ZN3ccc8CC10x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y7E),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  DD10x0y7  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc8DD10x0y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x0y73pqrEv
  ~DD10x0y7(); // tgen
  DD10x0y7(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y7E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x0y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y73abcEv");}
void  ccc::DD10x0y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y73pqrEv");}
ccc::DD10x0y7 ::~DD10x0y7(){ note_dtor("_ZN3ccc8DD10x0y7E", this);} // tgen
ccc::DD10x0y7 ::DD10x0y7(){ note_ctor("_ZN3ccc8DD10x0y7E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y7E, buf);
    ::ccc::DD10x0y7 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y7E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y7E);
    dp->::ccc::DD10x0y7::~DD10x0y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y7E(Test__ZN3ccc8DD10x0y7E, "_ZN3ccc8DD10x0y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y7C1Ev();
extern void _ZN3ccc8DD10x0y7D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y7E[] = {
  NSPAIR(_ZN3ccc8DD10x0y7C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y7E[];
extern void _ZN3ccc8DD10x0y73pqrEv();
extern void _ZN3ccc8DD10x0y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y73abcEv,_ZTv0_n12_N3ccc8DD10x0y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y73abcEv,_ZThn4_N3ccc8DD10x0y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y73pqrEv,_ZTv0_n20_N3ccc8DD10x0y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y73pqrEv,_ZThn4_N3ccc8DD10x0y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y73abcEv,_ZTv0_n12_N3ccc8DD10x0y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y73pqrEv,_ZTv0_n20_N3ccc8DD10x0y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y7E[] = {
  {&(_ZTVN3ccc8DD10x0y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x0y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x0y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y7E[];
static VTBL_ENTRY alt_thunk_names2022[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y73pqrEv,_ZTv0_n20_N3ccc8DD10x0y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y73pqrEv,_ZThn4_N3ccc8DD10x0y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y73abcEv,_ZTv0_n12_N3ccc8DD10x0y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y73abcEv,_ZThn4_N3ccc8DD10x0y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y7E = {  "_ZN3ccc8DD10x0y7E", // class name
  bases__ZN3ccc8DD10x0y7E, 2,
  &(vtc__ZN3ccc8DD10x0y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y7E),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  CC10x0y8  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x0y83abcEv
  ~CC10x0y8(); // tgen
  CC10x0y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y8E) C1{ VBC2{ v3 v2} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y83efgEv");}
void  ccc::CC10x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x0y83abcEv");}
ccc::CC10x0y8 ::~CC10x0y8(){ note_dtor("_ZN3ccc8CC10x0y8E", this);} // tgen
ccc::CC10x0y8 ::CC10x0y8(){ note_ctor("_ZN3ccc8CC10x0y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y8E, buf);
    ::ccc::CC10x0y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y8E);
    dp->::ccc::CC10x0y8::~CC10x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y8E(Test__ZN3ccc8CC10x0y8E, "_ZN3ccc8CC10x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y8C1Ev();
extern void _ZN3ccc8CC10x0y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y8E[] = {
  NSPAIR(_ZN3ccc8CC10x0y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y8E[];
extern void _ZN3ccc8CC10x0y83abcEv();
extern void _ZN3ccc8CC10x0y83efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x0y83abcEv,_ZTv0_n16_N3ccc8CC10x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y83abcEv,_ZThn4_N3ccc8CC10x0y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x0y83abcEv,_ZTv0_n16_N3ccc8CC10x0y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y8E[] = {
  {&(_ZTVN3ccc8CC10x0y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y8E[];
static VTBL_ENTRY alt_thunk_names2023[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x0y83abcEv,_ZTv0_n16_N3ccc8CC10x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y83abcEv,_ZThn4_N3ccc8CC10x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y8E = {  "_ZN3ccc8CC10x0y8E", // class name
  bases__ZN3ccc8CC10x0y8E, 2,
  &(vtc__ZN3ccc8CC10x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y8E),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  DD10x0y8  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD10x0y83efgEv
  virtual void  abc(); // _ZN3ccc8DD10x0y83abcEv
  ~DD10x0y8(); // tgen
  DD10x0y8(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y8E) C1{ VBC2{ v3 v2} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x0y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y83efgEv");}
void  ccc::DD10x0y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x0y83abcEv");}
ccc::DD10x0y8 ::~DD10x0y8(){ note_dtor("_ZN3ccc8DD10x0y8E", this);} // tgen
ccc::DD10x0y8 ::DD10x0y8(){ note_ctor("_ZN3ccc8DD10x0y8E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y8E, buf);
    ::ccc::DD10x0y8 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y8E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y8E);
    dp->::ccc::DD10x0y8::~DD10x0y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y8E(Test__ZN3ccc8DD10x0y8E, "_ZN3ccc8DD10x0y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y8C1Ev();
extern void _ZN3ccc8DD10x0y8D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y8E[] = {
  NSPAIR(_ZN3ccc8DD10x0y8C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x0y83abcEv();
extern void _ZN3ccc8DD10x0y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x0y83abcEv,_ZTv0_n12_N3ccc8DD10x0y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y83abcEv,_ZThn4_N3ccc8DD10x0y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y83efgEv,_ZTv0_n16_N3ccc8DD10x0y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y83efgEv,_ZThn4_N3ccc8DD10x0y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x0y83abcEv,_ZTv0_n12_N3ccc8DD10x0y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y83efgEv,_ZTv0_n16_N3ccc8DD10x0y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y8E[] = {
  {&(_ZTVN3ccc8DD10x0y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y8E[];
static VTBL_ENTRY alt_thunk_names2024[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y83efgEv,_ZTv0_n16_N3ccc8DD10x0y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y83efgEv,_ZThn4_N3ccc8DD10x0y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x0y83abcEv,_ZTv0_n12_N3ccc8DD10x0y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y83abcEv,_ZThn4_N3ccc8DD10x0y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y8E = {  "_ZN3ccc8DD10x0y8E", // class name
  bases__ZN3ccc8DD10x0y8E, 2,
  &(vtc__ZN3ccc8DD10x0y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y8E),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  CC10x0y9  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8CC10x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x0y93pqrEv
  ~CC10x0y9(); // tgen
  CC10x0y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x0y9E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x0y93efgEv");}
void  ccc::CC10x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x0y93pqrEv");}
ccc::CC10x0y9 ::~CC10x0y9(){ note_dtor("_ZN3ccc8CC10x0y9E", this);} // tgen
ccc::CC10x0y9 ::CC10x0y9(){ note_ctor("_ZN3ccc8CC10x0y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x0y9E, buf);
    ::ccc::CC10x0y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x0y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc8CC10x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x0y9E);
    dp->::ccc::CC10x0y9::~CC10x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x0y9E(Test__ZN3ccc8CC10x0y9E, "_ZN3ccc8CC10x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x0y9C1Ev();
extern void _ZN3ccc8CC10x0y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x0y9E[] = {
  NSPAIR(_ZN3ccc8CC10x0y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8CC10x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x0y9E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc8CC10x0y93efgEv();
extern void _ZN3ccc8CC10x0y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x0y93pqrEv,_ZTv0_n12_N3ccc8CC10x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x0y93pqrEv,_ZThn4_N3ccc8CC10x0y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x0y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x0y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x0y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x0y93pqrEv,_ZTv0_n12_N3ccc8CC10x0y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x0y9E[] = {
  {&(_ZTVN3ccc8CC10x0y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x0y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x0y9E[];
static VTBL_ENTRY alt_thunk_names2025[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x0y93pqrEv,_ZTv0_n12_N3ccc8CC10x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x0y93pqrEv,_ZThn4_N3ccc8CC10x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x0y9E = {  "_ZN3ccc8CC10x0y9E", // class name
  bases__ZN3ccc8CC10x0y9E, 2,
  &(vtc__ZN3ccc8CC10x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x0y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x0y9E),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  DD10x0y9  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc8DD10x0y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x0y93pqrEv
  ~DD10x0y9(); // tgen
  DD10x0y9(); // tgen
};
//SIG(1 _ZN3ccc8DD10x0y9E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x0y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x0y93efgEv");}
void  ccc::DD10x0y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x0y93pqrEv");}
ccc::DD10x0y9 ::~DD10x0y9(){ note_dtor("_ZN3ccc8DD10x0y9E", this);} // tgen
ccc::DD10x0y9 ::DD10x0y9(){ note_ctor("_ZN3ccc8DD10x0y9E", this);} // tgen
}
static void Test__ZN3ccc8DD10x0y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x0y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x0y9E, buf);
    ::ccc::DD10x0y9 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x0y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x0y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x0y9E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc8DD10x0y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x0y9E);
    dp->::ccc::DD10x0y9::~DD10x0y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x0y9E(Test__ZN3ccc8DD10x0y9E, "_ZN3ccc8DD10x0y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x0y9C1Ev();
extern void _ZN3ccc8DD10x0y9D1Ev();
Name_Map name_map__ZN3ccc8DD10x0y9E[] = {
  NSPAIR(_ZN3ccc8DD10x0y9C1Ev),
  NSPAIR(_ZN3ccc8DD10x0y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc8DD10x0y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y9E[];
extern void _ZN3ccc8DD10x0y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8DD10x0y93efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x0y93efgEv,_ZTv0_n16_N3ccc8DD10x0y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y93efgEv,_ZThn4_N3ccc8DD10x0y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x0y93pqrEv,_ZTv0_n20_N3ccc8DD10x0y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x0y93pqrEv,_ZThn4_N3ccc8DD10x0y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x0y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x0y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x0y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x0y93efgEv,_ZTv0_n16_N3ccc8DD10x0y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x0y93pqrEv,_ZTv0_n20_N3ccc8DD10x0y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x0y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x0y9E[] = {
  {&(_ZTVN3ccc8DD10x0y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x0y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x0y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x0y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x0y9E[];
static VTBL_ENTRY alt_thunk_names2026[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x0y93pqrEv,_ZTv0_n20_N3ccc8DD10x0y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y93pqrEv,_ZThn4_N3ccc8DD10x0y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x0y93efgEv,_ZTv0_n16_N3ccc8DD10x0y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x0y93efgEv,_ZThn4_N3ccc8DD10x0y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x0y9E = {  "_ZN3ccc8DD10x0y9E", // class name
  bases__ZN3ccc8DD10x0y9E, 2,
  &(vtc__ZN3ccc8DD10x0y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x0y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x0y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x0y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x0y9E),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  CC10x0y10  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC10x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x0y103abcEv
  ~CC10x0y10(); // tgen
  CC10x0y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y10E) C1{ VBC2{ v1 v2} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x0y103pqrEv");}
void  ccc::CC10x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x0y103abcEv");}
ccc::CC10x0y10 ::~CC10x0y10(){ note_dtor("_ZN3ccc9CC10x0y10E", this);} // tgen
ccc::CC10x0y10 ::CC10x0y10(){ note_ctor("_ZN3ccc9CC10x0y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x0y10E, buf);
    ::ccc::CC10x0y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x0y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC10x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x0y10E);
    dp->::ccc::CC10x0y10::~CC10x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x0y10E(Test__ZN3ccc9CC10x0y10E, "_ZN3ccc9CC10x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x0y10C1Ev();
extern void _ZN3ccc9CC10x0y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x0y10E[] = {
  NSPAIR(_ZN3ccc9CC10x0y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC10x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x0y10E[];
extern void _ZN3ccc9CC10x0y103abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc9CC10x0y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x0y103pqrEv,_ZTv0_n12_N3ccc9CC10x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y103pqrEv,_ZThn4_N3ccc9CC10x0y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x0y103abcEv,_ZTv0_n16_N3ccc9CC10x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y103abcEv,_ZThn4_N3ccc9CC10x0y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x0y103pqrEv,_ZTv0_n12_N3ccc9CC10x0y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x0y103abcEv,_ZTv0_n16_N3ccc9CC10x0y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x0y10E[] = {
  {&(_ZTVN3ccc9CC10x0y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x0y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x0y10E[];
static VTBL_ENTRY alt_thunk_names2027[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x0y103abcEv,_ZTv0_n16_N3ccc9CC10x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x0y103abcEv,_ZThn4_N3ccc9CC10x0y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x0y103pqrEv,_ZTv0_n12_N3ccc9CC10x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x0y103pqrEv,_ZThn4_N3ccc9CC10x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x0y10E = {  "_ZN3ccc9CC10x0y10E", // class name
  bases__ZN3ccc9CC10x0y10E, 2,
  &(vtc__ZN3ccc9CC10x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x0y10E),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  DD10x0y10  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9DD10x0y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD10x0y103abcEv
  ~DD10x0y10(); // tgen
  DD10x0y10(); // tgen
};
//SIG(1 _ZN3ccc9DD10x0y10E) C1{ VBC2{ v1 v2} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x0y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x0y103pqrEv");}
void  ccc::DD10x0y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x0y103abcEv");}
ccc::DD10x0y10 ::~DD10x0y10(){ note_dtor("_ZN3ccc9DD10x0y10E", this);} // tgen
ccc::DD10x0y10 ::DD10x0y10(){ note_ctor("_ZN3ccc9DD10x0y10E", this);} // tgen
}
static void Test__ZN3ccc9DD10x0y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x0y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x0y10E, buf);
    ::ccc::DD10x0y10 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x0y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x0y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x0y10E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9DD10x0y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x0y10E);
    dp->::ccc::DD10x0y10::~DD10x0y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x0y10E(Test__ZN3ccc9DD10x0y10E, "_ZN3ccc9DD10x0y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x0y10C1Ev();
extern void _ZN3ccc9DD10x0y10D1Ev();
Name_Map name_map__ZN3ccc9DD10x0y10E[] = {
  NSPAIR(_ZN3ccc9DD10x0y10C1Ev),
  NSPAIR(_ZN3ccc9DD10x0y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9DD10x0y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y10E[];
extern void _ZN3ccc9DD10x0y103pqrEv();
extern void _ZN3ccc9DD10x0y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x0y103abcEv,_ZTv0_n12_N3ccc9DD10x0y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y103abcEv,_ZThn4_N3ccc9DD10x0y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x0y103pqrEv,_ZTv0_n20_N3ccc9DD10x0y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y103pqrEv,_ZThn4_N3ccc9DD10x0y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x0y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x0y103abcEv,_ZTv0_n12_N3ccc9DD10x0y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x0y103pqrEv,_ZTv0_n20_N3ccc9DD10x0y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x0y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x0y10E[] = {
  {&(_ZTVN3ccc9DD10x0y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x0y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x0y10E[];
static VTBL_ENTRY alt_thunk_names2028[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x0y103pqrEv,_ZTv0_n20_N3ccc9DD10x0y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y103pqrEv,_ZThn4_N3ccc9DD10x0y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x0y103abcEv,_ZTv0_n12_N3ccc9DD10x0y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y103abcEv,_ZThn4_N3ccc9DD10x0y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x0y10E = {  "_ZN3ccc9DD10x0y10E", // class name
  bases__ZN3ccc9DD10x0y10E, 2,
  &(vtc__ZN3ccc9DD10x0y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x0y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x0y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x0y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x0y10E),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  CC10x0y11  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC10x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x0y113efgEv
  ~CC10x0y11(); // tgen
  CC10x0y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y11E) C1{ VBC2{ v1 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x0y113pqrEv");}
void  ccc::CC10x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x0y113efgEv");}
ccc::CC10x0y11 ::~CC10x0y11(){ note_dtor("_ZN3ccc9CC10x0y11E", this);} // tgen
ccc::CC10x0y11 ::CC10x0y11(){ note_ctor("_ZN3ccc9CC10x0y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x0y11E, buf);
    ::ccc::CC10x0y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x0y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC10x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x0y11E);
    dp->::ccc::CC10x0y11::~CC10x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x0y11E(Test__ZN3ccc9CC10x0y11E, "_ZN3ccc9CC10x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x0y11C1Ev();
extern void _ZN3ccc9CC10x0y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x0y11E[] = {
  NSPAIR(_ZN3ccc9CC10x0y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC10x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x0y11E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc9CC10x0y113efgEv();
extern void _ZN3ccc9CC10x0y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x0y113pqrEv,_ZTv0_n12_N3ccc9CC10x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y113pqrEv,_ZThn4_N3ccc9CC10x0y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x0y113pqrEv,_ZTv0_n12_N3ccc9CC10x0y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x0y11E[] = {
  {&(_ZTVN3ccc9CC10x0y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x0y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x0y11E[];
static VTBL_ENTRY alt_thunk_names2029[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x0y113pqrEv,_ZTv0_n12_N3ccc9CC10x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x0y113pqrEv,_ZThn4_N3ccc9CC10x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x0y11E = {  "_ZN3ccc9CC10x0y11E", // class name
  bases__ZN3ccc9CC10x0y11E, 2,
  &(vtc__ZN3ccc9CC10x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x0y11E),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  DD10x0y11  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9DD10x0y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD10x0y113efgEv
  ~DD10x0y11(); // tgen
  DD10x0y11(); // tgen
};
//SIG(1 _ZN3ccc9DD10x0y11E) C1{ VBC2{ v1 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x0y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x0y113pqrEv");}
void  ccc::DD10x0y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x0y113efgEv");}
ccc::DD10x0y11 ::~DD10x0y11(){ note_dtor("_ZN3ccc9DD10x0y11E", this);} // tgen
ccc::DD10x0y11 ::DD10x0y11(){ note_ctor("_ZN3ccc9DD10x0y11E", this);} // tgen
}
static void Test__ZN3ccc9DD10x0y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x0y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x0y11E, buf);
    ::ccc::DD10x0y11 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x0y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x0y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x0y11E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9DD10x0y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x0y11E);
    dp->::ccc::DD10x0y11::~DD10x0y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x0y11E(Test__ZN3ccc9DD10x0y11E, "_ZN3ccc9DD10x0y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x0y11C1Ev();
extern void _ZN3ccc9DD10x0y11D1Ev();
Name_Map name_map__ZN3ccc9DD10x0y11E[] = {
  NSPAIR(_ZN3ccc9DD10x0y11C1Ev),
  NSPAIR(_ZN3ccc9DD10x0y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9DD10x0y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y11E[];
extern void _ZN3ccc9DD10x0y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x0y113efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x0y113efgEv,_ZTv0_n16_N3ccc9DD10x0y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y113efgEv,_ZThn4_N3ccc9DD10x0y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x0y113pqrEv,_ZTv0_n20_N3ccc9DD10x0y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y113pqrEv,_ZThn4_N3ccc9DD10x0y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x0y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x0y113efgEv,_ZTv0_n16_N3ccc9DD10x0y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x0y113pqrEv,_ZTv0_n20_N3ccc9DD10x0y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x0y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x0y11E[] = {
  {&(_ZTVN3ccc9DD10x0y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x0y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x0y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x0y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x0y11E[];
static VTBL_ENTRY alt_thunk_names2030[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x0y113pqrEv,_ZTv0_n20_N3ccc9DD10x0y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y113pqrEv,_ZThn4_N3ccc9DD10x0y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x0y113efgEv,_ZTv0_n16_N3ccc9DD10x0y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y113efgEv,_ZThn4_N3ccc9DD10x0y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x0y11E = {  "_ZN3ccc9DD10x0y11E", // class name
  bases__ZN3ccc9DD10x0y11E, 2,
  &(vtc__ZN3ccc9DD10x0y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x0y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x0y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x0y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x0y11E),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  CC10x0y12  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9CC10x0y123abcEv
  ~CC10x0y12(); // tgen
  CC10x0y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y12E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x0y123abcEv");}
ccc::CC10x0y12 ::~CC10x0y12(){ note_dtor("_ZN3ccc9CC10x0y12E", this);} // tgen
ccc::CC10x0y12 ::CC10x0y12(){ note_ctor("_ZN3ccc9CC10x0y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x0y12E, buf);
    ::ccc::CC10x0y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x0y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC10x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x0y12E);
    dp->::ccc::CC10x0y12::~CC10x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x0y12E(Test__ZN3ccc9CC10x0y12E, "_ZN3ccc9CC10x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x0y12C1Ev();
extern void _ZN3ccc9CC10x0y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x0y12E[] = {
  NSPAIR(_ZN3ccc9CC10x0y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC10x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x0y12E[];
extern void _ZN3ccc9CC10x0y123abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x0y123abcEv,_ZTv0_n16_N3ccc9CC10x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y123abcEv,_ZThn4_N3ccc9CC10x0y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x0y123abcEv,_ZTv0_n16_N3ccc9CC10x0y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x0y12E[] = {
  {&(_ZTVN3ccc9CC10x0y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x0y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x0y12E[];
static VTBL_ENTRY alt_thunk_names2031[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x0y123abcEv,_ZTv0_n16_N3ccc9CC10x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x0y123abcEv,_ZThn4_N3ccc9CC10x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x0y12E = {  "_ZN3ccc9CC10x0y12E", // class name
  bases__ZN3ccc9CC10x0y12E, 2,
  &(vtc__ZN3ccc9CC10x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x0y12E),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  DD10x0y12  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  abc(); // _ZN3ccc9DD10x0y123abcEv
  ~DD10x0y12(); // tgen
  DD10x0y12(); // tgen
};
//SIG(1 _ZN3ccc9DD10x0y12E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD10x0y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x0y123abcEv");}
ccc::DD10x0y12 ::~DD10x0y12(){ note_dtor("_ZN3ccc9DD10x0y12E", this);} // tgen
ccc::DD10x0y12 ::DD10x0y12(){ note_ctor("_ZN3ccc9DD10x0y12E", this);} // tgen
}
static void Test__ZN3ccc9DD10x0y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x0y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x0y12E, buf);
    ::ccc::DD10x0y12 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x0y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x0y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x0y12E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9DD10x0y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x0y12E);
    dp->::ccc::DD10x0y12::~DD10x0y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x0y12E(Test__ZN3ccc9DD10x0y12E, "_ZN3ccc9DD10x0y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x0y12C1Ev();
extern void _ZN3ccc9DD10x0y12D1Ev();
Name_Map name_map__ZN3ccc9DD10x0y12E[] = {
  NSPAIR(_ZN3ccc9DD10x0y12C1Ev),
  NSPAIR(_ZN3ccc9DD10x0y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9DD10x0y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9DD10x0y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x0y123abcEv,_ZTv0_n12_N3ccc9DD10x0y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y123abcEv,_ZThn4_N3ccc9DD10x0y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x0y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x0y123abcEv,_ZTv0_n12_N3ccc9DD10x0y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x0y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x0y12E[] = {
  {&(_ZTVN3ccc9DD10x0y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x0y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x0y12E[];
static VTBL_ENTRY alt_thunk_names2032[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x0y123abcEv,_ZTv0_n12_N3ccc9DD10x0y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y123abcEv,_ZThn4_N3ccc9DD10x0y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x0y12E = {  "_ZN3ccc9DD10x0y12E", // class name
  bases__ZN3ccc9DD10x0y12E, 2,
  &(vtc__ZN3ccc9DD10x0y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x0y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x0y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x0y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x0y12E),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  CC10x0y13  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9CC10x0y133efgEv
  ~CC10x0y13(); // tgen
  CC10x0y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y13E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC10x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x0y133efgEv");}
ccc::CC10x0y13 ::~CC10x0y13(){ note_dtor("_ZN3ccc9CC10x0y13E", this);} // tgen
ccc::CC10x0y13 ::CC10x0y13(){ note_ctor("_ZN3ccc9CC10x0y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x0y13E, buf);
    ::ccc::CC10x0y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x0y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC10x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x0y13E);
    dp->::ccc::CC10x0y13::~CC10x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x0y13E(Test__ZN3ccc9CC10x0y13E, "_ZN3ccc9CC10x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x0y13C1Ev();
extern void _ZN3ccc9CC10x0y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x0y13E[] = {
  NSPAIR(_ZN3ccc9CC10x0y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC10x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x0y13E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc9CC10x0y133efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x0y13E[] = {
  {&(_ZTVN3ccc9CC10x0y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x0y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x0y13E[];
Class_Descriptor cd__ZN3ccc9CC10x0y13E = {  "_ZN3ccc9CC10x0y13E", // class name
  bases__ZN3ccc9CC10x0y13E, 2,
  &(vtc__ZN3ccc9CC10x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x0y13E),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  DD10x0y13  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  efg(); // _ZN3ccc9DD10x0y133efgEv
  ~DD10x0y13(); // tgen
  DD10x0y13(); // tgen
};
//SIG(1 _ZN3ccc9DD10x0y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD10x0y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x0y133efgEv");}
ccc::DD10x0y13 ::~DD10x0y13(){ note_dtor("_ZN3ccc9DD10x0y13E", this);} // tgen
ccc::DD10x0y13 ::DD10x0y13(){ note_ctor("_ZN3ccc9DD10x0y13E", this);} // tgen
}
static void Test__ZN3ccc9DD10x0y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x0y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x0y13E, buf);
    ::ccc::DD10x0y13 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x0y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x0y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x0y13E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9DD10x0y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x0y13E);
    dp->::ccc::DD10x0y13::~DD10x0y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x0y13E(Test__ZN3ccc9DD10x0y13E, "_ZN3ccc9DD10x0y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x0y13C1Ev();
extern void _ZN3ccc9DD10x0y13D1Ev();
Name_Map name_map__ZN3ccc9DD10x0y13E[] = {
  NSPAIR(_ZN3ccc9DD10x0y13C1Ev),
  NSPAIR(_ZN3ccc9DD10x0y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9DD10x0y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x0y133efgEv();
extern void _ZN3ccc3BB03abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x0y133efgEv,_ZTv0_n16_N3ccc9DD10x0y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y133efgEv,_ZThn4_N3ccc9DD10x0y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x0y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x0y133efgEv,_ZTv0_n16_N3ccc9DD10x0y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x0y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x0y13E[] = {
  {&(_ZTVN3ccc9DD10x0y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x0y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x0y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x0y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x0y13E[];
static VTBL_ENTRY alt_thunk_names2033[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x0y133efgEv,_ZTv0_n16_N3ccc9DD10x0y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y133efgEv,_ZThn4_N3ccc9DD10x0y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x0y13E = {  "_ZN3ccc9DD10x0y13E", // class name
  bases__ZN3ccc9DD10x0y13E, 2,
  &(vtc__ZN3ccc9DD10x0y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x0y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x0y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x0y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x0y13E),3, //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  CC10x0y14  : virtual ::ccc::AA10 , ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9CC10x0y143pqrEv
  ~CC10x0y14(); // tgen
  CC10x0y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y14E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC10x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x0y143pqrEv");}
ccc::CC10x0y14 ::~CC10x0y14(){ note_dtor("_ZN3ccc9CC10x0y14E", this);} // tgen
ccc::CC10x0y14 ::CC10x0y14(){ note_ctor("_ZN3ccc9CC10x0y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x0y14E, buf);
    ::ccc::CC10x0y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x0y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC10x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x0y14E);
    dp->::ccc::CC10x0y14::~CC10x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x0y14E(Test__ZN3ccc9CC10x0y14E, "_ZN3ccc9CC10x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x0y14C1Ev();
extern void _ZN3ccc9CC10x0y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x0y14E[] = {
  NSPAIR(_ZN3ccc9CC10x0y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC10x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x0y14E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc9CC10x0y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x0y143pqrEv,_ZTv0_n12_N3ccc9CC10x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x0y143pqrEv,_ZThn4_N3ccc9CC10x0y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x0y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x0y143pqrEv,_ZTv0_n12_N3ccc9CC10x0y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x0y14E[] = {
  {&(_ZTVN3ccc9CC10x0y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x0y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x0y14E[];
static VTBL_ENTRY alt_thunk_names2034[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x0y143pqrEv,_ZTv0_n12_N3ccc9CC10x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x0y143pqrEv,_ZThn4_N3ccc9CC10x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x0y14E = {  "_ZN3ccc9CC10x0y14E", // class name
  bases__ZN3ccc9CC10x0y14E, 2,
  &(vtc__ZN3ccc9CC10x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x0y14E),2, //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  DD10x0y14  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  virtual void  pqr(); // _ZN3ccc9DD10x0y143pqrEv
  ~DD10x0y14(); // tgen
  DD10x0y14(); // tgen
};
//SIG(1 _ZN3ccc9DD10x0y14E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD10x0y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x0y143pqrEv");}
ccc::DD10x0y14 ::~DD10x0y14(){ note_dtor("_ZN3ccc9DD10x0y14E", this);} // tgen
ccc::DD10x0y14 ::DD10x0y14(){ note_ctor("_ZN3ccc9DD10x0y14E", this);} // tgen
}
static void Test__ZN3ccc9DD10x0y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x0y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x0y14E, buf);
    ::ccc::DD10x0y14 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x0y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x0y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x0y14E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9DD10x0y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x0y14E);
    dp->::ccc::DD10x0y14::~DD10x0y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x0y14E(Test__ZN3ccc9DD10x0y14E, "_ZN3ccc9DD10x0y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x0y14C1Ev();
extern void _ZN3ccc9DD10x0y14D1Ev();
Name_Map name_map__ZN3ccc9DD10x0y14E[] = {
  NSPAIR(_ZN3ccc9DD10x0y14C1Ev),
  NSPAIR(_ZN3ccc9DD10x0y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9DD10x0y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y14E[];
extern void _ZN3ccc9DD10x0y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x0y143pqrEv,_ZTv0_n20_N3ccc9DD10x0y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x0y143pqrEv,_ZThn4_N3ccc9DD10x0y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x0y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x0y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x0y143pqrEv,_ZTv0_n20_N3ccc9DD10x0y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x0y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x0y14E[] = {
  {&(_ZTVN3ccc9DD10x0y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x0y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x0y14E[];
static VTBL_ENTRY alt_thunk_names2035[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x0y143pqrEv,_ZTv0_n20_N3ccc9DD10x0y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x0y143pqrEv,_ZThn4_N3ccc9DD10x0y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x0y14E = {  "_ZN3ccc9DD10x0y14E", // class name
  bases__ZN3ccc9DD10x0y14E, 2,
  &(vtc__ZN3ccc9DD10x0y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x0y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x0y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x0y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x0y14E),3, //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  CC10x0y15  : virtual ::ccc::AA10 , ::ccc::BB0 {
  ~CC10x0y15(); // tgen
  CC10x0y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x0y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC10x0y15 ::~CC10x0y15(){ note_dtor("_ZN3ccc9CC10x0y15E", this);} // tgen
ccc::CC10x0y15 ::CC10x0y15(){ note_ctor("_ZN3ccc9CC10x0y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x0y15E, buf);
    ::ccc::CC10x0y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x0y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), 0, "_ZN3ccc9CC10x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x0y15E);
    dp->::ccc::CC10x0y15::~CC10x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x0y15E(Test__ZN3ccc9CC10x0y15E, "_ZN3ccc9CC10x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x0y15C1Ev();
extern void _ZN3ccc9CC10x0y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x0y15E[] = {
  NSPAIR(_ZN3ccc9CC10x0y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9CC10x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x0y15E[];
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x0y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x0y15E[] = {
  {&(_ZTVN3ccc9CC10x0y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x0y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x0y15E[];
Class_Descriptor cd__ZN3ccc9CC10x0y15E = {  "_ZN3ccc9CC10x0y15E", // class name
  bases__ZN3ccc9CC10x0y15E, 2,
  &(vtc__ZN3ccc9CC10x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x0y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x0y15E),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  DD10x0y15  : virtual ::ccc::AA10 , virtual ::ccc::BB0 {
  ~DD10x0y15(); // tgen
  DD10x0y15(); // tgen
};
//SIG(1 _ZN3ccc9DD10x0y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD10x0y15 ::~DD10x0y15(){ note_dtor("_ZN3ccc9DD10x0y15E", this);} // tgen
ccc::DD10x0y15 ::DD10x0y15(){ note_ctor("_ZN3ccc9DD10x0y15E", this);} // tgen
}
static void Test__ZN3ccc9DD10x0y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x0y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x0y15E, buf);
    ::ccc::DD10x0y15 *dp, &lv = *(dp=new (buf) ::ccc::DD10x0y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x0y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x0y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x0y15E");
    check_base_class_offset(lv, (::ccc::BB0*), ABISELECT(8,4), "_ZN3ccc9DD10x0y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x0y15E);
    dp->::ccc::DD10x0y15::~DD10x0y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x0y15E(Test__ZN3ccc9DD10x0y15E, "_ZN3ccc9DD10x0y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x0y15C1Ev();
extern void _ZN3ccc9DD10x0y15D1Ev();
Name_Map name_map__ZN3ccc9DD10x0y15E[] = {
  NSPAIR(_ZN3ccc9DD10x0y15C1Ev),
  NSPAIR(_ZN3ccc9DD10x0y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB0E;
extern VTBL_ENTRY _ZTIN3ccc3BB0E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB0E[];
static Base_Class bases__ZN3ccc9DD10x0y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB0E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB03abcEv();
extern void _ZN3ccc3BB03efgEv();
extern void _ZN3ccc3BB03pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x0y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x0y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB03abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB03pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x0y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x0y15E[] = {
  {&(_ZTVN3ccc9DD10x0y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x0y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x0y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x0y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x0y15E[];
Class_Descriptor cd__ZN3ccc9DD10x0y15E = {  "_ZN3ccc9DD10x0y15E", // class name
  bases__ZN3ccc9DD10x0y15E, 2,
  &(vtc__ZN3ccc9DD10x0y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x0y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x0y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x0y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x0y15E),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  CC10x1y0  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y03pqrEv
  ~CC10x1y0(); // tgen
  CC10x1y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y0E) C1{ VBC2{ v3 v1} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y03abcEv");}
void  ccc::CC10x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y03efgEv");}
void  ccc::CC10x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y03pqrEv");}
ccc::CC10x1y0 ::~CC10x1y0(){ note_dtor("_ZN3ccc8CC10x1y0E", this);} // tgen
ccc::CC10x1y0 ::CC10x1y0(){ note_ctor("_ZN3ccc8CC10x1y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y0E, buf);
    ::ccc::CC10x1y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y0E);
    dp->::ccc::CC10x1y0::~CC10x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y0E(Test__ZN3ccc8CC10x1y0E, "_ZN3ccc8CC10x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y0C1Ev();
extern void _ZN3ccc8CC10x1y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y0E[] = {
  NSPAIR(_ZN3ccc8CC10x1y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y0E[];
extern void _ZN3ccc8CC10x1y03abcEv();
extern void _ZN3ccc8CC10x1y03pqrEv();
extern void _ZN3ccc8CC10x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y03pqrEv,_ZTv0_n12_N3ccc8CC10x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y03pqrEv,_ZThn4_N3ccc8CC10x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y03abcEv,_ZTv0_n16_N3ccc8CC10x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y03abcEv,_ZThn4_N3ccc8CC10x1y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y03pqrEv,_ZTv0_n12_N3ccc8CC10x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y03abcEv,_ZTv0_n16_N3ccc8CC10x1y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y0E[] = {
  {&(_ZTVN3ccc8CC10x1y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y0E[];
static VTBL_ENTRY alt_thunk_names2036[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y03abcEv,_ZTv0_n16_N3ccc8CC10x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y03abcEv,_ZThn4_N3ccc8CC10x1y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y03pqrEv,_ZTv0_n12_N3ccc8CC10x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y03pqrEv,_ZThn4_N3ccc8CC10x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y0E = {  "_ZN3ccc8CC10x1y0E", // class name
  bases__ZN3ccc8CC10x1y0E, 2,
  &(vtc__ZN3ccc8CC10x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y0E),2, //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  DD10x1y0  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD10x1y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x1y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x1y03pqrEv
  ~DD10x1y0(); // tgen
  DD10x1y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y0E) C1{ VBC2{ v3 v1} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x1y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y03abcEv");}
void  ccc::DD10x1y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y03efgEv");}
void  ccc::DD10x1y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y03pqrEv");}
ccc::DD10x1y0 ::~DD10x1y0(){ note_dtor("_ZN3ccc8DD10x1y0E", this);} // tgen
ccc::DD10x1y0 ::DD10x1y0(){ note_ctor("_ZN3ccc8DD10x1y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y0E, buf);
    ::ccc::DD10x1y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y0E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y0E);
    dp->::ccc::DD10x1y0::~DD10x1y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y0E(Test__ZN3ccc8DD10x1y0E, "_ZN3ccc8DD10x1y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y0C1Ev();
extern void _ZN3ccc8DD10x1y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y0E[] = {
  NSPAIR(_ZN3ccc8DD10x1y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y0E[];
extern void _ZN3ccc8DD10x1y03pqrEv();
extern void _ZN3ccc8DD10x1y03abcEv();
extern void _ZN3ccc8DD10x1y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y03abcEv,_ZTv0_n12_N3ccc8DD10x1y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y03abcEv,_ZThn4_N3ccc8DD10x1y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y03pqrEv,_ZTv0_n16_N3ccc8DD10x1y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y03pqrEv,_ZThn4_N3ccc8DD10x1y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y03efgEv,_ZTv0_n20_N3ccc8DD10x1y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y03efgEv,_ZThn4_N3ccc8DD10x1y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y03abcEv,_ZTv0_n12_N3ccc8DD10x1y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y03pqrEv,_ZTv0_n16_N3ccc8DD10x1y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y03efgEv,_ZTv0_n20_N3ccc8DD10x1y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y0E[] = {
  {&(_ZTVN3ccc8DD10x1y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y0E[];
static VTBL_ENTRY alt_thunk_names2037[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y03efgEv,_ZTv0_n20_N3ccc8DD10x1y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y03efgEv,_ZThn4_N3ccc8DD10x1y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y03pqrEv,_ZTv0_n16_N3ccc8DD10x1y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y03pqrEv,_ZThn4_N3ccc8DD10x1y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y03abcEv,_ZTv0_n12_N3ccc8DD10x1y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y03abcEv,_ZThn4_N3ccc8DD10x1y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y0E = {  "_ZN3ccc8DD10x1y0E", // class name
  bases__ZN3ccc8DD10x1y0E, 2,
  &(vtc__ZN3ccc8DD10x1y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y0E),3, //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  CC10x1y1  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x1y13efgEv
  ~CC10x1y1(); // tgen
  CC10x1y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y1E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y13abcEv");}
void  ccc::CC10x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y13pqrEv");}
void  ccc::CC10x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y13efgEv");}
ccc::CC10x1y1 ::~CC10x1y1(){ note_dtor("_ZN3ccc8CC10x1y1E", this);} // tgen
ccc::CC10x1y1 ::CC10x1y1(){ note_ctor("_ZN3ccc8CC10x1y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y1E, buf);
    ::ccc::CC10x1y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y1E);
    dp->::ccc::CC10x1y1::~CC10x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y1E(Test__ZN3ccc8CC10x1y1E, "_ZN3ccc8CC10x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y1C1Ev();
extern void _ZN3ccc8CC10x1y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y1E[] = {
  NSPAIR(_ZN3ccc8CC10x1y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y1E[];
extern void _ZN3ccc8CC10x1y13abcEv();
extern void _ZN3ccc8CC10x1y13pqrEv();
extern void _ZN3ccc8CC10x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y13pqrEv,_ZTv0_n12_N3ccc8CC10x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y13pqrEv,_ZThn4_N3ccc8CC10x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y13abcEv,_ZTv0_n16_N3ccc8CC10x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y13abcEv,_ZThn4_N3ccc8CC10x1y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y13pqrEv,_ZTv0_n12_N3ccc8CC10x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y13abcEv,_ZTv0_n16_N3ccc8CC10x1y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y1E[] = {
  {&(_ZTVN3ccc8CC10x1y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y1E[];
static VTBL_ENTRY alt_thunk_names2038[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y13abcEv,_ZTv0_n16_N3ccc8CC10x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y13abcEv,_ZThn4_N3ccc8CC10x1y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y13pqrEv,_ZTv0_n12_N3ccc8CC10x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y13pqrEv,_ZThn4_N3ccc8CC10x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y1E = {  "_ZN3ccc8CC10x1y1E", // class name
  bases__ZN3ccc8CC10x1y1E, 2,
  &(vtc__ZN3ccc8CC10x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y1E),2, //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  DD10x1y1  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD10x1y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x1y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x1y13efgEv
  ~DD10x1y1(); // tgen
  DD10x1y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y1E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x1y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y13abcEv");}
void  ccc::DD10x1y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y13pqrEv");}
void  ccc::DD10x1y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y13efgEv");}
ccc::DD10x1y1 ::~DD10x1y1(){ note_dtor("_ZN3ccc8DD10x1y1E", this);} // tgen
ccc::DD10x1y1 ::DD10x1y1(){ note_ctor("_ZN3ccc8DD10x1y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y1E, buf);
    ::ccc::DD10x1y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y1E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y1E);
    dp->::ccc::DD10x1y1::~DD10x1y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y1E(Test__ZN3ccc8DD10x1y1E, "_ZN3ccc8DD10x1y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y1C1Ev();
extern void _ZN3ccc8DD10x1y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y1E[] = {
  NSPAIR(_ZN3ccc8DD10x1y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y1E[];
extern void _ZN3ccc8DD10x1y13pqrEv();
extern void _ZN3ccc8DD10x1y13abcEv();
extern void _ZN3ccc8DD10x1y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y13abcEv,_ZTv0_n12_N3ccc8DD10x1y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y13abcEv,_ZThn4_N3ccc8DD10x1y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y13pqrEv,_ZTv0_n16_N3ccc8DD10x1y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y13pqrEv,_ZThn4_N3ccc8DD10x1y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y13efgEv,_ZTv0_n20_N3ccc8DD10x1y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y13efgEv,_ZThn4_N3ccc8DD10x1y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y13abcEv,_ZTv0_n12_N3ccc8DD10x1y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y13pqrEv,_ZTv0_n16_N3ccc8DD10x1y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y13efgEv,_ZTv0_n20_N3ccc8DD10x1y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y1E[] = {
  {&(_ZTVN3ccc8DD10x1y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y1E[];
static VTBL_ENTRY alt_thunk_names2039[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y13efgEv,_ZTv0_n20_N3ccc8DD10x1y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y13efgEv,_ZThn4_N3ccc8DD10x1y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y13pqrEv,_ZTv0_n16_N3ccc8DD10x1y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y13pqrEv,_ZThn4_N3ccc8DD10x1y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y13abcEv,_ZTv0_n12_N3ccc8DD10x1y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y13abcEv,_ZThn4_N3ccc8DD10x1y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y1E = {  "_ZN3ccc8DD10x1y1E", // class name
  bases__ZN3ccc8DD10x1y1E, 2,
  &(vtc__ZN3ccc8DD10x1y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y1E),3, //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  CC10x1y2  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y23pqrEv
  ~CC10x1y2(); // tgen
  CC10x1y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y2E) C1{ VBC2{ v3 v2} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y23efgEv");}
void  ccc::CC10x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y23abcEv");}
void  ccc::CC10x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y23pqrEv");}
ccc::CC10x1y2 ::~CC10x1y2(){ note_dtor("_ZN3ccc8CC10x1y2E", this);} // tgen
ccc::CC10x1y2 ::CC10x1y2(){ note_ctor("_ZN3ccc8CC10x1y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y2E, buf);
    ::ccc::CC10x1y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y2E);
    dp->::ccc::CC10x1y2::~CC10x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y2E(Test__ZN3ccc8CC10x1y2E, "_ZN3ccc8CC10x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y2C1Ev();
extern void _ZN3ccc8CC10x1y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y2E[] = {
  NSPAIR(_ZN3ccc8CC10x1y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y2E[];
extern void _ZN3ccc8CC10x1y23abcEv();
extern void _ZN3ccc8CC10x1y23pqrEv();
extern void _ZN3ccc8CC10x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y23pqrEv,_ZTv0_n12_N3ccc8CC10x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y23pqrEv,_ZThn4_N3ccc8CC10x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y23abcEv,_ZTv0_n16_N3ccc8CC10x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y23abcEv,_ZThn4_N3ccc8CC10x1y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y23pqrEv,_ZTv0_n12_N3ccc8CC10x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y23abcEv,_ZTv0_n16_N3ccc8CC10x1y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y2E[] = {
  {&(_ZTVN3ccc8CC10x1y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y2E[];
static VTBL_ENTRY alt_thunk_names2040[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y23abcEv,_ZTv0_n16_N3ccc8CC10x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y23abcEv,_ZThn4_N3ccc8CC10x1y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y23pqrEv,_ZTv0_n12_N3ccc8CC10x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y23pqrEv,_ZThn4_N3ccc8CC10x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y2E = {  "_ZN3ccc8CC10x1y2E", // class name
  bases__ZN3ccc8CC10x1y2E, 2,
  &(vtc__ZN3ccc8CC10x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y2E),2, //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  DD10x1y2  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD10x1y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x1y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x1y23pqrEv
  ~DD10x1y2(); // tgen
  DD10x1y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y2E) C1{ VBC2{ v3 v2} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x1y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y23efgEv");}
void  ccc::DD10x1y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y23abcEv");}
void  ccc::DD10x1y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y23pqrEv");}
ccc::DD10x1y2 ::~DD10x1y2(){ note_dtor("_ZN3ccc8DD10x1y2E", this);} // tgen
ccc::DD10x1y2 ::DD10x1y2(){ note_ctor("_ZN3ccc8DD10x1y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y2E, buf);
    ::ccc::DD10x1y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y2E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y2E);
    dp->::ccc::DD10x1y2::~DD10x1y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y2E(Test__ZN3ccc8DD10x1y2E, "_ZN3ccc8DD10x1y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y2C1Ev();
extern void _ZN3ccc8DD10x1y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y2E[] = {
  NSPAIR(_ZN3ccc8DD10x1y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y2E[];
extern void _ZN3ccc8DD10x1y23pqrEv();
extern void _ZN3ccc8DD10x1y23abcEv();
extern void _ZN3ccc8DD10x1y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y23abcEv,_ZTv0_n12_N3ccc8DD10x1y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y23abcEv,_ZThn4_N3ccc8DD10x1y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y23pqrEv,_ZTv0_n16_N3ccc8DD10x1y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y23pqrEv,_ZThn4_N3ccc8DD10x1y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y23efgEv,_ZTv0_n20_N3ccc8DD10x1y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y23efgEv,_ZThn4_N3ccc8DD10x1y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y23abcEv,_ZTv0_n12_N3ccc8DD10x1y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y23pqrEv,_ZTv0_n16_N3ccc8DD10x1y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y23efgEv,_ZTv0_n20_N3ccc8DD10x1y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y2E[] = {
  {&(_ZTVN3ccc8DD10x1y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y2E[];
static VTBL_ENTRY alt_thunk_names2041[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y23efgEv,_ZTv0_n20_N3ccc8DD10x1y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y23efgEv,_ZThn4_N3ccc8DD10x1y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y23pqrEv,_ZTv0_n16_N3ccc8DD10x1y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y23pqrEv,_ZThn4_N3ccc8DD10x1y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y23abcEv,_ZTv0_n12_N3ccc8DD10x1y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y23abcEv,_ZThn4_N3ccc8DD10x1y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y2E = {  "_ZN3ccc8DD10x1y2E", // class name
  bases__ZN3ccc8DD10x1y2E, 2,
  &(vtc__ZN3ccc8DD10x1y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y2E),3, //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  CC10x1y3  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x1y33abcEv
  ~CC10x1y3(); // tgen
  CC10x1y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y3E) C1{ VBC2{ v2 v3} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y33efgEv");}
void  ccc::CC10x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y33pqrEv");}
void  ccc::CC10x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y33abcEv");}
ccc::CC10x1y3 ::~CC10x1y3(){ note_dtor("_ZN3ccc8CC10x1y3E", this);} // tgen
ccc::CC10x1y3 ::CC10x1y3(){ note_ctor("_ZN3ccc8CC10x1y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y3E, buf);
    ::ccc::CC10x1y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y3E);
    dp->::ccc::CC10x1y3::~CC10x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y3E(Test__ZN3ccc8CC10x1y3E, "_ZN3ccc8CC10x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y3C1Ev();
extern void _ZN3ccc8CC10x1y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y3E[] = {
  NSPAIR(_ZN3ccc8CC10x1y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y3E[];
extern void _ZN3ccc8CC10x1y33abcEv();
extern void _ZN3ccc8CC10x1y33pqrEv();
extern void _ZN3ccc8CC10x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y33pqrEv,_ZTv0_n12_N3ccc8CC10x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y33pqrEv,_ZThn4_N3ccc8CC10x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y33abcEv,_ZTv0_n16_N3ccc8CC10x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y33abcEv,_ZThn4_N3ccc8CC10x1y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y33pqrEv,_ZTv0_n12_N3ccc8CC10x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y33abcEv,_ZTv0_n16_N3ccc8CC10x1y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y3E[] = {
  {&(_ZTVN3ccc8CC10x1y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y3E[];
static VTBL_ENTRY alt_thunk_names2042[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y33abcEv,_ZTv0_n16_N3ccc8CC10x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y33abcEv,_ZThn4_N3ccc8CC10x1y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y33pqrEv,_ZTv0_n12_N3ccc8CC10x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y33pqrEv,_ZThn4_N3ccc8CC10x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y3E = {  "_ZN3ccc8CC10x1y3E", // class name
  bases__ZN3ccc8CC10x1y3E, 2,
  &(vtc__ZN3ccc8CC10x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y3E),2, //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  DD10x1y3  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD10x1y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x1y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x1y33abcEv
  ~DD10x1y3(); // tgen
  DD10x1y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y3E) C1{ VBC2{ v2 v3} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x1y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y33efgEv");}
void  ccc::DD10x1y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y33pqrEv");}
void  ccc::DD10x1y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y33abcEv");}
ccc::DD10x1y3 ::~DD10x1y3(){ note_dtor("_ZN3ccc8DD10x1y3E", this);} // tgen
ccc::DD10x1y3 ::DD10x1y3(){ note_ctor("_ZN3ccc8DD10x1y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y3E, buf);
    ::ccc::DD10x1y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y3E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y3E);
    dp->::ccc::DD10x1y3::~DD10x1y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y3E(Test__ZN3ccc8DD10x1y3E, "_ZN3ccc8DD10x1y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y3C1Ev();
extern void _ZN3ccc8DD10x1y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y3E[] = {
  NSPAIR(_ZN3ccc8DD10x1y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y3E[];
extern void _ZN3ccc8DD10x1y33pqrEv();
extern void _ZN3ccc8DD10x1y33abcEv();
extern void _ZN3ccc8DD10x1y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y33abcEv,_ZTv0_n12_N3ccc8DD10x1y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y33abcEv,_ZThn4_N3ccc8DD10x1y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y33pqrEv,_ZTv0_n16_N3ccc8DD10x1y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y33pqrEv,_ZThn4_N3ccc8DD10x1y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y33efgEv,_ZTv0_n20_N3ccc8DD10x1y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y33efgEv,_ZThn4_N3ccc8DD10x1y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y33abcEv,_ZTv0_n12_N3ccc8DD10x1y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y33pqrEv,_ZTv0_n16_N3ccc8DD10x1y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y33efgEv,_ZTv0_n20_N3ccc8DD10x1y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y3E[] = {
  {&(_ZTVN3ccc8DD10x1y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y3E[];
static VTBL_ENTRY alt_thunk_names2043[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y33efgEv,_ZTv0_n20_N3ccc8DD10x1y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y33efgEv,_ZThn4_N3ccc8DD10x1y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y33pqrEv,_ZTv0_n16_N3ccc8DD10x1y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y33pqrEv,_ZThn4_N3ccc8DD10x1y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y33abcEv,_ZTv0_n12_N3ccc8DD10x1y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y33abcEv,_ZThn4_N3ccc8DD10x1y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y3E = {  "_ZN3ccc8DD10x1y3E", // class name
  bases__ZN3ccc8DD10x1y3E, 2,
  &(vtc__ZN3ccc8DD10x1y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y3E),3, //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  CC10x1y4  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC10x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x1y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x1y43efgEv
  ~CC10x1y4(); // tgen
  CC10x1y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y4E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y43pqrEv");}
void  ccc::CC10x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y43abcEv");}
void  ccc::CC10x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y43efgEv");}
ccc::CC10x1y4 ::~CC10x1y4(){ note_dtor("_ZN3ccc8CC10x1y4E", this);} // tgen
ccc::CC10x1y4 ::CC10x1y4(){ note_ctor("_ZN3ccc8CC10x1y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y4E, buf);
    ::ccc::CC10x1y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y4E);
    dp->::ccc::CC10x1y4::~CC10x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y4E(Test__ZN3ccc8CC10x1y4E, "_ZN3ccc8CC10x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y4C1Ev();
extern void _ZN3ccc8CC10x1y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y4E[] = {
  NSPAIR(_ZN3ccc8CC10x1y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y4E[];
extern void _ZN3ccc8CC10x1y43abcEv();
extern void _ZN3ccc8CC10x1y43pqrEv();
extern void _ZN3ccc8CC10x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y43pqrEv,_ZTv0_n12_N3ccc8CC10x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y43pqrEv,_ZThn4_N3ccc8CC10x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y43abcEv,_ZTv0_n16_N3ccc8CC10x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y43abcEv,_ZThn4_N3ccc8CC10x1y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y43pqrEv,_ZTv0_n12_N3ccc8CC10x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y43abcEv,_ZTv0_n16_N3ccc8CC10x1y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y4E[] = {
  {&(_ZTVN3ccc8CC10x1y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y4E[];
static VTBL_ENTRY alt_thunk_names2044[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y43abcEv,_ZTv0_n16_N3ccc8CC10x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y43abcEv,_ZThn4_N3ccc8CC10x1y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y43pqrEv,_ZTv0_n12_N3ccc8CC10x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y43pqrEv,_ZThn4_N3ccc8CC10x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y4E = {  "_ZN3ccc8CC10x1y4E", // class name
  bases__ZN3ccc8CC10x1y4E, 2,
  &(vtc__ZN3ccc8CC10x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y4E),2, //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  DD10x1y4  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD10x1y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x1y43abcEv
  virtual void  efg(); // _ZN3ccc8DD10x1y43efgEv
  ~DD10x1y4(); // tgen
  DD10x1y4(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y4E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x1y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y43pqrEv");}
void  ccc::DD10x1y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y43abcEv");}
void  ccc::DD10x1y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y43efgEv");}
ccc::DD10x1y4 ::~DD10x1y4(){ note_dtor("_ZN3ccc8DD10x1y4E", this);} // tgen
ccc::DD10x1y4 ::DD10x1y4(){ note_ctor("_ZN3ccc8DD10x1y4E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y4E, buf);
    ::ccc::DD10x1y4 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y4E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y4E);
    dp->::ccc::DD10x1y4::~DD10x1y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y4E(Test__ZN3ccc8DD10x1y4E, "_ZN3ccc8DD10x1y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y4C1Ev();
extern void _ZN3ccc8DD10x1y4D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y4E[] = {
  NSPAIR(_ZN3ccc8DD10x1y4C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y4E[];
extern void _ZN3ccc8DD10x1y43pqrEv();
extern void _ZN3ccc8DD10x1y43abcEv();
extern void _ZN3ccc8DD10x1y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y43abcEv,_ZTv0_n12_N3ccc8DD10x1y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y43abcEv,_ZThn4_N3ccc8DD10x1y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y43pqrEv,_ZTv0_n16_N3ccc8DD10x1y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y43pqrEv,_ZThn4_N3ccc8DD10x1y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y43efgEv,_ZTv0_n20_N3ccc8DD10x1y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y43efgEv,_ZThn4_N3ccc8DD10x1y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y43abcEv,_ZTv0_n12_N3ccc8DD10x1y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y43pqrEv,_ZTv0_n16_N3ccc8DD10x1y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y43efgEv,_ZTv0_n20_N3ccc8DD10x1y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y4E[] = {
  {&(_ZTVN3ccc8DD10x1y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y4E[];
static VTBL_ENTRY alt_thunk_names2045[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y43efgEv,_ZTv0_n20_N3ccc8DD10x1y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y43efgEv,_ZThn4_N3ccc8DD10x1y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y43pqrEv,_ZTv0_n16_N3ccc8DD10x1y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y43pqrEv,_ZThn4_N3ccc8DD10x1y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y43abcEv,_ZTv0_n12_N3ccc8DD10x1y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y43abcEv,_ZThn4_N3ccc8DD10x1y43abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y4E = {  "_ZN3ccc8DD10x1y4E", // class name
  bases__ZN3ccc8DD10x1y4E, 2,
  &(vtc__ZN3ccc8DD10x1y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y4E),3, //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  CC10x1y5  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8CC10x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x1y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x1y53abcEv
  ~CC10x1y5(); // tgen
  CC10x1y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y5E) C1{ VBC2{ v1 v3} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y53pqrEv");}
void  ccc::CC10x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y53efgEv");}
void  ccc::CC10x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y53abcEv");}
ccc::CC10x1y5 ::~CC10x1y5(){ note_dtor("_ZN3ccc8CC10x1y5E", this);} // tgen
ccc::CC10x1y5 ::CC10x1y5(){ note_ctor("_ZN3ccc8CC10x1y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y5E, buf);
    ::ccc::CC10x1y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y5E);
    dp->::ccc::CC10x1y5::~CC10x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y5E(Test__ZN3ccc8CC10x1y5E, "_ZN3ccc8CC10x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y5C1Ev();
extern void _ZN3ccc8CC10x1y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y5E[] = {
  NSPAIR(_ZN3ccc8CC10x1y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y5E[];
extern void _ZN3ccc8CC10x1y53abcEv();
extern void _ZN3ccc8CC10x1y53pqrEv();
extern void _ZN3ccc8CC10x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y53pqrEv,_ZTv0_n12_N3ccc8CC10x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y53pqrEv,_ZThn4_N3ccc8CC10x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y53abcEv,_ZTv0_n16_N3ccc8CC10x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y53abcEv,_ZThn4_N3ccc8CC10x1y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y53pqrEv,_ZTv0_n12_N3ccc8CC10x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y53abcEv,_ZTv0_n16_N3ccc8CC10x1y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y5E[] = {
  {&(_ZTVN3ccc8CC10x1y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y5E[];
static VTBL_ENTRY alt_thunk_names2046[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y53abcEv,_ZTv0_n16_N3ccc8CC10x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y53abcEv,_ZThn4_N3ccc8CC10x1y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y53pqrEv,_ZTv0_n12_N3ccc8CC10x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y53pqrEv,_ZThn4_N3ccc8CC10x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y5E = {  "_ZN3ccc8CC10x1y5E", // class name
  bases__ZN3ccc8CC10x1y5E, 2,
  &(vtc__ZN3ccc8CC10x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y5E),2, //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  DD10x1y5  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc8DD10x1y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x1y53efgEv
  virtual void  abc(); // _ZN3ccc8DD10x1y53abcEv
  ~DD10x1y5(); // tgen
  DD10x1y5(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y5E) C1{ VBC2{ v1 v3} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x1y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y53pqrEv");}
void  ccc::DD10x1y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y53efgEv");}
void  ccc::DD10x1y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y53abcEv");}
ccc::DD10x1y5 ::~DD10x1y5(){ note_dtor("_ZN3ccc8DD10x1y5E", this);} // tgen
ccc::DD10x1y5 ::DD10x1y5(){ note_ctor("_ZN3ccc8DD10x1y5E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y5E, buf);
    ::ccc::DD10x1y5 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y5E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y5E);
    dp->::ccc::DD10x1y5::~DD10x1y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y5E(Test__ZN3ccc8DD10x1y5E, "_ZN3ccc8DD10x1y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y5C1Ev();
extern void _ZN3ccc8DD10x1y5D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y5E[] = {
  NSPAIR(_ZN3ccc8DD10x1y5C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y5E[];
extern void _ZN3ccc8DD10x1y53pqrEv();
extern void _ZN3ccc8DD10x1y53abcEv();
extern void _ZN3ccc8DD10x1y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y53abcEv,_ZTv0_n12_N3ccc8DD10x1y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y53abcEv,_ZThn4_N3ccc8DD10x1y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y53pqrEv,_ZTv0_n16_N3ccc8DD10x1y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y53pqrEv,_ZThn4_N3ccc8DD10x1y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y53efgEv,_ZTv0_n20_N3ccc8DD10x1y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y53efgEv,_ZThn4_N3ccc8DD10x1y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y53abcEv,_ZTv0_n12_N3ccc8DD10x1y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y53pqrEv,_ZTv0_n16_N3ccc8DD10x1y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y53efgEv,_ZTv0_n20_N3ccc8DD10x1y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y5E[] = {
  {&(_ZTVN3ccc8DD10x1y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y5E[];
static VTBL_ENTRY alt_thunk_names2047[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y53efgEv,_ZTv0_n20_N3ccc8DD10x1y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y53efgEv,_ZThn4_N3ccc8DD10x1y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y53pqrEv,_ZTv0_n16_N3ccc8DD10x1y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y53pqrEv,_ZThn4_N3ccc8DD10x1y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y53abcEv,_ZTv0_n12_N3ccc8DD10x1y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y53abcEv,_ZThn4_N3ccc8DD10x1y53abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y5E = {  "_ZN3ccc8DD10x1y5E", // class name
  bases__ZN3ccc8DD10x1y5E, 2,
  &(vtc__ZN3ccc8DD10x1y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y5E),3, //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  CC10x1y6  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x1y63efgEv
  ~CC10x1y6(); // tgen
  CC10x1y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y6E) C1{ VBC2{ v3 v1} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y63abcEv");}
void  ccc::CC10x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y63efgEv");}
ccc::CC10x1y6 ::~CC10x1y6(){ note_dtor("_ZN3ccc8CC10x1y6E", this);} // tgen
ccc::CC10x1y6 ::CC10x1y6(){ note_ctor("_ZN3ccc8CC10x1y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y6E, buf);
    ::ccc::CC10x1y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y6E);
    dp->::ccc::CC10x1y6::~CC10x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y6E(Test__ZN3ccc8CC10x1y6E, "_ZN3ccc8CC10x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y6C1Ev();
extern void _ZN3ccc8CC10x1y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y6E[] = {
  NSPAIR(_ZN3ccc8CC10x1y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y6E[];
extern void _ZN3ccc8CC10x1y63abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC10x1y63efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y63abcEv,_ZTv0_n16_N3ccc8CC10x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y63abcEv,_ZThn4_N3ccc8CC10x1y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y63abcEv,_ZTv0_n16_N3ccc8CC10x1y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y6E[] = {
  {&(_ZTVN3ccc8CC10x1y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y6E[];
static VTBL_ENTRY alt_thunk_names2048[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y63abcEv,_ZTv0_n16_N3ccc8CC10x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y63abcEv,_ZThn4_N3ccc8CC10x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y6E = {  "_ZN3ccc8CC10x1y6E", // class name
  bases__ZN3ccc8CC10x1y6E, 2,
  &(vtc__ZN3ccc8CC10x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y6E),2, //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  DD10x1y6  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD10x1y63abcEv
  virtual void  efg(); // _ZN3ccc8DD10x1y63efgEv
  ~DD10x1y6(); // tgen
  DD10x1y6(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y6E) C1{ VBC2{ v3 v1} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x1y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y63abcEv");}
void  ccc::DD10x1y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y63efgEv");}
ccc::DD10x1y6 ::~DD10x1y6(){ note_dtor("_ZN3ccc8DD10x1y6E", this);} // tgen
ccc::DD10x1y6 ::DD10x1y6(){ note_ctor("_ZN3ccc8DD10x1y6E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y6E, buf);
    ::ccc::DD10x1y6 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y6E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y6E);
    dp->::ccc::DD10x1y6::~DD10x1y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y6E(Test__ZN3ccc8DD10x1y6E, "_ZN3ccc8DD10x1y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y6C1Ev();
extern void _ZN3ccc8DD10x1y6D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y6E[] = {
  NSPAIR(_ZN3ccc8DD10x1y6C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x1y63abcEv();
extern void _ZN3ccc8DD10x1y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y63abcEv,_ZTv0_n12_N3ccc8DD10x1y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y63abcEv,_ZThn4_N3ccc8DD10x1y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y63efgEv,_ZTv0_n20_N3ccc8DD10x1y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y63efgEv,_ZThn4_N3ccc8DD10x1y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y63abcEv,_ZTv0_n12_N3ccc8DD10x1y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y63efgEv,_ZTv0_n20_N3ccc8DD10x1y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y6E[] = {
  {&(_ZTVN3ccc8DD10x1y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y6E[];
static VTBL_ENTRY alt_thunk_names2049[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y63efgEv,_ZTv0_n20_N3ccc8DD10x1y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y63efgEv,_ZThn4_N3ccc8DD10x1y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y63abcEv,_ZTv0_n12_N3ccc8DD10x1y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y63abcEv,_ZThn4_N3ccc8DD10x1y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y6E = {  "_ZN3ccc8DD10x1y6E", // class name
  bases__ZN3ccc8DD10x1y6E, 2,
  &(vtc__ZN3ccc8DD10x1y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y6E),3, //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  CC10x1y7  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8CC10x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y73pqrEv
  ~CC10x1y7(); // tgen
  CC10x1y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y7E) C1{ VBC2{ v2 v1} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y73abcEv");}
void  ccc::CC10x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y73pqrEv");}
ccc::CC10x1y7 ::~CC10x1y7(){ note_dtor("_ZN3ccc8CC10x1y7E", this);} // tgen
ccc::CC10x1y7 ::CC10x1y7(){ note_ctor("_ZN3ccc8CC10x1y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y7E, buf);
    ::ccc::CC10x1y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y7E);
    dp->::ccc::CC10x1y7::~CC10x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y7E(Test__ZN3ccc8CC10x1y7E, "_ZN3ccc8CC10x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y7C1Ev();
extern void _ZN3ccc8CC10x1y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y7E[] = {
  NSPAIR(_ZN3ccc8CC10x1y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y7E[];
extern void _ZN3ccc8CC10x1y73abcEv();
extern void _ZN3ccc8CC10x1y73pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y73pqrEv,_ZTv0_n12_N3ccc8CC10x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y73pqrEv,_ZThn4_N3ccc8CC10x1y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y73abcEv,_ZTv0_n16_N3ccc8CC10x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y73abcEv,_ZThn4_N3ccc8CC10x1y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y73pqrEv,_ZTv0_n12_N3ccc8CC10x1y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y73abcEv,_ZTv0_n16_N3ccc8CC10x1y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y7E[] = {
  {&(_ZTVN3ccc8CC10x1y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y7E[];
static VTBL_ENTRY alt_thunk_names2050[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y73abcEv,_ZTv0_n16_N3ccc8CC10x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y73abcEv,_ZThn4_N3ccc8CC10x1y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y73pqrEv,_ZTv0_n12_N3ccc8CC10x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y73pqrEv,_ZThn4_N3ccc8CC10x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y7E = {  "_ZN3ccc8CC10x1y7E", // class name
  bases__ZN3ccc8CC10x1y7E, 2,
  &(vtc__ZN3ccc8CC10x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y7E),2, //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  DD10x1y7  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc8DD10x1y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x1y73pqrEv
  ~DD10x1y7(); // tgen
  DD10x1y7(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y7E) C1{ VBC2{ v2 v1} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD10x1y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y73abcEv");}
void  ccc::DD10x1y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y73pqrEv");}
ccc::DD10x1y7 ::~DD10x1y7(){ note_dtor("_ZN3ccc8DD10x1y7E", this);} // tgen
ccc::DD10x1y7 ::DD10x1y7(){ note_ctor("_ZN3ccc8DD10x1y7E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y7E, buf);
    ::ccc::DD10x1y7 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y7E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y7E);
    dp->::ccc::DD10x1y7::~DD10x1y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y7E(Test__ZN3ccc8DD10x1y7E, "_ZN3ccc8DD10x1y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y7C1Ev();
extern void _ZN3ccc8DD10x1y7D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y7E[] = {
  NSPAIR(_ZN3ccc8DD10x1y7C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y7E[];
extern void _ZN3ccc8DD10x1y73pqrEv();
extern void _ZN3ccc8DD10x1y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y73abcEv,_ZTv0_n12_N3ccc8DD10x1y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y73abcEv,_ZThn4_N3ccc8DD10x1y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y73pqrEv,_ZTv0_n16_N3ccc8DD10x1y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y73pqrEv,_ZThn4_N3ccc8DD10x1y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y73abcEv,_ZTv0_n12_N3ccc8DD10x1y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y73pqrEv,_ZTv0_n16_N3ccc8DD10x1y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y7E[] = {
  {&(_ZTVN3ccc8DD10x1y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x1y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x1y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y7E[];
static VTBL_ENTRY alt_thunk_names2051[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y73pqrEv,_ZTv0_n16_N3ccc8DD10x1y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y73pqrEv,_ZThn4_N3ccc8DD10x1y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y73abcEv,_ZTv0_n12_N3ccc8DD10x1y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y73abcEv,_ZThn4_N3ccc8DD10x1y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y7E = {  "_ZN3ccc8DD10x1y7E", // class name
  bases__ZN3ccc8DD10x1y7E, 2,
  &(vtc__ZN3ccc8DD10x1y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y7E),3, //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  CC10x1y8  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x1y83abcEv
  ~CC10x1y8(); // tgen
  CC10x1y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y8E) C1{ VBC2{ v3 v2} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y83efgEv");}
void  ccc::CC10x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x1y83abcEv");}
ccc::CC10x1y8 ::~CC10x1y8(){ note_dtor("_ZN3ccc8CC10x1y8E", this);} // tgen
ccc::CC10x1y8 ::CC10x1y8(){ note_ctor("_ZN3ccc8CC10x1y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y8E, buf);
    ::ccc::CC10x1y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y8E);
    dp->::ccc::CC10x1y8::~CC10x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y8E(Test__ZN3ccc8CC10x1y8E, "_ZN3ccc8CC10x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y8C1Ev();
extern void _ZN3ccc8CC10x1y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y8E[] = {
  NSPAIR(_ZN3ccc8CC10x1y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y8E[];
extern void _ZN3ccc8CC10x1y83abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc8CC10x1y83efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x1y83abcEv,_ZTv0_n16_N3ccc8CC10x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y83abcEv,_ZThn4_N3ccc8CC10x1y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x1y83abcEv,_ZTv0_n16_N3ccc8CC10x1y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y8E[] = {
  {&(_ZTVN3ccc8CC10x1y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y8E[];
static VTBL_ENTRY alt_thunk_names2052[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x1y83abcEv,_ZTv0_n16_N3ccc8CC10x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y83abcEv,_ZThn4_N3ccc8CC10x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y8E = {  "_ZN3ccc8CC10x1y8E", // class name
  bases__ZN3ccc8CC10x1y8E, 2,
  &(vtc__ZN3ccc8CC10x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y8E),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  DD10x1y8  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD10x1y83efgEv
  virtual void  abc(); // _ZN3ccc8DD10x1y83abcEv
  ~DD10x1y8(); // tgen
  DD10x1y8(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y8E) C1{ VBC2{ v3 v2} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x1y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y83efgEv");}
void  ccc::DD10x1y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x1y83abcEv");}
ccc::DD10x1y8 ::~DD10x1y8(){ note_dtor("_ZN3ccc8DD10x1y8E", this);} // tgen
ccc::DD10x1y8 ::DD10x1y8(){ note_ctor("_ZN3ccc8DD10x1y8E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y8E, buf);
    ::ccc::DD10x1y8 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y8E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y8E);
    dp->::ccc::DD10x1y8::~DD10x1y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y8E(Test__ZN3ccc8DD10x1y8E, "_ZN3ccc8DD10x1y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y8C1Ev();
extern void _ZN3ccc8DD10x1y8D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y8E[] = {
  NSPAIR(_ZN3ccc8DD10x1y8C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x1y83abcEv();
extern void _ZN3ccc8DD10x1y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x1y83abcEv,_ZTv0_n12_N3ccc8DD10x1y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y83abcEv,_ZThn4_N3ccc8DD10x1y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y83efgEv,_ZTv0_n20_N3ccc8DD10x1y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y83efgEv,_ZThn4_N3ccc8DD10x1y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x1y83abcEv,_ZTv0_n12_N3ccc8DD10x1y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y83efgEv,_ZTv0_n20_N3ccc8DD10x1y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y8E[] = {
  {&(_ZTVN3ccc8DD10x1y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y8E[];
static VTBL_ENTRY alt_thunk_names2053[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y83efgEv,_ZTv0_n20_N3ccc8DD10x1y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y83efgEv,_ZThn4_N3ccc8DD10x1y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x1y83abcEv,_ZTv0_n12_N3ccc8DD10x1y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y83abcEv,_ZThn4_N3ccc8DD10x1y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y8E = {  "_ZN3ccc8DD10x1y8E", // class name
  bases__ZN3ccc8DD10x1y8E, 2,
  &(vtc__ZN3ccc8DD10x1y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y8E),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  CC10x1y9  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8CC10x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x1y93pqrEv
  ~CC10x1y9(); // tgen
  CC10x1y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x1y9E) C1{ VBC2{ v2 v3} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x1y93efgEv");}
void  ccc::CC10x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x1y93pqrEv");}
ccc::CC10x1y9 ::~CC10x1y9(){ note_dtor("_ZN3ccc8CC10x1y9E", this);} // tgen
ccc::CC10x1y9 ::CC10x1y9(){ note_ctor("_ZN3ccc8CC10x1y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x1y9E, buf);
    ::ccc::CC10x1y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x1y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc8CC10x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x1y9E);
    dp->::ccc::CC10x1y9::~CC10x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x1y9E(Test__ZN3ccc8CC10x1y9E, "_ZN3ccc8CC10x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x1y9C1Ev();
extern void _ZN3ccc8CC10x1y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x1y9E[] = {
  NSPAIR(_ZN3ccc8CC10x1y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8CC10x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x1y9E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc8CC10x1y93pqrEv();
extern void _ZN3ccc8CC10x1y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x1y93pqrEv,_ZTv0_n12_N3ccc8CC10x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x1y93pqrEv,_ZThn4_N3ccc8CC10x1y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x1y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x1y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x1y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x1y93pqrEv,_ZTv0_n12_N3ccc8CC10x1y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x1y9E[] = {
  {&(_ZTVN3ccc8CC10x1y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x1y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x1y9E[];
static VTBL_ENTRY alt_thunk_names2054[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x1y93pqrEv,_ZTv0_n12_N3ccc8CC10x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x1y93pqrEv,_ZThn4_N3ccc8CC10x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x1y9E = {  "_ZN3ccc8CC10x1y9E", // class name
  bases__ZN3ccc8CC10x1y9E, 2,
  &(vtc__ZN3ccc8CC10x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x1y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x1y9E),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  DD10x1y9  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc8DD10x1y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x1y93pqrEv
  ~DD10x1y9(); // tgen
  DD10x1y9(); // tgen
};
//SIG(1 _ZN3ccc8DD10x1y9E) C1{ VBC2{ v2 v3} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x1y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x1y93efgEv");}
void  ccc::DD10x1y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x1y93pqrEv");}
ccc::DD10x1y9 ::~DD10x1y9(){ note_dtor("_ZN3ccc8DD10x1y9E", this);} // tgen
ccc::DD10x1y9 ::DD10x1y9(){ note_ctor("_ZN3ccc8DD10x1y9E", this);} // tgen
}
static void Test__ZN3ccc8DD10x1y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x1y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x1y9E, buf);
    ::ccc::DD10x1y9 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x1y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x1y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x1y9E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc8DD10x1y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x1y9E);
    dp->::ccc::DD10x1y9::~DD10x1y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x1y9E(Test__ZN3ccc8DD10x1y9E, "_ZN3ccc8DD10x1y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x1y9C1Ev();
extern void _ZN3ccc8DD10x1y9D1Ev();
Name_Map name_map__ZN3ccc8DD10x1y9E[] = {
  NSPAIR(_ZN3ccc8DD10x1y9C1Ev),
  NSPAIR(_ZN3ccc8DD10x1y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc8DD10x1y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y9E[];
extern void _ZN3ccc8DD10x1y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8DD10x1y93efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x1y93pqrEv,_ZTv0_n16_N3ccc8DD10x1y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y93pqrEv,_ZThn4_N3ccc8DD10x1y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x1y93efgEv,_ZTv0_n20_N3ccc8DD10x1y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x1y93efgEv,_ZThn4_N3ccc8DD10x1y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x1y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x1y93efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x1y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x1y93pqrEv,_ZTv0_n16_N3ccc8DD10x1y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x1y93efgEv,_ZTv0_n20_N3ccc8DD10x1y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x1y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x1y9E[] = {
  {&(_ZTVN3ccc8DD10x1y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x1y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x1y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x1y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x1y9E[];
static VTBL_ENTRY alt_thunk_names2055[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x1y93efgEv,_ZTv0_n20_N3ccc8DD10x1y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y93efgEv,_ZThn4_N3ccc8DD10x1y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x1y93pqrEv,_ZTv0_n16_N3ccc8DD10x1y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x1y93pqrEv,_ZThn4_N3ccc8DD10x1y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x1y9E = {  "_ZN3ccc8DD10x1y9E", // class name
  bases__ZN3ccc8DD10x1y9E, 2,
  &(vtc__ZN3ccc8DD10x1y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x1y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x1y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x1y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x1y9E),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  CC10x1y10  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC10x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x1y103abcEv
  ~CC10x1y10(); // tgen
  CC10x1y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y10E) C1{ VBC2{ v1 v2} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x1y103pqrEv");}
void  ccc::CC10x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x1y103abcEv");}
ccc::CC10x1y10 ::~CC10x1y10(){ note_dtor("_ZN3ccc9CC10x1y10E", this);} // tgen
ccc::CC10x1y10 ::CC10x1y10(){ note_ctor("_ZN3ccc9CC10x1y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x1y10E, buf);
    ::ccc::CC10x1y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x1y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC10x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x1y10E);
    dp->::ccc::CC10x1y10::~CC10x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x1y10E(Test__ZN3ccc9CC10x1y10E, "_ZN3ccc9CC10x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x1y10C1Ev();
extern void _ZN3ccc9CC10x1y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x1y10E[] = {
  NSPAIR(_ZN3ccc9CC10x1y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC10x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x1y10E[];
extern void _ZN3ccc9CC10x1y103abcEv();
extern void _ZN3ccc9CC10x1y103pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x1y103pqrEv,_ZTv0_n12_N3ccc9CC10x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y103pqrEv,_ZThn4_N3ccc9CC10x1y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x1y103abcEv,_ZTv0_n16_N3ccc9CC10x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y103abcEv,_ZThn4_N3ccc9CC10x1y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x1y103pqrEv,_ZTv0_n12_N3ccc9CC10x1y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x1y103abcEv,_ZTv0_n16_N3ccc9CC10x1y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x1y10E[] = {
  {&(_ZTVN3ccc9CC10x1y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x1y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x1y10E[];
static VTBL_ENTRY alt_thunk_names2056[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x1y103abcEv,_ZTv0_n16_N3ccc9CC10x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x1y103abcEv,_ZThn4_N3ccc9CC10x1y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x1y103pqrEv,_ZTv0_n12_N3ccc9CC10x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x1y103pqrEv,_ZThn4_N3ccc9CC10x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x1y10E = {  "_ZN3ccc9CC10x1y10E", // class name
  bases__ZN3ccc9CC10x1y10E, 2,
  &(vtc__ZN3ccc9CC10x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x1y10E),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  DD10x1y10  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9DD10x1y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD10x1y103abcEv
  ~DD10x1y10(); // tgen
  DD10x1y10(); // tgen
};
//SIG(1 _ZN3ccc9DD10x1y10E) C1{ VBC2{ v1 v2} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD10x1y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x1y103pqrEv");}
void  ccc::DD10x1y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x1y103abcEv");}
ccc::DD10x1y10 ::~DD10x1y10(){ note_dtor("_ZN3ccc9DD10x1y10E", this);} // tgen
ccc::DD10x1y10 ::DD10x1y10(){ note_ctor("_ZN3ccc9DD10x1y10E", this);} // tgen
}
static void Test__ZN3ccc9DD10x1y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x1y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x1y10E, buf);
    ::ccc::DD10x1y10 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x1y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x1y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x1y10E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9DD10x1y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x1y10E);
    dp->::ccc::DD10x1y10::~DD10x1y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x1y10E(Test__ZN3ccc9DD10x1y10E, "_ZN3ccc9DD10x1y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x1y10C1Ev();
extern void _ZN3ccc9DD10x1y10D1Ev();
Name_Map name_map__ZN3ccc9DD10x1y10E[] = {
  NSPAIR(_ZN3ccc9DD10x1y10C1Ev),
  NSPAIR(_ZN3ccc9DD10x1y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9DD10x1y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y10E[];
extern void _ZN3ccc9DD10x1y103pqrEv();
extern void _ZN3ccc9DD10x1y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x1y103abcEv,_ZTv0_n12_N3ccc9DD10x1y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y103abcEv,_ZThn4_N3ccc9DD10x1y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x1y103pqrEv,_ZTv0_n16_N3ccc9DD10x1y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y103pqrEv,_ZThn4_N3ccc9DD10x1y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x1y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x1y103abcEv,_ZTv0_n12_N3ccc9DD10x1y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x1y103pqrEv,_ZTv0_n16_N3ccc9DD10x1y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x1y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x1y10E[] = {
  {&(_ZTVN3ccc9DD10x1y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x1y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x1y10E[];
static VTBL_ENTRY alt_thunk_names2057[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x1y103pqrEv,_ZTv0_n16_N3ccc9DD10x1y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y103pqrEv,_ZThn4_N3ccc9DD10x1y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x1y103abcEv,_ZTv0_n12_N3ccc9DD10x1y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y103abcEv,_ZThn4_N3ccc9DD10x1y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x1y10E = {  "_ZN3ccc9DD10x1y10E", // class name
  bases__ZN3ccc9DD10x1y10E, 2,
  &(vtc__ZN3ccc9DD10x1y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x1y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x1y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x1y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x1y10E),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  CC10x1y11  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC10x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x1y113efgEv
  ~CC10x1y11(); // tgen
  CC10x1y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y11E) C1{ VBC2{ v1 v3} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x1y113pqrEv");}
void  ccc::CC10x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x1y113efgEv");}
ccc::CC10x1y11 ::~CC10x1y11(){ note_dtor("_ZN3ccc9CC10x1y11E", this);} // tgen
ccc::CC10x1y11 ::CC10x1y11(){ note_ctor("_ZN3ccc9CC10x1y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x1y11E, buf);
    ::ccc::CC10x1y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x1y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC10x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x1y11E);
    dp->::ccc::CC10x1y11::~CC10x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x1y11E(Test__ZN3ccc9CC10x1y11E, "_ZN3ccc9CC10x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x1y11C1Ev();
extern void _ZN3ccc9CC10x1y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x1y11E[] = {
  NSPAIR(_ZN3ccc9CC10x1y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC10x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x1y11E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc9CC10x1y113pqrEv();
extern void _ZN3ccc9CC10x1y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x1y113pqrEv,_ZTv0_n12_N3ccc9CC10x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y113pqrEv,_ZThn4_N3ccc9CC10x1y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x1y113pqrEv,_ZTv0_n12_N3ccc9CC10x1y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x1y11E[] = {
  {&(_ZTVN3ccc9CC10x1y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x1y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x1y11E[];
static VTBL_ENTRY alt_thunk_names2058[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x1y113pqrEv,_ZTv0_n12_N3ccc9CC10x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x1y113pqrEv,_ZThn4_N3ccc9CC10x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x1y11E = {  "_ZN3ccc9CC10x1y11E", // class name
  bases__ZN3ccc9CC10x1y11E, 2,
  &(vtc__ZN3ccc9CC10x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x1y11E),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  DD10x1y11  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9DD10x1y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD10x1y113efgEv
  ~DD10x1y11(); // tgen
  DD10x1y11(); // tgen
};
//SIG(1 _ZN3ccc9DD10x1y11E) C1{ VBC2{ v1 v3} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x1y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x1y113pqrEv");}
void  ccc::DD10x1y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x1y113efgEv");}
ccc::DD10x1y11 ::~DD10x1y11(){ note_dtor("_ZN3ccc9DD10x1y11E", this);} // tgen
ccc::DD10x1y11 ::DD10x1y11(){ note_ctor("_ZN3ccc9DD10x1y11E", this);} // tgen
}
static void Test__ZN3ccc9DD10x1y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x1y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x1y11E, buf);
    ::ccc::DD10x1y11 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x1y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x1y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x1y11E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9DD10x1y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x1y11E);
    dp->::ccc::DD10x1y11::~DD10x1y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x1y11E(Test__ZN3ccc9DD10x1y11E, "_ZN3ccc9DD10x1y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x1y11C1Ev();
extern void _ZN3ccc9DD10x1y11D1Ev();
Name_Map name_map__ZN3ccc9DD10x1y11E[] = {
  NSPAIR(_ZN3ccc9DD10x1y11C1Ev),
  NSPAIR(_ZN3ccc9DD10x1y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9DD10x1y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y11E[];
extern void _ZN3ccc9DD10x1y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x1y113efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x1y113pqrEv,_ZTv0_n16_N3ccc9DD10x1y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y113pqrEv,_ZThn4_N3ccc9DD10x1y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x1y113efgEv,_ZTv0_n20_N3ccc9DD10x1y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y113efgEv,_ZThn4_N3ccc9DD10x1y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x1y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y113efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x1y113pqrEv,_ZTv0_n16_N3ccc9DD10x1y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x1y113efgEv,_ZTv0_n20_N3ccc9DD10x1y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x1y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x1y11E[] = {
  {&(_ZTVN3ccc9DD10x1y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x1y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x1y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x1y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x1y11E[];
static VTBL_ENTRY alt_thunk_names2059[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x1y113efgEv,_ZTv0_n20_N3ccc9DD10x1y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y113efgEv,_ZThn4_N3ccc9DD10x1y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x1y113pqrEv,_ZTv0_n16_N3ccc9DD10x1y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y113pqrEv,_ZThn4_N3ccc9DD10x1y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x1y11E = {  "_ZN3ccc9DD10x1y11E", // class name
  bases__ZN3ccc9DD10x1y11E, 2,
  &(vtc__ZN3ccc9DD10x1y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x1y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x1y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x1y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x1y11E),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  CC10x1y12  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9CC10x1y123abcEv
  ~CC10x1y12(); // tgen
  CC10x1y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y12E) C1{ VBC2{ v2 v1} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x1y123abcEv");}
ccc::CC10x1y12 ::~CC10x1y12(){ note_dtor("_ZN3ccc9CC10x1y12E", this);} // tgen
ccc::CC10x1y12 ::CC10x1y12(){ note_ctor("_ZN3ccc9CC10x1y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x1y12E, buf);
    ::ccc::CC10x1y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x1y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC10x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x1y12E);
    dp->::ccc::CC10x1y12::~CC10x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x1y12E(Test__ZN3ccc9CC10x1y12E, "_ZN3ccc9CC10x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x1y12C1Ev();
extern void _ZN3ccc9CC10x1y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x1y12E[] = {
  NSPAIR(_ZN3ccc9CC10x1y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC10x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x1y12E[];
extern void _ZN3ccc9CC10x1y123abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x1y123abcEv,_ZTv0_n16_N3ccc9CC10x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y123abcEv,_ZThn4_N3ccc9CC10x1y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x1y123abcEv,_ZTv0_n16_N3ccc9CC10x1y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x1y12E[] = {
  {&(_ZTVN3ccc9CC10x1y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x1y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x1y12E[];
static VTBL_ENTRY alt_thunk_names2060[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x1y123abcEv,_ZTv0_n16_N3ccc9CC10x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x1y123abcEv,_ZThn4_N3ccc9CC10x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x1y12E = {  "_ZN3ccc9CC10x1y12E", // class name
  bases__ZN3ccc9CC10x1y12E, 2,
  &(vtc__ZN3ccc9CC10x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x1y12E),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  DD10x1y12  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  abc(); // _ZN3ccc9DD10x1y123abcEv
  ~DD10x1y12(); // tgen
  DD10x1y12(); // tgen
};
//SIG(1 _ZN3ccc9DD10x1y12E) C1{ VBC2{ v2 v1} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD10x1y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x1y123abcEv");}
ccc::DD10x1y12 ::~DD10x1y12(){ note_dtor("_ZN3ccc9DD10x1y12E", this);} // tgen
ccc::DD10x1y12 ::DD10x1y12(){ note_ctor("_ZN3ccc9DD10x1y12E", this);} // tgen
}
static void Test__ZN3ccc9DD10x1y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x1y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x1y12E, buf);
    ::ccc::DD10x1y12 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x1y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x1y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x1y12E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9DD10x1y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x1y12E);
    dp->::ccc::DD10x1y12::~DD10x1y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x1y12E(Test__ZN3ccc9DD10x1y12E, "_ZN3ccc9DD10x1y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x1y12C1Ev();
extern void _ZN3ccc9DD10x1y12D1Ev();
Name_Map name_map__ZN3ccc9DD10x1y12E[] = {
  NSPAIR(_ZN3ccc9DD10x1y12C1Ev),
  NSPAIR(_ZN3ccc9DD10x1y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9DD10x1y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9DD10x1y123abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x1y123abcEv,_ZTv0_n12_N3ccc9DD10x1y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y123abcEv,_ZThn4_N3ccc9DD10x1y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x1y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y123abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y12E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x1y123abcEv,_ZTv0_n12_N3ccc9DD10x1y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x1y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x1y12E[] = {
  {&(_ZTVN3ccc9DD10x1y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x1y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x1y12E[];
static VTBL_ENTRY alt_thunk_names2061[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x1y123abcEv,_ZTv0_n12_N3ccc9DD10x1y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y123abcEv,_ZThn4_N3ccc9DD10x1y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x1y12E = {  "_ZN3ccc9DD10x1y12E", // class name
  bases__ZN3ccc9DD10x1y12E, 2,
  &(vtc__ZN3ccc9DD10x1y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x1y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x1y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x1y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x1y12E),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  CC10x1y13  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9CC10x1y133efgEv
  ~CC10x1y13(); // tgen
  CC10x1y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y13E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC10x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x1y133efgEv");}
ccc::CC10x1y13 ::~CC10x1y13(){ note_dtor("_ZN3ccc9CC10x1y13E", this);} // tgen
ccc::CC10x1y13 ::CC10x1y13(){ note_ctor("_ZN3ccc9CC10x1y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x1y13E, buf);
    ::ccc::CC10x1y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x1y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC10x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x1y13E);
    dp->::ccc::CC10x1y13::~CC10x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x1y13E(Test__ZN3ccc9CC10x1y13E, "_ZN3ccc9CC10x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x1y13C1Ev();
extern void _ZN3ccc9CC10x1y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x1y13E[] = {
  NSPAIR(_ZN3ccc9CC10x1y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC10x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x1y13E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc9CC10x1y133efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x1y13E[] = {
  {&(_ZTVN3ccc9CC10x1y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x1y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x1y13E[];
Class_Descriptor cd__ZN3ccc9CC10x1y13E = {  "_ZN3ccc9CC10x1y13E", // class name
  bases__ZN3ccc9CC10x1y13E, 2,
  &(vtc__ZN3ccc9CC10x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x1y13E),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  DD10x1y13  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  efg(); // _ZN3ccc9DD10x1y133efgEv
  ~DD10x1y13(); // tgen
  DD10x1y13(); // tgen
};
//SIG(1 _ZN3ccc9DD10x1y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD10x1y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x1y133efgEv");}
ccc::DD10x1y13 ::~DD10x1y13(){ note_dtor("_ZN3ccc9DD10x1y13E", this);} // tgen
ccc::DD10x1y13 ::DD10x1y13(){ note_ctor("_ZN3ccc9DD10x1y13E", this);} // tgen
}
static void Test__ZN3ccc9DD10x1y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x1y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x1y13E, buf);
    ::ccc::DD10x1y13 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x1y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x1y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x1y13E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9DD10x1y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x1y13E);
    dp->::ccc::DD10x1y13::~DD10x1y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x1y13E(Test__ZN3ccc9DD10x1y13E, "_ZN3ccc9DD10x1y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x1y13C1Ev();
extern void _ZN3ccc9DD10x1y13D1Ev();
Name_Map name_map__ZN3ccc9DD10x1y13E[] = {
  NSPAIR(_ZN3ccc9DD10x1y13C1Ev),
  NSPAIR(_ZN3ccc9DD10x1y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9DD10x1y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x1y133efgEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x1y133efgEv,_ZTv0_n20_N3ccc9DD10x1y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y133efgEv,_ZThn4_N3ccc9DD10x1y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x1y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x1y133efgEv,_ZTv0_n20_N3ccc9DD10x1y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x1y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x1y13E[] = {
  {&(_ZTVN3ccc9DD10x1y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x1y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x1y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x1y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x1y13E[];
static VTBL_ENTRY alt_thunk_names2062[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x1y133efgEv,_ZTv0_n20_N3ccc9DD10x1y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y133efgEv,_ZThn4_N3ccc9DD10x1y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x1y13E = {  "_ZN3ccc9DD10x1y13E", // class name
  bases__ZN3ccc9DD10x1y13E, 2,
  &(vtc__ZN3ccc9DD10x1y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x1y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x1y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x1y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x1y13E),3, //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  CC10x1y14  : virtual ::ccc::AA10 , ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9CC10x1y143pqrEv
  ~CC10x1y14(); // tgen
  CC10x1y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y14E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC10x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x1y143pqrEv");}
ccc::CC10x1y14 ::~CC10x1y14(){ note_dtor("_ZN3ccc9CC10x1y14E", this);} // tgen
ccc::CC10x1y14 ::CC10x1y14(){ note_ctor("_ZN3ccc9CC10x1y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x1y14E, buf);
    ::ccc::CC10x1y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x1y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC10x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x1y14E);
    dp->::ccc::CC10x1y14::~CC10x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x1y14E(Test__ZN3ccc9CC10x1y14E, "_ZN3ccc9CC10x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x1y14C1Ev();
extern void _ZN3ccc9CC10x1y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x1y14E[] = {
  NSPAIR(_ZN3ccc9CC10x1y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC10x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x1y14E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc9CC10x1y143pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x1y143pqrEv,_ZTv0_n12_N3ccc9CC10x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x1y143pqrEv,_ZThn4_N3ccc9CC10x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x1y143pqrEv,_ZTv0_n12_N3ccc9CC10x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x1y14E[] = {
  {&(_ZTVN3ccc9CC10x1y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x1y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x1y14E[];
static VTBL_ENTRY alt_thunk_names2063[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x1y143pqrEv,_ZTv0_n12_N3ccc9CC10x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x1y143pqrEv,_ZThn4_N3ccc9CC10x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x1y14E = {  "_ZN3ccc9CC10x1y14E", // class name
  bases__ZN3ccc9CC10x1y14E, 2,
  &(vtc__ZN3ccc9CC10x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x1y14E),2, //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  DD10x1y14  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  virtual void  pqr(); // _ZN3ccc9DD10x1y143pqrEv
  ~DD10x1y14(); // tgen
  DD10x1y14(); // tgen
};
//SIG(1 _ZN3ccc9DD10x1y14E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD10x1y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x1y143pqrEv");}
ccc::DD10x1y14 ::~DD10x1y14(){ note_dtor("_ZN3ccc9DD10x1y14E", this);} // tgen
ccc::DD10x1y14 ::DD10x1y14(){ note_ctor("_ZN3ccc9DD10x1y14E", this);} // tgen
}
static void Test__ZN3ccc9DD10x1y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x1y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x1y14E, buf);
    ::ccc::DD10x1y14 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x1y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x1y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x1y14E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9DD10x1y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x1y14E);
    dp->::ccc::DD10x1y14::~DD10x1y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x1y14E(Test__ZN3ccc9DD10x1y14E, "_ZN3ccc9DD10x1y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x1y14C1Ev();
extern void _ZN3ccc9DD10x1y14D1Ev();
Name_Map name_map__ZN3ccc9DD10x1y14E[] = {
  NSPAIR(_ZN3ccc9DD10x1y14C1Ev),
  NSPAIR(_ZN3ccc9DD10x1y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9DD10x1y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y14E[];
extern void _ZN3ccc9DD10x1y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x1y143pqrEv,_ZTv0_n16_N3ccc9DD10x1y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x1y143pqrEv,_ZThn4_N3ccc9DD10x1y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x1y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x1y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x1y143pqrEv,_ZTv0_n16_N3ccc9DD10x1y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x1y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x1y14E[] = {
  {&(_ZTVN3ccc9DD10x1y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x1y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x1y14E[];
static VTBL_ENTRY alt_thunk_names2064[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x1y143pqrEv,_ZTv0_n16_N3ccc9DD10x1y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x1y143pqrEv,_ZThn4_N3ccc9DD10x1y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x1y14E = {  "_ZN3ccc9DD10x1y14E", // class name
  bases__ZN3ccc9DD10x1y14E, 2,
  &(vtc__ZN3ccc9DD10x1y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x1y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x1y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x1y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x1y14E),3, //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  CC10x1y15  : virtual ::ccc::AA10 , ::ccc::BB1 {
  ~CC10x1y15(); // tgen
  CC10x1y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x1y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC10x1y15 ::~CC10x1y15(){ note_dtor("_ZN3ccc9CC10x1y15E", this);} // tgen
ccc::CC10x1y15 ::CC10x1y15(){ note_ctor("_ZN3ccc9CC10x1y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x1y15E, buf);
    ::ccc::CC10x1y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x1y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), 0, "_ZN3ccc9CC10x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x1y15E);
    dp->::ccc::CC10x1y15::~CC10x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x1y15E(Test__ZN3ccc9CC10x1y15E, "_ZN3ccc9CC10x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x1y15C1Ev();
extern void _ZN3ccc9CC10x1y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x1y15E[] = {
  NSPAIR(_ZN3ccc9CC10x1y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9CC10x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x1y15E[];
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x1y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x1y15E[] = {
  {&(_ZTVN3ccc9CC10x1y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x1y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x1y15E[];
Class_Descriptor cd__ZN3ccc9CC10x1y15E = {  "_ZN3ccc9CC10x1y15E", // class name
  bases__ZN3ccc9CC10x1y15E, 2,
  &(vtc__ZN3ccc9CC10x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x1y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x1y15E),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  DD10x1y15  : virtual ::ccc::AA10 , virtual ::ccc::BB1 {
  ~DD10x1y15(); // tgen
  DD10x1y15(); // tgen
};
//SIG(1 _ZN3ccc9DD10x1y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD10x1y15 ::~DD10x1y15(){ note_dtor("_ZN3ccc9DD10x1y15E", this);} // tgen
ccc::DD10x1y15 ::DD10x1y15(){ note_ctor("_ZN3ccc9DD10x1y15E", this);} // tgen
}
static void Test__ZN3ccc9DD10x1y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x1y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x1y15E, buf);
    ::ccc::DD10x1y15 *dp, &lv = *(dp=new (buf) ::ccc::DD10x1y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x1y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x1y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x1y15E");
    check_base_class_offset(lv, (::ccc::BB1*), ABISELECT(8,4), "_ZN3ccc9DD10x1y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x1y15E);
    dp->::ccc::DD10x1y15::~DD10x1y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x1y15E(Test__ZN3ccc9DD10x1y15E, "_ZN3ccc9DD10x1y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x1y15C1Ev();
extern void _ZN3ccc9DD10x1y15D1Ev();
Name_Map name_map__ZN3ccc9DD10x1y15E[] = {
  NSPAIR(_ZN3ccc9DD10x1y15C1Ev),
  NSPAIR(_ZN3ccc9DD10x1y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB1E;
extern VTBL_ENTRY _ZTIN3ccc3BB1E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB1E[];
static Base_Class bases__ZN3ccc9DD10x1y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB1E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB13abcEv();
extern void _ZN3ccc3BB13pqrEv();
extern void _ZN3ccc3BB13efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x1y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x1y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB13abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB13efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x1y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x1y15E[] = {
  {&(_ZTVN3ccc9DD10x1y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x1y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x1y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x1y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x1y15E[];
Class_Descriptor cd__ZN3ccc9DD10x1y15E = {  "_ZN3ccc9DD10x1y15E", // class name
  bases__ZN3ccc9DD10x1y15E, 2,
  &(vtc__ZN3ccc9DD10x1y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x1y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x1y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x1y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x1y15E),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  CC10x2y0  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y03pqrEv
  ~CC10x2y0(); // tgen
  CC10x2y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y0E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y03abcEv");}
void  ccc::CC10x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y03efgEv");}
void  ccc::CC10x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y03pqrEv");}
ccc::CC10x2y0 ::~CC10x2y0(){ note_dtor("_ZN3ccc8CC10x2y0E", this);} // tgen
ccc::CC10x2y0 ::CC10x2y0(){ note_ctor("_ZN3ccc8CC10x2y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y0E, buf);
    ::ccc::CC10x2y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y0E);
    dp->::ccc::CC10x2y0::~CC10x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y0E(Test__ZN3ccc8CC10x2y0E, "_ZN3ccc8CC10x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y0C1Ev();
extern void _ZN3ccc8CC10x2y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y0E[] = {
  NSPAIR(_ZN3ccc8CC10x2y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y0E[];
extern void _ZN3ccc8CC10x2y03efgEv();
extern void _ZN3ccc8CC10x2y03abcEv();
extern void _ZN3ccc8CC10x2y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y03pqrEv,_ZTv0_n12_N3ccc8CC10x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y03pqrEv,_ZThn4_N3ccc8CC10x2y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y03abcEv,_ZTv0_n16_N3ccc8CC10x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y03abcEv,_ZThn4_N3ccc8CC10x2y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y03pqrEv,_ZTv0_n12_N3ccc8CC10x2y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y03abcEv,_ZTv0_n16_N3ccc8CC10x2y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y0E[] = {
  {&(_ZTVN3ccc8CC10x2y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y0E[];
static VTBL_ENTRY alt_thunk_names2065[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y03abcEv,_ZTv0_n16_N3ccc8CC10x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y03abcEv,_ZThn4_N3ccc8CC10x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y03pqrEv,_ZTv0_n12_N3ccc8CC10x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y03pqrEv,_ZThn4_N3ccc8CC10x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y0E = {  "_ZN3ccc8CC10x2y0E", // class name
  bases__ZN3ccc8CC10x2y0E, 2,
  &(vtc__ZN3ccc8CC10x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y0E),2, //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  DD10x2y0  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD10x2y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x2y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x2y03pqrEv
  ~DD10x2y0(); // tgen
  DD10x2y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y0E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x2y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y03abcEv");}
void  ccc::DD10x2y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y03efgEv");}
void  ccc::DD10x2y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y03pqrEv");}
ccc::DD10x2y0 ::~DD10x2y0(){ note_dtor("_ZN3ccc8DD10x2y0E", this);} // tgen
ccc::DD10x2y0 ::DD10x2y0(){ note_ctor("_ZN3ccc8DD10x2y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y0E, buf);
    ::ccc::DD10x2y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y0E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y0E);
    dp->::ccc::DD10x2y0::~DD10x2y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y0E(Test__ZN3ccc8DD10x2y0E, "_ZN3ccc8DD10x2y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y0C1Ev();
extern void _ZN3ccc8DD10x2y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y0E[] = {
  NSPAIR(_ZN3ccc8DD10x2y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y0E[];
extern void _ZN3ccc8DD10x2y03pqrEv();
extern void _ZN3ccc8DD10x2y03abcEv();
extern void _ZN3ccc8DD10x2y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y03efgEv,_ZTv0_n12_N3ccc8DD10x2y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y03efgEv,_ZThn4_N3ccc8DD10x2y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y03abcEv,_ZTv0_n16_N3ccc8DD10x2y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y03abcEv,_ZThn4_N3ccc8DD10x2y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y03pqrEv,_ZTv0_n20_N3ccc8DD10x2y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y03pqrEv,_ZThn4_N3ccc8DD10x2y03pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y03efgEv,_ZTv0_n12_N3ccc8DD10x2y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y03abcEv,_ZTv0_n16_N3ccc8DD10x2y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y03pqrEv,_ZTv0_n20_N3ccc8DD10x2y03pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y0E[] = {
  {&(_ZTVN3ccc8DD10x2y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y0E[];
static VTBL_ENTRY alt_thunk_names2066[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y03pqrEv,_ZTv0_n20_N3ccc8DD10x2y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y03pqrEv,_ZThn4_N3ccc8DD10x2y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y03abcEv,_ZTv0_n16_N3ccc8DD10x2y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y03abcEv,_ZThn4_N3ccc8DD10x2y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y03efgEv,_ZTv0_n12_N3ccc8DD10x2y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y03efgEv,_ZThn4_N3ccc8DD10x2y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y0E = {  "_ZN3ccc8DD10x2y0E", // class name
  bases__ZN3ccc8DD10x2y0E, 2,
  &(vtc__ZN3ccc8DD10x2y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y0E),3, //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  CC10x2y1  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x2y13efgEv
  ~CC10x2y1(); // tgen
  CC10x2y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y1E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y13abcEv");}
void  ccc::CC10x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y13pqrEv");}
void  ccc::CC10x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y13efgEv");}
ccc::CC10x2y1 ::~CC10x2y1(){ note_dtor("_ZN3ccc8CC10x2y1E", this);} // tgen
ccc::CC10x2y1 ::CC10x2y1(){ note_ctor("_ZN3ccc8CC10x2y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y1E, buf);
    ::ccc::CC10x2y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y1E);
    dp->::ccc::CC10x2y1::~CC10x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y1E(Test__ZN3ccc8CC10x2y1E, "_ZN3ccc8CC10x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y1C1Ev();
extern void _ZN3ccc8CC10x2y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y1E[] = {
  NSPAIR(_ZN3ccc8CC10x2y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y1E[];
extern void _ZN3ccc8CC10x2y13efgEv();
extern void _ZN3ccc8CC10x2y13abcEv();
extern void _ZN3ccc8CC10x2y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y13pqrEv,_ZTv0_n12_N3ccc8CC10x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y13pqrEv,_ZThn4_N3ccc8CC10x2y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y13abcEv,_ZTv0_n16_N3ccc8CC10x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y13abcEv,_ZThn4_N3ccc8CC10x2y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y13pqrEv,_ZTv0_n12_N3ccc8CC10x2y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y13abcEv,_ZTv0_n16_N3ccc8CC10x2y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y1E[] = {
  {&(_ZTVN3ccc8CC10x2y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y1E[];
static VTBL_ENTRY alt_thunk_names2067[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y13abcEv,_ZTv0_n16_N3ccc8CC10x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y13abcEv,_ZThn4_N3ccc8CC10x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y13pqrEv,_ZTv0_n12_N3ccc8CC10x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y13pqrEv,_ZThn4_N3ccc8CC10x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y1E = {  "_ZN3ccc8CC10x2y1E", // class name
  bases__ZN3ccc8CC10x2y1E, 2,
  &(vtc__ZN3ccc8CC10x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y1E),2, //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  DD10x2y1  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD10x2y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x2y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x2y13efgEv
  ~DD10x2y1(); // tgen
  DD10x2y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y1E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x2y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y13abcEv");}
void  ccc::DD10x2y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y13pqrEv");}
void  ccc::DD10x2y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y13efgEv");}
ccc::DD10x2y1 ::~DD10x2y1(){ note_dtor("_ZN3ccc8DD10x2y1E", this);} // tgen
ccc::DD10x2y1 ::DD10x2y1(){ note_ctor("_ZN3ccc8DD10x2y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y1E, buf);
    ::ccc::DD10x2y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y1E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y1E);
    dp->::ccc::DD10x2y1::~DD10x2y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y1E(Test__ZN3ccc8DD10x2y1E, "_ZN3ccc8DD10x2y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y1C1Ev();
extern void _ZN3ccc8DD10x2y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y1E[] = {
  NSPAIR(_ZN3ccc8DD10x2y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y1E[];
extern void _ZN3ccc8DD10x2y13pqrEv();
extern void _ZN3ccc8DD10x2y13abcEv();
extern void _ZN3ccc8DD10x2y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y13efgEv,_ZTv0_n12_N3ccc8DD10x2y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y13efgEv,_ZThn4_N3ccc8DD10x2y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y13abcEv,_ZTv0_n16_N3ccc8DD10x2y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y13abcEv,_ZThn4_N3ccc8DD10x2y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y13pqrEv,_ZTv0_n20_N3ccc8DD10x2y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y13pqrEv,_ZThn4_N3ccc8DD10x2y13pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y13efgEv,_ZTv0_n12_N3ccc8DD10x2y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y13abcEv,_ZTv0_n16_N3ccc8DD10x2y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y13pqrEv,_ZTv0_n20_N3ccc8DD10x2y13pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y1E[] = {
  {&(_ZTVN3ccc8DD10x2y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y1E[];
static VTBL_ENTRY alt_thunk_names2068[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y13pqrEv,_ZTv0_n20_N3ccc8DD10x2y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y13pqrEv,_ZThn4_N3ccc8DD10x2y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y13abcEv,_ZTv0_n16_N3ccc8DD10x2y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y13abcEv,_ZThn4_N3ccc8DD10x2y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y13efgEv,_ZTv0_n12_N3ccc8DD10x2y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y13efgEv,_ZThn4_N3ccc8DD10x2y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y1E = {  "_ZN3ccc8DD10x2y1E", // class name
  bases__ZN3ccc8DD10x2y1E, 2,
  &(vtc__ZN3ccc8DD10x2y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y1E),3, //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  CC10x2y2  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y23pqrEv
  ~CC10x2y2(); // tgen
  CC10x2y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y2E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y23efgEv");}
void  ccc::CC10x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y23abcEv");}
void  ccc::CC10x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y23pqrEv");}
ccc::CC10x2y2 ::~CC10x2y2(){ note_dtor("_ZN3ccc8CC10x2y2E", this);} // tgen
ccc::CC10x2y2 ::CC10x2y2(){ note_ctor("_ZN3ccc8CC10x2y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y2E, buf);
    ::ccc::CC10x2y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y2E);
    dp->::ccc::CC10x2y2::~CC10x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y2E(Test__ZN3ccc8CC10x2y2E, "_ZN3ccc8CC10x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y2C1Ev();
extern void _ZN3ccc8CC10x2y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y2E[] = {
  NSPAIR(_ZN3ccc8CC10x2y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y2E[];
extern void _ZN3ccc8CC10x2y23efgEv();
extern void _ZN3ccc8CC10x2y23abcEv();
extern void _ZN3ccc8CC10x2y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y23pqrEv,_ZTv0_n12_N3ccc8CC10x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y23pqrEv,_ZThn4_N3ccc8CC10x2y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y23abcEv,_ZTv0_n16_N3ccc8CC10x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y23abcEv,_ZThn4_N3ccc8CC10x2y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y23pqrEv,_ZTv0_n12_N3ccc8CC10x2y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y23abcEv,_ZTv0_n16_N3ccc8CC10x2y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y2E[] = {
  {&(_ZTVN3ccc8CC10x2y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y2E[];
static VTBL_ENTRY alt_thunk_names2069[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y23abcEv,_ZTv0_n16_N3ccc8CC10x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y23abcEv,_ZThn4_N3ccc8CC10x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y23pqrEv,_ZTv0_n12_N3ccc8CC10x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y23pqrEv,_ZThn4_N3ccc8CC10x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y2E = {  "_ZN3ccc8CC10x2y2E", // class name
  bases__ZN3ccc8CC10x2y2E, 2,
  &(vtc__ZN3ccc8CC10x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y2E),2, //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  DD10x2y2  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD10x2y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x2y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x2y23pqrEv
  ~DD10x2y2(); // tgen
  DD10x2y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y2E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x2y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y23efgEv");}
void  ccc::DD10x2y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y23abcEv");}
void  ccc::DD10x2y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y23pqrEv");}
ccc::DD10x2y2 ::~DD10x2y2(){ note_dtor("_ZN3ccc8DD10x2y2E", this);} // tgen
ccc::DD10x2y2 ::DD10x2y2(){ note_ctor("_ZN3ccc8DD10x2y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y2E, buf);
    ::ccc::DD10x2y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y2E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y2E);
    dp->::ccc::DD10x2y2::~DD10x2y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y2E(Test__ZN3ccc8DD10x2y2E, "_ZN3ccc8DD10x2y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y2C1Ev();
extern void _ZN3ccc8DD10x2y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y2E[] = {
  NSPAIR(_ZN3ccc8DD10x2y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y2E[];
extern void _ZN3ccc8DD10x2y23pqrEv();
extern void _ZN3ccc8DD10x2y23abcEv();
extern void _ZN3ccc8DD10x2y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y23efgEv,_ZTv0_n12_N3ccc8DD10x2y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y23efgEv,_ZThn4_N3ccc8DD10x2y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y23abcEv,_ZTv0_n16_N3ccc8DD10x2y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y23abcEv,_ZThn4_N3ccc8DD10x2y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y23pqrEv,_ZTv0_n20_N3ccc8DD10x2y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y23pqrEv,_ZThn4_N3ccc8DD10x2y23pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y23efgEv,_ZTv0_n12_N3ccc8DD10x2y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y23abcEv,_ZTv0_n16_N3ccc8DD10x2y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y23pqrEv,_ZTv0_n20_N3ccc8DD10x2y23pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y2E[] = {
  {&(_ZTVN3ccc8DD10x2y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y2E[];
static VTBL_ENTRY alt_thunk_names2070[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y23pqrEv,_ZTv0_n20_N3ccc8DD10x2y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y23pqrEv,_ZThn4_N3ccc8DD10x2y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y23abcEv,_ZTv0_n16_N3ccc8DD10x2y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y23abcEv,_ZThn4_N3ccc8DD10x2y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y23efgEv,_ZTv0_n12_N3ccc8DD10x2y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y23efgEv,_ZThn4_N3ccc8DD10x2y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y2E = {  "_ZN3ccc8DD10x2y2E", // class name
  bases__ZN3ccc8DD10x2y2E, 2,
  &(vtc__ZN3ccc8DD10x2y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y2E),3, //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  CC10x2y3  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x2y33abcEv
  ~CC10x2y3(); // tgen
  CC10x2y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y3E) C1{ VBC2{ v2 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y33efgEv");}
void  ccc::CC10x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y33pqrEv");}
void  ccc::CC10x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y33abcEv");}
ccc::CC10x2y3 ::~CC10x2y3(){ note_dtor("_ZN3ccc8CC10x2y3E", this);} // tgen
ccc::CC10x2y3 ::CC10x2y3(){ note_ctor("_ZN3ccc8CC10x2y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y3E, buf);
    ::ccc::CC10x2y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y3E);
    dp->::ccc::CC10x2y3::~CC10x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y3E(Test__ZN3ccc8CC10x2y3E, "_ZN3ccc8CC10x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y3C1Ev();
extern void _ZN3ccc8CC10x2y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y3E[] = {
  NSPAIR(_ZN3ccc8CC10x2y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y3E[];
extern void _ZN3ccc8CC10x2y33efgEv();
extern void _ZN3ccc8CC10x2y33abcEv();
extern void _ZN3ccc8CC10x2y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y33pqrEv,_ZTv0_n12_N3ccc8CC10x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y33pqrEv,_ZThn4_N3ccc8CC10x2y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y33abcEv,_ZTv0_n16_N3ccc8CC10x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y33abcEv,_ZThn4_N3ccc8CC10x2y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y33pqrEv,_ZTv0_n12_N3ccc8CC10x2y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y33abcEv,_ZTv0_n16_N3ccc8CC10x2y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y3E[] = {
  {&(_ZTVN3ccc8CC10x2y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y3E[];
static VTBL_ENTRY alt_thunk_names2071[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y33abcEv,_ZTv0_n16_N3ccc8CC10x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y33abcEv,_ZThn4_N3ccc8CC10x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y33pqrEv,_ZTv0_n12_N3ccc8CC10x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y33pqrEv,_ZThn4_N3ccc8CC10x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y3E = {  "_ZN3ccc8CC10x2y3E", // class name
  bases__ZN3ccc8CC10x2y3E, 2,
  &(vtc__ZN3ccc8CC10x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y3E),2, //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  DD10x2y3  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD10x2y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x2y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x2y33abcEv
  ~DD10x2y3(); // tgen
  DD10x2y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y3E) C1{ VBC2{ v2 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x2y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y33efgEv");}
void  ccc::DD10x2y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y33pqrEv");}
void  ccc::DD10x2y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y33abcEv");}
ccc::DD10x2y3 ::~DD10x2y3(){ note_dtor("_ZN3ccc8DD10x2y3E", this);} // tgen
ccc::DD10x2y3 ::DD10x2y3(){ note_ctor("_ZN3ccc8DD10x2y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y3E, buf);
    ::ccc::DD10x2y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y3E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y3E);
    dp->::ccc::DD10x2y3::~DD10x2y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y3E(Test__ZN3ccc8DD10x2y3E, "_ZN3ccc8DD10x2y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y3C1Ev();
extern void _ZN3ccc8DD10x2y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y3E[] = {
  NSPAIR(_ZN3ccc8DD10x2y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y3E[];
extern void _ZN3ccc8DD10x2y33pqrEv();
extern void _ZN3ccc8DD10x2y33abcEv();
extern void _ZN3ccc8DD10x2y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y33efgEv,_ZTv0_n12_N3ccc8DD10x2y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y33efgEv,_ZThn4_N3ccc8DD10x2y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y33abcEv,_ZTv0_n16_N3ccc8DD10x2y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y33abcEv,_ZThn4_N3ccc8DD10x2y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y33pqrEv,_ZTv0_n20_N3ccc8DD10x2y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y33pqrEv,_ZThn4_N3ccc8DD10x2y33pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y33efgEv,_ZTv0_n12_N3ccc8DD10x2y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y33abcEv,_ZTv0_n16_N3ccc8DD10x2y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y33pqrEv,_ZTv0_n20_N3ccc8DD10x2y33pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y3E[] = {
  {&(_ZTVN3ccc8DD10x2y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y3E[];
static VTBL_ENTRY alt_thunk_names2072[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y33pqrEv,_ZTv0_n20_N3ccc8DD10x2y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y33pqrEv,_ZThn4_N3ccc8DD10x2y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y33abcEv,_ZTv0_n16_N3ccc8DD10x2y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y33abcEv,_ZThn4_N3ccc8DD10x2y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y33efgEv,_ZTv0_n12_N3ccc8DD10x2y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y33efgEv,_ZThn4_N3ccc8DD10x2y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y3E = {  "_ZN3ccc8DD10x2y3E", // class name
  bases__ZN3ccc8DD10x2y3E, 2,
  &(vtc__ZN3ccc8DD10x2y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y3E),3, //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  CC10x2y4  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC10x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x2y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x2y43efgEv
  ~CC10x2y4(); // tgen
  CC10x2y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y4E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y43pqrEv");}
void  ccc::CC10x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y43abcEv");}
void  ccc::CC10x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y43efgEv");}
ccc::CC10x2y4 ::~CC10x2y4(){ note_dtor("_ZN3ccc8CC10x2y4E", this);} // tgen
ccc::CC10x2y4 ::CC10x2y4(){ note_ctor("_ZN3ccc8CC10x2y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y4E, buf);
    ::ccc::CC10x2y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y4E);
    dp->::ccc::CC10x2y4::~CC10x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y4E(Test__ZN3ccc8CC10x2y4E, "_ZN3ccc8CC10x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y4C1Ev();
extern void _ZN3ccc8CC10x2y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y4E[] = {
  NSPAIR(_ZN3ccc8CC10x2y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y4E[];
extern void _ZN3ccc8CC10x2y43efgEv();
extern void _ZN3ccc8CC10x2y43abcEv();
extern void _ZN3ccc8CC10x2y43pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y43pqrEv,_ZTv0_n12_N3ccc8CC10x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y43pqrEv,_ZThn4_N3ccc8CC10x2y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y43abcEv,_ZTv0_n16_N3ccc8CC10x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y43abcEv,_ZThn4_N3ccc8CC10x2y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y43pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y43pqrEv,_ZTv0_n12_N3ccc8CC10x2y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y43abcEv,_ZTv0_n16_N3ccc8CC10x2y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y4E[] = {
  {&(_ZTVN3ccc8CC10x2y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y4E[];
static VTBL_ENTRY alt_thunk_names2073[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y43abcEv,_ZTv0_n16_N3ccc8CC10x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y43abcEv,_ZThn4_N3ccc8CC10x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y43pqrEv,_ZTv0_n12_N3ccc8CC10x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y43pqrEv,_ZThn4_N3ccc8CC10x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y4E = {  "_ZN3ccc8CC10x2y4E", // class name
  bases__ZN3ccc8CC10x2y4E, 2,
  &(vtc__ZN3ccc8CC10x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y4E),2, //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  DD10x2y4  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD10x2y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x2y43abcEv
  virtual void  efg(); // _ZN3ccc8DD10x2y43efgEv
  ~DD10x2y4(); // tgen
  DD10x2y4(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y4E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x2y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y43pqrEv");}
void  ccc::DD10x2y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y43abcEv");}
void  ccc::DD10x2y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y43efgEv");}
ccc::DD10x2y4 ::~DD10x2y4(){ note_dtor("_ZN3ccc8DD10x2y4E", this);} // tgen
ccc::DD10x2y4 ::DD10x2y4(){ note_ctor("_ZN3ccc8DD10x2y4E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y4E, buf);
    ::ccc::DD10x2y4 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y4E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y4E);
    dp->::ccc::DD10x2y4::~DD10x2y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y4E(Test__ZN3ccc8DD10x2y4E, "_ZN3ccc8DD10x2y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y4C1Ev();
extern void _ZN3ccc8DD10x2y4D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y4E[] = {
  NSPAIR(_ZN3ccc8DD10x2y4C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y4E[];
extern void _ZN3ccc8DD10x2y43pqrEv();
extern void _ZN3ccc8DD10x2y43abcEv();
extern void _ZN3ccc8DD10x2y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y43efgEv,_ZTv0_n12_N3ccc8DD10x2y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y43efgEv,_ZThn4_N3ccc8DD10x2y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y43abcEv,_ZTv0_n16_N3ccc8DD10x2y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y43abcEv,_ZThn4_N3ccc8DD10x2y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y43pqrEv,_ZTv0_n20_N3ccc8DD10x2y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y43pqrEv,_ZThn4_N3ccc8DD10x2y43pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y43efgEv,_ZTv0_n12_N3ccc8DD10x2y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y43abcEv,_ZTv0_n16_N3ccc8DD10x2y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y43pqrEv,_ZTv0_n20_N3ccc8DD10x2y43pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y4E[] = {
  {&(_ZTVN3ccc8DD10x2y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y4E[];
static VTBL_ENTRY alt_thunk_names2074[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y43pqrEv,_ZTv0_n20_N3ccc8DD10x2y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y43pqrEv,_ZThn4_N3ccc8DD10x2y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y43abcEv,_ZTv0_n16_N3ccc8DD10x2y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y43abcEv,_ZThn4_N3ccc8DD10x2y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y43efgEv,_ZTv0_n12_N3ccc8DD10x2y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y43efgEv,_ZThn4_N3ccc8DD10x2y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y4E = {  "_ZN3ccc8DD10x2y4E", // class name
  bases__ZN3ccc8DD10x2y4E, 2,
  &(vtc__ZN3ccc8DD10x2y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y4E),3, //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  CC10x2y5  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8CC10x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x2y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x2y53abcEv
  ~CC10x2y5(); // tgen
  CC10x2y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y5E) C1{ VBC2{ v1 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y53pqrEv");}
void  ccc::CC10x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y53efgEv");}
void  ccc::CC10x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y53abcEv");}
ccc::CC10x2y5 ::~CC10x2y5(){ note_dtor("_ZN3ccc8CC10x2y5E", this);} // tgen
ccc::CC10x2y5 ::CC10x2y5(){ note_ctor("_ZN3ccc8CC10x2y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y5E, buf);
    ::ccc::CC10x2y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y5E);
    dp->::ccc::CC10x2y5::~CC10x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y5E(Test__ZN3ccc8CC10x2y5E, "_ZN3ccc8CC10x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y5C1Ev();
extern void _ZN3ccc8CC10x2y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y5E[] = {
  NSPAIR(_ZN3ccc8CC10x2y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y5E[];
extern void _ZN3ccc8CC10x2y53efgEv();
extern void _ZN3ccc8CC10x2y53abcEv();
extern void _ZN3ccc8CC10x2y53pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y53pqrEv,_ZTv0_n12_N3ccc8CC10x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y53pqrEv,_ZThn4_N3ccc8CC10x2y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y53abcEv,_ZTv0_n16_N3ccc8CC10x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y53abcEv,_ZThn4_N3ccc8CC10x2y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y53pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y53pqrEv,_ZTv0_n12_N3ccc8CC10x2y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y53abcEv,_ZTv0_n16_N3ccc8CC10x2y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y5E[] = {
  {&(_ZTVN3ccc8CC10x2y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y5E[];
static VTBL_ENTRY alt_thunk_names2075[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y53abcEv,_ZTv0_n16_N3ccc8CC10x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y53abcEv,_ZThn4_N3ccc8CC10x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y53pqrEv,_ZTv0_n12_N3ccc8CC10x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y53pqrEv,_ZThn4_N3ccc8CC10x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y5E = {  "_ZN3ccc8CC10x2y5E", // class name
  bases__ZN3ccc8CC10x2y5E, 2,
  &(vtc__ZN3ccc8CC10x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y5E),2, //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  DD10x2y5  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc8DD10x2y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x2y53efgEv
  virtual void  abc(); // _ZN3ccc8DD10x2y53abcEv
  ~DD10x2y5(); // tgen
  DD10x2y5(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y5E) C1{ VBC2{ v1 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x2y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y53pqrEv");}
void  ccc::DD10x2y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y53efgEv");}
void  ccc::DD10x2y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y53abcEv");}
ccc::DD10x2y5 ::~DD10x2y5(){ note_dtor("_ZN3ccc8DD10x2y5E", this);} // tgen
ccc::DD10x2y5 ::DD10x2y5(){ note_ctor("_ZN3ccc8DD10x2y5E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y5E, buf);
    ::ccc::DD10x2y5 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y5E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y5E);
    dp->::ccc::DD10x2y5::~DD10x2y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y5E(Test__ZN3ccc8DD10x2y5E, "_ZN3ccc8DD10x2y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y5C1Ev();
extern void _ZN3ccc8DD10x2y5D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y5E[] = {
  NSPAIR(_ZN3ccc8DD10x2y5C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y5E[];
extern void _ZN3ccc8DD10x2y53pqrEv();
extern void _ZN3ccc8DD10x2y53abcEv();
extern void _ZN3ccc8DD10x2y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y53efgEv,_ZTv0_n12_N3ccc8DD10x2y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y53efgEv,_ZThn4_N3ccc8DD10x2y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y53abcEv,_ZTv0_n16_N3ccc8DD10x2y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y53abcEv,_ZThn4_N3ccc8DD10x2y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y53pqrEv,_ZTv0_n20_N3ccc8DD10x2y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y53pqrEv,_ZThn4_N3ccc8DD10x2y53pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y53efgEv,_ZTv0_n12_N3ccc8DD10x2y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y53abcEv,_ZTv0_n16_N3ccc8DD10x2y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y53pqrEv,_ZTv0_n20_N3ccc8DD10x2y53pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y5E[] = {
  {&(_ZTVN3ccc8DD10x2y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y5E[];
static VTBL_ENTRY alt_thunk_names2076[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y53pqrEv,_ZTv0_n20_N3ccc8DD10x2y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y53pqrEv,_ZThn4_N3ccc8DD10x2y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y53abcEv,_ZTv0_n16_N3ccc8DD10x2y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y53abcEv,_ZThn4_N3ccc8DD10x2y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y53efgEv,_ZTv0_n12_N3ccc8DD10x2y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y53efgEv,_ZThn4_N3ccc8DD10x2y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y5E = {  "_ZN3ccc8DD10x2y5E", // class name
  bases__ZN3ccc8DD10x2y5E, 2,
  &(vtc__ZN3ccc8DD10x2y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y5E),3, //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  CC10x2y6  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x2y63efgEv
  ~CC10x2y6(); // tgen
  CC10x2y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y6E) C1{ VBC2{ v3 v1} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y63abcEv");}
void  ccc::CC10x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y63efgEv");}
ccc::CC10x2y6 ::~CC10x2y6(){ note_dtor("_ZN3ccc8CC10x2y6E", this);} // tgen
ccc::CC10x2y6 ::CC10x2y6(){ note_ctor("_ZN3ccc8CC10x2y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y6E, buf);
    ::ccc::CC10x2y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y6E);
    dp->::ccc::CC10x2y6::~CC10x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y6E(Test__ZN3ccc8CC10x2y6E, "_ZN3ccc8CC10x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y6C1Ev();
extern void _ZN3ccc8CC10x2y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y6E[] = {
  NSPAIR(_ZN3ccc8CC10x2y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y6E[];
extern void _ZN3ccc8CC10x2y63efgEv();
extern void _ZN3ccc8CC10x2y63abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y63abcEv,_ZTv0_n16_N3ccc8CC10x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y63abcEv,_ZThn4_N3ccc8CC10x2y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y63abcEv,_ZTv0_n16_N3ccc8CC10x2y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y6E[] = {
  {&(_ZTVN3ccc8CC10x2y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y6E[];
static VTBL_ENTRY alt_thunk_names2077[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y63abcEv,_ZTv0_n16_N3ccc8CC10x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y63abcEv,_ZThn4_N3ccc8CC10x2y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y6E = {  "_ZN3ccc8CC10x2y6E", // class name
  bases__ZN3ccc8CC10x2y6E, 2,
  &(vtc__ZN3ccc8CC10x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y6E),2, //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  DD10x2y6  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD10x2y63abcEv
  virtual void  efg(); // _ZN3ccc8DD10x2y63efgEv
  ~DD10x2y6(); // tgen
  DD10x2y6(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y6E) C1{ VBC2{ v3 v1} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x2y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y63abcEv");}
void  ccc::DD10x2y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y63efgEv");}
ccc::DD10x2y6 ::~DD10x2y6(){ note_dtor("_ZN3ccc8DD10x2y6E", this);} // tgen
ccc::DD10x2y6 ::DD10x2y6(){ note_ctor("_ZN3ccc8DD10x2y6E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y6E, buf);
    ::ccc::DD10x2y6 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y6E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y6E);
    dp->::ccc::DD10x2y6::~DD10x2y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y6E(Test__ZN3ccc8DD10x2y6E, "_ZN3ccc8DD10x2y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y6C1Ev();
extern void _ZN3ccc8DD10x2y6D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y6E[] = {
  NSPAIR(_ZN3ccc8DD10x2y6C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x2y63abcEv();
extern void _ZN3ccc8DD10x2y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y63efgEv,_ZTv0_n12_N3ccc8DD10x2y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y63efgEv,_ZThn4_N3ccc8DD10x2y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y63abcEv,_ZTv0_n16_N3ccc8DD10x2y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y63abcEv,_ZThn4_N3ccc8DD10x2y63abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y63efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y63efgEv,_ZTv0_n12_N3ccc8DD10x2y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y63abcEv,_ZTv0_n16_N3ccc8DD10x2y63abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y6E[] = {
  {&(_ZTVN3ccc8DD10x2y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y6E[];
static VTBL_ENTRY alt_thunk_names2078[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y63abcEv,_ZTv0_n16_N3ccc8DD10x2y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y63abcEv,_ZThn4_N3ccc8DD10x2y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y63efgEv,_ZTv0_n12_N3ccc8DD10x2y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y63efgEv,_ZThn4_N3ccc8DD10x2y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y6E = {  "_ZN3ccc8DD10x2y6E", // class name
  bases__ZN3ccc8DD10x2y6E, 2,
  &(vtc__ZN3ccc8DD10x2y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y6E),3, //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  CC10x2y7  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8CC10x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y73pqrEv
  ~CC10x2y7(); // tgen
  CC10x2y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y7E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y73abcEv");}
void  ccc::CC10x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y73pqrEv");}
ccc::CC10x2y7 ::~CC10x2y7(){ note_dtor("_ZN3ccc8CC10x2y7E", this);} // tgen
ccc::CC10x2y7 ::CC10x2y7(){ note_ctor("_ZN3ccc8CC10x2y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y7E, buf);
    ::ccc::CC10x2y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y7E);
    dp->::ccc::CC10x2y7::~CC10x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y7E(Test__ZN3ccc8CC10x2y7E, "_ZN3ccc8CC10x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y7C1Ev();
extern void _ZN3ccc8CC10x2y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y7E[] = {
  NSPAIR(_ZN3ccc8CC10x2y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y7E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc8CC10x2y73abcEv();
extern void _ZN3ccc8CC10x2y73pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y73pqrEv,_ZTv0_n12_N3ccc8CC10x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y73pqrEv,_ZThn4_N3ccc8CC10x2y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y73abcEv,_ZTv0_n16_N3ccc8CC10x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y73abcEv,_ZThn4_N3ccc8CC10x2y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y73pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y73pqrEv,_ZTv0_n12_N3ccc8CC10x2y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y73abcEv,_ZTv0_n16_N3ccc8CC10x2y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y7E[] = {
  {&(_ZTVN3ccc8CC10x2y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y7E[];
static VTBL_ENTRY alt_thunk_names2079[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y73abcEv,_ZTv0_n16_N3ccc8CC10x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y73abcEv,_ZThn4_N3ccc8CC10x2y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y73pqrEv,_ZTv0_n12_N3ccc8CC10x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y73pqrEv,_ZThn4_N3ccc8CC10x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y7E = {  "_ZN3ccc8CC10x2y7E", // class name
  bases__ZN3ccc8CC10x2y7E, 2,
  &(vtc__ZN3ccc8CC10x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y7E),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  DD10x2y7  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc8DD10x2y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x2y73pqrEv
  ~DD10x2y7(); // tgen
  DD10x2y7(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y7E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x2y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y73abcEv");}
void  ccc::DD10x2y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y73pqrEv");}
ccc::DD10x2y7 ::~DD10x2y7(){ note_dtor("_ZN3ccc8DD10x2y7E", this);} // tgen
ccc::DD10x2y7 ::DD10x2y7(){ note_ctor("_ZN3ccc8DD10x2y7E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y7E, buf);
    ::ccc::DD10x2y7 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y7E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y7E);
    dp->::ccc::DD10x2y7::~DD10x2y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y7E(Test__ZN3ccc8DD10x2y7E, "_ZN3ccc8DD10x2y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y7C1Ev();
extern void _ZN3ccc8DD10x2y7D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y7E[] = {
  NSPAIR(_ZN3ccc8DD10x2y7C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y7E[];
extern void _ZN3ccc8DD10x2y73pqrEv();
extern void _ZN3ccc8DD10x2y73abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y73abcEv,_ZTv0_n16_N3ccc8DD10x2y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y73abcEv,_ZThn4_N3ccc8DD10x2y73abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y73pqrEv,_ZTv0_n20_N3ccc8DD10x2y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y73pqrEv,_ZThn4_N3ccc8DD10x2y73pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y73abcEv,_ZTv0_n16_N3ccc8DD10x2y73abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y73pqrEv,_ZTv0_n20_N3ccc8DD10x2y73pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y7E[] = {
  {&(_ZTVN3ccc8DD10x2y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x2y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x2y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y7E[];
static VTBL_ENTRY alt_thunk_names2080[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y73pqrEv,_ZTv0_n20_N3ccc8DD10x2y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y73pqrEv,_ZThn4_N3ccc8DD10x2y73pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y73abcEv,_ZTv0_n16_N3ccc8DD10x2y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y73abcEv,_ZThn4_N3ccc8DD10x2y73abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y7E = {  "_ZN3ccc8DD10x2y7E", // class name
  bases__ZN3ccc8DD10x2y7E, 2,
  &(vtc__ZN3ccc8DD10x2y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y7E),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  CC10x2y8  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x2y83abcEv
  ~CC10x2y8(); // tgen
  CC10x2y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y8E) C1{ VBC2{ v3 v2} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y83efgEv");}
void  ccc::CC10x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x2y83abcEv");}
ccc::CC10x2y8 ::~CC10x2y8(){ note_dtor("_ZN3ccc8CC10x2y8E", this);} // tgen
ccc::CC10x2y8 ::CC10x2y8(){ note_ctor("_ZN3ccc8CC10x2y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y8E, buf);
    ::ccc::CC10x2y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y8E);
    dp->::ccc::CC10x2y8::~CC10x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y8E(Test__ZN3ccc8CC10x2y8E, "_ZN3ccc8CC10x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y8C1Ev();
extern void _ZN3ccc8CC10x2y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y8E[] = {
  NSPAIR(_ZN3ccc8CC10x2y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y8E[];
extern void _ZN3ccc8CC10x2y83efgEv();
extern void _ZN3ccc8CC10x2y83abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x2y83abcEv,_ZTv0_n16_N3ccc8CC10x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y83abcEv,_ZThn4_N3ccc8CC10x2y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x2y83abcEv,_ZTv0_n16_N3ccc8CC10x2y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y8E[] = {
  {&(_ZTVN3ccc8CC10x2y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y8E[];
static VTBL_ENTRY alt_thunk_names2081[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x2y83abcEv,_ZTv0_n16_N3ccc8CC10x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y83abcEv,_ZThn4_N3ccc8CC10x2y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y8E = {  "_ZN3ccc8CC10x2y8E", // class name
  bases__ZN3ccc8CC10x2y8E, 2,
  &(vtc__ZN3ccc8CC10x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y8E),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  DD10x2y8  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD10x2y83efgEv
  virtual void  abc(); // _ZN3ccc8DD10x2y83abcEv
  ~DD10x2y8(); // tgen
  DD10x2y8(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y8E) C1{ VBC2{ v3 v2} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x2y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y83efgEv");}
void  ccc::DD10x2y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x2y83abcEv");}
ccc::DD10x2y8 ::~DD10x2y8(){ note_dtor("_ZN3ccc8DD10x2y8E", this);} // tgen
ccc::DD10x2y8 ::DD10x2y8(){ note_ctor("_ZN3ccc8DD10x2y8E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y8E, buf);
    ::ccc::DD10x2y8 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y8E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y8E);
    dp->::ccc::DD10x2y8::~DD10x2y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y8E(Test__ZN3ccc8DD10x2y8E, "_ZN3ccc8DD10x2y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y8C1Ev();
extern void _ZN3ccc8DD10x2y8D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y8E[] = {
  NSPAIR(_ZN3ccc8DD10x2y8C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x2y83abcEv();
extern void _ZN3ccc8DD10x2y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y83efgEv,_ZTv0_n12_N3ccc8DD10x2y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y83efgEv,_ZThn4_N3ccc8DD10x2y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x2y83abcEv,_ZTv0_n16_N3ccc8DD10x2y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y83abcEv,_ZThn4_N3ccc8DD10x2y83abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y83efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y83efgEv,_ZTv0_n12_N3ccc8DD10x2y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x2y83abcEv,_ZTv0_n16_N3ccc8DD10x2y83abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y8E[] = {
  {&(_ZTVN3ccc8DD10x2y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y8E[];
static VTBL_ENTRY alt_thunk_names2082[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x2y83abcEv,_ZTv0_n16_N3ccc8DD10x2y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y83abcEv,_ZThn4_N3ccc8DD10x2y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y83efgEv,_ZTv0_n12_N3ccc8DD10x2y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y83efgEv,_ZThn4_N3ccc8DD10x2y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y8E = {  "_ZN3ccc8DD10x2y8E", // class name
  bases__ZN3ccc8DD10x2y8E, 2,
  &(vtc__ZN3ccc8DD10x2y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y8E),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  CC10x2y9  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8CC10x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x2y93pqrEv
  ~CC10x2y9(); // tgen
  CC10x2y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x2y9E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x2y93efgEv");}
void  ccc::CC10x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x2y93pqrEv");}
ccc::CC10x2y9 ::~CC10x2y9(){ note_dtor("_ZN3ccc8CC10x2y9E", this);} // tgen
ccc::CC10x2y9 ::CC10x2y9(){ note_ctor("_ZN3ccc8CC10x2y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x2y9E, buf);
    ::ccc::CC10x2y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x2y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc8CC10x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x2y9E);
    dp->::ccc::CC10x2y9::~CC10x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x2y9E(Test__ZN3ccc8CC10x2y9E, "_ZN3ccc8CC10x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x2y9C1Ev();
extern void _ZN3ccc8CC10x2y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x2y9E[] = {
  NSPAIR(_ZN3ccc8CC10x2y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8CC10x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x2y9E[];
extern void _ZN3ccc8CC10x2y93efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc8CC10x2y93pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x2y93pqrEv,_ZTv0_n12_N3ccc8CC10x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x2y93pqrEv,_ZThn4_N3ccc8CC10x2y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x2y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x2y93pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x2y93pqrEv,_ZTv0_n12_N3ccc8CC10x2y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x2y9E[] = {
  {&(_ZTVN3ccc8CC10x2y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x2y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x2y9E[];
static VTBL_ENTRY alt_thunk_names2083[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x2y93pqrEv,_ZTv0_n12_N3ccc8CC10x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x2y93pqrEv,_ZThn4_N3ccc8CC10x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x2y9E = {  "_ZN3ccc8CC10x2y9E", // class name
  bases__ZN3ccc8CC10x2y9E, 2,
  &(vtc__ZN3ccc8CC10x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x2y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x2y9E),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  DD10x2y9  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc8DD10x2y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x2y93pqrEv
  ~DD10x2y9(); // tgen
  DD10x2y9(); // tgen
};
//SIG(1 _ZN3ccc8DD10x2y9E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x2y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x2y93efgEv");}
void  ccc::DD10x2y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x2y93pqrEv");}
ccc::DD10x2y9 ::~DD10x2y9(){ note_dtor("_ZN3ccc8DD10x2y9E", this);} // tgen
ccc::DD10x2y9 ::DD10x2y9(){ note_ctor("_ZN3ccc8DD10x2y9E", this);} // tgen
}
static void Test__ZN3ccc8DD10x2y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x2y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x2y9E, buf);
    ::ccc::DD10x2y9 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x2y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x2y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x2y9E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc8DD10x2y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x2y9E);
    dp->::ccc::DD10x2y9::~DD10x2y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x2y9E(Test__ZN3ccc8DD10x2y9E, "_ZN3ccc8DD10x2y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x2y9C1Ev();
extern void _ZN3ccc8DD10x2y9D1Ev();
Name_Map name_map__ZN3ccc8DD10x2y9E[] = {
  NSPAIR(_ZN3ccc8DD10x2y9C1Ev),
  NSPAIR(_ZN3ccc8DD10x2y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc8DD10x2y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y9E[];
extern void _ZN3ccc8DD10x2y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8DD10x2y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x2y93efgEv,_ZTv0_n12_N3ccc8DD10x2y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y93efgEv,_ZThn4_N3ccc8DD10x2y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x2y93pqrEv,_ZTv0_n20_N3ccc8DD10x2y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x2y93pqrEv,_ZThn4_N3ccc8DD10x2y93pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x2y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x2y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x2y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x2y93efgEv,_ZTv0_n12_N3ccc8DD10x2y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x2y93pqrEv,_ZTv0_n20_N3ccc8DD10x2y93pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x2y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x2y9E[] = {
  {&(_ZTVN3ccc8DD10x2y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x2y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x2y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x2y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x2y9E[];
static VTBL_ENTRY alt_thunk_names2084[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x2y93pqrEv,_ZTv0_n20_N3ccc8DD10x2y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y93pqrEv,_ZThn4_N3ccc8DD10x2y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x2y93efgEv,_ZTv0_n12_N3ccc8DD10x2y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x2y93efgEv,_ZThn4_N3ccc8DD10x2y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x2y9E = {  "_ZN3ccc8DD10x2y9E", // class name
  bases__ZN3ccc8DD10x2y9E, 2,
  &(vtc__ZN3ccc8DD10x2y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x2y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x2y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x2y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x2y9E),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  CC10x2y10  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC10x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x2y103abcEv
  ~CC10x2y10(); // tgen
  CC10x2y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y10E) C1{ VBC2{ v1 v2} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x2y103pqrEv");}
void  ccc::CC10x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x2y103abcEv");}
ccc::CC10x2y10 ::~CC10x2y10(){ note_dtor("_ZN3ccc9CC10x2y10E", this);} // tgen
ccc::CC10x2y10 ::CC10x2y10(){ note_ctor("_ZN3ccc9CC10x2y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x2y10E, buf);
    ::ccc::CC10x2y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x2y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC10x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x2y10E);
    dp->::ccc::CC10x2y10::~CC10x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x2y10E(Test__ZN3ccc9CC10x2y10E, "_ZN3ccc9CC10x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x2y10C1Ev();
extern void _ZN3ccc9CC10x2y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x2y10E[] = {
  NSPAIR(_ZN3ccc9CC10x2y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC10x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x2y10E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc9CC10x2y103abcEv();
extern void _ZN3ccc9CC10x2y103pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x2y103pqrEv,_ZTv0_n12_N3ccc9CC10x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y103pqrEv,_ZThn4_N3ccc9CC10x2y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x2y103abcEv,_ZTv0_n16_N3ccc9CC10x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y103abcEv,_ZThn4_N3ccc9CC10x2y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y103pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x2y103pqrEv,_ZTv0_n12_N3ccc9CC10x2y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x2y103abcEv,_ZTv0_n16_N3ccc9CC10x2y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x2y10E[] = {
  {&(_ZTVN3ccc9CC10x2y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x2y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x2y10E[];
static VTBL_ENTRY alt_thunk_names2085[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x2y103abcEv,_ZTv0_n16_N3ccc9CC10x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x2y103abcEv,_ZThn4_N3ccc9CC10x2y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x2y103pqrEv,_ZTv0_n12_N3ccc9CC10x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x2y103pqrEv,_ZThn4_N3ccc9CC10x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x2y10E = {  "_ZN3ccc9CC10x2y10E", // class name
  bases__ZN3ccc9CC10x2y10E, 2,
  &(vtc__ZN3ccc9CC10x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x2y10E),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  DD10x2y10  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9DD10x2y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD10x2y103abcEv
  ~DD10x2y10(); // tgen
  DD10x2y10(); // tgen
};
//SIG(1 _ZN3ccc9DD10x2y10E) C1{ VBC2{ v1 v2} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x2y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x2y103pqrEv");}
void  ccc::DD10x2y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x2y103abcEv");}
ccc::DD10x2y10 ::~DD10x2y10(){ note_dtor("_ZN3ccc9DD10x2y10E", this);} // tgen
ccc::DD10x2y10 ::DD10x2y10(){ note_ctor("_ZN3ccc9DD10x2y10E", this);} // tgen
}
static void Test__ZN3ccc9DD10x2y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x2y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x2y10E, buf);
    ::ccc::DD10x2y10 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x2y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x2y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x2y10E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9DD10x2y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x2y10E);
    dp->::ccc::DD10x2y10::~DD10x2y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x2y10E(Test__ZN3ccc9DD10x2y10E, "_ZN3ccc9DD10x2y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x2y10C1Ev();
extern void _ZN3ccc9DD10x2y10D1Ev();
Name_Map name_map__ZN3ccc9DD10x2y10E[] = {
  NSPAIR(_ZN3ccc9DD10x2y10C1Ev),
  NSPAIR(_ZN3ccc9DD10x2y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9DD10x2y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y10E[];
extern void _ZN3ccc9DD10x2y103pqrEv();
extern void _ZN3ccc9DD10x2y103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x2y103abcEv,_ZTv0_n16_N3ccc9DD10x2y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y103abcEv,_ZThn4_N3ccc9DD10x2y103abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x2y103pqrEv,_ZTv0_n20_N3ccc9DD10x2y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y103pqrEv,_ZThn4_N3ccc9DD10x2y103pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x2y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x2y103abcEv,_ZTv0_n16_N3ccc9DD10x2y103abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x2y103pqrEv,_ZTv0_n20_N3ccc9DD10x2y103pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x2y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x2y10E[] = {
  {&(_ZTVN3ccc9DD10x2y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x2y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x2y10E[];
static VTBL_ENTRY alt_thunk_names2086[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x2y103pqrEv,_ZTv0_n20_N3ccc9DD10x2y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y103pqrEv,_ZThn4_N3ccc9DD10x2y103pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x2y103abcEv,_ZTv0_n16_N3ccc9DD10x2y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y103abcEv,_ZThn4_N3ccc9DD10x2y103abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x2y10E = {  "_ZN3ccc9DD10x2y10E", // class name
  bases__ZN3ccc9DD10x2y10E, 2,
  &(vtc__ZN3ccc9DD10x2y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x2y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x2y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x2y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x2y10E),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  CC10x2y11  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC10x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x2y113efgEv
  ~CC10x2y11(); // tgen
  CC10x2y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y11E) C1{ VBC2{ v1 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x2y113pqrEv");}
void  ccc::CC10x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x2y113efgEv");}
ccc::CC10x2y11 ::~CC10x2y11(){ note_dtor("_ZN3ccc9CC10x2y11E", this);} // tgen
ccc::CC10x2y11 ::CC10x2y11(){ note_ctor("_ZN3ccc9CC10x2y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x2y11E, buf);
    ::ccc::CC10x2y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x2y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC10x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x2y11E);
    dp->::ccc::CC10x2y11::~CC10x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x2y11E(Test__ZN3ccc9CC10x2y11E, "_ZN3ccc9CC10x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x2y11C1Ev();
extern void _ZN3ccc9CC10x2y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x2y11E[] = {
  NSPAIR(_ZN3ccc9CC10x2y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC10x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x2y11E[];
extern void _ZN3ccc9CC10x2y113efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc9CC10x2y113pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x2y113pqrEv,_ZTv0_n12_N3ccc9CC10x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y113pqrEv,_ZThn4_N3ccc9CC10x2y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y113pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x2y113pqrEv,_ZTv0_n12_N3ccc9CC10x2y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x2y11E[] = {
  {&(_ZTVN3ccc9CC10x2y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x2y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x2y11E[];
static VTBL_ENTRY alt_thunk_names2087[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x2y113pqrEv,_ZTv0_n12_N3ccc9CC10x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x2y113pqrEv,_ZThn4_N3ccc9CC10x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x2y11E = {  "_ZN3ccc9CC10x2y11E", // class name
  bases__ZN3ccc9CC10x2y11E, 2,
  &(vtc__ZN3ccc9CC10x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x2y11E),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  DD10x2y11  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9DD10x2y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD10x2y113efgEv
  ~DD10x2y11(); // tgen
  DD10x2y11(); // tgen
};
//SIG(1 _ZN3ccc9DD10x2y11E) C1{ VBC2{ v1 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x2y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x2y113pqrEv");}
void  ccc::DD10x2y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x2y113efgEv");}
ccc::DD10x2y11 ::~DD10x2y11(){ note_dtor("_ZN3ccc9DD10x2y11E", this);} // tgen
ccc::DD10x2y11 ::DD10x2y11(){ note_ctor("_ZN3ccc9DD10x2y11E", this);} // tgen
}
static void Test__ZN3ccc9DD10x2y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x2y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x2y11E, buf);
    ::ccc::DD10x2y11 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x2y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x2y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x2y11E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9DD10x2y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x2y11E);
    dp->::ccc::DD10x2y11::~DD10x2y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x2y11E(Test__ZN3ccc9DD10x2y11E, "_ZN3ccc9DD10x2y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x2y11C1Ev();
extern void _ZN3ccc9DD10x2y11D1Ev();
Name_Map name_map__ZN3ccc9DD10x2y11E[] = {
  NSPAIR(_ZN3ccc9DD10x2y11C1Ev),
  NSPAIR(_ZN3ccc9DD10x2y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9DD10x2y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y11E[];
extern void _ZN3ccc9DD10x2y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x2y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x2y113efgEv,_ZTv0_n12_N3ccc9DD10x2y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y113efgEv,_ZThn4_N3ccc9DD10x2y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x2y113pqrEv,_ZTv0_n20_N3ccc9DD10x2y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y113pqrEv,_ZThn4_N3ccc9DD10x2y113pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x2y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x2y113efgEv,_ZTv0_n12_N3ccc9DD10x2y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x2y113pqrEv,_ZTv0_n20_N3ccc9DD10x2y113pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x2y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x2y11E[] = {
  {&(_ZTVN3ccc9DD10x2y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x2y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x2y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x2y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x2y11E[];
static VTBL_ENTRY alt_thunk_names2088[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x2y113pqrEv,_ZTv0_n20_N3ccc9DD10x2y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y113pqrEv,_ZThn4_N3ccc9DD10x2y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x2y113efgEv,_ZTv0_n12_N3ccc9DD10x2y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y113efgEv,_ZThn4_N3ccc9DD10x2y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x2y11E = {  "_ZN3ccc9DD10x2y11E", // class name
  bases__ZN3ccc9DD10x2y11E, 2,
  &(vtc__ZN3ccc9DD10x2y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x2y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x2y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x2y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x2y11E),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  CC10x2y12  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9CC10x2y123abcEv
  ~CC10x2y12(); // tgen
  CC10x2y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y12E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC10x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x2y123abcEv");}
ccc::CC10x2y12 ::~CC10x2y12(){ note_dtor("_ZN3ccc9CC10x2y12E", this);} // tgen
ccc::CC10x2y12 ::CC10x2y12(){ note_ctor("_ZN3ccc9CC10x2y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x2y12E, buf);
    ::ccc::CC10x2y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x2y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC10x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x2y12E);
    dp->::ccc::CC10x2y12::~CC10x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x2y12E(Test__ZN3ccc9CC10x2y12E, "_ZN3ccc9CC10x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x2y12C1Ev();
extern void _ZN3ccc9CC10x2y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x2y12E[] = {
  NSPAIR(_ZN3ccc9CC10x2y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC10x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x2y12E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc9CC10x2y123abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x2y123abcEv,_ZTv0_n16_N3ccc9CC10x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y123abcEv,_ZThn4_N3ccc9CC10x2y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x2y123abcEv,_ZTv0_n16_N3ccc9CC10x2y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x2y12E[] = {
  {&(_ZTVN3ccc9CC10x2y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x2y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x2y12E[];
static VTBL_ENTRY alt_thunk_names2089[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x2y123abcEv,_ZTv0_n16_N3ccc9CC10x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x2y123abcEv,_ZThn4_N3ccc9CC10x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x2y12E = {  "_ZN3ccc9CC10x2y12E", // class name
  bases__ZN3ccc9CC10x2y12E, 2,
  &(vtc__ZN3ccc9CC10x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x2y12E),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  DD10x2y12  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  abc(); // _ZN3ccc9DD10x2y123abcEv
  ~DD10x2y12(); // tgen
  DD10x2y12(); // tgen
};
//SIG(1 _ZN3ccc9DD10x2y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD10x2y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x2y123abcEv");}
ccc::DD10x2y12 ::~DD10x2y12(){ note_dtor("_ZN3ccc9DD10x2y12E", this);} // tgen
ccc::DD10x2y12 ::DD10x2y12(){ note_ctor("_ZN3ccc9DD10x2y12E", this);} // tgen
}
static void Test__ZN3ccc9DD10x2y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x2y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x2y12E, buf);
    ::ccc::DD10x2y12 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x2y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x2y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x2y12E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9DD10x2y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x2y12E);
    dp->::ccc::DD10x2y12::~DD10x2y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x2y12E(Test__ZN3ccc9DD10x2y12E, "_ZN3ccc9DD10x2y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x2y12C1Ev();
extern void _ZN3ccc9DD10x2y12D1Ev();
Name_Map name_map__ZN3ccc9DD10x2y12E[] = {
  NSPAIR(_ZN3ccc9DD10x2y12C1Ev),
  NSPAIR(_ZN3ccc9DD10x2y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9DD10x2y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9DD10x2y123abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x2y123abcEv,_ZTv0_n16_N3ccc9DD10x2y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y123abcEv,_ZThn4_N3ccc9DD10x2y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x2y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x2y123abcEv,_ZTv0_n16_N3ccc9DD10x2y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x2y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x2y12E[] = {
  {&(_ZTVN3ccc9DD10x2y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x2y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x2y12E[];
static VTBL_ENTRY alt_thunk_names2090[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x2y123abcEv,_ZTv0_n16_N3ccc9DD10x2y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y123abcEv,_ZThn4_N3ccc9DD10x2y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x2y12E = {  "_ZN3ccc9DD10x2y12E", // class name
  bases__ZN3ccc9DD10x2y12E, 2,
  &(vtc__ZN3ccc9DD10x2y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x2y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x2y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x2y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x2y12E),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  CC10x2y13  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9CC10x2y133efgEv
  ~CC10x2y13(); // tgen
  CC10x2y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y13E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC10x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x2y133efgEv");}
ccc::CC10x2y13 ::~CC10x2y13(){ note_dtor("_ZN3ccc9CC10x2y13E", this);} // tgen
ccc::CC10x2y13 ::CC10x2y13(){ note_ctor("_ZN3ccc9CC10x2y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x2y13E, buf);
    ::ccc::CC10x2y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x2y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC10x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x2y13E);
    dp->::ccc::CC10x2y13::~CC10x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x2y13E(Test__ZN3ccc9CC10x2y13E, "_ZN3ccc9CC10x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x2y13C1Ev();
extern void _ZN3ccc9CC10x2y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x2y13E[] = {
  NSPAIR(_ZN3ccc9CC10x2y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC10x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x2y13E[];
extern void _ZN3ccc9CC10x2y133efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x2y13E[] = {
  {&(_ZTVN3ccc9CC10x2y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x2y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x2y13E[];
Class_Descriptor cd__ZN3ccc9CC10x2y13E = {  "_ZN3ccc9CC10x2y13E", // class name
  bases__ZN3ccc9CC10x2y13E, 2,
  &(vtc__ZN3ccc9CC10x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x2y13E),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  DD10x2y13  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  efg(); // _ZN3ccc9DD10x2y133efgEv
  ~DD10x2y13(); // tgen
  DD10x2y13(); // tgen
};
//SIG(1 _ZN3ccc9DD10x2y13E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD10x2y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x2y133efgEv");}
ccc::DD10x2y13 ::~DD10x2y13(){ note_dtor("_ZN3ccc9DD10x2y13E", this);} // tgen
ccc::DD10x2y13 ::DD10x2y13(){ note_ctor("_ZN3ccc9DD10x2y13E", this);} // tgen
}
static void Test__ZN3ccc9DD10x2y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x2y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x2y13E, buf);
    ::ccc::DD10x2y13 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x2y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x2y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x2y13E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9DD10x2y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x2y13E);
    dp->::ccc::DD10x2y13::~DD10x2y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x2y13E(Test__ZN3ccc9DD10x2y13E, "_ZN3ccc9DD10x2y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x2y13C1Ev();
extern void _ZN3ccc9DD10x2y13D1Ev();
Name_Map name_map__ZN3ccc9DD10x2y13E[] = {
  NSPAIR(_ZN3ccc9DD10x2y13C1Ev),
  NSPAIR(_ZN3ccc9DD10x2y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9DD10x2y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x2y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x2y133efgEv,_ZTv0_n12_N3ccc9DD10x2y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y133efgEv,_ZThn4_N3ccc9DD10x2y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x2y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x2y133efgEv,_ZTv0_n12_N3ccc9DD10x2y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x2y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x2y13E[] = {
  {&(_ZTVN3ccc9DD10x2y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x2y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x2y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x2y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x2y13E[];
static VTBL_ENTRY alt_thunk_names2091[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x2y133efgEv,_ZTv0_n12_N3ccc9DD10x2y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y133efgEv,_ZThn4_N3ccc9DD10x2y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x2y13E = {  "_ZN3ccc9DD10x2y13E", // class name
  bases__ZN3ccc9DD10x2y13E, 2,
  &(vtc__ZN3ccc9DD10x2y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x2y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x2y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x2y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x2y13E),3, //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  CC10x2y14  : virtual ::ccc::AA10 , ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9CC10x2y143pqrEv
  ~CC10x2y14(); // tgen
  CC10x2y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y14E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC10x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x2y143pqrEv");}
ccc::CC10x2y14 ::~CC10x2y14(){ note_dtor("_ZN3ccc9CC10x2y14E", this);} // tgen
ccc::CC10x2y14 ::CC10x2y14(){ note_ctor("_ZN3ccc9CC10x2y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x2y14E, buf);
    ::ccc::CC10x2y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x2y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC10x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x2y14E);
    dp->::ccc::CC10x2y14::~CC10x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x2y14E(Test__ZN3ccc9CC10x2y14E, "_ZN3ccc9CC10x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x2y14C1Ev();
extern void _ZN3ccc9CC10x2y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x2y14E[] = {
  NSPAIR(_ZN3ccc9CC10x2y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC10x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x2y14E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc9CC10x2y143pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x2y143pqrEv,_ZTv0_n12_N3ccc9CC10x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x2y143pqrEv,_ZThn4_N3ccc9CC10x2y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x2y143pqrEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x2y143pqrEv,_ZTv0_n12_N3ccc9CC10x2y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x2y14E[] = {
  {&(_ZTVN3ccc9CC10x2y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x2y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x2y14E[];
static VTBL_ENTRY alt_thunk_names2092[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x2y143pqrEv,_ZTv0_n12_N3ccc9CC10x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x2y143pqrEv,_ZThn4_N3ccc9CC10x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x2y14E = {  "_ZN3ccc9CC10x2y14E", // class name
  bases__ZN3ccc9CC10x2y14E, 2,
  &(vtc__ZN3ccc9CC10x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x2y14E),2, //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  DD10x2y14  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  virtual void  pqr(); // _ZN3ccc9DD10x2y143pqrEv
  ~DD10x2y14(); // tgen
  DD10x2y14(); // tgen
};
//SIG(1 _ZN3ccc9DD10x2y14E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD10x2y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x2y143pqrEv");}
ccc::DD10x2y14 ::~DD10x2y14(){ note_dtor("_ZN3ccc9DD10x2y14E", this);} // tgen
ccc::DD10x2y14 ::DD10x2y14(){ note_ctor("_ZN3ccc9DD10x2y14E", this);} // tgen
}
static void Test__ZN3ccc9DD10x2y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x2y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x2y14E, buf);
    ::ccc::DD10x2y14 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x2y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x2y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x2y14E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9DD10x2y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x2y14E);
    dp->::ccc::DD10x2y14::~DD10x2y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x2y14E(Test__ZN3ccc9DD10x2y14E, "_ZN3ccc9DD10x2y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x2y14C1Ev();
extern void _ZN3ccc9DD10x2y14D1Ev();
Name_Map name_map__ZN3ccc9DD10x2y14E[] = {
  NSPAIR(_ZN3ccc9DD10x2y14C1Ev),
  NSPAIR(_ZN3ccc9DD10x2y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9DD10x2y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y14E[];
extern void _ZN3ccc9DD10x2y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x2y143pqrEv,_ZTv0_n20_N3ccc9DD10x2y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x2y143pqrEv,_ZThn4_N3ccc9DD10x2y143pqrEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x2y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x2y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x2y143pqrEv,_ZTv0_n20_N3ccc9DD10x2y143pqrEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x2y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x2y14E[] = {
  {&(_ZTVN3ccc9DD10x2y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x2y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x2y14E[];
static VTBL_ENTRY alt_thunk_names2093[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x2y143pqrEv,_ZTv0_n20_N3ccc9DD10x2y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x2y143pqrEv,_ZThn4_N3ccc9DD10x2y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x2y14E = {  "_ZN3ccc9DD10x2y14E", // class name
  bases__ZN3ccc9DD10x2y14E, 2,
  &(vtc__ZN3ccc9DD10x2y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x2y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x2y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x2y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x2y14E),3, //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  CC10x2y15  : virtual ::ccc::AA10 , ::ccc::BB2 {
  ~CC10x2y15(); // tgen
  CC10x2y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x2y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC10x2y15 ::~CC10x2y15(){ note_dtor("_ZN3ccc9CC10x2y15E", this);} // tgen
ccc::CC10x2y15 ::CC10x2y15(){ note_ctor("_ZN3ccc9CC10x2y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x2y15E, buf);
    ::ccc::CC10x2y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x2y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), 0, "_ZN3ccc9CC10x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x2y15E);
    dp->::ccc::CC10x2y15::~CC10x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x2y15E(Test__ZN3ccc9CC10x2y15E, "_ZN3ccc9CC10x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x2y15C1Ev();
extern void _ZN3ccc9CC10x2y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x2y15E[] = {
  NSPAIR(_ZN3ccc9CC10x2y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9CC10x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x2y15E[];
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x2y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x2y15E[] = {
  {&(_ZTVN3ccc9CC10x2y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x2y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x2y15E[];
Class_Descriptor cd__ZN3ccc9CC10x2y15E = {  "_ZN3ccc9CC10x2y15E", // class name
  bases__ZN3ccc9CC10x2y15E, 2,
  &(vtc__ZN3ccc9CC10x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x2y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x2y15E),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  DD10x2y15  : virtual ::ccc::AA10 , virtual ::ccc::BB2 {
  ~DD10x2y15(); // tgen
  DD10x2y15(); // tgen
};
//SIG(1 _ZN3ccc9DD10x2y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD10x2y15 ::~DD10x2y15(){ note_dtor("_ZN3ccc9DD10x2y15E", this);} // tgen
ccc::DD10x2y15 ::DD10x2y15(){ note_ctor("_ZN3ccc9DD10x2y15E", this);} // tgen
}
static void Test__ZN3ccc9DD10x2y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x2y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x2y15E, buf);
    ::ccc::DD10x2y15 *dp, &lv = *(dp=new (buf) ::ccc::DD10x2y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x2y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x2y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x2y15E");
    check_base_class_offset(lv, (::ccc::BB2*), ABISELECT(8,4), "_ZN3ccc9DD10x2y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x2y15E);
    dp->::ccc::DD10x2y15::~DD10x2y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x2y15E(Test__ZN3ccc9DD10x2y15E, "_ZN3ccc9DD10x2y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x2y15C1Ev();
extern void _ZN3ccc9DD10x2y15D1Ev();
Name_Map name_map__ZN3ccc9DD10x2y15E[] = {
  NSPAIR(_ZN3ccc9DD10x2y15C1Ev),
  NSPAIR(_ZN3ccc9DD10x2y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB2E;
extern VTBL_ENTRY _ZTIN3ccc3BB2E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB2E[];
static Base_Class bases__ZN3ccc9DD10x2y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB2E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB23efgEv();
extern void _ZN3ccc3BB23abcEv();
extern void _ZN3ccc3BB23pqrEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x2y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x2y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB23efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB23pqrEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x2y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x2y15E[] = {
  {&(_ZTVN3ccc9DD10x2y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x2y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x2y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x2y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x2y15E[];
Class_Descriptor cd__ZN3ccc9DD10x2y15E = {  "_ZN3ccc9DD10x2y15E", // class name
  bases__ZN3ccc9DD10x2y15E, 2,
  &(vtc__ZN3ccc9DD10x2y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x2y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x2y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x2y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x2y15E),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  CC10x3y0  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y03pqrEv
  ~CC10x3y0(); // tgen
  CC10x3y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y0E) C1{ VBC2{ v3 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y03abcEv");}
void  ccc::CC10x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y03efgEv");}
void  ccc::CC10x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y03pqrEv");}
ccc::CC10x3y0 ::~CC10x3y0(){ note_dtor("_ZN3ccc8CC10x3y0E", this);} // tgen
ccc::CC10x3y0 ::CC10x3y0(){ note_ctor("_ZN3ccc8CC10x3y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y0E, buf);
    ::ccc::CC10x3y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y0E);
    dp->::ccc::CC10x3y0::~CC10x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y0E(Test__ZN3ccc8CC10x3y0E, "_ZN3ccc8CC10x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y0C1Ev();
extern void _ZN3ccc8CC10x3y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y0E[] = {
  NSPAIR(_ZN3ccc8CC10x3y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y0E[];
extern void _ZN3ccc8CC10x3y03efgEv();
extern void _ZN3ccc8CC10x3y03pqrEv();
extern void _ZN3ccc8CC10x3y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y03pqrEv,_ZTv0_n12_N3ccc8CC10x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y03pqrEv,_ZThn4_N3ccc8CC10x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y03abcEv,_ZTv0_n16_N3ccc8CC10x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y03abcEv,_ZThn4_N3ccc8CC10x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y03pqrEv,_ZTv0_n12_N3ccc8CC10x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y03abcEv,_ZTv0_n16_N3ccc8CC10x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y0E[] = {
  {&(_ZTVN3ccc8CC10x3y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y0E[];
static VTBL_ENTRY alt_thunk_names2094[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y03abcEv,_ZTv0_n16_N3ccc8CC10x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y03abcEv,_ZThn4_N3ccc8CC10x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y03pqrEv,_ZTv0_n12_N3ccc8CC10x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y03pqrEv,_ZThn4_N3ccc8CC10x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y0E = {  "_ZN3ccc8CC10x3y0E", // class name
  bases__ZN3ccc8CC10x3y0E, 2,
  &(vtc__ZN3ccc8CC10x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y0E),2, //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  DD10x3y0  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD10x3y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x3y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x3y03pqrEv
  ~DD10x3y0(); // tgen
  DD10x3y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y0E) C1{ VBC2{ v3 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x3y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y03abcEv");}
void  ccc::DD10x3y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y03efgEv");}
void  ccc::DD10x3y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y03pqrEv");}
ccc::DD10x3y0 ::~DD10x3y0(){ note_dtor("_ZN3ccc8DD10x3y0E", this);} // tgen
ccc::DD10x3y0 ::DD10x3y0(){ note_ctor("_ZN3ccc8DD10x3y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y0E, buf);
    ::ccc::DD10x3y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y0E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y0E);
    dp->::ccc::DD10x3y0::~DD10x3y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y0E(Test__ZN3ccc8DD10x3y0E, "_ZN3ccc8DD10x3y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y0C1Ev();
extern void _ZN3ccc8DD10x3y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y0E[] = {
  NSPAIR(_ZN3ccc8DD10x3y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y0E[];
extern void _ZN3ccc8DD10x3y03pqrEv();
extern void _ZN3ccc8DD10x3y03abcEv();
extern void _ZN3ccc8DD10x3y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y03efgEv,_ZTv0_n12_N3ccc8DD10x3y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y03efgEv,_ZThn4_N3ccc8DD10x3y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y03pqrEv,_ZTv0_n16_N3ccc8DD10x3y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y03pqrEv,_ZThn4_N3ccc8DD10x3y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y03abcEv,_ZTv0_n20_N3ccc8DD10x3y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y03abcEv,_ZThn4_N3ccc8DD10x3y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y03efgEv,_ZTv0_n12_N3ccc8DD10x3y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y03pqrEv,_ZTv0_n16_N3ccc8DD10x3y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y03abcEv,_ZTv0_n20_N3ccc8DD10x3y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y0E[] = {
  {&(_ZTVN3ccc8DD10x3y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y0E[];
static VTBL_ENTRY alt_thunk_names2095[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y03abcEv,_ZTv0_n20_N3ccc8DD10x3y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y03abcEv,_ZThn4_N3ccc8DD10x3y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y03pqrEv,_ZTv0_n16_N3ccc8DD10x3y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y03pqrEv,_ZThn4_N3ccc8DD10x3y03pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y03efgEv,_ZTv0_n12_N3ccc8DD10x3y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y03efgEv,_ZThn4_N3ccc8DD10x3y03efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y0E = {  "_ZN3ccc8DD10x3y0E", // class name
  bases__ZN3ccc8DD10x3y0E, 2,
  &(vtc__ZN3ccc8DD10x3y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y0E),3, //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  CC10x3y1  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x3y13efgEv
  ~CC10x3y1(); // tgen
  CC10x3y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y1E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y13abcEv");}
void  ccc::CC10x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y13pqrEv");}
void  ccc::CC10x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y13efgEv");}
ccc::CC10x3y1 ::~CC10x3y1(){ note_dtor("_ZN3ccc8CC10x3y1E", this);} // tgen
ccc::CC10x3y1 ::CC10x3y1(){ note_ctor("_ZN3ccc8CC10x3y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y1E, buf);
    ::ccc::CC10x3y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y1E);
    dp->::ccc::CC10x3y1::~CC10x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y1E(Test__ZN3ccc8CC10x3y1E, "_ZN3ccc8CC10x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y1C1Ev();
extern void _ZN3ccc8CC10x3y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y1E[] = {
  NSPAIR(_ZN3ccc8CC10x3y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y1E[];
extern void _ZN3ccc8CC10x3y13efgEv();
extern void _ZN3ccc8CC10x3y13pqrEv();
extern void _ZN3ccc8CC10x3y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y13pqrEv,_ZTv0_n12_N3ccc8CC10x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y13pqrEv,_ZThn4_N3ccc8CC10x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y13abcEv,_ZTv0_n16_N3ccc8CC10x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y13abcEv,_ZThn4_N3ccc8CC10x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y13pqrEv,_ZTv0_n12_N3ccc8CC10x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y13abcEv,_ZTv0_n16_N3ccc8CC10x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y1E[] = {
  {&(_ZTVN3ccc8CC10x3y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y1E[];
static VTBL_ENTRY alt_thunk_names2096[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y13abcEv,_ZTv0_n16_N3ccc8CC10x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y13abcEv,_ZThn4_N3ccc8CC10x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y13pqrEv,_ZTv0_n12_N3ccc8CC10x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y13pqrEv,_ZThn4_N3ccc8CC10x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y1E = {  "_ZN3ccc8CC10x3y1E", // class name
  bases__ZN3ccc8CC10x3y1E, 2,
  &(vtc__ZN3ccc8CC10x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y1E),2, //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  DD10x3y1  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD10x3y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x3y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x3y13efgEv
  ~DD10x3y1(); // tgen
  DD10x3y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y1E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x3y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y13abcEv");}
void  ccc::DD10x3y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y13pqrEv");}
void  ccc::DD10x3y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y13efgEv");}
ccc::DD10x3y1 ::~DD10x3y1(){ note_dtor("_ZN3ccc8DD10x3y1E", this);} // tgen
ccc::DD10x3y1 ::DD10x3y1(){ note_ctor("_ZN3ccc8DD10x3y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y1E, buf);
    ::ccc::DD10x3y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y1E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y1E);
    dp->::ccc::DD10x3y1::~DD10x3y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y1E(Test__ZN3ccc8DD10x3y1E, "_ZN3ccc8DD10x3y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y1C1Ev();
extern void _ZN3ccc8DD10x3y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y1E[] = {
  NSPAIR(_ZN3ccc8DD10x3y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y1E[];
extern void _ZN3ccc8DD10x3y13pqrEv();
extern void _ZN3ccc8DD10x3y13abcEv();
extern void _ZN3ccc8DD10x3y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y13efgEv,_ZTv0_n12_N3ccc8DD10x3y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y13efgEv,_ZThn4_N3ccc8DD10x3y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y13pqrEv,_ZTv0_n16_N3ccc8DD10x3y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y13pqrEv,_ZThn4_N3ccc8DD10x3y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y13abcEv,_ZTv0_n20_N3ccc8DD10x3y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y13abcEv,_ZThn4_N3ccc8DD10x3y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y13efgEv,_ZTv0_n12_N3ccc8DD10x3y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y13pqrEv,_ZTv0_n16_N3ccc8DD10x3y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y13abcEv,_ZTv0_n20_N3ccc8DD10x3y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y1E[] = {
  {&(_ZTVN3ccc8DD10x3y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y1E[];
static VTBL_ENTRY alt_thunk_names2097[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y13abcEv,_ZTv0_n20_N3ccc8DD10x3y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y13abcEv,_ZThn4_N3ccc8DD10x3y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y13pqrEv,_ZTv0_n16_N3ccc8DD10x3y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y13pqrEv,_ZThn4_N3ccc8DD10x3y13pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y13efgEv,_ZTv0_n12_N3ccc8DD10x3y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y13efgEv,_ZThn4_N3ccc8DD10x3y13efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y1E = {  "_ZN3ccc8DD10x3y1E", // class name
  bases__ZN3ccc8DD10x3y1E, 2,
  &(vtc__ZN3ccc8DD10x3y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y1E),3, //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  CC10x3y2  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y23pqrEv
  ~CC10x3y2(); // tgen
  CC10x3y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y2E) C1{ VBC2{ v3 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y23efgEv");}
void  ccc::CC10x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y23abcEv");}
void  ccc::CC10x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y23pqrEv");}
ccc::CC10x3y2 ::~CC10x3y2(){ note_dtor("_ZN3ccc8CC10x3y2E", this);} // tgen
ccc::CC10x3y2 ::CC10x3y2(){ note_ctor("_ZN3ccc8CC10x3y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y2E, buf);
    ::ccc::CC10x3y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y2E);
    dp->::ccc::CC10x3y2::~CC10x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y2E(Test__ZN3ccc8CC10x3y2E, "_ZN3ccc8CC10x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y2C1Ev();
extern void _ZN3ccc8CC10x3y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y2E[] = {
  NSPAIR(_ZN3ccc8CC10x3y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y2E[];
extern void _ZN3ccc8CC10x3y23efgEv();
extern void _ZN3ccc8CC10x3y23pqrEv();
extern void _ZN3ccc8CC10x3y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y23pqrEv,_ZTv0_n12_N3ccc8CC10x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y23pqrEv,_ZThn4_N3ccc8CC10x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y23abcEv,_ZTv0_n16_N3ccc8CC10x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y23abcEv,_ZThn4_N3ccc8CC10x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y23pqrEv,_ZTv0_n12_N3ccc8CC10x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y23abcEv,_ZTv0_n16_N3ccc8CC10x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y2E[] = {
  {&(_ZTVN3ccc8CC10x3y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y2E[];
static VTBL_ENTRY alt_thunk_names2098[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y23abcEv,_ZTv0_n16_N3ccc8CC10x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y23abcEv,_ZThn4_N3ccc8CC10x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y23pqrEv,_ZTv0_n12_N3ccc8CC10x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y23pqrEv,_ZThn4_N3ccc8CC10x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y2E = {  "_ZN3ccc8CC10x3y2E", // class name
  bases__ZN3ccc8CC10x3y2E, 2,
  &(vtc__ZN3ccc8CC10x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y2E),2, //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  DD10x3y2  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD10x3y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x3y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x3y23pqrEv
  ~DD10x3y2(); // tgen
  DD10x3y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y2E) C1{ VBC2{ v3 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x3y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y23efgEv");}
void  ccc::DD10x3y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y23abcEv");}
void  ccc::DD10x3y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y23pqrEv");}
ccc::DD10x3y2 ::~DD10x3y2(){ note_dtor("_ZN3ccc8DD10x3y2E", this);} // tgen
ccc::DD10x3y2 ::DD10x3y2(){ note_ctor("_ZN3ccc8DD10x3y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y2E, buf);
    ::ccc::DD10x3y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y2E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y2E);
    dp->::ccc::DD10x3y2::~DD10x3y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y2E(Test__ZN3ccc8DD10x3y2E, "_ZN3ccc8DD10x3y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y2C1Ev();
extern void _ZN3ccc8DD10x3y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y2E[] = {
  NSPAIR(_ZN3ccc8DD10x3y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y2E[];
extern void _ZN3ccc8DD10x3y23pqrEv();
extern void _ZN3ccc8DD10x3y23abcEv();
extern void _ZN3ccc8DD10x3y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y23efgEv,_ZTv0_n12_N3ccc8DD10x3y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y23efgEv,_ZThn4_N3ccc8DD10x3y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y23pqrEv,_ZTv0_n16_N3ccc8DD10x3y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y23pqrEv,_ZThn4_N3ccc8DD10x3y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y23abcEv,_ZTv0_n20_N3ccc8DD10x3y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y23abcEv,_ZThn4_N3ccc8DD10x3y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y23efgEv,_ZTv0_n12_N3ccc8DD10x3y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y23pqrEv,_ZTv0_n16_N3ccc8DD10x3y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y23abcEv,_ZTv0_n20_N3ccc8DD10x3y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y2E[] = {
  {&(_ZTVN3ccc8DD10x3y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y2E[];
static VTBL_ENTRY alt_thunk_names2099[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y23abcEv,_ZTv0_n20_N3ccc8DD10x3y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y23abcEv,_ZThn4_N3ccc8DD10x3y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y23pqrEv,_ZTv0_n16_N3ccc8DD10x3y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y23pqrEv,_ZThn4_N3ccc8DD10x3y23pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y23efgEv,_ZTv0_n12_N3ccc8DD10x3y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y23efgEv,_ZThn4_N3ccc8DD10x3y23efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y2E = {  "_ZN3ccc8DD10x3y2E", // class name
  bases__ZN3ccc8DD10x3y2E, 2,
  &(vtc__ZN3ccc8DD10x3y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y2E),3, //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  CC10x3y3  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x3y33abcEv
  ~CC10x3y3(); // tgen
  CC10x3y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y3E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y33efgEv");}
void  ccc::CC10x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y33pqrEv");}
void  ccc::CC10x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y33abcEv");}
ccc::CC10x3y3 ::~CC10x3y3(){ note_dtor("_ZN3ccc8CC10x3y3E", this);} // tgen
ccc::CC10x3y3 ::CC10x3y3(){ note_ctor("_ZN3ccc8CC10x3y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y3E, buf);
    ::ccc::CC10x3y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y3E);
    dp->::ccc::CC10x3y3::~CC10x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y3E(Test__ZN3ccc8CC10x3y3E, "_ZN3ccc8CC10x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y3C1Ev();
extern void _ZN3ccc8CC10x3y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y3E[] = {
  NSPAIR(_ZN3ccc8CC10x3y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y3E[];
extern void _ZN3ccc8CC10x3y33efgEv();
extern void _ZN3ccc8CC10x3y33pqrEv();
extern void _ZN3ccc8CC10x3y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y33pqrEv,_ZTv0_n12_N3ccc8CC10x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y33pqrEv,_ZThn4_N3ccc8CC10x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y33abcEv,_ZTv0_n16_N3ccc8CC10x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y33abcEv,_ZThn4_N3ccc8CC10x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y33pqrEv,_ZTv0_n12_N3ccc8CC10x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y33abcEv,_ZTv0_n16_N3ccc8CC10x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y3E[] = {
  {&(_ZTVN3ccc8CC10x3y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y3E[];
static VTBL_ENTRY alt_thunk_names2100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y33abcEv,_ZTv0_n16_N3ccc8CC10x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y33abcEv,_ZThn4_N3ccc8CC10x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y33pqrEv,_ZTv0_n12_N3ccc8CC10x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y33pqrEv,_ZThn4_N3ccc8CC10x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y3E = {  "_ZN3ccc8CC10x3y3E", // class name
  bases__ZN3ccc8CC10x3y3E, 2,
  &(vtc__ZN3ccc8CC10x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y3E),2, //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  DD10x3y3  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD10x3y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x3y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x3y33abcEv
  ~DD10x3y3(); // tgen
  DD10x3y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y3E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x3y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y33efgEv");}
void  ccc::DD10x3y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y33pqrEv");}
void  ccc::DD10x3y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y33abcEv");}
ccc::DD10x3y3 ::~DD10x3y3(){ note_dtor("_ZN3ccc8DD10x3y3E", this);} // tgen
ccc::DD10x3y3 ::DD10x3y3(){ note_ctor("_ZN3ccc8DD10x3y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y3E, buf);
    ::ccc::DD10x3y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y3E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y3E);
    dp->::ccc::DD10x3y3::~DD10x3y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y3E(Test__ZN3ccc8DD10x3y3E, "_ZN3ccc8DD10x3y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y3C1Ev();
extern void _ZN3ccc8DD10x3y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y3E[] = {
  NSPAIR(_ZN3ccc8DD10x3y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y3E[];
extern void _ZN3ccc8DD10x3y33pqrEv();
extern void _ZN3ccc8DD10x3y33abcEv();
extern void _ZN3ccc8DD10x3y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y33efgEv,_ZTv0_n12_N3ccc8DD10x3y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y33efgEv,_ZThn4_N3ccc8DD10x3y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y33pqrEv,_ZTv0_n16_N3ccc8DD10x3y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y33pqrEv,_ZThn4_N3ccc8DD10x3y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y33abcEv,_ZTv0_n20_N3ccc8DD10x3y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y33abcEv,_ZThn4_N3ccc8DD10x3y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y33efgEv,_ZTv0_n12_N3ccc8DD10x3y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y33pqrEv,_ZTv0_n16_N3ccc8DD10x3y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y33abcEv,_ZTv0_n20_N3ccc8DD10x3y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y3E[] = {
  {&(_ZTVN3ccc8DD10x3y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y3E[];
static VTBL_ENTRY alt_thunk_names2101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y33abcEv,_ZTv0_n20_N3ccc8DD10x3y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y33abcEv,_ZThn4_N3ccc8DD10x3y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y33pqrEv,_ZTv0_n16_N3ccc8DD10x3y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y33pqrEv,_ZThn4_N3ccc8DD10x3y33pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y33efgEv,_ZTv0_n12_N3ccc8DD10x3y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y33efgEv,_ZThn4_N3ccc8DD10x3y33efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y3E = {  "_ZN3ccc8DD10x3y3E", // class name
  bases__ZN3ccc8DD10x3y3E, 2,
  &(vtc__ZN3ccc8DD10x3y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y3E),3, //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  CC10x3y4  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC10x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x3y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x3y43efgEv
  ~CC10x3y4(); // tgen
  CC10x3y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y4E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y43pqrEv");}
void  ccc::CC10x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y43abcEv");}
void  ccc::CC10x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y43efgEv");}
ccc::CC10x3y4 ::~CC10x3y4(){ note_dtor("_ZN3ccc8CC10x3y4E", this);} // tgen
ccc::CC10x3y4 ::CC10x3y4(){ note_ctor("_ZN3ccc8CC10x3y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y4E, buf);
    ::ccc::CC10x3y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y4E);
    dp->::ccc::CC10x3y4::~CC10x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y4E(Test__ZN3ccc8CC10x3y4E, "_ZN3ccc8CC10x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y4C1Ev();
extern void _ZN3ccc8CC10x3y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y4E[] = {
  NSPAIR(_ZN3ccc8CC10x3y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y4E[];
extern void _ZN3ccc8CC10x3y43efgEv();
extern void _ZN3ccc8CC10x3y43pqrEv();
extern void _ZN3ccc8CC10x3y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y43pqrEv,_ZTv0_n12_N3ccc8CC10x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y43pqrEv,_ZThn4_N3ccc8CC10x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y43abcEv,_ZTv0_n16_N3ccc8CC10x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y43abcEv,_ZThn4_N3ccc8CC10x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y43pqrEv,_ZTv0_n12_N3ccc8CC10x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y43abcEv,_ZTv0_n16_N3ccc8CC10x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y4E[] = {
  {&(_ZTVN3ccc8CC10x3y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y4E[];
static VTBL_ENTRY alt_thunk_names2102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y43abcEv,_ZTv0_n16_N3ccc8CC10x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y43abcEv,_ZThn4_N3ccc8CC10x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y43pqrEv,_ZTv0_n12_N3ccc8CC10x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y43pqrEv,_ZThn4_N3ccc8CC10x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y4E = {  "_ZN3ccc8CC10x3y4E", // class name
  bases__ZN3ccc8CC10x3y4E, 2,
  &(vtc__ZN3ccc8CC10x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y4E),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  DD10x3y4  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD10x3y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x3y43abcEv
  virtual void  efg(); // _ZN3ccc8DD10x3y43efgEv
  ~DD10x3y4(); // tgen
  DD10x3y4(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y4E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x3y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y43pqrEv");}
void  ccc::DD10x3y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y43abcEv");}
void  ccc::DD10x3y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y43efgEv");}
ccc::DD10x3y4 ::~DD10x3y4(){ note_dtor("_ZN3ccc8DD10x3y4E", this);} // tgen
ccc::DD10x3y4 ::DD10x3y4(){ note_ctor("_ZN3ccc8DD10x3y4E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y4E, buf);
    ::ccc::DD10x3y4 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y4E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y4E);
    dp->::ccc::DD10x3y4::~DD10x3y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y4E(Test__ZN3ccc8DD10x3y4E, "_ZN3ccc8DD10x3y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y4C1Ev();
extern void _ZN3ccc8DD10x3y4D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y4E[] = {
  NSPAIR(_ZN3ccc8DD10x3y4C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y4E[];
extern void _ZN3ccc8DD10x3y43pqrEv();
extern void _ZN3ccc8DD10x3y43abcEv();
extern void _ZN3ccc8DD10x3y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y43efgEv,_ZTv0_n12_N3ccc8DD10x3y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y43efgEv,_ZThn4_N3ccc8DD10x3y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y43pqrEv,_ZTv0_n16_N3ccc8DD10x3y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y43pqrEv,_ZThn4_N3ccc8DD10x3y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y43abcEv,_ZTv0_n20_N3ccc8DD10x3y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y43abcEv,_ZThn4_N3ccc8DD10x3y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y43efgEv,_ZTv0_n12_N3ccc8DD10x3y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y43pqrEv,_ZTv0_n16_N3ccc8DD10x3y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y43abcEv,_ZTv0_n20_N3ccc8DD10x3y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y4E[] = {
  {&(_ZTVN3ccc8DD10x3y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y4E[];
static VTBL_ENTRY alt_thunk_names2103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y43abcEv,_ZTv0_n20_N3ccc8DD10x3y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y43abcEv,_ZThn4_N3ccc8DD10x3y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y43pqrEv,_ZTv0_n16_N3ccc8DD10x3y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y43pqrEv,_ZThn4_N3ccc8DD10x3y43pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y43efgEv,_ZTv0_n12_N3ccc8DD10x3y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y43efgEv,_ZThn4_N3ccc8DD10x3y43efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y4E = {  "_ZN3ccc8DD10x3y4E", // class name
  bases__ZN3ccc8DD10x3y4E, 2,
  &(vtc__ZN3ccc8DD10x3y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y4E),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  CC10x3y5  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8CC10x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x3y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x3y53abcEv
  ~CC10x3y5(); // tgen
  CC10x3y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y5E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y53pqrEv");}
void  ccc::CC10x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y53efgEv");}
void  ccc::CC10x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y53abcEv");}
ccc::CC10x3y5 ::~CC10x3y5(){ note_dtor("_ZN3ccc8CC10x3y5E", this);} // tgen
ccc::CC10x3y5 ::CC10x3y5(){ note_ctor("_ZN3ccc8CC10x3y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y5E, buf);
    ::ccc::CC10x3y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y5E);
    dp->::ccc::CC10x3y5::~CC10x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y5E(Test__ZN3ccc8CC10x3y5E, "_ZN3ccc8CC10x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y5C1Ev();
extern void _ZN3ccc8CC10x3y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y5E[] = {
  NSPAIR(_ZN3ccc8CC10x3y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y5E[];
extern void _ZN3ccc8CC10x3y53efgEv();
extern void _ZN3ccc8CC10x3y53pqrEv();
extern void _ZN3ccc8CC10x3y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y53pqrEv,_ZTv0_n12_N3ccc8CC10x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y53pqrEv,_ZThn4_N3ccc8CC10x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y53abcEv,_ZTv0_n16_N3ccc8CC10x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y53abcEv,_ZThn4_N3ccc8CC10x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y53pqrEv,_ZTv0_n12_N3ccc8CC10x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y53abcEv,_ZTv0_n16_N3ccc8CC10x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y5E[] = {
  {&(_ZTVN3ccc8CC10x3y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y5E[];
static VTBL_ENTRY alt_thunk_names2104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y53abcEv,_ZTv0_n16_N3ccc8CC10x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y53abcEv,_ZThn4_N3ccc8CC10x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y53pqrEv,_ZTv0_n12_N3ccc8CC10x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y53pqrEv,_ZThn4_N3ccc8CC10x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y5E = {  "_ZN3ccc8CC10x3y5E", // class name
  bases__ZN3ccc8CC10x3y5E, 2,
  &(vtc__ZN3ccc8CC10x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y5E),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  DD10x3y5  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc8DD10x3y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x3y53efgEv
  virtual void  abc(); // _ZN3ccc8DD10x3y53abcEv
  ~DD10x3y5(); // tgen
  DD10x3y5(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y5E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x3y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y53pqrEv");}
void  ccc::DD10x3y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y53efgEv");}
void  ccc::DD10x3y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y53abcEv");}
ccc::DD10x3y5 ::~DD10x3y5(){ note_dtor("_ZN3ccc8DD10x3y5E", this);} // tgen
ccc::DD10x3y5 ::DD10x3y5(){ note_ctor("_ZN3ccc8DD10x3y5E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y5E, buf);
    ::ccc::DD10x3y5 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y5E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y5E);
    dp->::ccc::DD10x3y5::~DD10x3y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y5E(Test__ZN3ccc8DD10x3y5E, "_ZN3ccc8DD10x3y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y5C1Ev();
extern void _ZN3ccc8DD10x3y5D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y5E[] = {
  NSPAIR(_ZN3ccc8DD10x3y5C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y5E[];
extern void _ZN3ccc8DD10x3y53pqrEv();
extern void _ZN3ccc8DD10x3y53abcEv();
extern void _ZN3ccc8DD10x3y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y53efgEv,_ZTv0_n12_N3ccc8DD10x3y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y53efgEv,_ZThn4_N3ccc8DD10x3y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y53pqrEv,_ZTv0_n16_N3ccc8DD10x3y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y53pqrEv,_ZThn4_N3ccc8DD10x3y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y53abcEv,_ZTv0_n20_N3ccc8DD10x3y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y53abcEv,_ZThn4_N3ccc8DD10x3y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y53efgEv,_ZTv0_n12_N3ccc8DD10x3y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y53pqrEv,_ZTv0_n16_N3ccc8DD10x3y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y53abcEv,_ZTv0_n20_N3ccc8DD10x3y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y5E[] = {
  {&(_ZTVN3ccc8DD10x3y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y5E[];
static VTBL_ENTRY alt_thunk_names2105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y53abcEv,_ZTv0_n20_N3ccc8DD10x3y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y53abcEv,_ZThn4_N3ccc8DD10x3y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y53pqrEv,_ZTv0_n16_N3ccc8DD10x3y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y53pqrEv,_ZThn4_N3ccc8DD10x3y53pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y53efgEv,_ZTv0_n12_N3ccc8DD10x3y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y53efgEv,_ZThn4_N3ccc8DD10x3y53efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y5E = {  "_ZN3ccc8DD10x3y5E", // class name
  bases__ZN3ccc8DD10x3y5E, 2,
  &(vtc__ZN3ccc8DD10x3y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y5E),3, //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  CC10x3y6  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x3y63efgEv
  ~CC10x3y6(); // tgen
  CC10x3y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y6E) C1{ VBC2{ v3 v1} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y63abcEv");}
void  ccc::CC10x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y63efgEv");}
ccc::CC10x3y6 ::~CC10x3y6(){ note_dtor("_ZN3ccc8CC10x3y6E", this);} // tgen
ccc::CC10x3y6 ::CC10x3y6(){ note_ctor("_ZN3ccc8CC10x3y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y6E, buf);
    ::ccc::CC10x3y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y6E);
    dp->::ccc::CC10x3y6::~CC10x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y6E(Test__ZN3ccc8CC10x3y6E, "_ZN3ccc8CC10x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y6C1Ev();
extern void _ZN3ccc8CC10x3y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y6E[] = {
  NSPAIR(_ZN3ccc8CC10x3y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y6E[];
extern void _ZN3ccc8CC10x3y63efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC10x3y63abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y63abcEv,_ZTv0_n16_N3ccc8CC10x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y63abcEv,_ZThn4_N3ccc8CC10x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y63abcEv,_ZTv0_n16_N3ccc8CC10x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y6E[] = {
  {&(_ZTVN3ccc8CC10x3y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y6E[];
static VTBL_ENTRY alt_thunk_names2106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y63abcEv,_ZTv0_n16_N3ccc8CC10x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y63abcEv,_ZThn4_N3ccc8CC10x3y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y6E = {  "_ZN3ccc8CC10x3y6E", // class name
  bases__ZN3ccc8CC10x3y6E, 2,
  &(vtc__ZN3ccc8CC10x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y6E),2, //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  DD10x3y6  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD10x3y63abcEv
  virtual void  efg(); // _ZN3ccc8DD10x3y63efgEv
  ~DD10x3y6(); // tgen
  DD10x3y6(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y6E) C1{ VBC2{ v3 v1} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x3y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y63abcEv");}
void  ccc::DD10x3y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y63efgEv");}
ccc::DD10x3y6 ::~DD10x3y6(){ note_dtor("_ZN3ccc8DD10x3y6E", this);} // tgen
ccc::DD10x3y6 ::DD10x3y6(){ note_ctor("_ZN3ccc8DD10x3y6E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y6E, buf);
    ::ccc::DD10x3y6 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y6E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y6E);
    dp->::ccc::DD10x3y6::~DD10x3y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y6E(Test__ZN3ccc8DD10x3y6E, "_ZN3ccc8DD10x3y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y6C1Ev();
extern void _ZN3ccc8DD10x3y6D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y6E[] = {
  NSPAIR(_ZN3ccc8DD10x3y6C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x3y63abcEv();
extern void _ZN3ccc8DD10x3y63efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y63efgEv,_ZTv0_n12_N3ccc8DD10x3y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y63efgEv,_ZThn4_N3ccc8DD10x3y63efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y63abcEv,_ZTv0_n20_N3ccc8DD10x3y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y63abcEv,_ZThn4_N3ccc8DD10x3y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y6E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y63efgEv,_ZTv0_n12_N3ccc8DD10x3y63efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y63abcEv,_ZTv0_n20_N3ccc8DD10x3y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y6E[] = {
  {&(_ZTVN3ccc8DD10x3y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y6E[];
static VTBL_ENTRY alt_thunk_names2107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y63abcEv,_ZTv0_n20_N3ccc8DD10x3y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y63abcEv,_ZThn4_N3ccc8DD10x3y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y63efgEv,_ZTv0_n12_N3ccc8DD10x3y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y63efgEv,_ZThn4_N3ccc8DD10x3y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y6E = {  "_ZN3ccc8DD10x3y6E", // class name
  bases__ZN3ccc8DD10x3y6E, 2,
  &(vtc__ZN3ccc8DD10x3y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y6E),3, //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  CC10x3y7  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8CC10x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y73pqrEv
  ~CC10x3y7(); // tgen
  CC10x3y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y7E) C1{ VBC2{ v2 v1} BC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y73abcEv");}
void  ccc::CC10x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y73pqrEv");}
ccc::CC10x3y7 ::~CC10x3y7(){ note_dtor("_ZN3ccc8CC10x3y7E", this);} // tgen
ccc::CC10x3y7 ::CC10x3y7(){ note_ctor("_ZN3ccc8CC10x3y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y7E, buf);
    ::ccc::CC10x3y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y7E);
    dp->::ccc::CC10x3y7::~CC10x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y7E(Test__ZN3ccc8CC10x3y7E, "_ZN3ccc8CC10x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y7C1Ev();
extern void _ZN3ccc8CC10x3y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y7E[] = {
  NSPAIR(_ZN3ccc8CC10x3y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y7E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc8CC10x3y73pqrEv();
extern void _ZN3ccc8CC10x3y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y73pqrEv,_ZTv0_n12_N3ccc8CC10x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y73pqrEv,_ZThn4_N3ccc8CC10x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y73abcEv,_ZTv0_n16_N3ccc8CC10x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y73abcEv,_ZThn4_N3ccc8CC10x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y73pqrEv,_ZTv0_n12_N3ccc8CC10x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y73abcEv,_ZTv0_n16_N3ccc8CC10x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y7E[] = {
  {&(_ZTVN3ccc8CC10x3y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y7E[];
static VTBL_ENTRY alt_thunk_names2108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y73abcEv,_ZTv0_n16_N3ccc8CC10x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y73abcEv,_ZThn4_N3ccc8CC10x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y73pqrEv,_ZTv0_n12_N3ccc8CC10x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y73pqrEv,_ZThn4_N3ccc8CC10x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y7E = {  "_ZN3ccc8CC10x3y7E", // class name
  bases__ZN3ccc8CC10x3y7E, 2,
  &(vtc__ZN3ccc8CC10x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y7E),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  DD10x3y7  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc8DD10x3y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x3y73pqrEv
  ~DD10x3y7(); // tgen
  DD10x3y7(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y7E) C1{ VBC2{ v2 v1} VBC3{ v3 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x3y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y73abcEv");}
void  ccc::DD10x3y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y73pqrEv");}
ccc::DD10x3y7 ::~DD10x3y7(){ note_dtor("_ZN3ccc8DD10x3y7E", this);} // tgen
ccc::DD10x3y7 ::DD10x3y7(){ note_ctor("_ZN3ccc8DD10x3y7E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y7E, buf);
    ::ccc::DD10x3y7 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y7E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y7E);
    dp->::ccc::DD10x3y7::~DD10x3y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y7E(Test__ZN3ccc8DD10x3y7E, "_ZN3ccc8DD10x3y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y7C1Ev();
extern void _ZN3ccc8DD10x3y7D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y7E[] = {
  NSPAIR(_ZN3ccc8DD10x3y7C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y7E[];
extern void _ZN3ccc8DD10x3y73pqrEv();
extern void _ZN3ccc8DD10x3y73abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y73pqrEv,_ZTv0_n16_N3ccc8DD10x3y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y73pqrEv,_ZThn4_N3ccc8DD10x3y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y73abcEv,_ZTv0_n20_N3ccc8DD10x3y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y73abcEv,_ZThn4_N3ccc8DD10x3y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y73pqrEv,_ZTv0_n16_N3ccc8DD10x3y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y73abcEv,_ZTv0_n20_N3ccc8DD10x3y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y7E[] = {
  {&(_ZTVN3ccc8DD10x3y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x3y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x3y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y7E[];
static VTBL_ENTRY alt_thunk_names2109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y73abcEv,_ZTv0_n20_N3ccc8DD10x3y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y73abcEv,_ZThn4_N3ccc8DD10x3y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y73pqrEv,_ZTv0_n16_N3ccc8DD10x3y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y73pqrEv,_ZThn4_N3ccc8DD10x3y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y7E = {  "_ZN3ccc8DD10x3y7E", // class name
  bases__ZN3ccc8DD10x3y7E, 2,
  &(vtc__ZN3ccc8DD10x3y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y7E),3, //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  CC10x3y8  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x3y83abcEv
  ~CC10x3y8(); // tgen
  CC10x3y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y8E) C1{ VBC2{ v3 v2} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y83efgEv");}
void  ccc::CC10x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x3y83abcEv");}
ccc::CC10x3y8 ::~CC10x3y8(){ note_dtor("_ZN3ccc8CC10x3y8E", this);} // tgen
ccc::CC10x3y8 ::CC10x3y8(){ note_ctor("_ZN3ccc8CC10x3y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y8E, buf);
    ::ccc::CC10x3y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y8E);
    dp->::ccc::CC10x3y8::~CC10x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y8E(Test__ZN3ccc8CC10x3y8E, "_ZN3ccc8CC10x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y8C1Ev();
extern void _ZN3ccc8CC10x3y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y8E[] = {
  NSPAIR(_ZN3ccc8CC10x3y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y8E[];
extern void _ZN3ccc8CC10x3y83efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc8CC10x3y83abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x3y83abcEv,_ZTv0_n16_N3ccc8CC10x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y83abcEv,_ZThn4_N3ccc8CC10x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x3y83abcEv,_ZTv0_n16_N3ccc8CC10x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y8E[] = {
  {&(_ZTVN3ccc8CC10x3y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y8E[];
static VTBL_ENTRY alt_thunk_names2110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x3y83abcEv,_ZTv0_n16_N3ccc8CC10x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y83abcEv,_ZThn4_N3ccc8CC10x3y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y8E = {  "_ZN3ccc8CC10x3y8E", // class name
  bases__ZN3ccc8CC10x3y8E, 2,
  &(vtc__ZN3ccc8CC10x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y8E),2, //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  DD10x3y8  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD10x3y83efgEv
  virtual void  abc(); // _ZN3ccc8DD10x3y83abcEv
  ~DD10x3y8(); // tgen
  DD10x3y8(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y8E) C1{ VBC2{ v3 v2} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x3y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y83efgEv");}
void  ccc::DD10x3y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x3y83abcEv");}
ccc::DD10x3y8 ::~DD10x3y8(){ note_dtor("_ZN3ccc8DD10x3y8E", this);} // tgen
ccc::DD10x3y8 ::DD10x3y8(){ note_ctor("_ZN3ccc8DD10x3y8E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y8E, buf);
    ::ccc::DD10x3y8 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y8E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y8E);
    dp->::ccc::DD10x3y8::~DD10x3y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y8E(Test__ZN3ccc8DD10x3y8E, "_ZN3ccc8DD10x3y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y8C1Ev();
extern void _ZN3ccc8DD10x3y8D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y8E[] = {
  NSPAIR(_ZN3ccc8DD10x3y8C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x3y83abcEv();
extern void _ZN3ccc8DD10x3y83efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y83efgEv,_ZTv0_n12_N3ccc8DD10x3y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y83efgEv,_ZThn4_N3ccc8DD10x3y83efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x3y83abcEv,_ZTv0_n20_N3ccc8DD10x3y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y83abcEv,_ZThn4_N3ccc8DD10x3y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y8E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y83efgEv,_ZTv0_n12_N3ccc8DD10x3y83efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x3y83abcEv,_ZTv0_n20_N3ccc8DD10x3y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y8E[] = {
  {&(_ZTVN3ccc8DD10x3y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y8E[];
static VTBL_ENTRY alt_thunk_names2111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x3y83abcEv,_ZTv0_n20_N3ccc8DD10x3y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y83abcEv,_ZThn4_N3ccc8DD10x3y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y83efgEv,_ZTv0_n12_N3ccc8DD10x3y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y83efgEv,_ZThn4_N3ccc8DD10x3y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y8E = {  "_ZN3ccc8DD10x3y8E", // class name
  bases__ZN3ccc8DD10x3y8E, 2,
  &(vtc__ZN3ccc8DD10x3y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y8E),3, //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  CC10x3y9  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8CC10x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x3y93pqrEv
  ~CC10x3y9(); // tgen
  CC10x3y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x3y9E) C1{ VBC2{ v2 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x3y93efgEv");}
void  ccc::CC10x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x3y93pqrEv");}
ccc::CC10x3y9 ::~CC10x3y9(){ note_dtor("_ZN3ccc8CC10x3y9E", this);} // tgen
ccc::CC10x3y9 ::CC10x3y9(){ note_ctor("_ZN3ccc8CC10x3y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x3y9E, buf);
    ::ccc::CC10x3y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x3y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc8CC10x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x3y9E);
    dp->::ccc::CC10x3y9::~CC10x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x3y9E(Test__ZN3ccc8CC10x3y9E, "_ZN3ccc8CC10x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x3y9C1Ev();
extern void _ZN3ccc8CC10x3y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x3y9E[] = {
  NSPAIR(_ZN3ccc8CC10x3y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8CC10x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x3y9E[];
extern void _ZN3ccc8CC10x3y93efgEv();
extern void _ZN3ccc8CC10x3y93pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x3y93pqrEv,_ZTv0_n12_N3ccc8CC10x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x3y93pqrEv,_ZThn4_N3ccc8CC10x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x3y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x3y93pqrEv,_ZTv0_n12_N3ccc8CC10x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x3y9E[] = {
  {&(_ZTVN3ccc8CC10x3y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x3y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x3y9E[];
static VTBL_ENTRY alt_thunk_names2112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x3y93pqrEv,_ZTv0_n12_N3ccc8CC10x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x3y93pqrEv,_ZThn4_N3ccc8CC10x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x3y9E = {  "_ZN3ccc8CC10x3y9E", // class name
  bases__ZN3ccc8CC10x3y9E, 2,
  &(vtc__ZN3ccc8CC10x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x3y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x3y9E),2, //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  DD10x3y9  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc8DD10x3y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x3y93pqrEv
  ~DD10x3y9(); // tgen
  DD10x3y9(); // tgen
};
//SIG(1 _ZN3ccc8DD10x3y9E) C1{ VBC2{ v2 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x3y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x3y93efgEv");}
void  ccc::DD10x3y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x3y93pqrEv");}
ccc::DD10x3y9 ::~DD10x3y9(){ note_dtor("_ZN3ccc8DD10x3y9E", this);} // tgen
ccc::DD10x3y9 ::DD10x3y9(){ note_ctor("_ZN3ccc8DD10x3y9E", this);} // tgen
}
static void Test__ZN3ccc8DD10x3y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x3y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x3y9E, buf);
    ::ccc::DD10x3y9 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x3y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x3y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x3y9E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc8DD10x3y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x3y9E);
    dp->::ccc::DD10x3y9::~DD10x3y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x3y9E(Test__ZN3ccc8DD10x3y9E, "_ZN3ccc8DD10x3y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x3y9C1Ev();
extern void _ZN3ccc8DD10x3y9D1Ev();
Name_Map name_map__ZN3ccc8DD10x3y9E[] = {
  NSPAIR(_ZN3ccc8DD10x3y9C1Ev),
  NSPAIR(_ZN3ccc8DD10x3y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc8DD10x3y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y9E[];
extern void _ZN3ccc8DD10x3y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8DD10x3y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x3y93efgEv,_ZTv0_n12_N3ccc8DD10x3y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y93efgEv,_ZThn4_N3ccc8DD10x3y93efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x3y93pqrEv,_ZTv0_n16_N3ccc8DD10x3y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x3y93pqrEv,_ZThn4_N3ccc8DD10x3y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x3y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x3y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x3y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x3y93efgEv,_ZTv0_n12_N3ccc8DD10x3y93efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x3y93pqrEv,_ZTv0_n16_N3ccc8DD10x3y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x3y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x3y9E[] = {
  {&(_ZTVN3ccc8DD10x3y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x3y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x3y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x3y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x3y9E[];
static VTBL_ENTRY alt_thunk_names2113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x3y93pqrEv,_ZTv0_n16_N3ccc8DD10x3y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y93pqrEv,_ZThn4_N3ccc8DD10x3y93pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x3y93efgEv,_ZTv0_n12_N3ccc8DD10x3y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x3y93efgEv,_ZThn4_N3ccc8DD10x3y93efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x3y9E = {  "_ZN3ccc8DD10x3y9E", // class name
  bases__ZN3ccc8DD10x3y9E, 2,
  &(vtc__ZN3ccc8DD10x3y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x3y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x3y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x3y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x3y9E),3, //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  CC10x3y10  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC10x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x3y103abcEv
  ~CC10x3y10(); // tgen
  CC10x3y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y10E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x3y103pqrEv");}
void  ccc::CC10x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x3y103abcEv");}
ccc::CC10x3y10 ::~CC10x3y10(){ note_dtor("_ZN3ccc9CC10x3y10E", this);} // tgen
ccc::CC10x3y10 ::CC10x3y10(){ note_ctor("_ZN3ccc9CC10x3y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x3y10E, buf);
    ::ccc::CC10x3y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x3y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC10x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x3y10E);
    dp->::ccc::CC10x3y10::~CC10x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x3y10E(Test__ZN3ccc9CC10x3y10E, "_ZN3ccc9CC10x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x3y10C1Ev();
extern void _ZN3ccc9CC10x3y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x3y10E[] = {
  NSPAIR(_ZN3ccc9CC10x3y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC10x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x3y10E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc9CC10x3y103pqrEv();
extern void _ZN3ccc9CC10x3y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x3y103pqrEv,_ZTv0_n12_N3ccc9CC10x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y103pqrEv,_ZThn4_N3ccc9CC10x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x3y103abcEv,_ZTv0_n16_N3ccc9CC10x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y103abcEv,_ZThn4_N3ccc9CC10x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x3y103pqrEv,_ZTv0_n12_N3ccc9CC10x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x3y103abcEv,_ZTv0_n16_N3ccc9CC10x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x3y10E[] = {
  {&(_ZTVN3ccc9CC10x3y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x3y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x3y10E[];
static VTBL_ENTRY alt_thunk_names2114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x3y103abcEv,_ZTv0_n16_N3ccc9CC10x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x3y103abcEv,_ZThn4_N3ccc9CC10x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x3y103pqrEv,_ZTv0_n12_N3ccc9CC10x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x3y103pqrEv,_ZThn4_N3ccc9CC10x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x3y10E = {  "_ZN3ccc9CC10x3y10E", // class name
  bases__ZN3ccc9CC10x3y10E, 2,
  &(vtc__ZN3ccc9CC10x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x3y10E),2, //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  DD10x3y10  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9DD10x3y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD10x3y103abcEv
  ~DD10x3y10(); // tgen
  DD10x3y10(); // tgen
};
//SIG(1 _ZN3ccc9DD10x3y10E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x3y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x3y103pqrEv");}
void  ccc::DD10x3y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x3y103abcEv");}
ccc::DD10x3y10 ::~DD10x3y10(){ note_dtor("_ZN3ccc9DD10x3y10E", this);} // tgen
ccc::DD10x3y10 ::DD10x3y10(){ note_ctor("_ZN3ccc9DD10x3y10E", this);} // tgen
}
static void Test__ZN3ccc9DD10x3y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x3y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x3y10E, buf);
    ::ccc::DD10x3y10 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x3y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x3y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x3y10E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9DD10x3y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x3y10E);
    dp->::ccc::DD10x3y10::~DD10x3y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x3y10E(Test__ZN3ccc9DD10x3y10E, "_ZN3ccc9DD10x3y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x3y10C1Ev();
extern void _ZN3ccc9DD10x3y10D1Ev();
Name_Map name_map__ZN3ccc9DD10x3y10E[] = {
  NSPAIR(_ZN3ccc9DD10x3y10C1Ev),
  NSPAIR(_ZN3ccc9DD10x3y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9DD10x3y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y10E[];
extern void _ZN3ccc9DD10x3y103pqrEv();
extern void _ZN3ccc9DD10x3y103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x3y103pqrEv,_ZTv0_n16_N3ccc9DD10x3y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y103pqrEv,_ZThn4_N3ccc9DD10x3y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x3y103abcEv,_ZTv0_n20_N3ccc9DD10x3y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y103abcEv,_ZThn4_N3ccc9DD10x3y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x3y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x3y103pqrEv,_ZTv0_n16_N3ccc9DD10x3y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x3y103abcEv,_ZTv0_n20_N3ccc9DD10x3y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x3y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x3y10E[] = {
  {&(_ZTVN3ccc9DD10x3y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x3y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x3y10E[];
static VTBL_ENTRY alt_thunk_names2115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x3y103abcEv,_ZTv0_n20_N3ccc9DD10x3y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y103abcEv,_ZThn4_N3ccc9DD10x3y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x3y103pqrEv,_ZTv0_n16_N3ccc9DD10x3y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y103pqrEv,_ZThn4_N3ccc9DD10x3y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x3y10E = {  "_ZN3ccc9DD10x3y10E", // class name
  bases__ZN3ccc9DD10x3y10E, 2,
  &(vtc__ZN3ccc9DD10x3y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x3y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x3y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x3y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x3y10E),3, //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  CC10x3y11  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC10x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x3y113efgEv
  ~CC10x3y11(); // tgen
  CC10x3y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y11E) C1{ VBC2{ v1 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x3y113pqrEv");}
void  ccc::CC10x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x3y113efgEv");}
ccc::CC10x3y11 ::~CC10x3y11(){ note_dtor("_ZN3ccc9CC10x3y11E", this);} // tgen
ccc::CC10x3y11 ::CC10x3y11(){ note_ctor("_ZN3ccc9CC10x3y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x3y11E, buf);
    ::ccc::CC10x3y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x3y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC10x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x3y11E);
    dp->::ccc::CC10x3y11::~CC10x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x3y11E(Test__ZN3ccc9CC10x3y11E, "_ZN3ccc9CC10x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x3y11C1Ev();
extern void _ZN3ccc9CC10x3y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x3y11E[] = {
  NSPAIR(_ZN3ccc9CC10x3y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC10x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x3y11E[];
extern void _ZN3ccc9CC10x3y113efgEv();
extern void _ZN3ccc9CC10x3y113pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x3y113pqrEv,_ZTv0_n12_N3ccc9CC10x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y113pqrEv,_ZThn4_N3ccc9CC10x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x3y113pqrEv,_ZTv0_n12_N3ccc9CC10x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x3y11E[] = {
  {&(_ZTVN3ccc9CC10x3y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x3y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x3y11E[];
static VTBL_ENTRY alt_thunk_names2116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x3y113pqrEv,_ZTv0_n12_N3ccc9CC10x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x3y113pqrEv,_ZThn4_N3ccc9CC10x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x3y11E = {  "_ZN3ccc9CC10x3y11E", // class name
  bases__ZN3ccc9CC10x3y11E, 2,
  &(vtc__ZN3ccc9CC10x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x3y11E),2, //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  DD10x3y11  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9DD10x3y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD10x3y113efgEv
  ~DD10x3y11(); // tgen
  DD10x3y11(); // tgen
};
//SIG(1 _ZN3ccc9DD10x3y11E) C1{ VBC2{ v1 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x3y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x3y113pqrEv");}
void  ccc::DD10x3y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x3y113efgEv");}
ccc::DD10x3y11 ::~DD10x3y11(){ note_dtor("_ZN3ccc9DD10x3y11E", this);} // tgen
ccc::DD10x3y11 ::DD10x3y11(){ note_ctor("_ZN3ccc9DD10x3y11E", this);} // tgen
}
static void Test__ZN3ccc9DD10x3y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x3y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x3y11E, buf);
    ::ccc::DD10x3y11 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x3y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x3y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x3y11E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9DD10x3y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x3y11E);
    dp->::ccc::DD10x3y11::~DD10x3y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x3y11E(Test__ZN3ccc9DD10x3y11E, "_ZN3ccc9DD10x3y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x3y11C1Ev();
extern void _ZN3ccc9DD10x3y11D1Ev();
Name_Map name_map__ZN3ccc9DD10x3y11E[] = {
  NSPAIR(_ZN3ccc9DD10x3y11C1Ev),
  NSPAIR(_ZN3ccc9DD10x3y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9DD10x3y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y11E[];
extern void _ZN3ccc9DD10x3y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x3y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x3y113efgEv,_ZTv0_n12_N3ccc9DD10x3y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y113efgEv,_ZThn4_N3ccc9DD10x3y113efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x3y113pqrEv,_ZTv0_n16_N3ccc9DD10x3y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y113pqrEv,_ZThn4_N3ccc9DD10x3y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x3y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x3y113efgEv,_ZTv0_n12_N3ccc9DD10x3y113efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x3y113pqrEv,_ZTv0_n16_N3ccc9DD10x3y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x3y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x3y11E[] = {
  {&(_ZTVN3ccc9DD10x3y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x3y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x3y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x3y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x3y11E[];
static VTBL_ENTRY alt_thunk_names2117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x3y113pqrEv,_ZTv0_n16_N3ccc9DD10x3y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y113pqrEv,_ZThn4_N3ccc9DD10x3y113pqrEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x3y113efgEv,_ZTv0_n12_N3ccc9DD10x3y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y113efgEv,_ZThn4_N3ccc9DD10x3y113efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x3y11E = {  "_ZN3ccc9DD10x3y11E", // class name
  bases__ZN3ccc9DD10x3y11E, 2,
  &(vtc__ZN3ccc9DD10x3y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x3y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x3y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x3y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x3y11E),3, //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  CC10x3y12  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9CC10x3y123abcEv
  ~CC10x3y12(); // tgen
  CC10x3y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y12E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC10x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x3y123abcEv");}
ccc::CC10x3y12 ::~CC10x3y12(){ note_dtor("_ZN3ccc9CC10x3y12E", this);} // tgen
ccc::CC10x3y12 ::CC10x3y12(){ note_ctor("_ZN3ccc9CC10x3y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x3y12E, buf);
    ::ccc::CC10x3y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x3y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC10x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x3y12E);
    dp->::ccc::CC10x3y12::~CC10x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x3y12E(Test__ZN3ccc9CC10x3y12E, "_ZN3ccc9CC10x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x3y12C1Ev();
extern void _ZN3ccc9CC10x3y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x3y12E[] = {
  NSPAIR(_ZN3ccc9CC10x3y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC10x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x3y12E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc9CC10x3y123abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x3y123abcEv,_ZTv0_n16_N3ccc9CC10x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y123abcEv,_ZThn4_N3ccc9CC10x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x3y123abcEv,_ZTv0_n16_N3ccc9CC10x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x3y12E[] = {
  {&(_ZTVN3ccc9CC10x3y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x3y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x3y12E[];
static VTBL_ENTRY alt_thunk_names2118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x3y123abcEv,_ZTv0_n16_N3ccc9CC10x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x3y123abcEv,_ZThn4_N3ccc9CC10x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x3y12E = {  "_ZN3ccc9CC10x3y12E", // class name
  bases__ZN3ccc9CC10x3y12E, 2,
  &(vtc__ZN3ccc9CC10x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x3y12E),2, //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  DD10x3y12  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  abc(); // _ZN3ccc9DD10x3y123abcEv
  ~DD10x3y12(); // tgen
  DD10x3y12(); // tgen
};
//SIG(1 _ZN3ccc9DD10x3y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD10x3y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x3y123abcEv");}
ccc::DD10x3y12 ::~DD10x3y12(){ note_dtor("_ZN3ccc9DD10x3y12E", this);} // tgen
ccc::DD10x3y12 ::DD10x3y12(){ note_ctor("_ZN3ccc9DD10x3y12E", this);} // tgen
}
static void Test__ZN3ccc9DD10x3y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x3y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x3y12E, buf);
    ::ccc::DD10x3y12 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x3y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x3y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x3y12E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9DD10x3y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x3y12E);
    dp->::ccc::DD10x3y12::~DD10x3y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x3y12E(Test__ZN3ccc9DD10x3y12E, "_ZN3ccc9DD10x3y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x3y12C1Ev();
extern void _ZN3ccc9DD10x3y12D1Ev();
Name_Map name_map__ZN3ccc9DD10x3y12E[] = {
  NSPAIR(_ZN3ccc9DD10x3y12C1Ev),
  NSPAIR(_ZN3ccc9DD10x3y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9DD10x3y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9DD10x3y123abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x3y123abcEv,_ZTv0_n20_N3ccc9DD10x3y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y123abcEv,_ZThn4_N3ccc9DD10x3y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x3y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x3y123abcEv,_ZTv0_n20_N3ccc9DD10x3y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x3y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x3y12E[] = {
  {&(_ZTVN3ccc9DD10x3y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x3y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x3y12E[];
static VTBL_ENTRY alt_thunk_names2119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x3y123abcEv,_ZTv0_n20_N3ccc9DD10x3y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y123abcEv,_ZThn4_N3ccc9DD10x3y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x3y12E = {  "_ZN3ccc9DD10x3y12E", // class name
  bases__ZN3ccc9DD10x3y12E, 2,
  &(vtc__ZN3ccc9DD10x3y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x3y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x3y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x3y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x3y12E),3, //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  CC10x3y13  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9CC10x3y133efgEv
  ~CC10x3y13(); // tgen
  CC10x3y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y13E) C1{ VBC2{ v2 v3} BC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::CC10x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x3y133efgEv");}
ccc::CC10x3y13 ::~CC10x3y13(){ note_dtor("_ZN3ccc9CC10x3y13E", this);} // tgen
ccc::CC10x3y13 ::CC10x3y13(){ note_ctor("_ZN3ccc9CC10x3y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x3y13E, buf);
    ::ccc::CC10x3y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x3y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC10x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x3y13E);
    dp->::ccc::CC10x3y13::~CC10x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x3y13E(Test__ZN3ccc9CC10x3y13E, "_ZN3ccc9CC10x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x3y13C1Ev();
extern void _ZN3ccc9CC10x3y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x3y13E[] = {
  NSPAIR(_ZN3ccc9CC10x3y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC10x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x3y13E[];
extern void _ZN3ccc9CC10x3y133efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x3y13E[] = {
  {&(_ZTVN3ccc9CC10x3y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x3y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x3y13E[];
Class_Descriptor cd__ZN3ccc9CC10x3y13E = {  "_ZN3ccc9CC10x3y13E", // class name
  bases__ZN3ccc9CC10x3y13E, 2,
  &(vtc__ZN3ccc9CC10x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x3y13E),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  DD10x3y13  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  efg(); // _ZN3ccc9DD10x3y133efgEv
  ~DD10x3y13(); // tgen
  DD10x3y13(); // tgen
};
//SIG(1 _ZN3ccc9DD10x3y13E) C1{ VBC2{ v2 v3} VBC3{ v1 v4 v5} v1}
}
namespace ccc { 
void  ccc::DD10x3y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x3y133efgEv");}
ccc::DD10x3y13 ::~DD10x3y13(){ note_dtor("_ZN3ccc9DD10x3y13E", this);} // tgen
ccc::DD10x3y13 ::DD10x3y13(){ note_ctor("_ZN3ccc9DD10x3y13E", this);} // tgen
}
static void Test__ZN3ccc9DD10x3y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x3y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x3y13E, buf);
    ::ccc::DD10x3y13 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x3y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x3y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x3y13E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9DD10x3y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x3y13E);
    dp->::ccc::DD10x3y13::~DD10x3y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x3y13E(Test__ZN3ccc9DD10x3y13E, "_ZN3ccc9DD10x3y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x3y13C1Ev();
extern void _ZN3ccc9DD10x3y13D1Ev();
Name_Map name_map__ZN3ccc9DD10x3y13E[] = {
  NSPAIR(_ZN3ccc9DD10x3y13C1Ev),
  NSPAIR(_ZN3ccc9DD10x3y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9DD10x3y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x3y133efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x3y133efgEv,_ZTv0_n12_N3ccc9DD10x3y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y133efgEv,_ZThn4_N3ccc9DD10x3y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x3y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y13E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x3y133efgEv,_ZTv0_n12_N3ccc9DD10x3y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x3y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x3y13E[] = {
  {&(_ZTVN3ccc9DD10x3y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x3y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x3y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x3y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x3y13E[];
static VTBL_ENTRY alt_thunk_names2120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x3y133efgEv,_ZTv0_n12_N3ccc9DD10x3y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y133efgEv,_ZThn4_N3ccc9DD10x3y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x3y13E = {  "_ZN3ccc9DD10x3y13E", // class name
  bases__ZN3ccc9DD10x3y13E, 2,
  &(vtc__ZN3ccc9DD10x3y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x3y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x3y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x3y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x3y13E),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  CC10x3y14  : virtual ::ccc::AA10 , ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9CC10x3y143pqrEv
  ~CC10x3y14(); // tgen
  CC10x3y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y14E) C1{ VBC2{ v1 v2} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC10x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x3y143pqrEv");}
ccc::CC10x3y14 ::~CC10x3y14(){ note_dtor("_ZN3ccc9CC10x3y14E", this);} // tgen
ccc::CC10x3y14 ::CC10x3y14(){ note_ctor("_ZN3ccc9CC10x3y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x3y14E, buf);
    ::ccc::CC10x3y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x3y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC10x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x3y14E);
    dp->::ccc::CC10x3y14::~CC10x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x3y14E(Test__ZN3ccc9CC10x3y14E, "_ZN3ccc9CC10x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x3y14C1Ev();
extern void _ZN3ccc9CC10x3y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x3y14E[] = {
  NSPAIR(_ZN3ccc9CC10x3y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC10x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x3y14E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc9CC10x3y143pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x3y143pqrEv,_ZTv0_n12_N3ccc9CC10x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x3y143pqrEv,_ZThn4_N3ccc9CC10x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x3y143pqrEv,_ZTv0_n12_N3ccc9CC10x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x3y14E[] = {
  {&(_ZTVN3ccc9CC10x3y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x3y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x3y14E[];
static VTBL_ENTRY alt_thunk_names2121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x3y143pqrEv,_ZTv0_n12_N3ccc9CC10x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x3y143pqrEv,_ZThn4_N3ccc9CC10x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x3y14E = {  "_ZN3ccc9CC10x3y14E", // class name
  bases__ZN3ccc9CC10x3y14E, 2,
  &(vtc__ZN3ccc9CC10x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x3y14E),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  DD10x3y14  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  virtual void  pqr(); // _ZN3ccc9DD10x3y143pqrEv
  ~DD10x3y14(); // tgen
  DD10x3y14(); // tgen
};
//SIG(1 _ZN3ccc9DD10x3y14E) C1{ VBC2{ v1 v2} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD10x3y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x3y143pqrEv");}
ccc::DD10x3y14 ::~DD10x3y14(){ note_dtor("_ZN3ccc9DD10x3y14E", this);} // tgen
ccc::DD10x3y14 ::DD10x3y14(){ note_ctor("_ZN3ccc9DD10x3y14E", this);} // tgen
}
static void Test__ZN3ccc9DD10x3y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x3y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x3y14E, buf);
    ::ccc::DD10x3y14 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x3y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x3y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x3y14E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9DD10x3y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x3y14E);
    dp->::ccc::DD10x3y14::~DD10x3y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x3y14E(Test__ZN3ccc9DD10x3y14E, "_ZN3ccc9DD10x3y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x3y14C1Ev();
extern void _ZN3ccc9DD10x3y14D1Ev();
Name_Map name_map__ZN3ccc9DD10x3y14E[] = {
  NSPAIR(_ZN3ccc9DD10x3y14C1Ev),
  NSPAIR(_ZN3ccc9DD10x3y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9DD10x3y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y14E[];
extern void _ZN3ccc9DD10x3y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x3y143pqrEv,_ZTv0_n16_N3ccc9DD10x3y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x3y143pqrEv,_ZThn4_N3ccc9DD10x3y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x3y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x3y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x3y143pqrEv,_ZTv0_n16_N3ccc9DD10x3y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x3y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x3y14E[] = {
  {&(_ZTVN3ccc9DD10x3y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x3y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x3y14E[];
static VTBL_ENTRY alt_thunk_names2122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x3y143pqrEv,_ZTv0_n16_N3ccc9DD10x3y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x3y143pqrEv,_ZThn4_N3ccc9DD10x3y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x3y14E = {  "_ZN3ccc9DD10x3y14E", // class name
  bases__ZN3ccc9DD10x3y14E, 2,
  &(vtc__ZN3ccc9DD10x3y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x3y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x3y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x3y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x3y14E),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  CC10x3y15  : virtual ::ccc::AA10 , ::ccc::BB3 {
  ~CC10x3y15(); // tgen
  CC10x3y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x3y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC10x3y15 ::~CC10x3y15(){ note_dtor("_ZN3ccc9CC10x3y15E", this);} // tgen
ccc::CC10x3y15 ::CC10x3y15(){ note_ctor("_ZN3ccc9CC10x3y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x3y15E, buf);
    ::ccc::CC10x3y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x3y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), 0, "_ZN3ccc9CC10x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x3y15E);
    dp->::ccc::CC10x3y15::~CC10x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x3y15E(Test__ZN3ccc9CC10x3y15E, "_ZN3ccc9CC10x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x3y15C1Ev();
extern void _ZN3ccc9CC10x3y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x3y15E[] = {
  NSPAIR(_ZN3ccc9CC10x3y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9CC10x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x3y15E[];
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x3y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x3y15E[] = {
  {&(_ZTVN3ccc9CC10x3y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x3y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x3y15E[];
Class_Descriptor cd__ZN3ccc9CC10x3y15E = {  "_ZN3ccc9CC10x3y15E", // class name
  bases__ZN3ccc9CC10x3y15E, 2,
  &(vtc__ZN3ccc9CC10x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x3y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x3y15E),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  DD10x3y15  : virtual ::ccc::AA10 , virtual ::ccc::BB3 {
  ~DD10x3y15(); // tgen
  DD10x3y15(); // tgen
};
//SIG(1 _ZN3ccc9DD10x3y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD10x3y15 ::~DD10x3y15(){ note_dtor("_ZN3ccc9DD10x3y15E", this);} // tgen
ccc::DD10x3y15 ::DD10x3y15(){ note_ctor("_ZN3ccc9DD10x3y15E", this);} // tgen
}
static void Test__ZN3ccc9DD10x3y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x3y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x3y15E, buf);
    ::ccc::DD10x3y15 *dp, &lv = *(dp=new (buf) ::ccc::DD10x3y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x3y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x3y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x3y15E");
    check_base_class_offset(lv, (::ccc::BB3*), ABISELECT(8,4), "_ZN3ccc9DD10x3y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x3y15E);
    dp->::ccc::DD10x3y15::~DD10x3y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x3y15E(Test__ZN3ccc9DD10x3y15E, "_ZN3ccc9DD10x3y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x3y15C1Ev();
extern void _ZN3ccc9DD10x3y15D1Ev();
Name_Map name_map__ZN3ccc9DD10x3y15E[] = {
  NSPAIR(_ZN3ccc9DD10x3y15C1Ev),
  NSPAIR(_ZN3ccc9DD10x3y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB3E;
extern VTBL_ENTRY _ZTIN3ccc3BB3E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB3E[];
static Base_Class bases__ZN3ccc9DD10x3y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB3E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB33efgEv();
extern void _ZN3ccc3BB33pqrEv();
extern void _ZN3ccc3BB33abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x3y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x3y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB33efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB33abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x3y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x3y15E[] = {
  {&(_ZTVN3ccc9DD10x3y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x3y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x3y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x3y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x3y15E[];
Class_Descriptor cd__ZN3ccc9DD10x3y15E = {  "_ZN3ccc9DD10x3y15E", // class name
  bases__ZN3ccc9DD10x3y15E, 2,
  &(vtc__ZN3ccc9DD10x3y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x3y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x3y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x3y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x3y15E),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  CC10x4y0  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y03pqrEv
  ~CC10x4y0(); // tgen
  CC10x4y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y0E) C1{ VBC2{ v3 v1} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y03abcEv");}
void  ccc::CC10x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y03efgEv");}
void  ccc::CC10x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y03pqrEv");}
ccc::CC10x4y0 ::~CC10x4y0(){ note_dtor("_ZN3ccc8CC10x4y0E", this);} // tgen
ccc::CC10x4y0 ::CC10x4y0(){ note_ctor("_ZN3ccc8CC10x4y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y0E, buf);
    ::ccc::CC10x4y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y0E);
    dp->::ccc::CC10x4y0::~CC10x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y0E(Test__ZN3ccc8CC10x4y0E, "_ZN3ccc8CC10x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y0C1Ev();
extern void _ZN3ccc8CC10x4y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y0E[] = {
  NSPAIR(_ZN3ccc8CC10x4y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y0E[];
extern void _ZN3ccc8CC10x4y03pqrEv();
extern void _ZN3ccc8CC10x4y03abcEv();
extern void _ZN3ccc8CC10x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y03pqrEv,_ZTv0_n12_N3ccc8CC10x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y03pqrEv,_ZThn4_N3ccc8CC10x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y03abcEv,_ZTv0_n16_N3ccc8CC10x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y03abcEv,_ZThn4_N3ccc8CC10x4y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y03pqrEv,_ZTv0_n12_N3ccc8CC10x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y03abcEv,_ZTv0_n16_N3ccc8CC10x4y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y0E[] = {
  {&(_ZTVN3ccc8CC10x4y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y0E[];
static VTBL_ENTRY alt_thunk_names2123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y03abcEv,_ZTv0_n16_N3ccc8CC10x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y03abcEv,_ZThn4_N3ccc8CC10x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y03pqrEv,_ZTv0_n12_N3ccc8CC10x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y03pqrEv,_ZThn4_N3ccc8CC10x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y0E = {  "_ZN3ccc8CC10x4y0E", // class name
  bases__ZN3ccc8CC10x4y0E, 2,
  &(vtc__ZN3ccc8CC10x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y0E),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  DD10x4y0  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD10x4y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x4y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x4y03pqrEv
  ~DD10x4y0(); // tgen
  DD10x4y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y0E) C1{ VBC2{ v3 v1} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x4y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y03abcEv");}
void  ccc::DD10x4y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y03efgEv");}
void  ccc::DD10x4y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y03pqrEv");}
ccc::DD10x4y0 ::~DD10x4y0(){ note_dtor("_ZN3ccc8DD10x4y0E", this);} // tgen
ccc::DD10x4y0 ::DD10x4y0(){ note_ctor("_ZN3ccc8DD10x4y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y0E, buf);
    ::ccc::DD10x4y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y0E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y0E);
    dp->::ccc::DD10x4y0::~DD10x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y0E(Test__ZN3ccc8DD10x4y0E, "_ZN3ccc8DD10x4y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y0C1Ev();
extern void _ZN3ccc8DD10x4y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y0E[] = {
  NSPAIR(_ZN3ccc8DD10x4y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y0E[];
extern void _ZN3ccc8DD10x4y03pqrEv();
extern void _ZN3ccc8DD10x4y03abcEv();
extern void _ZN3ccc8DD10x4y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y03pqrEv,_ZTv0_n12_N3ccc8DD10x4y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y03pqrEv,_ZThn4_N3ccc8DD10x4y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y03abcEv,_ZTv0_n16_N3ccc8DD10x4y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y03abcEv,_ZThn4_N3ccc8DD10x4y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y03efgEv,_ZTv0_n20_N3ccc8DD10x4y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y03efgEv,_ZThn4_N3ccc8DD10x4y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y03pqrEv,_ZTv0_n12_N3ccc8DD10x4y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y03abcEv,_ZTv0_n16_N3ccc8DD10x4y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y03efgEv,_ZTv0_n20_N3ccc8DD10x4y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y0E[] = {
  {&(_ZTVN3ccc8DD10x4y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y0E[];
static VTBL_ENTRY alt_thunk_names2124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y03efgEv,_ZTv0_n20_N3ccc8DD10x4y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y03efgEv,_ZThn4_N3ccc8DD10x4y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y03abcEv,_ZTv0_n16_N3ccc8DD10x4y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y03abcEv,_ZThn4_N3ccc8DD10x4y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y03pqrEv,_ZTv0_n12_N3ccc8DD10x4y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y03pqrEv,_ZThn4_N3ccc8DD10x4y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y0E = {  "_ZN3ccc8DD10x4y0E", // class name
  bases__ZN3ccc8DD10x4y0E, 2,
  &(vtc__ZN3ccc8DD10x4y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y0E),3, //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  CC10x4y1  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x4y13efgEv
  ~CC10x4y1(); // tgen
  CC10x4y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y1E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y13abcEv");}
void  ccc::CC10x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y13pqrEv");}
void  ccc::CC10x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y13efgEv");}
ccc::CC10x4y1 ::~CC10x4y1(){ note_dtor("_ZN3ccc8CC10x4y1E", this);} // tgen
ccc::CC10x4y1 ::CC10x4y1(){ note_ctor("_ZN3ccc8CC10x4y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y1E, buf);
    ::ccc::CC10x4y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y1E);
    dp->::ccc::CC10x4y1::~CC10x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y1E(Test__ZN3ccc8CC10x4y1E, "_ZN3ccc8CC10x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y1C1Ev();
extern void _ZN3ccc8CC10x4y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y1E[] = {
  NSPAIR(_ZN3ccc8CC10x4y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y1E[];
extern void _ZN3ccc8CC10x4y13pqrEv();
extern void _ZN3ccc8CC10x4y13abcEv();
extern void _ZN3ccc8CC10x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y13pqrEv,_ZTv0_n12_N3ccc8CC10x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y13pqrEv,_ZThn4_N3ccc8CC10x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y13abcEv,_ZTv0_n16_N3ccc8CC10x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y13abcEv,_ZThn4_N3ccc8CC10x4y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y13pqrEv,_ZTv0_n12_N3ccc8CC10x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y13abcEv,_ZTv0_n16_N3ccc8CC10x4y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y1E[] = {
  {&(_ZTVN3ccc8CC10x4y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y1E[];
static VTBL_ENTRY alt_thunk_names2125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y13abcEv,_ZTv0_n16_N3ccc8CC10x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y13abcEv,_ZThn4_N3ccc8CC10x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y13pqrEv,_ZTv0_n12_N3ccc8CC10x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y13pqrEv,_ZThn4_N3ccc8CC10x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y1E = {  "_ZN3ccc8CC10x4y1E", // class name
  bases__ZN3ccc8CC10x4y1E, 2,
  &(vtc__ZN3ccc8CC10x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y1E),2, //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  DD10x4y1  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD10x4y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x4y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x4y13efgEv
  ~DD10x4y1(); // tgen
  DD10x4y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y1E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x4y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y13abcEv");}
void  ccc::DD10x4y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y13pqrEv");}
void  ccc::DD10x4y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y13efgEv");}
ccc::DD10x4y1 ::~DD10x4y1(){ note_dtor("_ZN3ccc8DD10x4y1E", this);} // tgen
ccc::DD10x4y1 ::DD10x4y1(){ note_ctor("_ZN3ccc8DD10x4y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y1E, buf);
    ::ccc::DD10x4y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y1E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y1E);
    dp->::ccc::DD10x4y1::~DD10x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y1E(Test__ZN3ccc8DD10x4y1E, "_ZN3ccc8DD10x4y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y1C1Ev();
extern void _ZN3ccc8DD10x4y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y1E[] = {
  NSPAIR(_ZN3ccc8DD10x4y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y1E[];
extern void _ZN3ccc8DD10x4y13pqrEv();
extern void _ZN3ccc8DD10x4y13abcEv();
extern void _ZN3ccc8DD10x4y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y13pqrEv,_ZTv0_n12_N3ccc8DD10x4y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y13pqrEv,_ZThn4_N3ccc8DD10x4y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y13abcEv,_ZTv0_n16_N3ccc8DD10x4y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y13abcEv,_ZThn4_N3ccc8DD10x4y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y13efgEv,_ZTv0_n20_N3ccc8DD10x4y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y13efgEv,_ZThn4_N3ccc8DD10x4y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y13pqrEv,_ZTv0_n12_N3ccc8DD10x4y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y13abcEv,_ZTv0_n16_N3ccc8DD10x4y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y13efgEv,_ZTv0_n20_N3ccc8DD10x4y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y1E[] = {
  {&(_ZTVN3ccc8DD10x4y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y1E[];
static VTBL_ENTRY alt_thunk_names2126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y13efgEv,_ZTv0_n20_N3ccc8DD10x4y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y13efgEv,_ZThn4_N3ccc8DD10x4y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y13abcEv,_ZTv0_n16_N3ccc8DD10x4y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y13abcEv,_ZThn4_N3ccc8DD10x4y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y13pqrEv,_ZTv0_n12_N3ccc8DD10x4y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y13pqrEv,_ZThn4_N3ccc8DD10x4y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y1E = {  "_ZN3ccc8DD10x4y1E", // class name
  bases__ZN3ccc8DD10x4y1E, 2,
  &(vtc__ZN3ccc8DD10x4y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y1E),3, //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  CC10x4y2  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y23pqrEv
  ~CC10x4y2(); // tgen
  CC10x4y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y2E) C1{ VBC2{ v3 v2} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y23efgEv");}
void  ccc::CC10x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y23abcEv");}
void  ccc::CC10x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y23pqrEv");}
ccc::CC10x4y2 ::~CC10x4y2(){ note_dtor("_ZN3ccc8CC10x4y2E", this);} // tgen
ccc::CC10x4y2 ::CC10x4y2(){ note_ctor("_ZN3ccc8CC10x4y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y2E, buf);
    ::ccc::CC10x4y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y2E);
    dp->::ccc::CC10x4y2::~CC10x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y2E(Test__ZN3ccc8CC10x4y2E, "_ZN3ccc8CC10x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y2C1Ev();
extern void _ZN3ccc8CC10x4y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y2E[] = {
  NSPAIR(_ZN3ccc8CC10x4y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y2E[];
extern void _ZN3ccc8CC10x4y23pqrEv();
extern void _ZN3ccc8CC10x4y23abcEv();
extern void _ZN3ccc8CC10x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y23pqrEv,_ZTv0_n12_N3ccc8CC10x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y23pqrEv,_ZThn4_N3ccc8CC10x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y23abcEv,_ZTv0_n16_N3ccc8CC10x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y23abcEv,_ZThn4_N3ccc8CC10x4y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y23pqrEv,_ZTv0_n12_N3ccc8CC10x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y23abcEv,_ZTv0_n16_N3ccc8CC10x4y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y2E[] = {
  {&(_ZTVN3ccc8CC10x4y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y2E[];
static VTBL_ENTRY alt_thunk_names2127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y23abcEv,_ZTv0_n16_N3ccc8CC10x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y23abcEv,_ZThn4_N3ccc8CC10x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y23pqrEv,_ZTv0_n12_N3ccc8CC10x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y23pqrEv,_ZThn4_N3ccc8CC10x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y2E = {  "_ZN3ccc8CC10x4y2E", // class name
  bases__ZN3ccc8CC10x4y2E, 2,
  &(vtc__ZN3ccc8CC10x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y2E),2, //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  DD10x4y2  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD10x4y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x4y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x4y23pqrEv
  ~DD10x4y2(); // tgen
  DD10x4y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y2E) C1{ VBC2{ v3 v2} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x4y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y23efgEv");}
void  ccc::DD10x4y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y23abcEv");}
void  ccc::DD10x4y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y23pqrEv");}
ccc::DD10x4y2 ::~DD10x4y2(){ note_dtor("_ZN3ccc8DD10x4y2E", this);} // tgen
ccc::DD10x4y2 ::DD10x4y2(){ note_ctor("_ZN3ccc8DD10x4y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y2E, buf);
    ::ccc::DD10x4y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y2E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y2E);
    dp->::ccc::DD10x4y2::~DD10x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y2E(Test__ZN3ccc8DD10x4y2E, "_ZN3ccc8DD10x4y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y2C1Ev();
extern void _ZN3ccc8DD10x4y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y2E[] = {
  NSPAIR(_ZN3ccc8DD10x4y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y2E[];
extern void _ZN3ccc8DD10x4y23pqrEv();
extern void _ZN3ccc8DD10x4y23abcEv();
extern void _ZN3ccc8DD10x4y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y23pqrEv,_ZTv0_n12_N3ccc8DD10x4y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y23pqrEv,_ZThn4_N3ccc8DD10x4y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y23abcEv,_ZTv0_n16_N3ccc8DD10x4y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y23abcEv,_ZThn4_N3ccc8DD10x4y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y23efgEv,_ZTv0_n20_N3ccc8DD10x4y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y23efgEv,_ZThn4_N3ccc8DD10x4y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y23pqrEv,_ZTv0_n12_N3ccc8DD10x4y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y23abcEv,_ZTv0_n16_N3ccc8DD10x4y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y23efgEv,_ZTv0_n20_N3ccc8DD10x4y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y2E[] = {
  {&(_ZTVN3ccc8DD10x4y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y2E[];
static VTBL_ENTRY alt_thunk_names2128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y23efgEv,_ZTv0_n20_N3ccc8DD10x4y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y23efgEv,_ZThn4_N3ccc8DD10x4y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y23abcEv,_ZTv0_n16_N3ccc8DD10x4y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y23abcEv,_ZThn4_N3ccc8DD10x4y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y23pqrEv,_ZTv0_n12_N3ccc8DD10x4y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y23pqrEv,_ZThn4_N3ccc8DD10x4y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y2E = {  "_ZN3ccc8DD10x4y2E", // class name
  bases__ZN3ccc8DD10x4y2E, 2,
  &(vtc__ZN3ccc8DD10x4y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y2E),3, //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  CC10x4y3  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x4y33abcEv
  ~CC10x4y3(); // tgen
  CC10x4y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y3E) C1{ VBC2{ v2 v3} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y33efgEv");}
void  ccc::CC10x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y33pqrEv");}
void  ccc::CC10x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y33abcEv");}
ccc::CC10x4y3 ::~CC10x4y3(){ note_dtor("_ZN3ccc8CC10x4y3E", this);} // tgen
ccc::CC10x4y3 ::CC10x4y3(){ note_ctor("_ZN3ccc8CC10x4y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y3E, buf);
    ::ccc::CC10x4y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y3E);
    dp->::ccc::CC10x4y3::~CC10x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y3E(Test__ZN3ccc8CC10x4y3E, "_ZN3ccc8CC10x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y3C1Ev();
extern void _ZN3ccc8CC10x4y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y3E[] = {
  NSPAIR(_ZN3ccc8CC10x4y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y3E[];
extern void _ZN3ccc8CC10x4y33pqrEv();
extern void _ZN3ccc8CC10x4y33abcEv();
extern void _ZN3ccc8CC10x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y33pqrEv,_ZTv0_n12_N3ccc8CC10x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y33pqrEv,_ZThn4_N3ccc8CC10x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y33abcEv,_ZTv0_n16_N3ccc8CC10x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y33abcEv,_ZThn4_N3ccc8CC10x4y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y33pqrEv,_ZTv0_n12_N3ccc8CC10x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y33abcEv,_ZTv0_n16_N3ccc8CC10x4y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y3E[] = {
  {&(_ZTVN3ccc8CC10x4y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y3E[];
static VTBL_ENTRY alt_thunk_names2129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y33abcEv,_ZTv0_n16_N3ccc8CC10x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y33abcEv,_ZThn4_N3ccc8CC10x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y33pqrEv,_ZTv0_n12_N3ccc8CC10x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y33pqrEv,_ZThn4_N3ccc8CC10x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y3E = {  "_ZN3ccc8CC10x4y3E", // class name
  bases__ZN3ccc8CC10x4y3E, 2,
  &(vtc__ZN3ccc8CC10x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y3E),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  DD10x4y3  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD10x4y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x4y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x4y33abcEv
  ~DD10x4y3(); // tgen
  DD10x4y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y3E) C1{ VBC2{ v2 v3} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x4y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y33efgEv");}
void  ccc::DD10x4y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y33pqrEv");}
void  ccc::DD10x4y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y33abcEv");}
ccc::DD10x4y3 ::~DD10x4y3(){ note_dtor("_ZN3ccc8DD10x4y3E", this);} // tgen
ccc::DD10x4y3 ::DD10x4y3(){ note_ctor("_ZN3ccc8DD10x4y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y3E, buf);
    ::ccc::DD10x4y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y3E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y3E);
    dp->::ccc::DD10x4y3::~DD10x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y3E(Test__ZN3ccc8DD10x4y3E, "_ZN3ccc8DD10x4y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y3C1Ev();
extern void _ZN3ccc8DD10x4y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y3E[] = {
  NSPAIR(_ZN3ccc8DD10x4y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y3E[];
extern void _ZN3ccc8DD10x4y33pqrEv();
extern void _ZN3ccc8DD10x4y33abcEv();
extern void _ZN3ccc8DD10x4y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y33pqrEv,_ZTv0_n12_N3ccc8DD10x4y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y33pqrEv,_ZThn4_N3ccc8DD10x4y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y33abcEv,_ZTv0_n16_N3ccc8DD10x4y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y33abcEv,_ZThn4_N3ccc8DD10x4y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y33efgEv,_ZTv0_n20_N3ccc8DD10x4y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y33efgEv,_ZThn4_N3ccc8DD10x4y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y33pqrEv,_ZTv0_n12_N3ccc8DD10x4y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y33abcEv,_ZTv0_n16_N3ccc8DD10x4y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y33efgEv,_ZTv0_n20_N3ccc8DD10x4y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y3E[] = {
  {&(_ZTVN3ccc8DD10x4y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y3E[];
static VTBL_ENTRY alt_thunk_names2130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y33efgEv,_ZTv0_n20_N3ccc8DD10x4y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y33efgEv,_ZThn4_N3ccc8DD10x4y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y33abcEv,_ZTv0_n16_N3ccc8DD10x4y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y33abcEv,_ZThn4_N3ccc8DD10x4y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y33pqrEv,_ZTv0_n12_N3ccc8DD10x4y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y33pqrEv,_ZThn4_N3ccc8DD10x4y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y3E = {  "_ZN3ccc8DD10x4y3E", // class name
  bases__ZN3ccc8DD10x4y3E, 2,
  &(vtc__ZN3ccc8DD10x4y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y3E),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  CC10x4y4  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC10x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x4y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x4y43efgEv
  ~CC10x4y4(); // tgen
  CC10x4y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y4E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y43pqrEv");}
void  ccc::CC10x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y43abcEv");}
void  ccc::CC10x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y43efgEv");}
ccc::CC10x4y4 ::~CC10x4y4(){ note_dtor("_ZN3ccc8CC10x4y4E", this);} // tgen
ccc::CC10x4y4 ::CC10x4y4(){ note_ctor("_ZN3ccc8CC10x4y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y4E, buf);
    ::ccc::CC10x4y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y4E);
    dp->::ccc::CC10x4y4::~CC10x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y4E(Test__ZN3ccc8CC10x4y4E, "_ZN3ccc8CC10x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y4C1Ev();
extern void _ZN3ccc8CC10x4y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y4E[] = {
  NSPAIR(_ZN3ccc8CC10x4y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y4E[];
extern void _ZN3ccc8CC10x4y43pqrEv();
extern void _ZN3ccc8CC10x4y43abcEv();
extern void _ZN3ccc8CC10x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y43pqrEv,_ZTv0_n12_N3ccc8CC10x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y43pqrEv,_ZThn4_N3ccc8CC10x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y43abcEv,_ZTv0_n16_N3ccc8CC10x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y43abcEv,_ZThn4_N3ccc8CC10x4y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y43pqrEv,_ZTv0_n12_N3ccc8CC10x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y43abcEv,_ZTv0_n16_N3ccc8CC10x4y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y4E[] = {
  {&(_ZTVN3ccc8CC10x4y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y4E[];
static VTBL_ENTRY alt_thunk_names2131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y43abcEv,_ZTv0_n16_N3ccc8CC10x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y43abcEv,_ZThn4_N3ccc8CC10x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y43pqrEv,_ZTv0_n12_N3ccc8CC10x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y43pqrEv,_ZThn4_N3ccc8CC10x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y4E = {  "_ZN3ccc8CC10x4y4E", // class name
  bases__ZN3ccc8CC10x4y4E, 2,
  &(vtc__ZN3ccc8CC10x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y4E),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  DD10x4y4  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD10x4y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x4y43abcEv
  virtual void  efg(); // _ZN3ccc8DD10x4y43efgEv
  ~DD10x4y4(); // tgen
  DD10x4y4(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y4E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x4y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y43pqrEv");}
void  ccc::DD10x4y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y43abcEv");}
void  ccc::DD10x4y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y43efgEv");}
ccc::DD10x4y4 ::~DD10x4y4(){ note_dtor("_ZN3ccc8DD10x4y4E", this);} // tgen
ccc::DD10x4y4 ::DD10x4y4(){ note_ctor("_ZN3ccc8DD10x4y4E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y4E, buf);
    ::ccc::DD10x4y4 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y4E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y4E);
    dp->::ccc::DD10x4y4::~DD10x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y4E(Test__ZN3ccc8DD10x4y4E, "_ZN3ccc8DD10x4y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y4C1Ev();
extern void _ZN3ccc8DD10x4y4D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y4E[] = {
  NSPAIR(_ZN3ccc8DD10x4y4C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y4E[];
extern void _ZN3ccc8DD10x4y43pqrEv();
extern void _ZN3ccc8DD10x4y43abcEv();
extern void _ZN3ccc8DD10x4y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y43pqrEv,_ZTv0_n12_N3ccc8DD10x4y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y43pqrEv,_ZThn4_N3ccc8DD10x4y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y43abcEv,_ZTv0_n16_N3ccc8DD10x4y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y43abcEv,_ZThn4_N3ccc8DD10x4y43abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y43efgEv,_ZTv0_n20_N3ccc8DD10x4y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y43efgEv,_ZThn4_N3ccc8DD10x4y43efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y43pqrEv,_ZTv0_n12_N3ccc8DD10x4y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y43abcEv,_ZTv0_n16_N3ccc8DD10x4y43abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y43efgEv,_ZTv0_n20_N3ccc8DD10x4y43efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y4E[] = {
  {&(_ZTVN3ccc8DD10x4y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y4E[];
static VTBL_ENTRY alt_thunk_names2132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y43efgEv,_ZTv0_n20_N3ccc8DD10x4y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y43efgEv,_ZThn4_N3ccc8DD10x4y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y43abcEv,_ZTv0_n16_N3ccc8DD10x4y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y43abcEv,_ZThn4_N3ccc8DD10x4y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y43pqrEv,_ZTv0_n12_N3ccc8DD10x4y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y43pqrEv,_ZThn4_N3ccc8DD10x4y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y4E = {  "_ZN3ccc8DD10x4y4E", // class name
  bases__ZN3ccc8DD10x4y4E, 2,
  &(vtc__ZN3ccc8DD10x4y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y4E),3, //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  CC10x4y5  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8CC10x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x4y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x4y53abcEv
  ~CC10x4y5(); // tgen
  CC10x4y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y5E) C1{ VBC2{ v1 v3} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y53pqrEv");}
void  ccc::CC10x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y53efgEv");}
void  ccc::CC10x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y53abcEv");}
ccc::CC10x4y5 ::~CC10x4y5(){ note_dtor("_ZN3ccc8CC10x4y5E", this);} // tgen
ccc::CC10x4y5 ::CC10x4y5(){ note_ctor("_ZN3ccc8CC10x4y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y5E, buf);
    ::ccc::CC10x4y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y5E);
    dp->::ccc::CC10x4y5::~CC10x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y5E(Test__ZN3ccc8CC10x4y5E, "_ZN3ccc8CC10x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y5C1Ev();
extern void _ZN3ccc8CC10x4y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y5E[] = {
  NSPAIR(_ZN3ccc8CC10x4y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y5E[];
extern void _ZN3ccc8CC10x4y53pqrEv();
extern void _ZN3ccc8CC10x4y53abcEv();
extern void _ZN3ccc8CC10x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y53pqrEv,_ZTv0_n12_N3ccc8CC10x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y53pqrEv,_ZThn4_N3ccc8CC10x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y53abcEv,_ZTv0_n16_N3ccc8CC10x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y53abcEv,_ZThn4_N3ccc8CC10x4y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y53pqrEv,_ZTv0_n12_N3ccc8CC10x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y53abcEv,_ZTv0_n16_N3ccc8CC10x4y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y5E[] = {
  {&(_ZTVN3ccc8CC10x4y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y5E[];
static VTBL_ENTRY alt_thunk_names2133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y53abcEv,_ZTv0_n16_N3ccc8CC10x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y53abcEv,_ZThn4_N3ccc8CC10x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y53pqrEv,_ZTv0_n12_N3ccc8CC10x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y53pqrEv,_ZThn4_N3ccc8CC10x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y5E = {  "_ZN3ccc8CC10x4y5E", // class name
  bases__ZN3ccc8CC10x4y5E, 2,
  &(vtc__ZN3ccc8CC10x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y5E),2, //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  DD10x4y5  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc8DD10x4y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x4y53efgEv
  virtual void  abc(); // _ZN3ccc8DD10x4y53abcEv
  ~DD10x4y5(); // tgen
  DD10x4y5(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y5E) C1{ VBC2{ v1 v3} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x4y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y53pqrEv");}
void  ccc::DD10x4y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y53efgEv");}
void  ccc::DD10x4y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y53abcEv");}
ccc::DD10x4y5 ::~DD10x4y5(){ note_dtor("_ZN3ccc8DD10x4y5E", this);} // tgen
ccc::DD10x4y5 ::DD10x4y5(){ note_ctor("_ZN3ccc8DD10x4y5E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y5E, buf);
    ::ccc::DD10x4y5 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y5E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y5E);
    dp->::ccc::DD10x4y5::~DD10x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y5E(Test__ZN3ccc8DD10x4y5E, "_ZN3ccc8DD10x4y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y5C1Ev();
extern void _ZN3ccc8DD10x4y5D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y5E[] = {
  NSPAIR(_ZN3ccc8DD10x4y5C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y5E[];
extern void _ZN3ccc8DD10x4y53pqrEv();
extern void _ZN3ccc8DD10x4y53abcEv();
extern void _ZN3ccc8DD10x4y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y53pqrEv,_ZTv0_n12_N3ccc8DD10x4y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y53pqrEv,_ZThn4_N3ccc8DD10x4y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y53abcEv,_ZTv0_n16_N3ccc8DD10x4y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y53abcEv,_ZThn4_N3ccc8DD10x4y53abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y53efgEv,_ZTv0_n20_N3ccc8DD10x4y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y53efgEv,_ZThn4_N3ccc8DD10x4y53efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y53pqrEv,_ZTv0_n12_N3ccc8DD10x4y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y53abcEv,_ZTv0_n16_N3ccc8DD10x4y53abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y53efgEv,_ZTv0_n20_N3ccc8DD10x4y53efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y5E[] = {
  {&(_ZTVN3ccc8DD10x4y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y5E[];
static VTBL_ENTRY alt_thunk_names2134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y53efgEv,_ZTv0_n20_N3ccc8DD10x4y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y53efgEv,_ZThn4_N3ccc8DD10x4y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y53abcEv,_ZTv0_n16_N3ccc8DD10x4y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y53abcEv,_ZThn4_N3ccc8DD10x4y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y53pqrEv,_ZTv0_n12_N3ccc8DD10x4y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y53pqrEv,_ZThn4_N3ccc8DD10x4y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y5E = {  "_ZN3ccc8DD10x4y5E", // class name
  bases__ZN3ccc8DD10x4y5E, 2,
  &(vtc__ZN3ccc8DD10x4y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y5E),3, //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  CC10x4y6  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x4y63efgEv
  ~CC10x4y6(); // tgen
  CC10x4y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y6E) C1{ VBC2{ v3 v1} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y63abcEv");}
void  ccc::CC10x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y63efgEv");}
ccc::CC10x4y6 ::~CC10x4y6(){ note_dtor("_ZN3ccc8CC10x4y6E", this);} // tgen
ccc::CC10x4y6 ::CC10x4y6(){ note_ctor("_ZN3ccc8CC10x4y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y6E, buf);
    ::ccc::CC10x4y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y6E);
    dp->::ccc::CC10x4y6::~CC10x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y6E(Test__ZN3ccc8CC10x4y6E, "_ZN3ccc8CC10x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y6C1Ev();
extern void _ZN3ccc8CC10x4y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y6E[] = {
  NSPAIR(_ZN3ccc8CC10x4y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y6E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC10x4y63abcEv();
extern void _ZN3ccc8CC10x4y63efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y63abcEv,_ZTv0_n16_N3ccc8CC10x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y63abcEv,_ZThn4_N3ccc8CC10x4y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y63efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y63abcEv,_ZTv0_n16_N3ccc8CC10x4y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y6E[] = {
  {&(_ZTVN3ccc8CC10x4y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y6E[];
static VTBL_ENTRY alt_thunk_names2135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y63abcEv,_ZTv0_n16_N3ccc8CC10x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y63abcEv,_ZThn4_N3ccc8CC10x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y6E = {  "_ZN3ccc8CC10x4y6E", // class name
  bases__ZN3ccc8CC10x4y6E, 2,
  &(vtc__ZN3ccc8CC10x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y6E),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  DD10x4y6  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD10x4y63abcEv
  virtual void  efg(); // _ZN3ccc8DD10x4y63efgEv
  ~DD10x4y6(); // tgen
  DD10x4y6(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y6E) C1{ VBC2{ v3 v1} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x4y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y63abcEv");}
void  ccc::DD10x4y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y63efgEv");}
ccc::DD10x4y6 ::~DD10x4y6(){ note_dtor("_ZN3ccc8DD10x4y6E", this);} // tgen
ccc::DD10x4y6 ::DD10x4y6(){ note_ctor("_ZN3ccc8DD10x4y6E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y6E, buf);
    ::ccc::DD10x4y6 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y6E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y6E);
    dp->::ccc::DD10x4y6::~DD10x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y6E(Test__ZN3ccc8DD10x4y6E, "_ZN3ccc8DD10x4y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y6C1Ev();
extern void _ZN3ccc8DD10x4y6D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y6E[] = {
  NSPAIR(_ZN3ccc8DD10x4y6C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x4y63abcEv();
extern void _ZN3ccc8DD10x4y63efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y63abcEv,_ZTv0_n16_N3ccc8DD10x4y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y63abcEv,_ZThn4_N3ccc8DD10x4y63abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y63efgEv,_ZTv0_n20_N3ccc8DD10x4y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y63efgEv,_ZThn4_N3ccc8DD10x4y63efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y63abcEv,_ZTv0_n16_N3ccc8DD10x4y63abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y63efgEv,_ZTv0_n20_N3ccc8DD10x4y63efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y6E[] = {
  {&(_ZTVN3ccc8DD10x4y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y6E[];
static VTBL_ENTRY alt_thunk_names2136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y63efgEv,_ZTv0_n20_N3ccc8DD10x4y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y63efgEv,_ZThn4_N3ccc8DD10x4y63efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y63abcEv,_ZTv0_n16_N3ccc8DD10x4y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y63abcEv,_ZThn4_N3ccc8DD10x4y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y6E = {  "_ZN3ccc8DD10x4y6E", // class name
  bases__ZN3ccc8DD10x4y6E, 2,
  &(vtc__ZN3ccc8DD10x4y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y6E),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  CC10x4y7  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8CC10x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y73pqrEv
  ~CC10x4y7(); // tgen
  CC10x4y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y7E) C1{ VBC2{ v2 v1} BC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y73abcEv");}
void  ccc::CC10x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y73pqrEv");}
ccc::CC10x4y7 ::~CC10x4y7(){ note_dtor("_ZN3ccc8CC10x4y7E", this);} // tgen
ccc::CC10x4y7 ::CC10x4y7(){ note_ctor("_ZN3ccc8CC10x4y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y7E, buf);
    ::ccc::CC10x4y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y7E);
    dp->::ccc::CC10x4y7::~CC10x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y7E(Test__ZN3ccc8CC10x4y7E, "_ZN3ccc8CC10x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y7C1Ev();
extern void _ZN3ccc8CC10x4y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y7E[] = {
  NSPAIR(_ZN3ccc8CC10x4y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y7E[];
extern void _ZN3ccc8CC10x4y73pqrEv();
extern void _ZN3ccc8CC10x4y73abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y73pqrEv,_ZTv0_n12_N3ccc8CC10x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y73pqrEv,_ZThn4_N3ccc8CC10x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y73abcEv,_ZTv0_n16_N3ccc8CC10x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y73abcEv,_ZThn4_N3ccc8CC10x4y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y73abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y73pqrEv,_ZTv0_n12_N3ccc8CC10x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y73abcEv,_ZTv0_n16_N3ccc8CC10x4y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y7E[] = {
  {&(_ZTVN3ccc8CC10x4y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y7E[];
static VTBL_ENTRY alt_thunk_names2137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y73abcEv,_ZTv0_n16_N3ccc8CC10x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y73abcEv,_ZThn4_N3ccc8CC10x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y73pqrEv,_ZTv0_n12_N3ccc8CC10x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y73pqrEv,_ZThn4_N3ccc8CC10x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y7E = {  "_ZN3ccc8CC10x4y7E", // class name
  bases__ZN3ccc8CC10x4y7E, 2,
  &(vtc__ZN3ccc8CC10x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y7E),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  DD10x4y7  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc8DD10x4y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x4y73pqrEv
  ~DD10x4y7(); // tgen
  DD10x4y7(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y7E) C1{ VBC2{ v2 v1} VBC3{ v2 v1 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD10x4y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y73abcEv");}
void  ccc::DD10x4y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y73pqrEv");}
ccc::DD10x4y7 ::~DD10x4y7(){ note_dtor("_ZN3ccc8DD10x4y7E", this);} // tgen
ccc::DD10x4y7 ::DD10x4y7(){ note_ctor("_ZN3ccc8DD10x4y7E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y7E, buf);
    ::ccc::DD10x4y7 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y7E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y7E);
    dp->::ccc::DD10x4y7::~DD10x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y7E(Test__ZN3ccc8DD10x4y7E, "_ZN3ccc8DD10x4y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y7C1Ev();
extern void _ZN3ccc8DD10x4y7D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y7E[] = {
  NSPAIR(_ZN3ccc8DD10x4y7C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y7E[];
extern void _ZN3ccc8DD10x4y73pqrEv();
extern void _ZN3ccc8DD10x4y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y73pqrEv,_ZTv0_n12_N3ccc8DD10x4y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y73pqrEv,_ZThn4_N3ccc8DD10x4y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y73abcEv,_ZTv0_n16_N3ccc8DD10x4y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y73abcEv,_ZThn4_N3ccc8DD10x4y73abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y73abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y73pqrEv,_ZTv0_n12_N3ccc8DD10x4y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y73abcEv,_ZTv0_n16_N3ccc8DD10x4y73abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y7E[] = {
  {&(_ZTVN3ccc8DD10x4y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x4y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x4y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y7E[];
static VTBL_ENTRY alt_thunk_names2138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y73abcEv,_ZTv0_n16_N3ccc8DD10x4y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y73abcEv,_ZThn4_N3ccc8DD10x4y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y73pqrEv,_ZTv0_n12_N3ccc8DD10x4y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y73pqrEv,_ZThn4_N3ccc8DD10x4y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y7E = {  "_ZN3ccc8DD10x4y7E", // class name
  bases__ZN3ccc8DD10x4y7E, 2,
  &(vtc__ZN3ccc8DD10x4y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y7E),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  CC10x4y8  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x4y83abcEv
  ~CC10x4y8(); // tgen
  CC10x4y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y8E) C1{ VBC2{ v3 v2} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y83efgEv");}
void  ccc::CC10x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x4y83abcEv");}
ccc::CC10x4y8 ::~CC10x4y8(){ note_dtor("_ZN3ccc8CC10x4y8E", this);} // tgen
ccc::CC10x4y8 ::CC10x4y8(){ note_ctor("_ZN3ccc8CC10x4y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y8E, buf);
    ::ccc::CC10x4y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y8E);
    dp->::ccc::CC10x4y8::~CC10x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y8E(Test__ZN3ccc8CC10x4y8E, "_ZN3ccc8CC10x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y8C1Ev();
extern void _ZN3ccc8CC10x4y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y8E[] = {
  NSPAIR(_ZN3ccc8CC10x4y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y8E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc8CC10x4y83abcEv();
extern void _ZN3ccc8CC10x4y83efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x4y83abcEv,_ZTv0_n16_N3ccc8CC10x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y83abcEv,_ZThn4_N3ccc8CC10x4y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y83efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x4y83abcEv,_ZTv0_n16_N3ccc8CC10x4y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y8E[] = {
  {&(_ZTVN3ccc8CC10x4y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y8E[];
static VTBL_ENTRY alt_thunk_names2139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x4y83abcEv,_ZTv0_n16_N3ccc8CC10x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y83abcEv,_ZThn4_N3ccc8CC10x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y8E = {  "_ZN3ccc8CC10x4y8E", // class name
  bases__ZN3ccc8CC10x4y8E, 2,
  &(vtc__ZN3ccc8CC10x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y8E),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  DD10x4y8  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD10x4y83efgEv
  virtual void  abc(); // _ZN3ccc8DD10x4y83abcEv
  ~DD10x4y8(); // tgen
  DD10x4y8(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y8E) C1{ VBC2{ v3 v2} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x4y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y83efgEv");}
void  ccc::DD10x4y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x4y83abcEv");}
ccc::DD10x4y8 ::~DD10x4y8(){ note_dtor("_ZN3ccc8DD10x4y8E", this);} // tgen
ccc::DD10x4y8 ::DD10x4y8(){ note_ctor("_ZN3ccc8DD10x4y8E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y8E, buf);
    ::ccc::DD10x4y8 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y8E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y8E);
    dp->::ccc::DD10x4y8::~DD10x4y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y8E(Test__ZN3ccc8DD10x4y8E, "_ZN3ccc8DD10x4y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y8C1Ev();
extern void _ZN3ccc8DD10x4y8D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y8E[] = {
  NSPAIR(_ZN3ccc8DD10x4y8C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x4y83abcEv();
extern void _ZN3ccc8DD10x4y83efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x4y83abcEv,_ZTv0_n16_N3ccc8DD10x4y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y83abcEv,_ZThn4_N3ccc8DD10x4y83abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y83efgEv,_ZTv0_n20_N3ccc8DD10x4y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y83efgEv,_ZThn4_N3ccc8DD10x4y83efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x4y83abcEv,_ZTv0_n16_N3ccc8DD10x4y83abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y83efgEv,_ZTv0_n20_N3ccc8DD10x4y83efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y8E[] = {
  {&(_ZTVN3ccc8DD10x4y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y8E[];
static VTBL_ENTRY alt_thunk_names2140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y83efgEv,_ZTv0_n20_N3ccc8DD10x4y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y83efgEv,_ZThn4_N3ccc8DD10x4y83efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x4y83abcEv,_ZTv0_n16_N3ccc8DD10x4y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y83abcEv,_ZThn4_N3ccc8DD10x4y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y8E = {  "_ZN3ccc8DD10x4y8E", // class name
  bases__ZN3ccc8DD10x4y8E, 2,
  &(vtc__ZN3ccc8DD10x4y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y8E),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  CC10x4y9  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8CC10x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x4y93pqrEv
  ~CC10x4y9(); // tgen
  CC10x4y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x4y9E) C1{ VBC2{ v2 v3} BC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x4y93efgEv");}
void  ccc::CC10x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x4y93pqrEv");}
ccc::CC10x4y9 ::~CC10x4y9(){ note_dtor("_ZN3ccc8CC10x4y9E", this);} // tgen
ccc::CC10x4y9 ::CC10x4y9(){ note_ctor("_ZN3ccc8CC10x4y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x4y9E, buf);
    ::ccc::CC10x4y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x4y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc8CC10x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x4y9E);
    dp->::ccc::CC10x4y9::~CC10x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x4y9E(Test__ZN3ccc8CC10x4y9E, "_ZN3ccc8CC10x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x4y9C1Ev();
extern void _ZN3ccc8CC10x4y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x4y9E[] = {
  NSPAIR(_ZN3ccc8CC10x4y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8CC10x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x4y9E[];
extern void _ZN3ccc8CC10x4y93pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc8CC10x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x4y93pqrEv,_ZTv0_n12_N3ccc8CC10x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x4y93pqrEv,_ZThn4_N3ccc8CC10x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x4y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x4y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x4y93pqrEv,_ZTv0_n12_N3ccc8CC10x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x4y9E[] = {
  {&(_ZTVN3ccc8CC10x4y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x4y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x4y9E[];
static VTBL_ENTRY alt_thunk_names2141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x4y93pqrEv,_ZTv0_n12_N3ccc8CC10x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x4y93pqrEv,_ZThn4_N3ccc8CC10x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x4y9E = {  "_ZN3ccc8CC10x4y9E", // class name
  bases__ZN3ccc8CC10x4y9E, 2,
  &(vtc__ZN3ccc8CC10x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x4y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x4y9E),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  DD10x4y9  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc8DD10x4y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x4y93pqrEv
  ~DD10x4y9(); // tgen
  DD10x4y9(); // tgen
};
//SIG(1 _ZN3ccc8DD10x4y9E) C1{ VBC2{ v2 v3} VBC3{ v2 v4 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x4y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x4y93efgEv");}
void  ccc::DD10x4y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x4y93pqrEv");}
ccc::DD10x4y9 ::~DD10x4y9(){ note_dtor("_ZN3ccc8DD10x4y9E", this);} // tgen
ccc::DD10x4y9 ::DD10x4y9(){ note_ctor("_ZN3ccc8DD10x4y9E", this);} // tgen
}
static void Test__ZN3ccc8DD10x4y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x4y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x4y9E, buf);
    ::ccc::DD10x4y9 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x4y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x4y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x4y9E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc8DD10x4y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x4y9E);
    dp->::ccc::DD10x4y9::~DD10x4y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x4y9E(Test__ZN3ccc8DD10x4y9E, "_ZN3ccc8DD10x4y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x4y9C1Ev();
extern void _ZN3ccc8DD10x4y9D1Ev();
Name_Map name_map__ZN3ccc8DD10x4y9E[] = {
  NSPAIR(_ZN3ccc8DD10x4y9C1Ev),
  NSPAIR(_ZN3ccc8DD10x4y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc8DD10x4y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y9E[];
extern void _ZN3ccc8DD10x4y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8DD10x4y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x4y93pqrEv,_ZTv0_n12_N3ccc8DD10x4y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y93pqrEv,_ZThn4_N3ccc8DD10x4y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x4y93efgEv,_ZTv0_n20_N3ccc8DD10x4y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x4y93efgEv,_ZThn4_N3ccc8DD10x4y93efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x4y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x4y93efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x4y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x4y93pqrEv,_ZTv0_n12_N3ccc8DD10x4y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x4y93efgEv,_ZTv0_n20_N3ccc8DD10x4y93efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x4y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x4y9E[] = {
  {&(_ZTVN3ccc8DD10x4y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x4y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x4y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x4y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x4y9E[];
static VTBL_ENTRY alt_thunk_names2142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x4y93efgEv,_ZTv0_n20_N3ccc8DD10x4y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y93efgEv,_ZThn4_N3ccc8DD10x4y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x4y93pqrEv,_ZTv0_n12_N3ccc8DD10x4y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x4y93pqrEv,_ZThn4_N3ccc8DD10x4y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x4y9E = {  "_ZN3ccc8DD10x4y9E", // class name
  bases__ZN3ccc8DD10x4y9E, 2,
  &(vtc__ZN3ccc8DD10x4y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x4y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x4y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x4y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x4y9E),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  CC10x4y10  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC10x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x4y103abcEv
  ~CC10x4y10(); // tgen
  CC10x4y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y10E) C1{ VBC2{ v1 v2} BC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::CC10x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x4y103pqrEv");}
void  ccc::CC10x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x4y103abcEv");}
ccc::CC10x4y10 ::~CC10x4y10(){ note_dtor("_ZN3ccc9CC10x4y10E", this);} // tgen
ccc::CC10x4y10 ::CC10x4y10(){ note_ctor("_ZN3ccc9CC10x4y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x4y10E, buf);
    ::ccc::CC10x4y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x4y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC10x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x4y10E);
    dp->::ccc::CC10x4y10::~CC10x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x4y10E(Test__ZN3ccc9CC10x4y10E, "_ZN3ccc9CC10x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x4y10C1Ev();
extern void _ZN3ccc9CC10x4y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x4y10E[] = {
  NSPAIR(_ZN3ccc9CC10x4y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC10x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x4y10E[];
extern void _ZN3ccc9CC10x4y103pqrEv();
extern void _ZN3ccc9CC10x4y103abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x4y103pqrEv,_ZTv0_n12_N3ccc9CC10x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y103pqrEv,_ZThn4_N3ccc9CC10x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x4y103abcEv,_ZTv0_n16_N3ccc9CC10x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y103abcEv,_ZThn4_N3ccc9CC10x4y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y103abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x4y103pqrEv,_ZTv0_n12_N3ccc9CC10x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x4y103abcEv,_ZTv0_n16_N3ccc9CC10x4y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x4y10E[] = {
  {&(_ZTVN3ccc9CC10x4y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x4y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x4y10E[];
static VTBL_ENTRY alt_thunk_names2143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x4y103abcEv,_ZTv0_n16_N3ccc9CC10x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x4y103abcEv,_ZThn4_N3ccc9CC10x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x4y103pqrEv,_ZTv0_n12_N3ccc9CC10x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x4y103pqrEv,_ZThn4_N3ccc9CC10x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x4y10E = {  "_ZN3ccc9CC10x4y10E", // class name
  bases__ZN3ccc9CC10x4y10E, 2,
  &(vtc__ZN3ccc9CC10x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x4y10E),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  DD10x4y10  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9DD10x4y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD10x4y103abcEv
  ~DD10x4y10(); // tgen
  DD10x4y10(); // tgen
};
//SIG(1 _ZN3ccc9DD10x4y10E) C1{ VBC2{ v1 v2} VBC3{ v1 v2 v3} v1 v2}
}
namespace ccc { 
void  ccc::DD10x4y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x4y103pqrEv");}
void  ccc::DD10x4y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x4y103abcEv");}
ccc::DD10x4y10 ::~DD10x4y10(){ note_dtor("_ZN3ccc9DD10x4y10E", this);} // tgen
ccc::DD10x4y10 ::DD10x4y10(){ note_ctor("_ZN3ccc9DD10x4y10E", this);} // tgen
}
static void Test__ZN3ccc9DD10x4y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x4y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x4y10E, buf);
    ::ccc::DD10x4y10 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x4y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x4y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x4y10E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9DD10x4y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x4y10E);
    dp->::ccc::DD10x4y10::~DD10x4y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x4y10E(Test__ZN3ccc9DD10x4y10E, "_ZN3ccc9DD10x4y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x4y10C1Ev();
extern void _ZN3ccc9DD10x4y10D1Ev();
Name_Map name_map__ZN3ccc9DD10x4y10E[] = {
  NSPAIR(_ZN3ccc9DD10x4y10C1Ev),
  NSPAIR(_ZN3ccc9DD10x4y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9DD10x4y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y10E[];
extern void _ZN3ccc9DD10x4y103pqrEv();
extern void _ZN3ccc9DD10x4y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x4y103pqrEv,_ZTv0_n12_N3ccc9DD10x4y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y103pqrEv,_ZThn4_N3ccc9DD10x4y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x4y103abcEv,_ZTv0_n16_N3ccc9DD10x4y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y103abcEv,_ZThn4_N3ccc9DD10x4y103abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x4y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y103abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x4y103pqrEv,_ZTv0_n12_N3ccc9DD10x4y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x4y103abcEv,_ZTv0_n16_N3ccc9DD10x4y103abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x4y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x4y10E[] = {
  {&(_ZTVN3ccc9DD10x4y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x4y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x4y10E[];
static VTBL_ENTRY alt_thunk_names2144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x4y103abcEv,_ZTv0_n16_N3ccc9DD10x4y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y103abcEv,_ZThn4_N3ccc9DD10x4y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x4y103pqrEv,_ZTv0_n12_N3ccc9DD10x4y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y103pqrEv,_ZThn4_N3ccc9DD10x4y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x4y10E = {  "_ZN3ccc9DD10x4y10E", // class name
  bases__ZN3ccc9DD10x4y10E, 2,
  &(vtc__ZN3ccc9DD10x4y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x4y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x4y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x4y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x4y10E),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  CC10x4y11  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC10x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x4y113efgEv
  ~CC10x4y11(); // tgen
  CC10x4y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y11E) C1{ VBC2{ v1 v3} BC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x4y113pqrEv");}
void  ccc::CC10x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x4y113efgEv");}
ccc::CC10x4y11 ::~CC10x4y11(){ note_dtor("_ZN3ccc9CC10x4y11E", this);} // tgen
ccc::CC10x4y11 ::CC10x4y11(){ note_ctor("_ZN3ccc9CC10x4y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x4y11E, buf);
    ::ccc::CC10x4y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x4y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC10x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x4y11E);
    dp->::ccc::CC10x4y11::~CC10x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x4y11E(Test__ZN3ccc9CC10x4y11E, "_ZN3ccc9CC10x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x4y11C1Ev();
extern void _ZN3ccc9CC10x4y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x4y11E[] = {
  NSPAIR(_ZN3ccc9CC10x4y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC10x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x4y11E[];
extern void _ZN3ccc9CC10x4y113pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc9CC10x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x4y113pqrEv,_ZTv0_n12_N3ccc9CC10x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y113pqrEv,_ZThn4_N3ccc9CC10x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x4y113pqrEv,_ZTv0_n12_N3ccc9CC10x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x4y11E[] = {
  {&(_ZTVN3ccc9CC10x4y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x4y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x4y11E[];
static VTBL_ENTRY alt_thunk_names2145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x4y113pqrEv,_ZTv0_n12_N3ccc9CC10x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x4y113pqrEv,_ZThn4_N3ccc9CC10x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x4y11E = {  "_ZN3ccc9CC10x4y11E", // class name
  bases__ZN3ccc9CC10x4y11E, 2,
  &(vtc__ZN3ccc9CC10x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x4y11E),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  DD10x4y11  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9DD10x4y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD10x4y113efgEv
  ~DD10x4y11(); // tgen
  DD10x4y11(); // tgen
};
//SIG(1 _ZN3ccc9DD10x4y11E) C1{ VBC2{ v1 v3} VBC3{ v1 v4 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x4y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x4y113pqrEv");}
void  ccc::DD10x4y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x4y113efgEv");}
ccc::DD10x4y11 ::~DD10x4y11(){ note_dtor("_ZN3ccc9DD10x4y11E", this);} // tgen
ccc::DD10x4y11 ::DD10x4y11(){ note_ctor("_ZN3ccc9DD10x4y11E", this);} // tgen
}
static void Test__ZN3ccc9DD10x4y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x4y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x4y11E, buf);
    ::ccc::DD10x4y11 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x4y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x4y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x4y11E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9DD10x4y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x4y11E);
    dp->::ccc::DD10x4y11::~DD10x4y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x4y11E(Test__ZN3ccc9DD10x4y11E, "_ZN3ccc9DD10x4y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x4y11C1Ev();
extern void _ZN3ccc9DD10x4y11D1Ev();
Name_Map name_map__ZN3ccc9DD10x4y11E[] = {
  NSPAIR(_ZN3ccc9DD10x4y11C1Ev),
  NSPAIR(_ZN3ccc9DD10x4y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9DD10x4y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y11E[];
extern void _ZN3ccc9DD10x4y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x4y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x4y113pqrEv,_ZTv0_n12_N3ccc9DD10x4y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y113pqrEv,_ZThn4_N3ccc9DD10x4y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x4y113efgEv,_ZTv0_n20_N3ccc9DD10x4y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y113efgEv,_ZThn4_N3ccc9DD10x4y113efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x4y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y113efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x4y113pqrEv,_ZTv0_n12_N3ccc9DD10x4y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x4y113efgEv,_ZTv0_n20_N3ccc9DD10x4y113efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x4y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x4y11E[] = {
  {&(_ZTVN3ccc9DD10x4y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x4y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x4y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x4y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x4y11E[];
static VTBL_ENTRY alt_thunk_names2146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x4y113efgEv,_ZTv0_n20_N3ccc9DD10x4y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y113efgEv,_ZThn4_N3ccc9DD10x4y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x4y113pqrEv,_ZTv0_n12_N3ccc9DD10x4y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y113pqrEv,_ZThn4_N3ccc9DD10x4y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x4y11E = {  "_ZN3ccc9DD10x4y11E", // class name
  bases__ZN3ccc9DD10x4y11E, 2,
  &(vtc__ZN3ccc9DD10x4y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x4y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x4y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x4y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x4y11E),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  CC10x4y12  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9CC10x4y123abcEv
  ~CC10x4y12(); // tgen
  CC10x4y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y12E) C1{ VBC2{ v2 v1} BC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::CC10x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x4y123abcEv");}
ccc::CC10x4y12 ::~CC10x4y12(){ note_dtor("_ZN3ccc9CC10x4y12E", this);} // tgen
ccc::CC10x4y12 ::CC10x4y12(){ note_ctor("_ZN3ccc9CC10x4y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x4y12E, buf);
    ::ccc::CC10x4y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x4y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC10x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x4y12E);
    dp->::ccc::CC10x4y12::~CC10x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x4y12E(Test__ZN3ccc9CC10x4y12E, "_ZN3ccc9CC10x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x4y12C1Ev();
extern void _ZN3ccc9CC10x4y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x4y12E[] = {
  NSPAIR(_ZN3ccc9CC10x4y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC10x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x4y12E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc9CC10x4y123abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x4y123abcEv,_ZTv0_n16_N3ccc9CC10x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y123abcEv,_ZThn4_N3ccc9CC10x4y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y123abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x4y123abcEv,_ZTv0_n16_N3ccc9CC10x4y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x4y12E[] = {
  {&(_ZTVN3ccc9CC10x4y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x4y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x4y12E[];
static VTBL_ENTRY alt_thunk_names2147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x4y123abcEv,_ZTv0_n16_N3ccc9CC10x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x4y123abcEv,_ZThn4_N3ccc9CC10x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x4y12E = {  "_ZN3ccc9CC10x4y12E", // class name
  bases__ZN3ccc9CC10x4y12E, 2,
  &(vtc__ZN3ccc9CC10x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x4y12E),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  DD10x4y12  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  abc(); // _ZN3ccc9DD10x4y123abcEv
  ~DD10x4y12(); // tgen
  DD10x4y12(); // tgen
};
//SIG(1 _ZN3ccc9DD10x4y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v1 v4} v1}
}
namespace ccc { 
void  ccc::DD10x4y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x4y123abcEv");}
ccc::DD10x4y12 ::~DD10x4y12(){ note_dtor("_ZN3ccc9DD10x4y12E", this);} // tgen
ccc::DD10x4y12 ::DD10x4y12(){ note_ctor("_ZN3ccc9DD10x4y12E", this);} // tgen
}
static void Test__ZN3ccc9DD10x4y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x4y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x4y12E, buf);
    ::ccc::DD10x4y12 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x4y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x4y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x4y12E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9DD10x4y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x4y12E);
    dp->::ccc::DD10x4y12::~DD10x4y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x4y12E(Test__ZN3ccc9DD10x4y12E, "_ZN3ccc9DD10x4y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x4y12C1Ev();
extern void _ZN3ccc9DD10x4y12D1Ev();
Name_Map name_map__ZN3ccc9DD10x4y12E[] = {
  NSPAIR(_ZN3ccc9DD10x4y12C1Ev),
  NSPAIR(_ZN3ccc9DD10x4y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9DD10x4y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9DD10x4y123abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x4y123abcEv,_ZTv0_n16_N3ccc9DD10x4y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y123abcEv,_ZThn4_N3ccc9DD10x4y123abcEv)() __attribute__((weak));
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x4y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y123abcEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x4y123abcEv,_ZTv0_n16_N3ccc9DD10x4y123abcEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x4y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x4y12E[] = {
  {&(_ZTVN3ccc9DD10x4y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x4y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x4y12E[];
static VTBL_ENTRY alt_thunk_names2148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x4y123abcEv,_ZTv0_n16_N3ccc9DD10x4y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y123abcEv,_ZThn4_N3ccc9DD10x4y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x4y12E = {  "_ZN3ccc9DD10x4y12E", // class name
  bases__ZN3ccc9DD10x4y12E, 2,
  &(vtc__ZN3ccc9DD10x4y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x4y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x4y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x4y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x4y12E),3, //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  CC10x4y13  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9CC10x4y133efgEv
  ~CC10x4y13(); // tgen
  CC10x4y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y13E) C1{ VBC2{ v2 v3} BC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::CC10x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x4y133efgEv");}
ccc::CC10x4y13 ::~CC10x4y13(){ note_dtor("_ZN3ccc9CC10x4y13E", this);} // tgen
ccc::CC10x4y13 ::CC10x4y13(){ note_ctor("_ZN3ccc9CC10x4y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x4y13E, buf);
    ::ccc::CC10x4y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x4y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC10x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x4y13E);
    dp->::ccc::CC10x4y13::~CC10x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x4y13E(Test__ZN3ccc9CC10x4y13E, "_ZN3ccc9CC10x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x4y13C1Ev();
extern void _ZN3ccc9CC10x4y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x4y13E[] = {
  NSPAIR(_ZN3ccc9CC10x4y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC10x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x4y13E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc9CC10x4y133efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y133efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x4y13E[] = {
  {&(_ZTVN3ccc9CC10x4y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x4y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x4y13E[];
Class_Descriptor cd__ZN3ccc9CC10x4y13E = {  "_ZN3ccc9CC10x4y13E", // class name
  bases__ZN3ccc9CC10x4y13E, 2,
  &(vtc__ZN3ccc9CC10x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x4y13E),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  DD10x4y13  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  efg(); // _ZN3ccc9DD10x4y133efgEv
  ~DD10x4y13(); // tgen
  DD10x4y13(); // tgen
};
//SIG(1 _ZN3ccc9DD10x4y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v5 v1} v1}
}
namespace ccc { 
void  ccc::DD10x4y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x4y133efgEv");}
ccc::DD10x4y13 ::~DD10x4y13(){ note_dtor("_ZN3ccc9DD10x4y13E", this);} // tgen
ccc::DD10x4y13 ::DD10x4y13(){ note_ctor("_ZN3ccc9DD10x4y13E", this);} // tgen
}
static void Test__ZN3ccc9DD10x4y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x4y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x4y13E, buf);
    ::ccc::DD10x4y13 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x4y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x4y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x4y13E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9DD10x4y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x4y13E);
    dp->::ccc::DD10x4y13::~DD10x4y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x4y13E(Test__ZN3ccc9DD10x4y13E, "_ZN3ccc9DD10x4y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x4y13C1Ev();
extern void _ZN3ccc9DD10x4y13D1Ev();
Name_Map name_map__ZN3ccc9DD10x4y13E[] = {
  NSPAIR(_ZN3ccc9DD10x4y13C1Ev),
  NSPAIR(_ZN3ccc9DD10x4y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9DD10x4y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x4y133efgEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x4y133efgEv,_ZTv0_n20_N3ccc9DD10x4y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y133efgEv,_ZThn4_N3ccc9DD10x4y133efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x4y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y133efgEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x4y133efgEv,_ZTv0_n20_N3ccc9DD10x4y133efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x4y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x4y13E[] = {
  {&(_ZTVN3ccc9DD10x4y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x4y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x4y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x4y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x4y13E[];
static VTBL_ENTRY alt_thunk_names2149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x4y133efgEv,_ZTv0_n20_N3ccc9DD10x4y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y133efgEv,_ZThn4_N3ccc9DD10x4y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x4y13E = {  "_ZN3ccc9DD10x4y13E", // class name
  bases__ZN3ccc9DD10x4y13E, 2,
  &(vtc__ZN3ccc9DD10x4y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x4y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x4y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x4y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x4y13E),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  CC10x4y14  : virtual ::ccc::AA10 , ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9CC10x4y143pqrEv
  ~CC10x4y14(); // tgen
  CC10x4y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y14E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x4y143pqrEv");}
ccc::CC10x4y14 ::~CC10x4y14(){ note_dtor("_ZN3ccc9CC10x4y14E", this);} // tgen
ccc::CC10x4y14 ::CC10x4y14(){ note_ctor("_ZN3ccc9CC10x4y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x4y14E, buf);
    ::ccc::CC10x4y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x4y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC10x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x4y14E);
    dp->::ccc::CC10x4y14::~CC10x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x4y14E(Test__ZN3ccc9CC10x4y14E, "_ZN3ccc9CC10x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x4y14C1Ev();
extern void _ZN3ccc9CC10x4y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x4y14E[] = {
  NSPAIR(_ZN3ccc9CC10x4y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC10x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x4y14E[];
extern void _ZN3ccc9CC10x4y143pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x4y143pqrEv,_ZTv0_n12_N3ccc9CC10x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x4y143pqrEv,_ZThn4_N3ccc9CC10x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x4y143pqrEv,_ZTv0_n12_N3ccc9CC10x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x4y14E[] = {
  {&(_ZTVN3ccc9CC10x4y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x4y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x4y14E[];
static VTBL_ENTRY alt_thunk_names2150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x4y143pqrEv,_ZTv0_n12_N3ccc9CC10x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x4y143pqrEv,_ZThn4_N3ccc9CC10x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x4y14E = {  "_ZN3ccc9CC10x4y14E", // class name
  bases__ZN3ccc9CC10x4y14E, 2,
  &(vtc__ZN3ccc9CC10x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x4y14E),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  DD10x4y14  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  virtual void  pqr(); // _ZN3ccc9DD10x4y143pqrEv
  ~DD10x4y14(); // tgen
  DD10x4y14(); // tgen
};
//SIG(1 _ZN3ccc9DD10x4y14E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD10x4y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x4y143pqrEv");}
ccc::DD10x4y14 ::~DD10x4y14(){ note_dtor("_ZN3ccc9DD10x4y14E", this);} // tgen
ccc::DD10x4y14 ::DD10x4y14(){ note_ctor("_ZN3ccc9DD10x4y14E", this);} // tgen
}
static void Test__ZN3ccc9DD10x4y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x4y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x4y14E, buf);
    ::ccc::DD10x4y14 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x4y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x4y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x4y14E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9DD10x4y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x4y14E);
    dp->::ccc::DD10x4y14::~DD10x4y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x4y14E(Test__ZN3ccc9DD10x4y14E, "_ZN3ccc9DD10x4y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x4y14C1Ev();
extern void _ZN3ccc9DD10x4y14D1Ev();
Name_Map name_map__ZN3ccc9DD10x4y14E[] = {
  NSPAIR(_ZN3ccc9DD10x4y14C1Ev),
  NSPAIR(_ZN3ccc9DD10x4y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9DD10x4y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y14E[];
extern void _ZN3ccc9DD10x4y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x4y143pqrEv,_ZTv0_n12_N3ccc9DD10x4y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x4y143pqrEv,_ZThn4_N3ccc9DD10x4y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x4y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x4y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x4y143pqrEv,_ZTv0_n12_N3ccc9DD10x4y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x4y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x4y14E[] = {
  {&(_ZTVN3ccc9DD10x4y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x4y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x4y14E[];
static VTBL_ENTRY alt_thunk_names2151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x4y143pqrEv,_ZTv0_n12_N3ccc9DD10x4y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x4y143pqrEv,_ZThn4_N3ccc9DD10x4y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x4y14E = {  "_ZN3ccc9DD10x4y14E", // class name
  bases__ZN3ccc9DD10x4y14E, 2,
  &(vtc__ZN3ccc9DD10x4y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x4y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x4y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x4y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x4y14E),3, //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  CC10x4y15  : virtual ::ccc::AA10 , ::ccc::BB4 {
  ~CC10x4y15(); // tgen
  CC10x4y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x4y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC10x4y15 ::~CC10x4y15(){ note_dtor("_ZN3ccc9CC10x4y15E", this);} // tgen
ccc::CC10x4y15 ::CC10x4y15(){ note_ctor("_ZN3ccc9CC10x4y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x4y15E, buf);
    ::ccc::CC10x4y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x4y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), 0, "_ZN3ccc9CC10x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x4y15E);
    dp->::ccc::CC10x4y15::~CC10x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x4y15E(Test__ZN3ccc9CC10x4y15E, "_ZN3ccc9CC10x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x4y15C1Ev();
extern void _ZN3ccc9CC10x4y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x4y15E[] = {
  NSPAIR(_ZN3ccc9CC10x4y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9CC10x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x4y15E[];
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x4y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x4y15E[] = {
  {&(_ZTVN3ccc9CC10x4y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x4y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x4y15E[];
Class_Descriptor cd__ZN3ccc9CC10x4y15E = {  "_ZN3ccc9CC10x4y15E", // class name
  bases__ZN3ccc9CC10x4y15E, 2,
  &(vtc__ZN3ccc9CC10x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x4y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x4y15E),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  DD10x4y15  : virtual ::ccc::AA10 , virtual ::ccc::BB4 {
  ~DD10x4y15(); // tgen
  DD10x4y15(); // tgen
};
//SIG(1 _ZN3ccc9DD10x4y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD10x4y15 ::~DD10x4y15(){ note_dtor("_ZN3ccc9DD10x4y15E", this);} // tgen
ccc::DD10x4y15 ::DD10x4y15(){ note_ctor("_ZN3ccc9DD10x4y15E", this);} // tgen
}
static void Test__ZN3ccc9DD10x4y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x4y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x4y15E, buf);
    ::ccc::DD10x4y15 *dp, &lv = *(dp=new (buf) ::ccc::DD10x4y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x4y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x4y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x4y15E");
    check_base_class_offset(lv, (::ccc::BB4*), ABISELECT(8,4), "_ZN3ccc9DD10x4y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x4y15E);
    dp->::ccc::DD10x4y15::~DD10x4y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x4y15E(Test__ZN3ccc9DD10x4y15E, "_ZN3ccc9DD10x4y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x4y15C1Ev();
extern void _ZN3ccc9DD10x4y15D1Ev();
Name_Map name_map__ZN3ccc9DD10x4y15E[] = {
  NSPAIR(_ZN3ccc9DD10x4y15C1Ev),
  NSPAIR(_ZN3ccc9DD10x4y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB4E;
extern VTBL_ENTRY _ZTIN3ccc3BB4E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB4E[];
static Base_Class bases__ZN3ccc9DD10x4y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB4E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB43pqrEv();
extern void _ZN3ccc3BB43abcEv();
extern void _ZN3ccc3BB43efgEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x4y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x4y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43abcEv,
  (VTBL_ENTRY)&_ZN3ccc3BB43efgEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x4y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x4y15E[] = {
  {&(_ZTVN3ccc9DD10x4y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x4y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x4y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x4y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x4y15E[];
Class_Descriptor cd__ZN3ccc9DD10x4y15E = {  "_ZN3ccc9DD10x4y15E", // class name
  bases__ZN3ccc9DD10x4y15E, 2,
  &(vtc__ZN3ccc9DD10x4y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x4y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x4y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x4y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x4y15E),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  CC10x5y0  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y03pqrEv
  ~CC10x5y0(); // tgen
  CC10x5y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y0E) C1{ VBC2{ v3 v1} BC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y03abcEv");}
void  ccc::CC10x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y03efgEv");}
void  ccc::CC10x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y03pqrEv");}
ccc::CC10x5y0 ::~CC10x5y0(){ note_dtor("_ZN3ccc8CC10x5y0E", this);} // tgen
ccc::CC10x5y0 ::CC10x5y0(){ note_ctor("_ZN3ccc8CC10x5y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y0E, buf);
    ::ccc::CC10x5y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y0E);
    dp->::ccc::CC10x5y0::~CC10x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y0E(Test__ZN3ccc8CC10x5y0E, "_ZN3ccc8CC10x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y0C1Ev();
extern void _ZN3ccc8CC10x5y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y0E[] = {
  NSPAIR(_ZN3ccc8CC10x5y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y0E[];
extern void _ZN3ccc8CC10x5y03pqrEv();
extern void _ZN3ccc8CC10x5y03efgEv();
extern void _ZN3ccc8CC10x5y03abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y03pqrEv,_ZTv0_n12_N3ccc8CC10x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y03pqrEv,_ZThn4_N3ccc8CC10x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y03abcEv,_ZTv0_n16_N3ccc8CC10x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y03abcEv,_ZThn4_N3ccc8CC10x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y03abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y03pqrEv,_ZTv0_n12_N3ccc8CC10x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y03abcEv,_ZTv0_n16_N3ccc8CC10x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y0E[] = {
  {&(_ZTVN3ccc8CC10x5y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y0E[];
static VTBL_ENTRY alt_thunk_names2152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y03abcEv,_ZTv0_n16_N3ccc8CC10x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y03abcEv,_ZThn4_N3ccc8CC10x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y03pqrEv,_ZTv0_n12_N3ccc8CC10x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y03pqrEv,_ZThn4_N3ccc8CC10x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y0E = {  "_ZN3ccc8CC10x5y0E", // class name
  bases__ZN3ccc8CC10x5y0E, 2,
  &(vtc__ZN3ccc8CC10x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y0E),2, //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  DD10x5y0  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD10x5y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x5y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x5y03pqrEv
  ~DD10x5y0(); // tgen
  DD10x5y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y0E) C1{ VBC2{ v3 v1} VBC3{ v3 v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x5y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y03abcEv");}
void  ccc::DD10x5y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y03efgEv");}
void  ccc::DD10x5y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y03pqrEv");}
ccc::DD10x5y0 ::~DD10x5y0(){ note_dtor("_ZN3ccc8DD10x5y0E", this);} // tgen
ccc::DD10x5y0 ::DD10x5y0(){ note_ctor("_ZN3ccc8DD10x5y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y0E, buf);
    ::ccc::DD10x5y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y0E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y0E);
    dp->::ccc::DD10x5y0::~DD10x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y0E(Test__ZN3ccc8DD10x5y0E, "_ZN3ccc8DD10x5y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y0C1Ev();
extern void _ZN3ccc8DD10x5y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y0E[] = {
  NSPAIR(_ZN3ccc8DD10x5y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y0E[];
extern void _ZN3ccc8DD10x5y03pqrEv();
extern void _ZN3ccc8DD10x5y03abcEv();
extern void _ZN3ccc8DD10x5y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y03pqrEv,_ZTv0_n12_N3ccc8DD10x5y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y03pqrEv,_ZThn4_N3ccc8DD10x5y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y03efgEv,_ZTv0_n16_N3ccc8DD10x5y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y03efgEv,_ZThn4_N3ccc8DD10x5y03efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y03abcEv,_ZTv0_n20_N3ccc8DD10x5y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y03abcEv,_ZThn4_N3ccc8DD10x5y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y03pqrEv,_ZTv0_n12_N3ccc8DD10x5y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y03efgEv,_ZTv0_n16_N3ccc8DD10x5y03efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y03abcEv,_ZTv0_n20_N3ccc8DD10x5y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y0E[] = {
  {&(_ZTVN3ccc8DD10x5y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y0E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y0E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y0E[];
static VTBL_ENTRY alt_thunk_names2153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y03abcEv,_ZTv0_n20_N3ccc8DD10x5y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y03abcEv,_ZThn4_N3ccc8DD10x5y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y03efgEv,_ZTv0_n16_N3ccc8DD10x5y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y03efgEv,_ZThn4_N3ccc8DD10x5y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y03pqrEv,_ZTv0_n12_N3ccc8DD10x5y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y03pqrEv,_ZThn4_N3ccc8DD10x5y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y0E = {  "_ZN3ccc8DD10x5y0E", // class name
  bases__ZN3ccc8DD10x5y0E, 2,
  &(vtc__ZN3ccc8DD10x5y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y0E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y0E),3, //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  CC10x5y1  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x5y13efgEv
  ~CC10x5y1(); // tgen
  CC10x5y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y1E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y13abcEv");}
void  ccc::CC10x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y13pqrEv");}
void  ccc::CC10x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y13efgEv");}
ccc::CC10x5y1 ::~CC10x5y1(){ note_dtor("_ZN3ccc8CC10x5y1E", this);} // tgen
ccc::CC10x5y1 ::CC10x5y1(){ note_ctor("_ZN3ccc8CC10x5y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y1E, buf);
    ::ccc::CC10x5y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y1E);
    dp->::ccc::CC10x5y1::~CC10x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y1E(Test__ZN3ccc8CC10x5y1E, "_ZN3ccc8CC10x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y1C1Ev();
extern void _ZN3ccc8CC10x5y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y1E[] = {
  NSPAIR(_ZN3ccc8CC10x5y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y1E[];
extern void _ZN3ccc8CC10x5y13pqrEv();
extern void _ZN3ccc8CC10x5y13efgEv();
extern void _ZN3ccc8CC10x5y13abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y13pqrEv,_ZTv0_n12_N3ccc8CC10x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y13pqrEv,_ZThn4_N3ccc8CC10x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y13abcEv,_ZTv0_n16_N3ccc8CC10x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y13abcEv,_ZThn4_N3ccc8CC10x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y13abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y13pqrEv,_ZTv0_n12_N3ccc8CC10x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y13abcEv,_ZTv0_n16_N3ccc8CC10x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y1E[] = {
  {&(_ZTVN3ccc8CC10x5y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y1E[];
static VTBL_ENTRY alt_thunk_names2154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y13abcEv,_ZTv0_n16_N3ccc8CC10x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y13abcEv,_ZThn4_N3ccc8CC10x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y13pqrEv,_ZTv0_n12_N3ccc8CC10x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y13pqrEv,_ZThn4_N3ccc8CC10x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y1E = {  "_ZN3ccc8CC10x5y1E", // class name
  bases__ZN3ccc8CC10x5y1E, 2,
  &(vtc__ZN3ccc8CC10x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y1E),2, //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  DD10x5y1  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD10x5y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x5y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x5y13efgEv
  ~DD10x5y1(); // tgen
  DD10x5y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y1E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x5y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y13abcEv");}
void  ccc::DD10x5y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y13pqrEv");}
void  ccc::DD10x5y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y13efgEv");}
ccc::DD10x5y1 ::~DD10x5y1(){ note_dtor("_ZN3ccc8DD10x5y1E", this);} // tgen
ccc::DD10x5y1 ::DD10x5y1(){ note_ctor("_ZN3ccc8DD10x5y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y1E, buf);
    ::ccc::DD10x5y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y1E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y1E);
    dp->::ccc::DD10x5y1::~DD10x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y1E(Test__ZN3ccc8DD10x5y1E, "_ZN3ccc8DD10x5y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y1C1Ev();
extern void _ZN3ccc8DD10x5y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y1E[] = {
  NSPAIR(_ZN3ccc8DD10x5y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y1E[];
extern void _ZN3ccc8DD10x5y13pqrEv();
extern void _ZN3ccc8DD10x5y13abcEv();
extern void _ZN3ccc8DD10x5y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y13pqrEv,_ZTv0_n12_N3ccc8DD10x5y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y13pqrEv,_ZThn4_N3ccc8DD10x5y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y13efgEv,_ZTv0_n16_N3ccc8DD10x5y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y13efgEv,_ZThn4_N3ccc8DD10x5y13efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y13abcEv,_ZTv0_n20_N3ccc8DD10x5y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y13abcEv,_ZThn4_N3ccc8DD10x5y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y13pqrEv,_ZTv0_n12_N3ccc8DD10x5y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y13efgEv,_ZTv0_n16_N3ccc8DD10x5y13efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y13abcEv,_ZTv0_n20_N3ccc8DD10x5y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y1E[] = {
  {&(_ZTVN3ccc8DD10x5y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y1E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y1E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y1E[];
static VTBL_ENTRY alt_thunk_names2155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y13abcEv,_ZTv0_n20_N3ccc8DD10x5y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y13abcEv,_ZThn4_N3ccc8DD10x5y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y13efgEv,_ZTv0_n16_N3ccc8DD10x5y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y13efgEv,_ZThn4_N3ccc8DD10x5y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y13pqrEv,_ZTv0_n12_N3ccc8DD10x5y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y13pqrEv,_ZThn4_N3ccc8DD10x5y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y1E = {  "_ZN3ccc8DD10x5y1E", // class name
  bases__ZN3ccc8DD10x5y1E, 2,
  &(vtc__ZN3ccc8DD10x5y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y1E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y1E),3, //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  CC10x5y2  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y23pqrEv
  ~CC10x5y2(); // tgen
  CC10x5y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y2E) C1{ VBC2{ v3 v2} BC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y23efgEv");}
void  ccc::CC10x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y23abcEv");}
void  ccc::CC10x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y23pqrEv");}
ccc::CC10x5y2 ::~CC10x5y2(){ note_dtor("_ZN3ccc8CC10x5y2E", this);} // tgen
ccc::CC10x5y2 ::CC10x5y2(){ note_ctor("_ZN3ccc8CC10x5y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y2E, buf);
    ::ccc::CC10x5y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y2E);
    dp->::ccc::CC10x5y2::~CC10x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y2E(Test__ZN3ccc8CC10x5y2E, "_ZN3ccc8CC10x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y2C1Ev();
extern void _ZN3ccc8CC10x5y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y2E[] = {
  NSPAIR(_ZN3ccc8CC10x5y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y2E[];
extern void _ZN3ccc8CC10x5y23pqrEv();
extern void _ZN3ccc8CC10x5y23efgEv();
extern void _ZN3ccc8CC10x5y23abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y23pqrEv,_ZTv0_n12_N3ccc8CC10x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y23pqrEv,_ZThn4_N3ccc8CC10x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y23abcEv,_ZTv0_n16_N3ccc8CC10x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y23abcEv,_ZThn4_N3ccc8CC10x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y23abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y23pqrEv,_ZTv0_n12_N3ccc8CC10x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y23abcEv,_ZTv0_n16_N3ccc8CC10x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y2E[] = {
  {&(_ZTVN3ccc8CC10x5y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y2E[];
static VTBL_ENTRY alt_thunk_names2156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y23abcEv,_ZTv0_n16_N3ccc8CC10x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y23abcEv,_ZThn4_N3ccc8CC10x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y23pqrEv,_ZTv0_n12_N3ccc8CC10x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y23pqrEv,_ZThn4_N3ccc8CC10x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y2E = {  "_ZN3ccc8CC10x5y2E", // class name
  bases__ZN3ccc8CC10x5y2E, 2,
  &(vtc__ZN3ccc8CC10x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y2E),2, //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  DD10x5y2  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD10x5y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x5y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x5y23pqrEv
  ~DD10x5y2(); // tgen
  DD10x5y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y2E) C1{ VBC2{ v3 v2} VBC3{ v3 v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x5y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y23efgEv");}
void  ccc::DD10x5y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y23abcEv");}
void  ccc::DD10x5y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y23pqrEv");}
ccc::DD10x5y2 ::~DD10x5y2(){ note_dtor("_ZN3ccc8DD10x5y2E", this);} // tgen
ccc::DD10x5y2 ::DD10x5y2(){ note_ctor("_ZN3ccc8DD10x5y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y2E, buf);
    ::ccc::DD10x5y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y2E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y2E);
    dp->::ccc::DD10x5y2::~DD10x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y2E(Test__ZN3ccc8DD10x5y2E, "_ZN3ccc8DD10x5y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y2C1Ev();
extern void _ZN3ccc8DD10x5y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y2E[] = {
  NSPAIR(_ZN3ccc8DD10x5y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y2E[];
extern void _ZN3ccc8DD10x5y23pqrEv();
extern void _ZN3ccc8DD10x5y23abcEv();
extern void _ZN3ccc8DD10x5y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y23pqrEv,_ZTv0_n12_N3ccc8DD10x5y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y23pqrEv,_ZThn4_N3ccc8DD10x5y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y23efgEv,_ZTv0_n16_N3ccc8DD10x5y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y23efgEv,_ZThn4_N3ccc8DD10x5y23efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y23abcEv,_ZTv0_n20_N3ccc8DD10x5y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y23abcEv,_ZThn4_N3ccc8DD10x5y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y23pqrEv,_ZTv0_n12_N3ccc8DD10x5y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y23efgEv,_ZTv0_n16_N3ccc8DD10x5y23efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y23abcEv,_ZTv0_n20_N3ccc8DD10x5y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y2E[] = {
  {&(_ZTVN3ccc8DD10x5y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y2E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y2E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y2E[];
static VTBL_ENTRY alt_thunk_names2157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y23abcEv,_ZTv0_n20_N3ccc8DD10x5y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y23abcEv,_ZThn4_N3ccc8DD10x5y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y23efgEv,_ZTv0_n16_N3ccc8DD10x5y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y23efgEv,_ZThn4_N3ccc8DD10x5y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y23pqrEv,_ZTv0_n12_N3ccc8DD10x5y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y23pqrEv,_ZThn4_N3ccc8DD10x5y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y2E = {  "_ZN3ccc8DD10x5y2E", // class name
  bases__ZN3ccc8DD10x5y2E, 2,
  &(vtc__ZN3ccc8DD10x5y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y2E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y2E),3, //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  CC10x5y3  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x5y33abcEv
  ~CC10x5y3(); // tgen
  CC10x5y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y3E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y33efgEv");}
void  ccc::CC10x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y33pqrEv");}
void  ccc::CC10x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y33abcEv");}
ccc::CC10x5y3 ::~CC10x5y3(){ note_dtor("_ZN3ccc8CC10x5y3E", this);} // tgen
ccc::CC10x5y3 ::CC10x5y3(){ note_ctor("_ZN3ccc8CC10x5y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y3E, buf);
    ::ccc::CC10x5y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y3E);
    dp->::ccc::CC10x5y3::~CC10x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y3E(Test__ZN3ccc8CC10x5y3E, "_ZN3ccc8CC10x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y3C1Ev();
extern void _ZN3ccc8CC10x5y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y3E[] = {
  NSPAIR(_ZN3ccc8CC10x5y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y3E[];
extern void _ZN3ccc8CC10x5y33pqrEv();
extern void _ZN3ccc8CC10x5y33efgEv();
extern void _ZN3ccc8CC10x5y33abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y33pqrEv,_ZTv0_n12_N3ccc8CC10x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y33pqrEv,_ZThn4_N3ccc8CC10x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y33abcEv,_ZTv0_n16_N3ccc8CC10x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y33abcEv,_ZThn4_N3ccc8CC10x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y33abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y33pqrEv,_ZTv0_n12_N3ccc8CC10x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y33abcEv,_ZTv0_n16_N3ccc8CC10x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y3E[] = {
  {&(_ZTVN3ccc8CC10x5y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y3E[];
static VTBL_ENTRY alt_thunk_names2158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y33abcEv,_ZTv0_n16_N3ccc8CC10x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y33abcEv,_ZThn4_N3ccc8CC10x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y33pqrEv,_ZTv0_n12_N3ccc8CC10x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y33pqrEv,_ZThn4_N3ccc8CC10x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y3E = {  "_ZN3ccc8CC10x5y3E", // class name
  bases__ZN3ccc8CC10x5y3E, 2,
  &(vtc__ZN3ccc8CC10x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y3E),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  DD10x5y3  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD10x5y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x5y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x5y33abcEv
  ~DD10x5y3(); // tgen
  DD10x5y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y3E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x5y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y33efgEv");}
void  ccc::DD10x5y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y33pqrEv");}
void  ccc::DD10x5y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y33abcEv");}
ccc::DD10x5y3 ::~DD10x5y3(){ note_dtor("_ZN3ccc8DD10x5y3E", this);} // tgen
ccc::DD10x5y3 ::DD10x5y3(){ note_ctor("_ZN3ccc8DD10x5y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y3E, buf);
    ::ccc::DD10x5y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y3E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y3E);
    dp->::ccc::DD10x5y3::~DD10x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y3E(Test__ZN3ccc8DD10x5y3E, "_ZN3ccc8DD10x5y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y3C1Ev();
extern void _ZN3ccc8DD10x5y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y3E[] = {
  NSPAIR(_ZN3ccc8DD10x5y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y3E[];
extern void _ZN3ccc8DD10x5y33pqrEv();
extern void _ZN3ccc8DD10x5y33abcEv();
extern void _ZN3ccc8DD10x5y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y33pqrEv,_ZTv0_n12_N3ccc8DD10x5y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y33pqrEv,_ZThn4_N3ccc8DD10x5y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y33efgEv,_ZTv0_n16_N3ccc8DD10x5y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y33efgEv,_ZThn4_N3ccc8DD10x5y33efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y33abcEv,_ZTv0_n20_N3ccc8DD10x5y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y33abcEv,_ZThn4_N3ccc8DD10x5y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y33pqrEv,_ZTv0_n12_N3ccc8DD10x5y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y33efgEv,_ZTv0_n16_N3ccc8DD10x5y33efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y33abcEv,_ZTv0_n20_N3ccc8DD10x5y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y3E[] = {
  {&(_ZTVN3ccc8DD10x5y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y3E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y3E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y3E[];
static VTBL_ENTRY alt_thunk_names2159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y33abcEv,_ZTv0_n20_N3ccc8DD10x5y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y33abcEv,_ZThn4_N3ccc8DD10x5y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y33efgEv,_ZTv0_n16_N3ccc8DD10x5y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y33efgEv,_ZThn4_N3ccc8DD10x5y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y33pqrEv,_ZTv0_n12_N3ccc8DD10x5y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y33pqrEv,_ZThn4_N3ccc8DD10x5y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y3E = {  "_ZN3ccc8DD10x5y3E", // class name
  bases__ZN3ccc8DD10x5y3E, 2,
  &(vtc__ZN3ccc8DD10x5y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y3E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y3E),3, //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  CC10x5y4  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC10x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x5y43abcEv
  virtual void  efg(); // _ZN3ccc8CC10x5y43efgEv
  ~CC10x5y4(); // tgen
  CC10x5y4(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y4E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y43pqrEv");}
void  ccc::CC10x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y43abcEv");}
void  ccc::CC10x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y43efgEv");}
ccc::CC10x5y4 ::~CC10x5y4(){ note_dtor("_ZN3ccc8CC10x5y4E", this);} // tgen
ccc::CC10x5y4 ::CC10x5y4(){ note_ctor("_ZN3ccc8CC10x5y4E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y4E, buf);
    ::ccc::CC10x5y4 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y4E);
    dp->::ccc::CC10x5y4::~CC10x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y4E(Test__ZN3ccc8CC10x5y4E, "_ZN3ccc8CC10x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y4C1Ev();
extern void _ZN3ccc8CC10x5y4D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y4E[] = {
  NSPAIR(_ZN3ccc8CC10x5y4C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y4E[];
extern void _ZN3ccc8CC10x5y43pqrEv();
extern void _ZN3ccc8CC10x5y43efgEv();
extern void _ZN3ccc8CC10x5y43abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y43pqrEv,_ZTv0_n12_N3ccc8CC10x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y43pqrEv,_ZThn4_N3ccc8CC10x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y43abcEv,_ZTv0_n16_N3ccc8CC10x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y43abcEv,_ZThn4_N3ccc8CC10x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y4E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y43efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y43abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y43pqrEv,_ZTv0_n12_N3ccc8CC10x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y43abcEv,_ZTv0_n16_N3ccc8CC10x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y4E[] = {
  {&(_ZTVN3ccc8CC10x5y4E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y4E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y4E[];
static VTBL_ENTRY alt_thunk_names2160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y43abcEv,_ZTv0_n16_N3ccc8CC10x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y43abcEv,_ZThn4_N3ccc8CC10x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y43pqrEv,_ZTv0_n12_N3ccc8CC10x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y43pqrEv,_ZThn4_N3ccc8CC10x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y4E = {  "_ZN3ccc8CC10x5y4E", // class name
  bases__ZN3ccc8CC10x5y4E, 2,
  &(vtc__ZN3ccc8CC10x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y4E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y4E),2, //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  DD10x5y4  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD10x5y43pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x5y43abcEv
  virtual void  efg(); // _ZN3ccc8DD10x5y43efgEv
  ~DD10x5y4(); // tgen
  DD10x5y4(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y4E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x5y4 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y43pqrEv");}
void  ccc::DD10x5y4 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y43abcEv");}
void  ccc::DD10x5y4 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y43efgEv");}
ccc::DD10x5y4 ::~DD10x5y4(){ note_dtor("_ZN3ccc8DD10x5y4E", this);} // tgen
ccc::DD10x5y4 ::DD10x5y4(){ note_ctor("_ZN3ccc8DD10x5y4E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y4E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y4E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y4E, buf);
    ::ccc::DD10x5y4 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y4E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y4E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y4E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y4E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y4E);
    dp->::ccc::DD10x5y4::~DD10x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y4E(Test__ZN3ccc8DD10x5y4E, "_ZN3ccc8DD10x5y4E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y4C1Ev();
extern void _ZN3ccc8DD10x5y4D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y4E[] = {
  NSPAIR(_ZN3ccc8DD10x5y4C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y4E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y4E[];
extern void _ZN3ccc8DD10x5y43pqrEv();
extern void _ZN3ccc8DD10x5y43abcEv();
extern void _ZN3ccc8DD10x5y43efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y43pqrEv,_ZTv0_n12_N3ccc8DD10x5y43pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y43pqrEv,_ZThn4_N3ccc8DD10x5y43pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y43efgEv,_ZTv0_n16_N3ccc8DD10x5y43efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y43efgEv,_ZThn4_N3ccc8DD10x5y43efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y43abcEv,_ZTv0_n20_N3ccc8DD10x5y43abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y43abcEv,_ZThn4_N3ccc8DD10x5y43abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y4E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y4E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y43pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y43abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y43efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y4E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y43pqrEv,_ZTv0_n12_N3ccc8DD10x5y43pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y43efgEv,_ZTv0_n16_N3ccc8DD10x5y43efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y43abcEv,_ZTv0_n20_N3ccc8DD10x5y43abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y4E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y4E[] = {
  {&(_ZTVN3ccc8DD10x5y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y4E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y4E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y4E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y4E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y4E[];
static VTBL_ENTRY alt_thunk_names2161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y43abcEv,_ZTv0_n20_N3ccc8DD10x5y43abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y43abcEv,_ZThn4_N3ccc8DD10x5y43abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y43efgEv,_ZTv0_n16_N3ccc8DD10x5y43efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y43efgEv,_ZThn4_N3ccc8DD10x5y43efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y43pqrEv,_ZTv0_n12_N3ccc8DD10x5y43pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y43pqrEv,_ZThn4_N3ccc8DD10x5y43pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y4E = {  "_ZN3ccc8DD10x5y4E", // class name
  bases__ZN3ccc8DD10x5y4E, 2,
  &(vtc__ZN3ccc8DD10x5y4E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y4E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y4E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y4E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y4E),3, //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  CC10x5y5  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8CC10x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x5y53efgEv
  virtual void  abc(); // _ZN3ccc8CC10x5y53abcEv
  ~CC10x5y5(); // tgen
  CC10x5y5(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y5E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y53pqrEv");}
void  ccc::CC10x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y53efgEv");}
void  ccc::CC10x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y53abcEv");}
ccc::CC10x5y5 ::~CC10x5y5(){ note_dtor("_ZN3ccc8CC10x5y5E", this);} // tgen
ccc::CC10x5y5 ::CC10x5y5(){ note_ctor("_ZN3ccc8CC10x5y5E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y5E, buf);
    ::ccc::CC10x5y5 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y5E);
    dp->::ccc::CC10x5y5::~CC10x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y5E(Test__ZN3ccc8CC10x5y5E, "_ZN3ccc8CC10x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y5C1Ev();
extern void _ZN3ccc8CC10x5y5D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y5E[] = {
  NSPAIR(_ZN3ccc8CC10x5y5C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y5E[];
extern void _ZN3ccc8CC10x5y53pqrEv();
extern void _ZN3ccc8CC10x5y53efgEv();
extern void _ZN3ccc8CC10x5y53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y53pqrEv,_ZTv0_n12_N3ccc8CC10x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y53pqrEv,_ZThn4_N3ccc8CC10x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y53abcEv,_ZTv0_n16_N3ccc8CC10x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y53abcEv,_ZThn4_N3ccc8CC10x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y5E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y53abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y53pqrEv,_ZTv0_n12_N3ccc8CC10x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y53abcEv,_ZTv0_n16_N3ccc8CC10x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y5E[] = {
  {&(_ZTVN3ccc8CC10x5y5E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y5E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y5E[];
static VTBL_ENTRY alt_thunk_names2162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y53abcEv,_ZTv0_n16_N3ccc8CC10x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y53abcEv,_ZThn4_N3ccc8CC10x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y53pqrEv,_ZTv0_n12_N3ccc8CC10x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y53pqrEv,_ZThn4_N3ccc8CC10x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y5E = {  "_ZN3ccc8CC10x5y5E", // class name
  bases__ZN3ccc8CC10x5y5E, 2,
  &(vtc__ZN3ccc8CC10x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y5E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y5E),2, //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  DD10x5y5  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc8DD10x5y53pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x5y53efgEv
  virtual void  abc(); // _ZN3ccc8DD10x5y53abcEv
  ~DD10x5y5(); // tgen
  DD10x5y5(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y5E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x5y5 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y53pqrEv");}
void  ccc::DD10x5y5 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y53efgEv");}
void  ccc::DD10x5y5 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y53abcEv");}
ccc::DD10x5y5 ::~DD10x5y5(){ note_dtor("_ZN3ccc8DD10x5y5E", this);} // tgen
ccc::DD10x5y5 ::DD10x5y5(){ note_ctor("_ZN3ccc8DD10x5y5E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y5E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y5E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y5E, buf);
    ::ccc::DD10x5y5 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y5E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y5E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y5E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y5E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y5E);
    dp->::ccc::DD10x5y5::~DD10x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y5E(Test__ZN3ccc8DD10x5y5E, "_ZN3ccc8DD10x5y5E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y5C1Ev();
extern void _ZN3ccc8DD10x5y5D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y5E[] = {
  NSPAIR(_ZN3ccc8DD10x5y5C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y5E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y5E[];
extern void _ZN3ccc8DD10x5y53pqrEv();
extern void _ZN3ccc8DD10x5y53abcEv();
extern void _ZN3ccc8DD10x5y53efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y53pqrEv,_ZTv0_n12_N3ccc8DD10x5y53pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y53pqrEv,_ZThn4_N3ccc8DD10x5y53pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y53efgEv,_ZTv0_n16_N3ccc8DD10x5y53efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y53efgEv,_ZThn4_N3ccc8DD10x5y53efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y53abcEv,_ZTv0_n20_N3ccc8DD10x5y53abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y53abcEv,_ZThn4_N3ccc8DD10x5y53abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y5E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y5E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y53abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y53efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y5E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y53pqrEv,_ZTv0_n12_N3ccc8DD10x5y53pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y53efgEv,_ZTv0_n16_N3ccc8DD10x5y53efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y53abcEv,_ZTv0_n20_N3ccc8DD10x5y53abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y5E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y5E[] = {
  {&(_ZTVN3ccc8DD10x5y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y5E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y5E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y5E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y5E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y5E[];
static VTBL_ENTRY alt_thunk_names2163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y53abcEv,_ZTv0_n20_N3ccc8DD10x5y53abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y53abcEv,_ZThn4_N3ccc8DD10x5y53abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y53efgEv,_ZTv0_n16_N3ccc8DD10x5y53efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y53efgEv,_ZThn4_N3ccc8DD10x5y53efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y53pqrEv,_ZTv0_n12_N3ccc8DD10x5y53pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y53pqrEv,_ZThn4_N3ccc8DD10x5y53pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y5E = {  "_ZN3ccc8DD10x5y5E", // class name
  bases__ZN3ccc8DD10x5y5E, 2,
  &(vtc__ZN3ccc8DD10x5y5E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y5E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y5E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y5E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y5E),3, //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  CC10x5y6  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y63abcEv
  virtual void  efg(); // _ZN3ccc8CC10x5y63efgEv
  ~CC10x5y6(); // tgen
  CC10x5y6(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y6E) C1{ VBC2{ v3 v1} BC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y63abcEv");}
void  ccc::CC10x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y63efgEv");}
ccc::CC10x5y6 ::~CC10x5y6(){ note_dtor("_ZN3ccc8CC10x5y6E", this);} // tgen
ccc::CC10x5y6 ::CC10x5y6(){ note_ctor("_ZN3ccc8CC10x5y6E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y6E, buf);
    ::ccc::CC10x5y6 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y6E);
    dp->::ccc::CC10x5y6::~CC10x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y6E(Test__ZN3ccc8CC10x5y6E, "_ZN3ccc8CC10x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y6C1Ev();
extern void _ZN3ccc8CC10x5y6D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y6E[] = {
  NSPAIR(_ZN3ccc8CC10x5y6C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y6E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC10x5y63efgEv();
extern void _ZN3ccc8CC10x5y63abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y63abcEv,_ZTv0_n16_N3ccc8CC10x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y63abcEv,_ZThn4_N3ccc8CC10x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y6E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y63efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y63abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y63abcEv,_ZTv0_n16_N3ccc8CC10x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y6E[] = {
  {&(_ZTVN3ccc8CC10x5y6E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y6E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y6E[];
static VTBL_ENTRY alt_thunk_names2164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y63abcEv,_ZTv0_n16_N3ccc8CC10x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y63abcEv,_ZThn4_N3ccc8CC10x5y63abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y6E = {  "_ZN3ccc8CC10x5y6E", // class name
  bases__ZN3ccc8CC10x5y6E, 2,
  &(vtc__ZN3ccc8CC10x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y6E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y6E),2, //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  DD10x5y6  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD10x5y63abcEv
  virtual void  efg(); // _ZN3ccc8DD10x5y63efgEv
  ~DD10x5y6(); // tgen
  DD10x5y6(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y6E) C1{ VBC2{ v3 v1} VBC3{ v4 v2 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x5y6 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y63abcEv");}
void  ccc::DD10x5y6 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y63efgEv");}
ccc::DD10x5y6 ::~DD10x5y6(){ note_dtor("_ZN3ccc8DD10x5y6E", this);} // tgen
ccc::DD10x5y6 ::DD10x5y6(){ note_ctor("_ZN3ccc8DD10x5y6E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y6E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y6E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y6E, buf);
    ::ccc::DD10x5y6 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y6E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y6E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y6E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y6E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y6E);
    dp->::ccc::DD10x5y6::~DD10x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y6E(Test__ZN3ccc8DD10x5y6E, "_ZN3ccc8DD10x5y6E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y6C1Ev();
extern void _ZN3ccc8DD10x5y6D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y6E[] = {
  NSPAIR(_ZN3ccc8DD10x5y6C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y6E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y6E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x5y63abcEv();
extern void _ZN3ccc8DD10x5y63efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y63efgEv,_ZTv0_n16_N3ccc8DD10x5y63efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y63efgEv,_ZThn4_N3ccc8DD10x5y63efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y63abcEv,_ZTv0_n20_N3ccc8DD10x5y63abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y63abcEv,_ZThn4_N3ccc8DD10x5y63abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y6E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y63abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y63efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y6E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y63efgEv,_ZTv0_n16_N3ccc8DD10x5y63efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y63abcEv,_ZTv0_n20_N3ccc8DD10x5y63abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y6E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y6E[] = {
  {&(_ZTVN3ccc8DD10x5y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y6E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y6E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y6E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y6E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y6E[];
static VTBL_ENTRY alt_thunk_names2165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y63abcEv,_ZTv0_n20_N3ccc8DD10x5y63abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y63abcEv,_ZThn4_N3ccc8DD10x5y63abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y63efgEv,_ZTv0_n16_N3ccc8DD10x5y63efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y63efgEv,_ZThn4_N3ccc8DD10x5y63efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y6E = {  "_ZN3ccc8DD10x5y6E", // class name
  bases__ZN3ccc8DD10x5y6E, 2,
  &(vtc__ZN3ccc8DD10x5y6E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y6E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y6E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y6E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y6E),3, //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  CC10x5y7  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8CC10x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y73pqrEv
  ~CC10x5y7(); // tgen
  CC10x5y7(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y7E) C1{ VBC2{ v2 v1} BC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::CC10x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y73abcEv");}
void  ccc::CC10x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y73pqrEv");}
ccc::CC10x5y7 ::~CC10x5y7(){ note_dtor("_ZN3ccc8CC10x5y7E", this);} // tgen
ccc::CC10x5y7 ::CC10x5y7(){ note_ctor("_ZN3ccc8CC10x5y7E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y7E, buf);
    ::ccc::CC10x5y7 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y7E);
    dp->::ccc::CC10x5y7::~CC10x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y7E(Test__ZN3ccc8CC10x5y7E, "_ZN3ccc8CC10x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y7C1Ev();
extern void _ZN3ccc8CC10x5y7D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y7E[] = {
  NSPAIR(_ZN3ccc8CC10x5y7C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y7E[];
extern void _ZN3ccc8CC10x5y73pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc8CC10x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y73pqrEv,_ZTv0_n12_N3ccc8CC10x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y73pqrEv,_ZThn4_N3ccc8CC10x5y73pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y73abcEv,_ZTv0_n16_N3ccc8CC10x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y73abcEv,_ZThn4_N3ccc8CC10x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y7E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y73abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y73pqrEv,_ZTv0_n12_N3ccc8CC10x5y73pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y73abcEv,_ZTv0_n16_N3ccc8CC10x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y7E[] = {
  {&(_ZTVN3ccc8CC10x5y7E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y7E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y7E[];
static VTBL_ENTRY alt_thunk_names2166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y73abcEv,_ZTv0_n16_N3ccc8CC10x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y73abcEv,_ZThn4_N3ccc8CC10x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y73pqrEv,_ZTv0_n12_N3ccc8CC10x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y73pqrEv,_ZThn4_N3ccc8CC10x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y7E = {  "_ZN3ccc8CC10x5y7E", // class name
  bases__ZN3ccc8CC10x5y7E, 2,
  &(vtc__ZN3ccc8CC10x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y7E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y7E),2, //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  DD10x5y7  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc8DD10x5y73abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x5y73pqrEv
  ~DD10x5y7(); // tgen
  DD10x5y7(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y7E) C1{ VBC2{ v2 v1} VBC3{ v2 v3 v1} v1 v2}
}
namespace ccc { 
void  ccc::DD10x5y7 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y73abcEv");}
void  ccc::DD10x5y7 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y73pqrEv");}
ccc::DD10x5y7 ::~DD10x5y7(){ note_dtor("_ZN3ccc8DD10x5y7E", this);} // tgen
ccc::DD10x5y7 ::DD10x5y7(){ note_ctor("_ZN3ccc8DD10x5y7E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y7E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y7E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y7E, buf);
    ::ccc::DD10x5y7 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y7E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y7E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y7E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y7E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y7E);
    dp->::ccc::DD10x5y7::~DD10x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y7E(Test__ZN3ccc8DD10x5y7E, "_ZN3ccc8DD10x5y7E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y7C1Ev();
extern void _ZN3ccc8DD10x5y7D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y7E[] = {
  NSPAIR(_ZN3ccc8DD10x5y7C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y7E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y7E[];
extern void _ZN3ccc8DD10x5y73pqrEv();
extern void _ZN3ccc8DD10x5y73abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y73pqrEv,_ZTv0_n12_N3ccc8DD10x5y73pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y73pqrEv,_ZThn4_N3ccc8DD10x5y73pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y73abcEv,_ZTv0_n20_N3ccc8DD10x5y73abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y73abcEv,_ZThn4_N3ccc8DD10x5y73abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y7E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y7E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y73pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y73abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y7E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y73pqrEv,_ZTv0_n12_N3ccc8DD10x5y73pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y73abcEv,_ZTv0_n20_N3ccc8DD10x5y73abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y7E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y7E[] = {
  {&(_ZTVN3ccc8DD10x5y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x5y7E[6]),  6,16},
  {&(_ZTVN3ccc8DD10x5y7E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y7E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y7E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y7E[];
static VTBL_ENTRY alt_thunk_names2167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y73abcEv,_ZTv0_n20_N3ccc8DD10x5y73abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y73abcEv,_ZThn4_N3ccc8DD10x5y73abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y73pqrEv,_ZTv0_n12_N3ccc8DD10x5y73pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y73pqrEv,_ZThn4_N3ccc8DD10x5y73pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y7E = {  "_ZN3ccc8DD10x5y7E", // class name
  bases__ZN3ccc8DD10x5y7E, 2,
  &(vtc__ZN3ccc8DD10x5y7E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y7E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y7E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y7E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y7E),3, //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  CC10x5y8  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y83efgEv
  virtual void  abc(); // _ZN3ccc8CC10x5y83abcEv
  ~CC10x5y8(); // tgen
  CC10x5y8(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y8E) C1{ VBC2{ v3 v2} BC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y83efgEv");}
void  ccc::CC10x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x5y83abcEv");}
ccc::CC10x5y8 ::~CC10x5y8(){ note_dtor("_ZN3ccc8CC10x5y8E", this);} // tgen
ccc::CC10x5y8 ::CC10x5y8(){ note_ctor("_ZN3ccc8CC10x5y8E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y8E, buf);
    ::ccc::CC10x5y8 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y8E);
    dp->::ccc::CC10x5y8::~CC10x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y8E(Test__ZN3ccc8CC10x5y8E, "_ZN3ccc8CC10x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y8C1Ev();
extern void _ZN3ccc8CC10x5y8D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y8E[] = {
  NSPAIR(_ZN3ccc8CC10x5y8C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y8E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc8CC10x5y83efgEv();
extern void _ZN3ccc8CC10x5y83abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x5y83abcEv,_ZTv0_n16_N3ccc8CC10x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y83abcEv,_ZThn4_N3ccc8CC10x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y8E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y83efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y83abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x5y83abcEv,_ZTv0_n16_N3ccc8CC10x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y8E[] = {
  {&(_ZTVN3ccc8CC10x5y8E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y8E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y8E[];
static VTBL_ENTRY alt_thunk_names2168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x5y83abcEv,_ZTv0_n16_N3ccc8CC10x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y83abcEv,_ZThn4_N3ccc8CC10x5y83abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y8E = {  "_ZN3ccc8CC10x5y8E", // class name
  bases__ZN3ccc8CC10x5y8E, 2,
  &(vtc__ZN3ccc8CC10x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y8E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y8E),2, //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  DD10x5y8  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD10x5y83efgEv
  virtual void  abc(); // _ZN3ccc8DD10x5y83abcEv
  ~DD10x5y8(); // tgen
  DD10x5y8(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y8E) C1{ VBC2{ v3 v2} VBC3{ v4 v1 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x5y8 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y83efgEv");}
void  ccc::DD10x5y8 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x5y83abcEv");}
ccc::DD10x5y8 ::~DD10x5y8(){ note_dtor("_ZN3ccc8DD10x5y8E", this);} // tgen
ccc::DD10x5y8 ::DD10x5y8(){ note_ctor("_ZN3ccc8DD10x5y8E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y8E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y8E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y8E, buf);
    ::ccc::DD10x5y8 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y8E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y8E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y8E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y8E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y8E);
    dp->::ccc::DD10x5y8::~DD10x5y8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y8E(Test__ZN3ccc8DD10x5y8E, "_ZN3ccc8DD10x5y8E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y8C1Ev();
extern void _ZN3ccc8DD10x5y8D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y8E[] = {
  NSPAIR(_ZN3ccc8DD10x5y8C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y8D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y8E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y8E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc8DD10x5y83abcEv();
extern void _ZN3ccc8DD10x5y83efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y83efgEv,_ZTv0_n16_N3ccc8DD10x5y83efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y83efgEv,_ZThn4_N3ccc8DD10x5y83efgEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N3ccc8DD10x5y83abcEv,_ZTv0_n20_N3ccc8DD10x5y83abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y83abcEv,_ZThn4_N3ccc8DD10x5y83abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y8E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y83abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y83efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y8E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y83efgEv,_ZTv0_n16_N3ccc8DD10x5y83efgEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc8DD10x5y83abcEv,_ZTv0_n20_N3ccc8DD10x5y83abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y8E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y8E[] = {
  {&(_ZTVN3ccc8DD10x5y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y8E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y8E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y8E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y8E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y8E[];
static VTBL_ENTRY alt_thunk_names2169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc8DD10x5y83abcEv,_ZTv0_n20_N3ccc8DD10x5y83abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y83abcEv,_ZThn4_N3ccc8DD10x5y83abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y83efgEv,_ZTv0_n16_N3ccc8DD10x5y83efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y83efgEv,_ZThn4_N3ccc8DD10x5y83efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y8E = {  "_ZN3ccc8DD10x5y8E", // class name
  bases__ZN3ccc8DD10x5y8E, 2,
  &(vtc__ZN3ccc8DD10x5y8E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y8E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y8E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y8E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y8E),3, //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  CC10x5y9  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8CC10x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x5y93pqrEv
  ~CC10x5y9(); // tgen
  CC10x5y9(); // tgen
};
//SIG(1 _ZN3ccc8CC10x5y9E) C1{ VBC2{ v2 v3} BC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x5y93efgEv");}
void  ccc::CC10x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x5y93pqrEv");}
ccc::CC10x5y9 ::~CC10x5y9(){ note_dtor("_ZN3ccc8CC10x5y9E", this);} // tgen
ccc::CC10x5y9 ::CC10x5y9(){ note_ctor("_ZN3ccc8CC10x5y9E", this);} // tgen
}
static void Test__ZN3ccc8CC10x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x5y9E, buf);
    ::ccc::CC10x5y9 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x5y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc8CC10x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x5y9E);
    dp->::ccc::CC10x5y9::~CC10x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x5y9E(Test__ZN3ccc8CC10x5y9E, "_ZN3ccc8CC10x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x5y9C1Ev();
extern void _ZN3ccc8CC10x5y9D1Ev();
Name_Map name_map__ZN3ccc8CC10x5y9E[] = {
  NSPAIR(_ZN3ccc8CC10x5y9C1Ev),
  NSPAIR(_ZN3ccc8CC10x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8CC10x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x5y9E[];
extern void _ZN3ccc8CC10x5y93pqrEv();
extern void _ZN3ccc8CC10x5y93efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x5y93pqrEv,_ZTv0_n12_N3ccc8CC10x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x5y93pqrEv,_ZThn4_N3ccc8CC10x5y93pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8CC10x5y9E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x5y93efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x5y93pqrEv,_ZTv0_n12_N3ccc8CC10x5y93pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x5y9E[] = {
  {&(_ZTVN3ccc8CC10x5y9E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x5y9E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x5y9E[];
static VTBL_ENTRY alt_thunk_names2170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x5y93pqrEv,_ZTv0_n12_N3ccc8CC10x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x5y93pqrEv,_ZThn4_N3ccc8CC10x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x5y9E = {  "_ZN3ccc8CC10x5y9E", // class name
  bases__ZN3ccc8CC10x5y9E, 2,
  &(vtc__ZN3ccc8CC10x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x5y9E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x5y9E),2, //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  DD10x5y9  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc8DD10x5y93efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x5y93pqrEv
  ~DD10x5y9(); // tgen
  DD10x5y9(); // tgen
};
//SIG(1 _ZN3ccc8DD10x5y9E) C1{ VBC2{ v2 v3} VBC3{ v2 v1 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x5y9 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x5y93efgEv");}
void  ccc::DD10x5y9 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x5y93pqrEv");}
ccc::DD10x5y9 ::~DD10x5y9(){ note_dtor("_ZN3ccc8DD10x5y9E", this);} // tgen
ccc::DD10x5y9 ::DD10x5y9(){ note_ctor("_ZN3ccc8DD10x5y9E", this);} // tgen
}
static void Test__ZN3ccc8DD10x5y9E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x5y9E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x5y9E, buf);
    ::ccc::DD10x5y9 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x5y9E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x5y9E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x5y9E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc8DD10x5y9E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x5y9E);
    dp->::ccc::DD10x5y9::~DD10x5y9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x5y9E(Test__ZN3ccc8DD10x5y9E, "_ZN3ccc8DD10x5y9E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x5y9C1Ev();
extern void _ZN3ccc8DD10x5y9D1Ev();
Name_Map name_map__ZN3ccc8DD10x5y9E[] = {
  NSPAIR(_ZN3ccc8DD10x5y9C1Ev),
  NSPAIR(_ZN3ccc8DD10x5y9D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc8DD10x5y9E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y9E[];
extern void _ZN3ccc8DD10x5y93pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc8DD10x5y93efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x5y93pqrEv,_ZTv0_n12_N3ccc8DD10x5y93pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y93pqrEv,_ZThn4_N3ccc8DD10x5y93pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x5y93efgEv,_ZTv0_n16_N3ccc8DD10x5y93efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x5y93efgEv,_ZThn4_N3ccc8DD10x5y93efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc8DD10x5y9E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y9E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y93pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x5y93efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x5y9E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x5y93pqrEv,_ZTv0_n12_N3ccc8DD10x5y93pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x5y93efgEv,_ZTv0_n16_N3ccc8DD10x5y93efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x5y9E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x5y9E[] = {
  {&(_ZTVN3ccc8DD10x5y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y9E[6]),  6,17},
  {&(_ZTVN3ccc8DD10x5y9E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x5y9E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x5y9E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x5y9E[];
static VTBL_ENTRY alt_thunk_names2171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x5y93efgEv,_ZTv0_n16_N3ccc8DD10x5y93efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y93efgEv,_ZThn4_N3ccc8DD10x5y93efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x5y93pqrEv,_ZTv0_n12_N3ccc8DD10x5y93pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x5y93pqrEv,_ZThn4_N3ccc8DD10x5y93pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x5y9E = {  "_ZN3ccc8DD10x5y9E", // class name
  bases__ZN3ccc8DD10x5y9E, 2,
  &(vtc__ZN3ccc8DD10x5y9E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x5y9E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x5y9E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x5y9E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x5y9E),3, //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  CC10x5y10  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC10x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9CC10x5y103abcEv
  ~CC10x5y10(); // tgen
  CC10x5y10(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y10E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::CC10x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x5y103pqrEv");}
void  ccc::CC10x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x5y103abcEv");}
ccc::CC10x5y10 ::~CC10x5y10(){ note_dtor("_ZN3ccc9CC10x5y10E", this);} // tgen
ccc::CC10x5y10 ::CC10x5y10(){ note_ctor("_ZN3ccc9CC10x5y10E", this);} // tgen
}
static void Test__ZN3ccc9CC10x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x5y10E, buf);
    ::ccc::CC10x5y10 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x5y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC10x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x5y10E);
    dp->::ccc::CC10x5y10::~CC10x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x5y10E(Test__ZN3ccc9CC10x5y10E, "_ZN3ccc9CC10x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x5y10C1Ev();
extern void _ZN3ccc9CC10x5y10D1Ev();
Name_Map name_map__ZN3ccc9CC10x5y10E[] = {
  NSPAIR(_ZN3ccc9CC10x5y10C1Ev),
  NSPAIR(_ZN3ccc9CC10x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC10x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x5y10E[];
extern void _ZN3ccc9CC10x5y103pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc9CC10x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x5y103pqrEv,_ZTv0_n12_N3ccc9CC10x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y103pqrEv,_ZThn4_N3ccc9CC10x5y103pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x5y103abcEv,_ZTv0_n16_N3ccc9CC10x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y103abcEv,_ZThn4_N3ccc9CC10x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y10E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y103abcEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x5y103pqrEv,_ZTv0_n12_N3ccc9CC10x5y103pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x5y103abcEv,_ZTv0_n16_N3ccc9CC10x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x5y10E[] = {
  {&(_ZTVN3ccc9CC10x5y10E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x5y10E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x5y10E[];
static VTBL_ENTRY alt_thunk_names2172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x5y103abcEv,_ZTv0_n16_N3ccc9CC10x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x5y103abcEv,_ZThn4_N3ccc9CC10x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x5y103pqrEv,_ZTv0_n12_N3ccc9CC10x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x5y103pqrEv,_ZThn4_N3ccc9CC10x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x5y10E = {  "_ZN3ccc9CC10x5y10E", // class name
  bases__ZN3ccc9CC10x5y10E, 2,
  &(vtc__ZN3ccc9CC10x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y10E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x5y10E),2, //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  DD10x5y10  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9DD10x5y103pqrEv
  virtual void  abc(); // _ZN3ccc9DD10x5y103abcEv
  ~DD10x5y10(); // tgen
  DD10x5y10(); // tgen
};
//SIG(1 _ZN3ccc9DD10x5y10E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v2} v1 v2}
}
namespace ccc { 
void  ccc::DD10x5y10 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x5y103pqrEv");}
void  ccc::DD10x5y10 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x5y103abcEv");}
ccc::DD10x5y10 ::~DD10x5y10(){ note_dtor("_ZN3ccc9DD10x5y10E", this);} // tgen
ccc::DD10x5y10 ::DD10x5y10(){ note_ctor("_ZN3ccc9DD10x5y10E", this);} // tgen
}
static void Test__ZN3ccc9DD10x5y10E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x5y10E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x5y10E, buf);
    ::ccc::DD10x5y10 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x5y10E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x5y10E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x5y10E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9DD10x5y10E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x5y10E);
    dp->::ccc::DD10x5y10::~DD10x5y10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x5y10E(Test__ZN3ccc9DD10x5y10E, "_ZN3ccc9DD10x5y10E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x5y10C1Ev();
extern void _ZN3ccc9DD10x5y10D1Ev();
Name_Map name_map__ZN3ccc9DD10x5y10E[] = {
  NSPAIR(_ZN3ccc9DD10x5y10C1Ev),
  NSPAIR(_ZN3ccc9DD10x5y10D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9DD10x5y10E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y10E[];
extern void _ZN3ccc9DD10x5y103pqrEv();
extern void _ZN3ccc9DD10x5y103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x5y103pqrEv,_ZTv0_n12_N3ccc9DD10x5y103pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y103pqrEv,_ZThn4_N3ccc9DD10x5y103pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x5y103abcEv,_ZTv0_n20_N3ccc9DD10x5y103abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y103abcEv,_ZThn4_N3ccc9DD10x5y103abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x5y10E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y10E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y103abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y10E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x5y103pqrEv,_ZTv0_n12_N3ccc9DD10x5y103pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x5y103abcEv,_ZTv0_n20_N3ccc9DD10x5y103abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x5y10E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x5y10E[] = {
  {&(_ZTVN3ccc9DD10x5y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y10E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y10E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y10E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x5y10E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x5y10E[];
static VTBL_ENTRY alt_thunk_names2173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x5y103abcEv,_ZTv0_n20_N3ccc9DD10x5y103abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y103abcEv,_ZThn4_N3ccc9DD10x5y103abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x5y103pqrEv,_ZTv0_n12_N3ccc9DD10x5y103pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y103pqrEv,_ZThn4_N3ccc9DD10x5y103pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x5y10E = {  "_ZN3ccc9DD10x5y10E", // class name
  bases__ZN3ccc9DD10x5y10E, 2,
  &(vtc__ZN3ccc9DD10x5y10E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x5y10E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x5y10E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x5y10E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x5y10E),3, //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  CC10x5y11  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC10x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9CC10x5y113efgEv
  ~CC10x5y11(); // tgen
  CC10x5y11(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y11E) C1{ VBC2{ v1 v3} BC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::CC10x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x5y113pqrEv");}
void  ccc::CC10x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x5y113efgEv");}
ccc::CC10x5y11 ::~CC10x5y11(){ note_dtor("_ZN3ccc9CC10x5y11E", this);} // tgen
ccc::CC10x5y11 ::CC10x5y11(){ note_ctor("_ZN3ccc9CC10x5y11E", this);} // tgen
}
static void Test__ZN3ccc9CC10x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x5y11E, buf);
    ::ccc::CC10x5y11 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x5y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC10x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x5y11E);
    dp->::ccc::CC10x5y11::~CC10x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x5y11E(Test__ZN3ccc9CC10x5y11E, "_ZN3ccc9CC10x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x5y11C1Ev();
extern void _ZN3ccc9CC10x5y11D1Ev();
Name_Map name_map__ZN3ccc9CC10x5y11E[] = {
  NSPAIR(_ZN3ccc9CC10x5y11C1Ev),
  NSPAIR(_ZN3ccc9CC10x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC10x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x5y11E[];
extern void _ZN3ccc9CC10x5y113pqrEv();
extern void _ZN3ccc9CC10x5y113efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x5y113pqrEv,_ZTv0_n12_N3ccc9CC10x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y113pqrEv,_ZThn4_N3ccc9CC10x5y113pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y11E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y113efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x5y113pqrEv,_ZTv0_n12_N3ccc9CC10x5y113pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x5y11E[] = {
  {&(_ZTVN3ccc9CC10x5y11E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x5y11E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x5y11E[];
static VTBL_ENTRY alt_thunk_names2174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x5y113pqrEv,_ZTv0_n12_N3ccc9CC10x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x5y113pqrEv,_ZThn4_N3ccc9CC10x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x5y11E = {  "_ZN3ccc9CC10x5y11E", // class name
  bases__ZN3ccc9CC10x5y11E, 2,
  &(vtc__ZN3ccc9CC10x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y11E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x5y11E),2, //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  DD10x5y11  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9DD10x5y113pqrEv
  virtual void  efg(); // _ZN3ccc9DD10x5y113efgEv
  ~DD10x5y11(); // tgen
  DD10x5y11(); // tgen
};
//SIG(1 _ZN3ccc9DD10x5y11E) C1{ VBC2{ v1 v3} VBC3{ v1 v2 v4} v1 v2}
}
namespace ccc { 
void  ccc::DD10x5y11 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x5y113pqrEv");}
void  ccc::DD10x5y11 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x5y113efgEv");}
ccc::DD10x5y11 ::~DD10x5y11(){ note_dtor("_ZN3ccc9DD10x5y11E", this);} // tgen
ccc::DD10x5y11 ::DD10x5y11(){ note_ctor("_ZN3ccc9DD10x5y11E", this);} // tgen
}
static void Test__ZN3ccc9DD10x5y11E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x5y11E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x5y11E, buf);
    ::ccc::DD10x5y11 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x5y11E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x5y11E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x5y11E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9DD10x5y11E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x5y11E);
    dp->::ccc::DD10x5y11::~DD10x5y11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x5y11E(Test__ZN3ccc9DD10x5y11E, "_ZN3ccc9DD10x5y11E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x5y11C1Ev();
extern void _ZN3ccc9DD10x5y11D1Ev();
Name_Map name_map__ZN3ccc9DD10x5y11E[] = {
  NSPAIR(_ZN3ccc9DD10x5y11C1Ev),
  NSPAIR(_ZN3ccc9DD10x5y11D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9DD10x5y11E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y11E[];
extern void _ZN3ccc9DD10x5y113pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x5y113efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x5y113pqrEv,_ZTv0_n12_N3ccc9DD10x5y113pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y113pqrEv,_ZThn4_N3ccc9DD10x5y113pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x5y113efgEv,_ZTv0_n16_N3ccc9DD10x5y113efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y113efgEv,_ZThn4_N3ccc9DD10x5y113efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x5y11E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y11E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y113pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y113efgEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y11E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x5y113pqrEv,_ZTv0_n12_N3ccc9DD10x5y113pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x5y113efgEv,_ZTv0_n16_N3ccc9DD10x5y113efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x5y11E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x5y11E[] = {
  {&(_ZTVN3ccc9DD10x5y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x5y11E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x5y11E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y11E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x5y11E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x5y11E[];
static VTBL_ENTRY alt_thunk_names2175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x5y113efgEv,_ZTv0_n16_N3ccc9DD10x5y113efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y113efgEv,_ZThn4_N3ccc9DD10x5y113efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x5y113pqrEv,_ZTv0_n12_N3ccc9DD10x5y113pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y113pqrEv,_ZThn4_N3ccc9DD10x5y113pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x5y11E = {  "_ZN3ccc9DD10x5y11E", // class name
  bases__ZN3ccc9DD10x5y11E, 2,
  &(vtc__ZN3ccc9DD10x5y11E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x5y11E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x5y11E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x5y11E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x5y11E),3, //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  CC10x5y12  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9CC10x5y123abcEv
  ~CC10x5y12(); // tgen
  CC10x5y12(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y12E) C1{ VBC2{ v2 v1} BC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::CC10x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9CC10x5y123abcEv");}
ccc::CC10x5y12 ::~CC10x5y12(){ note_dtor("_ZN3ccc9CC10x5y12E", this);} // tgen
ccc::CC10x5y12 ::CC10x5y12(){ note_ctor("_ZN3ccc9CC10x5y12E", this);} // tgen
}
static void Test__ZN3ccc9CC10x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x5y12E, buf);
    ::ccc::CC10x5y12 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x5y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC10x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x5y12E);
    dp->::ccc::CC10x5y12::~CC10x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x5y12E(Test__ZN3ccc9CC10x5y12E, "_ZN3ccc9CC10x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x5y12C1Ev();
extern void _ZN3ccc9CC10x5y12D1Ev();
Name_Map name_map__ZN3ccc9CC10x5y12E[] = {
  NSPAIR(_ZN3ccc9CC10x5y12C1Ev),
  NSPAIR(_ZN3ccc9CC10x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC10x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x5y12E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc9CC10x5y123abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9CC10x5y123abcEv,_ZTv0_n16_N3ccc9CC10x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y123abcEv,_ZThn4_N3ccc9CC10x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y12E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9CC10x5y123abcEv,_ZTv0_n16_N3ccc9CC10x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x5y12E[] = {
  {&(_ZTVN3ccc9CC10x5y12E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x5y12E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x5y12E[];
static VTBL_ENTRY alt_thunk_names2176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9CC10x5y123abcEv,_ZTv0_n16_N3ccc9CC10x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x5y123abcEv,_ZThn4_N3ccc9CC10x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x5y12E = {  "_ZN3ccc9CC10x5y12E", // class name
  bases__ZN3ccc9CC10x5y12E, 2,
  &(vtc__ZN3ccc9CC10x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y12E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x5y12E),2, //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  DD10x5y12  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  abc(); // _ZN3ccc9DD10x5y123abcEv
  ~DD10x5y12(); // tgen
  DD10x5y12(); // tgen
};
//SIG(1 _ZN3ccc9DD10x5y12E) C1{ VBC2{ v2 v1} VBC3{ v3 v4 v1} v1}
}
namespace ccc { 
void  ccc::DD10x5y12 ::abc(){vfunc_called(this, "_ZN3ccc9DD10x5y123abcEv");}
ccc::DD10x5y12 ::~DD10x5y12(){ note_dtor("_ZN3ccc9DD10x5y12E", this);} // tgen
ccc::DD10x5y12 ::DD10x5y12(){ note_ctor("_ZN3ccc9DD10x5y12E", this);} // tgen
}
static void Test__ZN3ccc9DD10x5y12E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x5y12E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x5y12E, buf);
    ::ccc::DD10x5y12 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x5y12E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x5y12E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x5y12E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9DD10x5y12E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x5y12E);
    dp->::ccc::DD10x5y12::~DD10x5y12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x5y12E(Test__ZN3ccc9DD10x5y12E, "_ZN3ccc9DD10x5y12E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x5y12C1Ev();
extern void _ZN3ccc9DD10x5y12D1Ev();
Name_Map name_map__ZN3ccc9DD10x5y12E[] = {
  NSPAIR(_ZN3ccc9DD10x5y12C1Ev),
  NSPAIR(_ZN3ccc9DD10x5y12D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9DD10x5y12E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y12E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc9DD10x5y123abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void ABISELECT(_ZTv0_n40_N3ccc9DD10x5y123abcEv,_ZTv0_n20_N3ccc9DD10x5y123abcEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y123abcEv,_ZThn4_N3ccc9DD10x5y123abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc9DD10x5y12E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y123abcEv,
  ABISELECT(-8,-4),
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y12E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N3ccc9DD10x5y123abcEv,_ZTv0_n20_N3ccc9DD10x5y123abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x5y12E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x5y12E[] = {
  {&(_ZTVN3ccc9DD10x5y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y12E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y12E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y12E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x5y12E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x5y12E[];
static VTBL_ENTRY alt_thunk_names2177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N3ccc9DD10x5y123abcEv,_ZTv0_n20_N3ccc9DD10x5y123abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y123abcEv,_ZThn4_N3ccc9DD10x5y123abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x5y12E = {  "_ZN3ccc9DD10x5y12E", // class name
  bases__ZN3ccc9DD10x5y12E, 2,
  &(vtc__ZN3ccc9DD10x5y12E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x5y12E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x5y12E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x5y12E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x5y12E),3, //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  CC10x5y13  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9CC10x5y133efgEv
  ~CC10x5y13(); // tgen
  CC10x5y13(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y13E) C1{ VBC2{ v2 v3} BC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::CC10x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9CC10x5y133efgEv");}
ccc::CC10x5y13 ::~CC10x5y13(){ note_dtor("_ZN3ccc9CC10x5y13E", this);} // tgen
ccc::CC10x5y13 ::CC10x5y13(){ note_ctor("_ZN3ccc9CC10x5y13E", this);} // tgen
}
static void Test__ZN3ccc9CC10x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x5y13E, buf);
    ::ccc::CC10x5y13 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x5y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC10x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x5y13E);
    dp->::ccc::CC10x5y13::~CC10x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x5y13E(Test__ZN3ccc9CC10x5y13E, "_ZN3ccc9CC10x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x5y13C1Ev();
extern void _ZN3ccc9CC10x5y13D1Ev();
Name_Map name_map__ZN3ccc9CC10x5y13E[] = {
  NSPAIR(_ZN3ccc9CC10x5y13C1Ev),
  NSPAIR(_ZN3ccc9CC10x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC10x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x5y13E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc9CC10x5y133efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y13E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y133efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x5y13E[] = {
  {&(_ZTVN3ccc9CC10x5y13E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x5y13E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x5y13E[];
Class_Descriptor cd__ZN3ccc9CC10x5y13E = {  "_ZN3ccc9CC10x5y13E", // class name
  bases__ZN3ccc9CC10x5y13E, 2,
  &(vtc__ZN3ccc9CC10x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y13E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x5y13E),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  DD10x5y13  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  efg(); // _ZN3ccc9DD10x5y133efgEv
  ~DD10x5y13(); // tgen
  DD10x5y13(); // tgen
};
//SIG(1 _ZN3ccc9DD10x5y13E) C1{ VBC2{ v2 v3} VBC3{ v4 v1 v5} v1}
}
namespace ccc { 
void  ccc::DD10x5y13 ::efg(){vfunc_called(this, "_ZN3ccc9DD10x5y133efgEv");}
ccc::DD10x5y13 ::~DD10x5y13(){ note_dtor("_ZN3ccc9DD10x5y13E", this);} // tgen
ccc::DD10x5y13 ::DD10x5y13(){ note_ctor("_ZN3ccc9DD10x5y13E", this);} // tgen
}
static void Test__ZN3ccc9DD10x5y13E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x5y13E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x5y13E, buf);
    ::ccc::DD10x5y13 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x5y13E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x5y13E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x5y13E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9DD10x5y13E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x5y13E);
    dp->::ccc::DD10x5y13::~DD10x5y13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x5y13E(Test__ZN3ccc9DD10x5y13E, "_ZN3ccc9DD10x5y13E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x5y13C1Ev();
extern void _ZN3ccc9DD10x5y13D1Ev();
Name_Map name_map__ZN3ccc9DD10x5y13E[] = {
  NSPAIR(_ZN3ccc9DD10x5y13C1Ev),
  NSPAIR(_ZN3ccc9DD10x5y13D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9DD10x5y13E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y13E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc9DD10x5y133efgEv();
extern void _ZN3ccc3BB53pqrEv();
extern void ABISELECT(_ZTv0_n32_N3ccc9DD10x5y133efgEv,_ZTv0_n16_N3ccc9DD10x5y133efgEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y133efgEv,_ZThn4_N3ccc9DD10x5y133efgEv)() __attribute__((weak));
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x5y13E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y133efgEv,
  0,
  ABISELECT(-8,-4),
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y13E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc9DD10x5y133efgEv,_ZTv0_n16_N3ccc9DD10x5y133efgEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x5y13E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x5y13E[] = {
  {&(_ZTVN3ccc9DD10x5y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x5y13E[6]),  6,17},
  {&(_ZTVN3ccc9DD10x5y13E[14]),  14,17},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y13E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x5y13E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x5y13E[];
static VTBL_ENTRY alt_thunk_names2178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc9DD10x5y133efgEv,_ZTv0_n16_N3ccc9DD10x5y133efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y133efgEv,_ZThn4_N3ccc9DD10x5y133efgEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x5y13E = {  "_ZN3ccc9DD10x5y13E", // class name
  bases__ZN3ccc9DD10x5y13E, 2,
  &(vtc__ZN3ccc9DD10x5y13E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x5y13E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x5y13E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x5y13E),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x5y13E),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  CC10x5y14  : virtual ::ccc::AA10 , ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9CC10x5y143pqrEv
  ~CC10x5y14(); // tgen
  CC10x5y14(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y14E) C1{ VBC2{ v1 v2} BC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::CC10x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9CC10x5y143pqrEv");}
ccc::CC10x5y14 ::~CC10x5y14(){ note_dtor("_ZN3ccc9CC10x5y14E", this);} // tgen
ccc::CC10x5y14 ::CC10x5y14(){ note_ctor("_ZN3ccc9CC10x5y14E", this);} // tgen
}
static void Test__ZN3ccc9CC10x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x5y14E, buf);
    ::ccc::CC10x5y14 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x5y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC10x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x5y14E);
    dp->::ccc::CC10x5y14::~CC10x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x5y14E(Test__ZN3ccc9CC10x5y14E, "_ZN3ccc9CC10x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x5y14C1Ev();
extern void _ZN3ccc9CC10x5y14D1Ev();
Name_Map name_map__ZN3ccc9CC10x5y14E[] = {
  NSPAIR(_ZN3ccc9CC10x5y14C1Ev),
  NSPAIR(_ZN3ccc9CC10x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC10x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x5y14E[];
extern void _ZN3ccc9CC10x5y143pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9CC10x5y143pqrEv,_ZTv0_n12_N3ccc9CC10x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9CC10x5y143pqrEv,_ZThn4_N3ccc9CC10x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y14E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9CC10x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9CC10x5y143pqrEv,_ZTv0_n12_N3ccc9CC10x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x5y14E[] = {
  {&(_ZTVN3ccc9CC10x5y14E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x5y14E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x5y14E[];
static VTBL_ENTRY alt_thunk_names2179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9CC10x5y143pqrEv,_ZTv0_n12_N3ccc9CC10x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9CC10x5y143pqrEv,_ZThn4_N3ccc9CC10x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9CC10x5y14E = {  "_ZN3ccc9CC10x5y14E", // class name
  bases__ZN3ccc9CC10x5y14E, 2,
  &(vtc__ZN3ccc9CC10x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y14E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x5y14E),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  DD10x5y14  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  virtual void  pqr(); // _ZN3ccc9DD10x5y143pqrEv
  ~DD10x5y14(); // tgen
  DD10x5y14(); // tgen
};
//SIG(1 _ZN3ccc9DD10x5y14E) C1{ VBC2{ v1 v2} VBC3{ v1 v3 v4} v1}
}
namespace ccc { 
void  ccc::DD10x5y14 ::pqr(){vfunc_called(this, "_ZN3ccc9DD10x5y143pqrEv");}
ccc::DD10x5y14 ::~DD10x5y14(){ note_dtor("_ZN3ccc9DD10x5y14E", this);} // tgen
ccc::DD10x5y14 ::DD10x5y14(){ note_ctor("_ZN3ccc9DD10x5y14E", this);} // tgen
}
static void Test__ZN3ccc9DD10x5y14E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x5y14E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x5y14E, buf);
    ::ccc::DD10x5y14 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x5y14E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x5y14E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x5y14E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9DD10x5y14E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x5y14E);
    dp->::ccc::DD10x5y14::~DD10x5y14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x5y14E(Test__ZN3ccc9DD10x5y14E, "_ZN3ccc9DD10x5y14E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x5y14C1Ev();
extern void _ZN3ccc9DD10x5y14D1Ev();
Name_Map name_map__ZN3ccc9DD10x5y14E[] = {
  NSPAIR(_ZN3ccc9DD10x5y14C1Ev),
  NSPAIR(_ZN3ccc9DD10x5y14D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9DD10x5y14E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y14E[];
extern void _ZN3ccc9DD10x5y143pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void ABISELECT(_ZTv0_n24_N3ccc9DD10x5y143pqrEv,_ZTv0_n12_N3ccc9DD10x5y143pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc9DD10x5y143pqrEv,_ZThn4_N3ccc9DD10x5y143pqrEv)() __attribute__((weak));
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x5y14E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y14E[0]),
  (VTBL_ENTRY)&_ZN3ccc9DD10x5y143pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y14E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc9DD10x5y143pqrEv,_ZTv0_n12_N3ccc9DD10x5y143pqrEv),
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x5y14E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x5y14E[] = {
  {&(_ZTVN3ccc9DD10x5y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y14E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y14E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y14E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x5y14E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x5y14E[];
static VTBL_ENTRY alt_thunk_names2180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc9DD10x5y143pqrEv,_ZTv0_n12_N3ccc9DD10x5y143pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc9DD10x5y143pqrEv,_ZThn4_N3ccc9DD10x5y143pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc9DD10x5y14E = {  "_ZN3ccc9DD10x5y14E", // class name
  bases__ZN3ccc9DD10x5y14E, 2,
  &(vtc__ZN3ccc9DD10x5y14E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x5y14E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x5y14E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x5y14E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x5y14E),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  CC10x5y15  : virtual ::ccc::AA10 , ::ccc::BB5 {
  ~CC10x5y15(); // tgen
  CC10x5y15(); // tgen
};
//SIG(1 _ZN3ccc9CC10x5y15E) C1{ VBC2{ v1 v2} BC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::CC10x5y15 ::~CC10x5y15(){ note_dtor("_ZN3ccc9CC10x5y15E", this);} // tgen
ccc::CC10x5y15 ::CC10x5y15(){ note_ctor("_ZN3ccc9CC10x5y15E", this);} // tgen
}
static void Test__ZN3ccc9CC10x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9CC10x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9CC10x5y15E, buf);
    ::ccc::CC10x5y15 *dp, &lv = *(dp=new (buf) ::ccc::CC10x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9CC10x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9CC10x5y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc9CC10x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), 0, "_ZN3ccc9CC10x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9CC10x5y15E);
    dp->::ccc::CC10x5y15::~CC10x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9CC10x5y15E(Test__ZN3ccc9CC10x5y15E, "_ZN3ccc9CC10x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9CC10x5y15C1Ev();
extern void _ZN3ccc9CC10x5y15D1Ev();
Name_Map name_map__ZN3ccc9CC10x5y15E[] = {
  NSPAIR(_ZN3ccc9CC10x5y15C1Ev),
  NSPAIR(_ZN3ccc9CC10x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9CC10x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc9CC10x5y15E[];
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9CC10x5y15E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9CC10x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9CC10x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc9CC10x5y15E[] = {
  {&(_ZTVN3ccc9CC10x5y15E[3]),  3,12},
  {&(_ZTVN3ccc9CC10x5y15E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc9CC10x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9CC10x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9CC10x5y15E[];
Class_Descriptor cd__ZN3ccc9CC10x5y15E = {  "_ZN3ccc9CC10x5y15E", // class name
  bases__ZN3ccc9CC10x5y15E, 2,
  &(vtc__ZN3ccc9CC10x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9CC10x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9CC10x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9CC10x5y15E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9CC10x5y15E),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  DD10x5y15  : virtual ::ccc::AA10 , virtual ::ccc::BB5 {
  ~DD10x5y15(); // tgen
  DD10x5y15(); // tgen
};
//SIG(1 _ZN3ccc9DD10x5y15E) C1{ VBC2{ v1 v2} VBC3{ v3 v4 v5}}
}
namespace ccc { 
ccc::DD10x5y15 ::~DD10x5y15(){ note_dtor("_ZN3ccc9DD10x5y15E", this);} // tgen
ccc::DD10x5y15 ::DD10x5y15(){ note_ctor("_ZN3ccc9DD10x5y15E", this);} // tgen
}
static void Test__ZN3ccc9DD10x5y15E()
{
  extern Class_Descriptor cd__ZN3ccc9DD10x5y15E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc9DD10x5y15E, buf);
    ::ccc::DD10x5y15 *dp, &lv = *(dp=new (buf) ::ccc::DD10x5y15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc9DD10x5y15E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc9DD10x5y15E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc9DD10x5y15E");
    check_base_class_offset(lv, (::ccc::BB5*), ABISELECT(8,4), "_ZN3ccc9DD10x5y15E");
    test_class_info(&lv, &cd__ZN3ccc9DD10x5y15E);
    dp->::ccc::DD10x5y15::~DD10x5y15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc9DD10x5y15E(Test__ZN3ccc9DD10x5y15E, "_ZN3ccc9DD10x5y15E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc9DD10x5y15C1Ev();
extern void _ZN3ccc9DD10x5y15D1Ev();
Name_Map name_map__ZN3ccc9DD10x5y15E[] = {
  NSPAIR(_ZN3ccc9DD10x5y15C1Ev),
  NSPAIR(_ZN3ccc9DD10x5y15D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB5E;
extern VTBL_ENTRY _ZTIN3ccc3BB5E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB5E[];
static Base_Class bases__ZN3ccc9DD10x5y15E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB5E,    ABISELECT(8,4), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y15E[];
extern void _ZN3ccc4AA103pqrEv();
extern void _ZN3ccc4AA103abcEv();
extern void _ZN3ccc3BB53pqrEv();
extern void _ZN3ccc3BB53efgEv();
extern void _ZN3ccc3BB53abcEv();
static  VTBL_ENTRY vtc__ZN3ccc9DD10x5y15E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc4AA103pqrEv,
  (VTBL_ENTRY)&_ZN3ccc4AA103abcEv,
  0,
  0,
  0,
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc9DD10x5y15E[0]),
  (VTBL_ENTRY)&_ZN3ccc3BB53pqrEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53efgEv,
  (VTBL_ENTRY)&_ZN3ccc3BB53abcEv,
};
extern VTBL_ENTRY _ZTVN3ccc9DD10x5y15E[];
static  VTT_ENTRY vtt__ZN3ccc9DD10x5y15E[] = {
  {&(_ZTVN3ccc9DD10x5y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y15E[6]),  6,16},
  {&(_ZTVN3ccc9DD10x5y15E[13]),  13,16},
};
extern VTBL_ENTRY _ZTIN3ccc9DD10x5y15E[];
extern  VTBL_ENTRY _ZTVN3ccc9DD10x5y15E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc9DD10x5y15E[];
Class_Descriptor cd__ZN3ccc9DD10x5y15E = {  "_ZN3ccc9DD10x5y15E", // class name
  bases__ZN3ccc9DD10x5y15E, 2,
  &(vtc__ZN3ccc9DD10x5y15E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc9DD10x5y15E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc9DD10x5y15E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc9DD10x5y15E),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc9DD10x5y15E),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  CC10x6y0  : virtual ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC10x6y03abcEv
  virtual void  efg(); // _ZN3ccc8CC10x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y03pqrEv
  ~CC10x6y0(); // tgen
  CC10x6y0(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y0E) C1{ VBC2{ v3 v1} BC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y03abcEv");}
void  ccc::CC10x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y03efgEv");}
void  ccc::CC10x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y03pqrEv");}
ccc::CC10x6y0 ::~CC10x6y0(){ note_dtor("_ZN3ccc8CC10x6y0E", this);} // tgen
ccc::CC10x6y0 ::CC10x6y0(){ note_ctor("_ZN3ccc8CC10x6y0E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y0E, buf);
    ::ccc::CC10x6y0 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC10x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y0E);
    dp->::ccc::CC10x6y0::~CC10x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y0E(Test__ZN3ccc8CC10x6y0E, "_ZN3ccc8CC10x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y0C1Ev();
extern void _ZN3ccc8CC10x6y0D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y0E[] = {
  NSPAIR(_ZN3ccc8CC10x6y0C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC10x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x6y0E[];
extern void _ZN3ccc8CC10x6y03abcEv();
extern void _ZN3ccc8CC10x6y03efgEv();
extern void _ZN3ccc8CC10x6y03pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x6y03pqrEv,_ZTv0_n12_N3ccc8CC10x6y03pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y03pqrEv,_ZThn4_N3ccc8CC10x6y03pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x6y03abcEv,_ZTv0_n16_N3ccc8CC10x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y03abcEv,_ZThn4_N3ccc8CC10x6y03abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y0E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y03efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y03pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x6y03pqrEv,_ZTv0_n12_N3ccc8CC10x6y03pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x6y03abcEv,_ZTv0_n16_N3ccc8CC10x6y03abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x6y0E[] = {
  {&(_ZTVN3ccc8CC10x6y0E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x6y0E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x6y0E[];
static VTBL_ENTRY alt_thunk_names2181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x6y03abcEv,_ZTv0_n16_N3ccc8CC10x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y03abcEv,_ZThn4_N3ccc8CC10x6y03abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x6y03pqrEv,_ZTv0_n12_N3ccc8CC10x6y03pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y03pqrEv,_ZThn4_N3ccc8CC10x6y03pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x6y0E = {  "_ZN3ccc8CC10x6y0E", // class name
  bases__ZN3ccc8CC10x6y0E, 2,
  &(vtc__ZN3ccc8CC10x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y0E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x6y0E),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  DD10x6y0  : virtual ::ccc::AA10 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD10x6y03abcEv
  virtual void  efg(); // _ZN3ccc8DD10x6y03efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x6y03pqrEv
  ~DD10x6y0(); // tgen
  DD10x6y0(); // tgen
};
//SIG(1 _ZN3ccc8DD10x6y0E) C1{ VBC2{ v3 v1} VBC3{ v1 v2} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x6y0 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x6y03abcEv");}
void  ccc::DD10x6y0 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x6y03efgEv");}
void  ccc::DD10x6y0 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x6y03pqrEv");}
ccc::DD10x6y0 ::~DD10x6y0(){ note_dtor("_ZN3ccc8DD10x6y0E", this);} // tgen
ccc::DD10x6y0 ::DD10x6y0(){ note_ctor("_ZN3ccc8DD10x6y0E", this);} // tgen
}
static void Test__ZN3ccc8DD10x6y0E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x6y0E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x6y0E, buf);
    ::ccc::DD10x6y0 *dp, &lv = *(dp=new (buf) ::ccc::DD10x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x6y0E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x6y0E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x6y0E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD10x6y0E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x6y0E);
    dp->::ccc::DD10x6y0::~DD10x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x6y0E(Test__ZN3ccc8DD10x6y0E, "_ZN3ccc8DD10x6y0E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x6y0C1Ev();
extern void _ZN3ccc8DD10x6y0D1Ev();
Name_Map name_map__ZN3ccc8DD10x6y0E[] = {
  NSPAIR(_ZN3ccc8DD10x6y0C1Ev),
  NSPAIR(_ZN3ccc8DD10x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD10x6y0E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y0E[];
extern void _ZN3ccc8DD10x6y03pqrEv();
extern void _ZN3ccc8DD10x6y03abcEv();
extern void _ZN3ccc8DD10x6y03efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x6y03abcEv,_ZTv0_n12_N3ccc8DD10x6y03abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y03abcEv,_ZThn4_N3ccc8DD10x6y03abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x6y03efgEv,_ZTv0_n16_N3ccc8DD10x6y03efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y03efgEv,_ZThn4_N3ccc8DD10x6y03efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x6y0E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y0E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y03pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y03abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y03efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y0E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x6y03abcEv,_ZTv0_n12_N3ccc8DD10x6y03abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x6y03efgEv,_ZTv0_n16_N3ccc8DD10x6y03efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x6y0E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x6y0E[] = {
  {&(_ZTVN3ccc8DD10x6y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y0E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y0E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y0E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x6y0E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x6y0E[];
static VTBL_ENTRY alt_thunk_names2182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x6y03efgEv,_ZTv0_n16_N3ccc8DD10x6y03efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y03efgEv,_ZThn4_N3ccc8DD10x6y03efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x6y03abcEv,_ZTv0_n12_N3ccc8DD10x6y03abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y03abcEv,_ZThn4_N3ccc8DD10x6y03abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x6y0E = {  "_ZN3ccc8DD10x6y0E", // class name
  bases__ZN3ccc8DD10x6y0E, 2,
  &(vtc__ZN3ccc8DD10x6y0E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x6y0E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x6y0E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x6y0E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x6y0E),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  CC10x6y1  : virtual ::ccc::AA10 , ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8CC10x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8CC10x6y13efgEv
  ~CC10x6y1(); // tgen
  CC10x6y1(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y1E) C1{ VBC2{ v2 v1} BC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y13abcEv");}
void  ccc::CC10x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y13pqrEv");}
void  ccc::CC10x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y13efgEv");}
ccc::CC10x6y1 ::~CC10x6y1(){ note_dtor("_ZN3ccc8CC10x6y1E", this);} // tgen
ccc::CC10x6y1 ::CC10x6y1(){ note_ctor("_ZN3ccc8CC10x6y1E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y1E, buf);
    ::ccc::CC10x6y1 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC10x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y1E);
    dp->::ccc::CC10x6y1::~CC10x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y1E(Test__ZN3ccc8CC10x6y1E, "_ZN3ccc8CC10x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y1C1Ev();
extern void _ZN3ccc8CC10x6y1D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y1E[] = {
  NSPAIR(_ZN3ccc8CC10x6y1C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC10x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x6y1E[];
extern void _ZN3ccc8CC10x6y13abcEv();
extern void _ZN3ccc8CC10x6y13efgEv();
extern void _ZN3ccc8CC10x6y13pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x6y13pqrEv,_ZTv0_n12_N3ccc8CC10x6y13pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y13pqrEv,_ZThn4_N3ccc8CC10x6y13pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x6y13abcEv,_ZTv0_n16_N3ccc8CC10x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y13abcEv,_ZThn4_N3ccc8CC10x6y13abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y1E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y13efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y13pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x6y13pqrEv,_ZTv0_n12_N3ccc8CC10x6y13pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x6y13abcEv,_ZTv0_n16_N3ccc8CC10x6y13abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x6y1E[] = {
  {&(_ZTVN3ccc8CC10x6y1E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x6y1E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x6y1E[];
static VTBL_ENTRY alt_thunk_names2183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x6y13abcEv,_ZTv0_n16_N3ccc8CC10x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y13abcEv,_ZThn4_N3ccc8CC10x6y13abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x6y13pqrEv,_ZTv0_n12_N3ccc8CC10x6y13pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y13pqrEv,_ZThn4_N3ccc8CC10x6y13pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x6y1E = {  "_ZN3ccc8CC10x6y1E", // class name
  bases__ZN3ccc8CC10x6y1E, 2,
  &(vtc__ZN3ccc8CC10x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y1E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x6y1E),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  DD10x6y1  : virtual ::ccc::AA10 , virtual ::ccc::BB6 {
  virtual void  abc(); // _ZN3ccc8DD10x6y13abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x6y13pqrEv
  virtual void  efg(); // _ZN3ccc8DD10x6y13efgEv
  ~DD10x6y1(); // tgen
  DD10x6y1(); // tgen
};
//SIG(1 _ZN3ccc8DD10x6y1E) C1{ VBC2{ v2 v1} VBC3{ v1 v3} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x6y1 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x6y13abcEv");}
void  ccc::DD10x6y1 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x6y13pqrEv");}
void  ccc::DD10x6y1 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x6y13efgEv");}
ccc::DD10x6y1 ::~DD10x6y1(){ note_dtor("_ZN3ccc8DD10x6y1E", this);} // tgen
ccc::DD10x6y1 ::DD10x6y1(){ note_ctor("_ZN3ccc8DD10x6y1E", this);} // tgen
}
static void Test__ZN3ccc8DD10x6y1E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x6y1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x6y1E, buf);
    ::ccc::DD10x6y1 *dp, &lv = *(dp=new (buf) ::ccc::DD10x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x6y1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x6y1E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x6y1E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD10x6y1E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x6y1E);
    dp->::ccc::DD10x6y1::~DD10x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x6y1E(Test__ZN3ccc8DD10x6y1E, "_ZN3ccc8DD10x6y1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x6y1C1Ev();
extern void _ZN3ccc8DD10x6y1D1Ev();
Name_Map name_map__ZN3ccc8DD10x6y1E[] = {
  NSPAIR(_ZN3ccc8DD10x6y1C1Ev),
  NSPAIR(_ZN3ccc8DD10x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD10x6y1E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y1E[];
extern void _ZN3ccc8DD10x6y13pqrEv();
extern void _ZN3ccc8DD10x6y13abcEv();
extern void _ZN3ccc8DD10x6y13efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x6y13abcEv,_ZTv0_n12_N3ccc8DD10x6y13abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y13abcEv,_ZThn4_N3ccc8DD10x6y13abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x6y13efgEv,_ZTv0_n16_N3ccc8DD10x6y13efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y13efgEv,_ZThn4_N3ccc8DD10x6y13efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x6y1E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y1E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y13pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y13abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y13efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y1E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x6y13abcEv,_ZTv0_n12_N3ccc8DD10x6y13abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x6y13efgEv,_ZTv0_n16_N3ccc8DD10x6y13efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x6y1E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x6y1E[] = {
  {&(_ZTVN3ccc8DD10x6y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y1E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y1E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y1E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x6y1E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x6y1E[];
static VTBL_ENTRY alt_thunk_names2184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x6y13efgEv,_ZTv0_n16_N3ccc8DD10x6y13efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y13efgEv,_ZThn4_N3ccc8DD10x6y13efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x6y13abcEv,_ZTv0_n12_N3ccc8DD10x6y13abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y13abcEv,_ZThn4_N3ccc8DD10x6y13abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x6y1E = {  "_ZN3ccc8DD10x6y1E", // class name
  bases__ZN3ccc8DD10x6y1E, 2,
  &(vtc__ZN3ccc8DD10x6y1E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x6y1E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x6y1E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x6y1E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x6y1E),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  CC10x6y2  : virtual ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC10x6y23efgEv
  virtual void  abc(); // _ZN3ccc8CC10x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y23pqrEv
  ~CC10x6y2(); // tgen
  CC10x6y2(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y2E) C1{ VBC2{ v3 v2} BC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y23efgEv");}
void  ccc::CC10x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y23abcEv");}
void  ccc::CC10x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y23pqrEv");}
ccc::CC10x6y2 ::~CC10x6y2(){ note_dtor("_ZN3ccc8CC10x6y2E", this);} // tgen
ccc::CC10x6y2 ::CC10x6y2(){ note_ctor("_ZN3ccc8CC10x6y2E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y2E, buf);
    ::ccc::CC10x6y2 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC10x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y2E);
    dp->::ccc::CC10x6y2::~CC10x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y2E(Test__ZN3ccc8CC10x6y2E, "_ZN3ccc8CC10x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y2C1Ev();
extern void _ZN3ccc8CC10x6y2D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y2E[] = {
  NSPAIR(_ZN3ccc8CC10x6y2C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC10x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x6y2E[];
extern void _ZN3ccc8CC10x6y23abcEv();
extern void _ZN3ccc8CC10x6y23efgEv();
extern void _ZN3ccc8CC10x6y23pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x6y23pqrEv,_ZTv0_n12_N3ccc8CC10x6y23pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y23pqrEv,_ZThn4_N3ccc8CC10x6y23pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x6y23abcEv,_ZTv0_n16_N3ccc8CC10x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y23abcEv,_ZThn4_N3ccc8CC10x6y23abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y2E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y23efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y23pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x6y23pqrEv,_ZTv0_n12_N3ccc8CC10x6y23pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x6y23abcEv,_ZTv0_n16_N3ccc8CC10x6y23abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x6y2E[] = {
  {&(_ZTVN3ccc8CC10x6y2E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x6y2E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x6y2E[];
static VTBL_ENTRY alt_thunk_names2185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x6y23abcEv,_ZTv0_n16_N3ccc8CC10x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y23abcEv,_ZThn4_N3ccc8CC10x6y23abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x6y23pqrEv,_ZTv0_n12_N3ccc8CC10x6y23pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y23pqrEv,_ZThn4_N3ccc8CC10x6y23pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x6y2E = {  "_ZN3ccc8CC10x6y2E", // class name
  bases__ZN3ccc8CC10x6y2E, 2,
  &(vtc__ZN3ccc8CC10x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y2E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x6y2E),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  DD10x6y2  : virtual ::ccc::AA10 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD10x6y23efgEv
  virtual void  abc(); // _ZN3ccc8DD10x6y23abcEv
  virtual void  pqr(); // _ZN3ccc8DD10x6y23pqrEv
  ~DD10x6y2(); // tgen
  DD10x6y2(); // tgen
};
//SIG(1 _ZN3ccc8DD10x6y2E) C1{ VBC2{ v3 v2} VBC3{ v2 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x6y2 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x6y23efgEv");}
void  ccc::DD10x6y2 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x6y23abcEv");}
void  ccc::DD10x6y2 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x6y23pqrEv");}
ccc::DD10x6y2 ::~DD10x6y2(){ note_dtor("_ZN3ccc8DD10x6y2E", this);} // tgen
ccc::DD10x6y2 ::DD10x6y2(){ note_ctor("_ZN3ccc8DD10x6y2E", this);} // tgen
}
static void Test__ZN3ccc8DD10x6y2E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x6y2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x6y2E, buf);
    ::ccc::DD10x6y2 *dp, &lv = *(dp=new (buf) ::ccc::DD10x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x6y2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x6y2E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x6y2E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD10x6y2E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x6y2E);
    dp->::ccc::DD10x6y2::~DD10x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x6y2E(Test__ZN3ccc8DD10x6y2E, "_ZN3ccc8DD10x6y2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x6y2C1Ev();
extern void _ZN3ccc8DD10x6y2D1Ev();
Name_Map name_map__ZN3ccc8DD10x6y2E[] = {
  NSPAIR(_ZN3ccc8DD10x6y2C1Ev),
  NSPAIR(_ZN3ccc8DD10x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD10x6y2E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y2E[];
extern void _ZN3ccc8DD10x6y23pqrEv();
extern void _ZN3ccc8DD10x6y23abcEv();
extern void _ZN3ccc8DD10x6y23efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x6y23abcEv,_ZTv0_n12_N3ccc8DD10x6y23abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y23abcEv,_ZThn4_N3ccc8DD10x6y23abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x6y23efgEv,_ZTv0_n16_N3ccc8DD10x6y23efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y23efgEv,_ZThn4_N3ccc8DD10x6y23efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x6y2E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y2E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y23pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y23abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y23efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y2E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x6y23abcEv,_ZTv0_n12_N3ccc8DD10x6y23abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x6y23efgEv,_ZTv0_n16_N3ccc8DD10x6y23efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x6y2E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x6y2E[] = {
  {&(_ZTVN3ccc8DD10x6y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y2E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y2E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y2E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x6y2E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x6y2E[];
static VTBL_ENTRY alt_thunk_names2186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x6y23efgEv,_ZTv0_n16_N3ccc8DD10x6y23efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y23efgEv,_ZThn4_N3ccc8DD10x6y23efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x6y23abcEv,_ZTv0_n12_N3ccc8DD10x6y23abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y23abcEv,_ZThn4_N3ccc8DD10x6y23abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x6y2E = {  "_ZN3ccc8DD10x6y2E", // class name
  bases__ZN3ccc8DD10x6y2E, 2,
  &(vtc__ZN3ccc8DD10x6y2E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x6y2E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x6y2E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x6y2E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x6y2E),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  CC10x6y3  : virtual ::ccc::AA10 , ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8CC10x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8CC10x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8CC10x6y33abcEv
  ~CC10x6y3(); // tgen
  CC10x6y3(); // tgen
};
//SIG(1 _ZN3ccc8CC10x6y3E) C1{ VBC2{ v2 v3} BC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::CC10x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8CC10x6y33efgEv");}
void  ccc::CC10x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8CC10x6y33pqrEv");}
void  ccc::CC10x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8CC10x6y33abcEv");}
ccc::CC10x6y3 ::~CC10x6y3(){ note_dtor("_ZN3ccc8CC10x6y3E", this);} // tgen
ccc::CC10x6y3 ::CC10x6y3(){ note_ctor("_ZN3ccc8CC10x6y3E", this);} // tgen
}
static void Test__ZN3ccc8CC10x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8CC10x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8CC10x6y3E, buf);
    ::ccc::CC10x6y3 *dp, &lv = *(dp=new (buf) ::ccc::CC10x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8CC10x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8CC10x6y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), ABISELECT(8,4), "_ZN3ccc8CC10x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), 0, "_ZN3ccc8CC10x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8CC10x6y3E);
    dp->::ccc::CC10x6y3::~CC10x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8CC10x6y3E(Test__ZN3ccc8CC10x6y3E, "_ZN3ccc8CC10x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8CC10x6y3C1Ev();
extern void _ZN3ccc8CC10x6y3D1Ev();
Name_Map name_map__ZN3ccc8CC10x6y3E[] = {
  NSPAIR(_ZN3ccc8CC10x6y3C1Ev),
  NSPAIR(_ZN3ccc8CC10x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8CC10x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    ABISELECT(8,4), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&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 _ZTIN3ccc8CC10x6y3E[];
extern void _ZN3ccc8CC10x6y33abcEv();
extern void _ZN3ccc8CC10x6y33efgEv();
extern void _ZN3ccc8CC10x6y33pqrEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8CC10x6y33pqrEv,_ZTv0_n12_N3ccc8CC10x6y33pqrEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y33pqrEv,_ZThn4_N3ccc8CC10x6y33pqrEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8CC10x6y33abcEv,_ZTv0_n16_N3ccc8CC10x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8CC10x6y33abcEv,_ZThn4_N3ccc8CC10x6y33abcEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8CC10x6y3E[] = {
  ABISELECT(8,4),
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y33efgEv,
  (VTBL_ENTRY)&_ZN3ccc8CC10x6y33pqrEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8CC10x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8CC10x6y33pqrEv,_ZTv0_n12_N3ccc8CC10x6y33pqrEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8CC10x6y33abcEv,_ZTv0_n16_N3ccc8CC10x6y33abcEv),
};
extern VTBL_ENTRY _ZTVN3ccc8CC10x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc8CC10x6y3E[] = {
  {&(_ZTVN3ccc8CC10x6y3E[3]),  3,12},
  {&(_ZTVN3ccc8CC10x6y3E[10]),  10,12},
};
extern VTBL_ENTRY _ZTIN3ccc8CC10x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8CC10x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8CC10x6y3E[];
static VTBL_ENTRY alt_thunk_names2187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8CC10x6y33abcEv,_ZTv0_n16_N3ccc8CC10x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y33abcEv,_ZThn4_N3ccc8CC10x6y33abcEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8CC10x6y33pqrEv,_ZTv0_n12_N3ccc8CC10x6y33pqrEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8CC10x6y33pqrEv,_ZThn4_N3ccc8CC10x6y33pqrEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8CC10x6y3E = {  "_ZN3ccc8CC10x6y3E", // class name
  bases__ZN3ccc8CC10x6y3E, 2,
  &(vtc__ZN3ccc8CC10x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8CC10x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8CC10x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8CC10x6y3E),12, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8CC10x6y3E),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  DD10x6y3  : virtual ::ccc::AA10 , virtual ::ccc::BB6 {
  virtual void  efg(); // _ZN3ccc8DD10x6y33efgEv
  virtual void  pqr(); // _ZN3ccc8DD10x6y33pqrEv
  virtual void  abc(); // _ZN3ccc8DD10x6y33abcEv
  ~DD10x6y3(); // tgen
  DD10x6y3(); // tgen
};
//SIG(1 _ZN3ccc8DD10x6y3E) C1{ VBC2{ v2 v3} VBC3{ v3 v1} v1 v2 v3}
}
namespace ccc { 
void  ccc::DD10x6y3 ::efg(){vfunc_called(this, "_ZN3ccc8DD10x6y33efgEv");}
void  ccc::DD10x6y3 ::pqr(){vfunc_called(this, "_ZN3ccc8DD10x6y33pqrEv");}
void  ccc::DD10x6y3 ::abc(){vfunc_called(this, "_ZN3ccc8DD10x6y33abcEv");}
ccc::DD10x6y3 ::~DD10x6y3(){ note_dtor("_ZN3ccc8DD10x6y3E", this);} // tgen
ccc::DD10x6y3 ::DD10x6y3(){ note_ctor("_ZN3ccc8DD10x6y3E", this);} // tgen
}
static void Test__ZN3ccc8DD10x6y3E()
{
  extern Class_Descriptor cd__ZN3ccc8DD10x6y3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3ccc8DD10x6y3E, buf);
    ::ccc::DD10x6y3 *dp, &lv = *(dp=new (buf) ::ccc::DD10x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3ccc8DD10x6y3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3ccc8DD10x6y3E)");
    check_base_class_offset(lv, (::ccc::AA10*), 0, "_ZN3ccc8DD10x6y3E");
    check_base_class_offset(lv, (::ccc::BB6*), ABISELECT(8,4), "_ZN3ccc8DD10x6y3E");
    test_class_info(&lv, &cd__ZN3ccc8DD10x6y3E);
    dp->::ccc::DD10x6y3::~DD10x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3ccc8DD10x6y3E(Test__ZN3ccc8DD10x6y3E, "_ZN3ccc8DD10x6y3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3ccc8DD10x6y3C1Ev();
extern void _ZN3ccc8DD10x6y3D1Ev();
Name_Map name_map__ZN3ccc8DD10x6y3E[] = {
  NSPAIR(_ZN3ccc8DD10x6y3C1Ev),
  NSPAIR(_ZN3ccc8DD10x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3ccc4AA10E;
extern VTBL_ENTRY _ZTIN3ccc4AA10E[];
extern  VTBL_ENTRY _ZTVN3ccc4AA10E[];
extern Class_Descriptor cd__ZN3ccc3BB6E;
extern VTBL_ENTRY _ZTIN3ccc3BB6E[];
extern  VTBL_ENTRY _ZTVN3ccc3BB6E[];
static Base_Class bases__ZN3ccc8DD10x6y3E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3ccc4AA10E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd__ZN3ccc3BB6E,    ABISELECT(8,4), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y3E[];
extern void _ZN3ccc8DD10x6y33pqrEv();
extern void _ZN3ccc8DD10x6y33abcEv();
extern void _ZN3ccc8DD10x6y33efgEv();
extern void ABISELECT(_ZTv0_n24_N3ccc8DD10x6y33abcEv,_ZTv0_n12_N3ccc8DD10x6y33abcEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y33abcEv,_ZThn4_N3ccc8DD10x6y33abcEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N3ccc8DD10x6y33efgEv,_ZTv0_n16_N3ccc8DD10x6y33efgEv)();
extern void ABISELECT(_ZThn8_N3ccc8DD10x6y33efgEv,_ZThn4_N3ccc8DD10x6y33efgEv)() __attribute__((weak));
static  VTBL_ENTRY vtc__ZN3ccc8DD10x6y3E[] = {
  ABISELECT(8,4),
  0,
  0,
  0,
  0,
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y3E[0]),
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y33pqrEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y33abcEv,
  (VTBL_ENTRY)&_ZN3ccc8DD10x6y33efgEv,
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  ABISELECT(-8,-4),
  (VTBL_ENTRY)&(_ZTIN3ccc8DD10x6y3E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3ccc8DD10x6y33abcEv,_ZTv0_n12_N3ccc8DD10x6y33abcEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N3ccc8DD10x6y33efgEv,_ZTv0_n16_N3ccc8DD10x6y33efgEv),
};
extern VTBL_ENTRY _ZTVN3ccc8DD10x6y3E[];
static  VTT_ENTRY vtt__ZN3ccc8DD10x6y3E[] = {
  {&(_ZTVN3ccc8DD10x6y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y3E[6]),  6,15},
  {&(_ZTVN3ccc8DD10x6y3E[13]),  13,15},
};
extern VTBL_ENTRY _ZTIN3ccc8DD10x6y3E[];
extern  VTBL_ENTRY _ZTVN3ccc8DD10x6y3E[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTTN3ccc8DD10x6y3E[];
static VTBL_ENTRY alt_thunk_names2188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N3ccc8DD10x6y33efgEv,_ZTv0_n16_N3ccc8DD10x6y33efgEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y33efgEv,_ZThn4_N3ccc8DD10x6y33efgEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3ccc8DD10x6y33abcEv,_ZTv0_n12_N3ccc8DD10x6y33abcEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn8_N3ccc8DD10x6y33abcEv,_ZThn4_N3ccc8DD10x6y33abcEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd__ZN3ccc8DD10x6y3E = {  "_ZN3ccc8DD10x6y3E", // class name
  bases__ZN3ccc8DD10x6y3E, 2,
  &(vtc__ZN3ccc8DD10x6y3E[0]), // expected_vtbl_contents
  &(vtt__ZN3ccc8DD10x6y3E[0]), // expected_vtt_contents
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3ccc8DD10x6y3E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3ccc8DD10x6y3E),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTTN3ccc8DD10x6y3E),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2188,
};
#endif // __cplusplus

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

